[josm] 01/05: Imported Upstream version 0.0.svn7995+dfsg1

Bas Couwenberg sebastic at xs4all.nl
Sun Feb 1 19:23:42 UTC 2015


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

sebastic-guest pushed a commit to branch master
in repository josm.

commit 7113a8ae36d745b91c26436eaca4bd0658d28c06
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sun Feb 1 18:39:04 2015 +0100

    Imported Upstream version 0.0.svn7995+dfsg1
---
 .classpath                                         |    2 +-
 .settings/org.eclipse.jdt.core.prefs               |    1 +
 .settings/org.eclipse.jdt.groovy.core.prefs        |    2 +-
 CONTRIBUTION                                       |  166 +-
 README                                             |    4 +-
 REVISION                                           |    8 +-
 build.xml                                          |    9 +-
 data/defaultpresets.xml                            |  454 +--
 data/maps.xsd                                      |   24 +-
 data/projection/epsg                               |   24 +
 data/validator/addresses.mapcss                    |   12 +-
 data/validator/combinations.mapcss                 |   18 +-
 data/validator/deprecated.mapcss                   |   19 +-
 data/validator/geometry.mapcss                     |   48 +-
 data/validator/highway.mapcss                      |    9 +-
 data/validator/multiple.mapcss                     |   88 +-
 data/validator/numeric.mapcss                      |  308 +-
 data_nodist/projection-regression-test-data.csv    |   60 +
 i18n/po/af.po                                      |  376 ++-
 i18n/po/am.po                                      |  376 ++-
 i18n/po/ar.po                                      |  380 ++-
 i18n/po/ast.po                                     |  472 ++-
 i18n/po/az.po                                      |  376 ++-
 i18n/po/be.po                                      |  376 ++-
 i18n/po/bg.po                                      |  388 ++-
 i18n/po/bn.po                                      |  376 ++-
 i18n/po/br.po                                      |  376 ++-
 i18n/po/bs.po                                      |  376 ++-
 i18n/po/ca.po                                      | 1503 +++++----
 i18n/po/ca at valencia.po                             |  410 ++-
 i18n/po/cs.po                                      |  537 ++-
 i18n/po/cy.po                                      |  376 ++-
 i18n/po/da.po                                      |  752 +++--
 i18n/po/de.po                                      |  476 ++-
 i18n/po/de_DE.po                                   |  376 ++-
 i18n/po/el.po                                      |  384 ++-
 i18n/po/en_AU.po                                   |  388 ++-
 i18n/po/en_CA.po                                   |  376 ++-
 i18n/po/en_GB.po                                   |  404 ++-
 i18n/po/eo.po                                      |  378 ++-
 i18n/po/es.po                                      |  876 +++--
 i18n/po/et.po                                      |  766 +++--
 i18n/po/eu.po                                      |  384 ++-
 i18n/po/fa.po                                      |  376 ++-
 i18n/po/fi.po                                      |  396 ++-
 i18n/po/fil.po                                     |  376 ++-
 i18n/po/fr.po                                      |  430 ++-
 i18n/po/gl.po                                      |  574 ++--
 i18n/po/he.po                                      |  380 ++-
 i18n/po/hi.po                                      |  376 ++-
 i18n/po/hr.po                                      |  378 ++-
 i18n/po/ht.po                                      |  376 ++-
 i18n/po/hu.po                                      |  858 +++--
 i18n/po/hy.po                                      |  376 ++-
 i18n/po/ia.po                                      |  376 ++-
 i18n/po/id.po                                      |  406 ++-
 i18n/po/is.po                                      |  384 ++-
 i18n/po/it.po                                      |  727 +++--
 i18n/po/ja.po                                      |  465 ++-
 i18n/po/ka.po                                      |  376 ++-
 i18n/po/km.po                                      | 3412 +++++++++++++-------
 i18n/po/ko.po                                      |  376 ++-
 i18n/po/ky.po                                      |  376 ++-
 i18n/po/lo.po                                      |  376 ++-
 i18n/po/lt.po                                      |  388 ++-
 i18n/po/lv.po                                      |  376 ++-
 i18n/po/mk.po                                      |  376 ++-
 i18n/po/ms.po                                      |  376 ++-
 i18n/po/nb.po                                      |  386 ++-
 i18n/po/nds.po                                     |  376 ++-
 i18n/po/nl.po                                      |  412 ++-
 i18n/po/nn.po                                      |  376 ++-
 i18n/po/oc.po                                      |  378 ++-
 i18n/po/pa.po                                      |  376 ++-
 i18n/po/pl.po                                      | 1253 ++++---
 i18n/po/pt.po                                      |  408 ++-
 i18n/po/pt_BR.po                                   |  430 ++-
 i18n/po/rm.po                                      |  376 ++-
 i18n/po/ro.po                                      |  380 ++-
 i18n/po/ru.po                                      |  440 ++-
 i18n/po/sk.po                                      |  522 ++-
 i18n/po/sl.po                                      |  384 ++-
 i18n/po/sq.po                                      |  376 ++-
 i18n/po/sr.po                                      |  376 ++-
 i18n/po/sv.po                                      |  477 ++-
 i18n/po/ta.po                                      |  376 ++-
 i18n/po/te.po                                      |  376 ++-
 i18n/po/th.po                                      |  376 ++-
 i18n/po/tr.po                                      |  386 ++-
 i18n/po/ug.po                                      |  376 ++-
 i18n/po/uk.po                                      |  444 ++-
 i18n/po/ur.po                                      |  376 ++-
 i18n/po/vi.po                                      |  376 ++-
 i18n/po/zh_CN.po                                   |  400 ++-
 i18n/po/zh_TW.po                                   |  396 ++-
 images/dialogs/geoimage/togglegit.png              |  Bin 0 -> 550 bytes
 images/icons/power_tower_high2.n.16.png            |  Bin 541 -> 0 bytes
 images/icons/power_tower_low.n.16.png              |  Bin 343 -> 0 bytes
 images/presets/State_Public.png                    |  Bin 181 -> 0 bytes
 images/presets/State_Tourist.png                   |  Bin 213 -> 0 bytes
 images/presets/aeroway_gate.png                    |  Bin 496 -> 872 bytes
 images/presets/bar.png                             |  Bin 306 -> 0 bytes
 images/presets/book.png                            |  Bin 394 -> 0 bytes
 images/presets/caravan2.png                        |  Bin 165 -> 0 bytes
 images/presets/cow.png                             |  Bin 167 -> 0 bytes
 images/presets/crossing.png                        |  Bin 179 -> 0 bytes
 images/presets/fishing.png                         |  Bin 157 -> 0 bytes
 images/presets/gasometer.png                       |  Bin 347 -> 435 bytes
 images/presets/gate.png                            |  Bin 118 -> 0 bytes
 images/presets/hostel.png                          |  Bin 318 -> 0 bytes
 images/presets/information.png                     |  Bin 228 -> 0 bytes
 images/presets/marina.png                          |  Bin 394 -> 0 bytes
 images/presets/picnic.png                          |  Bin 324 -> 0 bytes
 images/presets/places.png                          |  Bin 127 -> 0 bytes
 images/presets/power_tower.png                     |  Bin 507 -> 0 bytes
 images/presets/shelter.png                         |  Bin 540 -> 0 bytes
 images/presets/survey_point.png                    |  Bin 355 -> 0 bytes
 images/presets/swimming.png                        |  Bin 144 -> 0 bytes
 images/presets/tent.png                            |  Bin 352 -> 0 bytes
 images/presets/theater.png                         |  Bin 591 -> 712 bytes
 images/presets/tower.png                           |  Bin 101 -> 0 bytes
 images/presets/tree.png                            |  Bin 1731 -> 0 bytes
 images/presets/vending_machine.png                 |  Bin 452 -> 0 bytes
 images/presets/viewpoint.png                       |  Bin 558 -> 0 bytes
 images/presets/water_tower.png                     |  Bin 130 -> 0 bytes
 images/presets/windmill.png                        |  Bin 303 -> 0 bytes
 netbeans/nbproject/genfiles.properties             |   16 +-
 netbeans/nbproject/project.properties              |  176 +-
 netbeans/nbproject/project.xml                     |   32 +-
 .../josm/actions/AbstractSelectAction.java         |   24 +
 .../josm/actions/CreateMultipolygonAction.java     |   33 +-
 .../josm/actions/DownloadAlongAction.java          |  240 +-
 .../josm/actions/JoinAreasAction.java              |    7 +-
 .../josm/actions/OsmPrimitiveAction.java           |   42 +-
 .../openstreetmap/josm/actions/PasteAction.java    |    2 +-
 .../josm/actions/ReportBugAction.java              |   98 +-
 .../josm/actions/SelectByInternalPointAction.java  |   10 +-
 .../openstreetmap/josm/actions/ToggleAction.java   |  264 +-
 .../ToggleUploadDiscouragedLayerAction.java        |   50 +-
 .../openstreetmap/josm/actions/ZoomToAction.java   |  226 +-
 .../DownloadOsmChangeCompressedTask.java           |  108 +-
 .../downloadtasks/DownloadOsmChangeTask.java       |  414 +--
 .../downloadtasks/DownloadOsmCompressedTask.java   |  130 +-
 .../actions/downloadtasks/DownloadOsmUrlTask.java  |   66 +-
 .../actions/downloadtasks/DownloadSessionTask.java |  172 +-
 .../actions/relation/AbstractRelationAction.java   |   80 +-
 .../actions/relation/AddSelectionToRelations.java  |  126 +-
 .../actions/relation/DeleteRelationsAction.java    |   94 +-
 .../actions/relation/DownloadMembersAction.java    |  110 +-
 .../DownloadSelectedIncompleteMembersAction.java   |  151 +-
 .../actions/relation/DuplicateRelationAction.java  |  112 +-
 .../josm/actions/relation/EditRelationAction.java  |  185 +-
 .../relation/SelectInRelationListAction.java       |   64 +-
 .../josm/actions/relation/SelectMembersAction.java |   96 +-
 .../josm/command/conflict/package-info.java        |   12 +-
 .../josm/corrector/ReverseWayNoTagCorrector.java   |  242 +-
 src/org/openstreetmap/josm/data/AutosaveTask.java  |    9 +-
 src/org/openstreetmap/josm/data/Data.java          |   78 +-
 src/org/openstreetmap/josm/data/Preferences.java   |    7 -
 .../josm/data/SystemOfMeasurement.java             |  354 +-
 src/org/openstreetmap/josm/data/ViewportData.java  |  136 +-
 src/org/openstreetmap/josm/data/osm/Changeset.java |   15 +-
 .../josm/data/osm/ChangesetDiscussionComment.java  |  130 +-
 .../josm/data/osm/PrimitiveDeepCopy.java           |   22 +-
 .../visitor/paint/relations/MultipolygonCache.java |  688 ++--
 .../josm/data/preferences/ColorProperty.java       |  110 +-
 .../josm/data/projection/Projections.java          |   12 +-
 .../data/projection/datum/NTV2GridShiftFile.java   |    6 +-
 .../josm/data/validation/PaintVisitor.java         |  564 ++--
 .../validation/routines/AbstractValidator.java     |  102 +-
 .../josm/data/validation/tests/Addresses.java      |   24 +-
 .../data/validation/tests/ApiCapabilitiesTest.java |  110 +-
 .../data/validation/tests/BarriersEntrances.java   |   76 +-
 .../josm/data/validation/tests/Highways.java       |  546 ++--
 .../josm/data/validation/tests/InternetTags.java   |  348 +-
 .../josm/data/validation/tests/PowerLines.java     |  440 +--
 .../data/validation/tests/RelationChecker.java     |    5 +-
 .../josm/data/validation/tests/UntaggedWay.java    |   13 +-
 src/org/openstreetmap/josm/gui/ImageryMenu.java    |  567 ++--
 .../openstreetmap/josm/gui/MapFrameListener.java   |   36 +-
 .../openstreetmap/josm/gui/PleaseWaitRunnable.java |   12 +-
 .../openstreetmap/josm/gui/PopupMenuHandler.java   |  250 +-
 .../openstreetmap/josm/gui/SelectionManager.java   |    2 +-
 .../josm/gui/actionsupport/LogShowDialog.java      |  106 +-
 .../josm/gui/conflict/pair/PairTable.java          |   66 +-
 .../gui/conflict/pair/nodes/NodeListTable.java     |   44 +-
 .../pair/relation/RelationMemberTable.java         |   44 +-
 .../josm/gui/dialogs/ConflictDialog.java           |    8 +-
 .../josm/gui/dialogs/NotesDialog.java              |   14 +
 .../josm/gui/dialogs/SelectionListDialog.java      |   37 +-
 .../josm/gui/dialogs/ValidatorDialog.java          |    8 +-
 .../dialogs/changeset/AbstractCellRenderer.java    |  152 +-
 .../dialogs/changeset/ChangesetCacheManager.java   |    6 +-
 .../changeset/ChangesetDiscussionPanel.java        |  305 +-
 .../ChangesetDiscussionTableCellRenderer.java      |   84 +-
 .../ChangesetDiscussionTableColumnModel.java       |   96 +-
 .../changeset/ChangesetDiscussionTableModel.java   |  110 +-
 .../dialogs/properties/PropertiesCellRenderer.java |  156 +-
 .../josm/gui/dialogs/properties/TagEditHelper.java | 1594 ++++-----
 .../josm/gui/download/DownloadObjectDialog.java    |  230 +-
 .../josm/gui/history/HistoryViewerPanel.java       |  250 +-
 .../josm/gui/history/VersionTable.java             |   29 +-
 .../josm/gui/io/AbstractUploadDialog.java          |  414 +--
 .../josm/gui/io/BasicUploadSettingsPanel.java      |   19 +-
 .../josm/gui/layer/AbstractModifiableLayer.java    |  192 +-
 src/org/openstreetmap/josm/gui/layer/TMSLayer.java |   16 +-
 .../gui/layer/geoimage/CorrelateGpxWithImages.java |    2 +-
 .../josm/gui/layer/geoimage/GeoImageLayer.java     |  186 +-
 .../josm/gui/layer/geoimage/ImageDisplay.java      |   32 +-
 .../josm/gui/layer/geoimage/ImageEntry.java        |    2 +-
 .../josm/gui/layer/geoimage/ImageViewerDialog.java |    2 +-
 .../gui/layer/geoimage/ShowThumbnailAction.java    |   69 +
 .../josm/gui/layer/geoimage/ThumbsLoader.java      |   26 +-
 .../josm/gui/layer/gpx/DateFilterPanel.java        |  274 +-
 .../josm/gui/layer/gpx/DownloadAlongPanel.java     |  390 +--
 .../josm/gui/layer/gpx/GpxDrawHelper.java          | 1094 +++----
 .../openstreetmap/josm/gui/mappaint/StyleKeys.java |   68 +-
 .../gui/preferences/DefaultPreferenceSetting.java  |   40 +-
 .../preferences/DefaultTabPreferenceSetting.java   |  266 +-
 .../josm/gui/preferences/SourceProvider.java       |   18 +-
 .../josm/gui/preferences/SourceType.java           |   30 +-
 .../josm/gui/preferences/SubPreferenceSetting.java |   32 +-
 .../josm/gui/preferences/TabPreferenceSetting.java |  160 +-
 .../preferences/advanced/ExportProfileAction.java  |  170 +-
 .../josm/gui/preferences/advanced/PrefEntry.java   |  220 +-
 .../gui/preferences/advanced/PreferencesTable.java |  724 ++---
 .../gui/preferences/advanced/package-info.java     |   12 +-
 .../josm/gui/preferences/audio/package-info.java   |   12 +-
 .../gui/preferences/display/DisplayPreference.java |   86 +-
 .../josm/gui/preferences/display/package-info.java |   12 +-
 .../gui/preferences/imagery/AddImageryDialog.java  |   86 +-
 .../preferences/imagery/CommonSettingsPanel.java   |  194 +-
 .../gui/preferences/imagery/TMSSettingsPanel.java  |  192 +-
 .../gui/preferences/imagery/WMSSettingsPanel.java  |  224 +-
 .../josm/gui/preferences/imagery/package-info.java |   12 +-
 .../josm/gui/preferences/map/MapPreference.java    |   84 +-
 .../josm/gui/preferences/map/package-info.java     |   12 +-
 .../josm/gui/preferences/package-info.java         |   14 +-
 .../josm/gui/preferences/plugin/package-info.java  |   12 +-
 .../projection/CustomProjectionChoice.java         |    2 +-
 .../gui/preferences/projection/package-info.java   |   12 +-
 .../preferences/remotecontrol/package-info.java    |   12 +-
 .../server/AuthenticationPreference.java           |  116 +-
 .../preferences/server/MessagesNotifierPanel.java  |  196 +-
 .../gui/preferences/server/ProxyPreference.java    |  182 +-
 .../server/ProxyPreferenceListener.java            |   28 +-
 .../josm/gui/preferences/server/package-info.java  |   12 +-
 .../gui/preferences/shortcut/package-info.java     |   12 +-
 .../ValidatorTagCheckerRulesPreference.java        |  422 +--
 .../validator/ValidatorTestsPreference.java        |  278 +-
 .../gui/preferences/validator/package-info.java    |   12 +-
 .../josm/gui/progress/ProgressMonitorExecutor.java |    6 +
 .../josm/gui/tagging/TaggingPresetItems.java       | 3085 +++++++++---------
 .../josm/gui/tagging/TaggingPresetListener.java    |   28 +-
 .../josm/gui/tagging/TaggingPresetReader.java      |  668 ++--
 .../josm/gui/tagging/TaggingPresetSelector.java    | 1120 +++----
 .../josm/gui/tagging/TaggingPresets.java           |  234 +-
 .../josm/gui/util/AdvancedKeyPressDetector.java    |  398 +--
 .../josm/gui/util/HighlightHelper.java             |  272 +-
 .../josm/gui/util/KeyPressReleaseListener.java     |   40 +-
 .../josm/gui/util/ModifierListener.java            |   20 +-
 .../openstreetmap/josm/gui/util/TableHelper.java   |   66 +-
 .../josm/gui/widgets/AbstractFileChooser.java      |  450 +--
 .../josm/gui/widgets/AbstractIdTextField.java      |  178 +-
 .../josm/gui/widgets/ChangesetIdTextField.java     |  178 +-
 .../josm/gui/widgets/DateEditorWithSlider.java     |  254 +-
 .../DisableShortcutsOnFocusGainedTextField.java    |  382 +--
 .../josm/gui/widgets/FileChooserManager.java       |  466 +--
 .../openstreetmap/josm/gui/widgets/ImageLabel.java |  112 +-
 .../josm/gui/widgets/JosmComboBox.java             |  486 +--
 .../josm/gui/widgets/JosmEditorPane.java           |  282 +-
 .../josm/gui/widgets/JosmHTMLEditorKit.java        |  100 +-
 .../josm/gui/widgets/JosmPasswordField.java        |  332 +-
 .../josm/gui/widgets/JosmTextArea.java             |  210 +-
 .../josm/gui/widgets/NativeFileChooser.java        |  352 +-
 .../josm/gui/widgets/OsmPrimitivesTable.java       |  220 +-
 .../josm/gui/widgets/OsmPrimitivesTableModel.java  |   22 +-
 .../josm/gui/widgets/SwingFileChooser.java         |  216 +-
 .../josm/gui/widgets/TextContextualPopupMenu.java  |  370 +--
 src/org/openstreetmap/josm/io/AbstractParser.java  |  416 +--
 src/org/openstreetmap/josm/io/AbstractReader.java  |  410 +--
 src/org/openstreetmap/josm/io/FileWatcher.java     |  324 +-
 .../josm/io/ImportCancelException.java             |   20 +-
 src/org/openstreetmap/josm/io/MessageNotifier.java |  304 +-
 .../josm/io/OfflineAccessException.java            |   34 +-
 src/org/openstreetmap/josm/io/OnlineResource.java  |  100 +-
 src/org/openstreetmap/josm/io/OsmChangeReader.java |  222 +-
 src/org/openstreetmap/josm/io/OsmZipImporter.java  |   56 +-
 .../josm/io/imagery/WMSException.java              |  118 +-
 .../josm/io/remotecontrol/DNSName.java             |  496 +--
 .../io/remotecontrol/RemoteControlHttpsServer.java |  876 ++---
 .../josm/io/remotecontrol/RequestProcessor.java    |  976 +++---
 .../io/remotecontrol/handler/AddNodeHandler.java   |  260 +-
 .../io/remotecontrol/handler/FeaturesHandler.java  |  176 +-
 .../io/remotecontrol/handler/ImageryHandler.java   |  344 +-
 .../io/remotecontrol/handler/ImportHandler.java    |  268 +-
 .../remotecontrol/handler/LoadAndZoomHandler.java  |  596 ++--
 .../io/remotecontrol/handler/RequestHandler.java   |  642 ++--
 .../io/remotecontrol/handler/VersionHandler.java   |  126 +-
 .../josm/io/session/SessionImporter.java           |   80 +-
 .../openstreetmap/josm/plugins/PluginHandler.java  |    1 -
 src/org/openstreetmap/josm/tools/ColorScale.java   |  352 +-
 .../openstreetmap/josm/tools/CompositeList.java    |   70 +-
 src/org/openstreetmap/josm/tools/ExifReader.java   |   63 +
 .../openstreetmap/josm/tools/TextTagParser.java    |  640 ++--
 .../josm/tools/XmlParsingException.java            |  164 +-
 .../josm/tools/date/package-info.java              |   12 +-
 styles/standard/elemstyles.mapcss                  |  337 +-
 taginfoextract.groovy                              |   10 +-
 .../conflict/pair/nodes/NodeListMergerTest.java    |  154 +-
 .../pair/properties/PropertiesMergerTest.java      |  104 +-
 .../pair/relation/RelationMemberMergerTest.java    |  112 +-
 .../josm/gui/conflict/pair/tags/TagMergerTest.java |   80 +-
 .../gui/dialogs/ConflictResolutionDialogTest.java  |  104 +-
 .../changeset/ChangesetCacheManagerTest.java       |   42 +-
 .../changeset/query/ChangesetQueryDialogTest.java  |   44 +-
 .../josm/gui/history/HistoryBrowserTest.java       |  130 +-
 .../josm/io/MultiFetchServerObjectReaderTest.java  |  556 ++--
 .../josm/io/OsmServerBackreferenceReaderTest.java  | 1138 +++----
 .../josm/io/OsmServerHistoryReaderTest.java        |  126 +-
 .../josm/io/UploadStrategySelectionPanelTest.java  |  134 +-
 .../josm/data/osm/RoundingPerformanceTest.java     |   96 +-
 test/unit/org/openstreetmap/josm/JOSMFixture.java  |  226 +-
 .../josm/actions/AlignInLineActionTest.java        |  382 +--
 .../josm/actions/JoinAreasActionTest.java          |   90 +-
 .../josm/corrector/ReverseWayTagCorrectorTest.java |  196 +-
 .../org/openstreetmap/josm/data/BoundsTest.java    |   86 +-
 .../openstreetmap/josm/data/coor/LatLonTest.java   |  246 +-
 .../josm/data/osm/APIDataSetTest.java              |  522 +--
 .../josm/data/osm/ChangesetCacheTest.groovy        |  332 +-
 .../josm/data/osm/DataSetMergerTest.java           | 1998 ++++++------
 .../josm/data/osm/OsmPrimitiveKeyHandlingTest.java |  290 +-
 .../openstreetmap/josm/data/osm/RelationTest.java  |  212 +-
 .../josm/data/osm/history/HistoryNodeTest.java     |  104 +-
 .../josm/data/osm/history/HistoryWayTest.java      |  208 +-
 .../visitor/MergeSourceBuildingVisitorTest.java    |  818 ++---
 .../data/projection/ProjectionRegressionTest.java  |    9 +-
 .../data/validation/tests/DuplicateNodeTest.java   |   92 +-
 .../data/validation/tests/InternetTagsTest.java    |  158 +-
 .../josm/gui/DefaultNameFormatterTest.java         |  234 +-
 .../josm/gui/JosmUserIdentityManagerTest.groovy    |  628 ++--
 .../josm/gui/SystemOfMeasurementTest.java          |  256 +-
 .../gui/conflict/nodes/NodeListMergeModelTest.java | 1446 ++++-----
 .../properties/PropertiesMergeModelTest.java       |  284 +-
 .../josm/gui/conflict/tags/TagMergeItemTest.java   |  302 +-
 .../josm/gui/conflict/tags/TagMergeModelTest.java  |  464 +--
 .../josm/io/ChangesetQueryUrlParserTest.groovy     |  438 +--
 .../josm/io/DiffResultProcessorTest.groovy         |  390 +--
 .../josm/io/OsmChangeBuilderTest.groovy            |  412 +--
 .../josm/io/OsmChangesetContentParserTest.groovy   |  432 +--
 .../josm/io/ParseWithChangesetReaderTest.groovy    |  420 +--
 .../josm/io/remotecontrol/RemoteControlTest.java   |  302 +-
 .../josm/io/session/SessionReaderTest.java         |  224 +-
 .../josm/io/session/SessionWriterTest.java         |  374 +--
 .../josm/tools/BugReportExceptionHandlerTest.java  |  114 +-
 .../openstreetmap/josm/tools/ExifReaderTest.java   |  149 +-
 .../josm/tools/ImageProviderTest.java              |   82 +-
 .../org/openstreetmap/josm/tools/UtilsTest.java    |  256 +-
 358 files changed, 53859 insertions(+), 38050 deletions(-)

diff --git a/.classpath b/.classpath
index bbf3acb..43e9d84 100644
--- a/.classpath
+++ b/.classpath
@@ -13,7 +13,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="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_72"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_76"/>
 	<classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/commons-collections-3.2.jar"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/commons-lang-2.3.jar"/>
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 7ce4ded..412d513 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -6,6 +6,7 @@ org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annota
 org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=1.7
diff --git a/.settings/org.eclipse.jdt.groovy.core.prefs b/.settings/org.eclipse.jdt.groovy.core.prefs
index a68b5bf..f8dc8b1 100644
--- a/.settings/org.eclipse.jdt.groovy.core.prefs
+++ b/.settings/org.eclipse.jdt.groovy.core.prefs
@@ -1,2 +1,2 @@
 eclipse.preferences.version=1
-groovy.compiler.level=-1
+groovy.compiler.level=23
diff --git a/CONTRIBUTION b/CONTRIBUTION
index 8dbae3e..df5de61 100644
--- a/CONTRIBUTION
+++ b/CONTRIBUTION
@@ -1,83 +1,83 @@
-JOSM was originally designed and coded by Immanuel Scholz,
-and is now maintained by the OpenStreetMap community.
-
-The current JOSM maintainer is Dirk Stöcker.
-A lot of administration work is done by Paul Hartmann and Vincent Privat.
-
-Major code contributions from (in alphabetical order):
-
-Stefan Breunig
-David Earl
-Gabriel Ebner
-Dave Hansen
-Paul Hartmann
-Karl Guggisberg
-Matthias Julius
-Alexei Kasatkin
-Jiri Klement
-Ulf Lamping
-Simon Legner
-Raphael Mack
-Upliner Mikhalych
-Vincent Privat
-Frederik Ramm
-Dirk Stöcker
-
-Many minor contributions and patches by others; see SVN history
-at http://josm.openstreetmap.de/svn/ for details. Use
-"josm-dev AT openstreetmap.org" to contact still active authors.
-
-The logo has been designed by Ilya Palikov.
-
-Copyright rests with the contributors.
-
--------------------------------- EXTERNAL CODE --------------------------------
-
-The jpeg metadata extraction code is from Drew Noakes
-(http://code.google.com/p/metadata-extractor/) and licensed
-with Apache license version 2.0.
-
-The Bzip2 code is from Apache Commons Compress and licensed
-with Apache license version 2.0.
-
-The signpost code (http://code.google.com/p/oauth-signpost/)
-is from Matthias Käppler and licensed with the Apache License 2.0.
-
-The mail/url validator routines use code from Apache Commons
-Validator which is licensed with Apache license version 2.0.
-
-The NTv2 transformation code (http://jgridshift.sourceforge.net/)
-is from Peter Yuill and licensed with LGPL.
-
-The MultiSplitPane is from Hans Muller and licensed with LGPL
-(https://today.java.net/pub/a/today/2006/03/23/multi-split-pane.html).
-
-The Alphanum Algorithm is from David Koelle and license with LGPL
-(http://www.davekoelle.com/alphanum.html)
-
-The Diff code (http://www.bmsi.com/java/#diff) 
-is from Stuart D. Gathman and licensed with GPL.
-
-The Ellipsoid code (http://www.i3s.unice.fr/~johan/gps/)
-is from Johan Montagnat and licensed with GPL.
-
-The JSON code (https://java.net/projects/jsonp/)
-is from Oracle (RI for JSR 353: Java API for JSON Processing) 
-and licensed with GPL / classpath exception.
-
-The opening hour validation uses code from opening_hour.js
-(https://github.com/ypid/opening_hours.js) which is licensed
-with the New (2-clause) BSD license.
-
------------------------------------- ICONS ------------------------------------
-
-Most icons have been nicked from GNOME and the GIMP, both under GPL. 
-Some are originally LGPL but redistributed here under GPL. 
-
-The keyboard icon comes fom:
-- source: http://www.iconfinder.net/index.php?q=key&page=icondetails&iconid=8553&size=128&q=key&s12=on&s16=on&s22=on&s32=on&s48=on&s64=on&s128=on
-- licence: GPL
-- designer: Paolino, http://www.paolinoland.it/
-- original filename: keyboard.png
-- original size: 128x128
-- modifications: icon was cropped, then resized
+JOSM was originally designed and coded by Immanuel Scholz,
+and is now maintained by the OpenStreetMap community.
+
+The current JOSM maintainer is Dirk Stöcker.
+A lot of administration work is done by Paul Hartmann and Vincent Privat.
+
+Major code contributions from (in alphabetical order):
+
+Stefan Breunig
+David Earl
+Gabriel Ebner
+Dave Hansen
+Paul Hartmann
+Karl Guggisberg
+Matthias Julius
+Alexei Kasatkin
+Jiri Klement
+Ulf Lamping
+Simon Legner
+Raphael Mack
+Upliner Mikhalych
+Vincent Privat
+Frederik Ramm
+Dirk Stöcker
+
+Many minor contributions and patches by others; see SVN history
+at http://josm.openstreetmap.de/svn/ for details. Use
+"josm-dev AT openstreetmap.org" to contact still active authors.
+
+The logo has been designed by Ilya Palikov.
+
+Copyright rests with the contributors.
+
+-------------------------------- EXTERNAL CODE --------------------------------
+
+The jpeg metadata extraction code is from Drew Noakes
+(http://code.google.com/p/metadata-extractor/) and licensed
+with Apache license version 2.0.
+
+The Bzip2 code is from Apache Commons Compress and licensed
+with Apache license version 2.0.
+
+The signpost code (http://code.google.com/p/oauth-signpost/)
+is from Matthias Käppler and licensed with the Apache License 2.0.
+
+The mail/url validator routines use code from Apache Commons
+Validator which is licensed with Apache license version 2.0.
+
+The NTv2 transformation code (http://jgridshift.sourceforge.net/)
+is from Peter Yuill and licensed with LGPL.
+
+The MultiSplitPane is from Hans Muller and licensed with LGPL
+(https://today.java.net/pub/a/today/2006/03/23/multi-split-pane.html).
+
+The Alphanum Algorithm is from David Koelle and license with LGPL
+(http://www.davekoelle.com/alphanum.html)
+
+The Diff code (http://www.bmsi.com/java/#diff) 
+is from Stuart D. Gathman and licensed with GPL.
+
+The Ellipsoid code (http://www.i3s.unice.fr/~johan/gps/)
+is from Johan Montagnat and licensed with GPL.
+
+The JSON code (https://java.net/projects/jsonp/)
+is from Oracle (RI for JSR 353: Java API for JSON Processing) 
+and licensed with GPL / classpath exception.
+
+The opening hour validation uses code from opening_hour.js
+(https://github.com/ypid/opening_hours.js) which is licensed
+with the New (2-clause) BSD license.
+
+------------------------------------ ICONS ------------------------------------
+
+Most icons have been nicked from GNOME and the GIMP, both under GPL. 
+Some are originally LGPL but redistributed here under GPL. 
+
+The keyboard icon comes fom:
+- source: http://www.iconfinder.net/index.php?q=key&page=icondetails&iconid=8553&size=128&q=key&s12=on&s16=on&s22=on&s32=on&s48=on&s64=on&s128=on
+- licence: GPL
+- designer: Paolino, http://www.paolinoland.it/
+- original filename: keyboard.png
+- original size: 128x128
+- modifications: icon was cropped, then resized
diff --git a/README b/README
index 6a04b73..368f6f2 100644
--- a/README
+++ b/README
@@ -114,8 +114,8 @@ This is an overview of the files and directories in the JOSM code repository:
     - performance/          performance tests (source code)
     - unit/                 unit tests (source code)
 - tools/                    libraries and tools that help in the development process
-    - animal-sniffer-ant-tasks-1.11.jar
-                            TODO: what is this?
+    - animal-sniffer-ant-tasks-1.13.jar
+                            used to build and check code signatures to ensure plugins binary compatibility 
     - appbundler-1.0ea.jar  used to build Mac OS X package for Oracle Java 7
     - findbugs/             libs and config files for findbugs (automatically detects common bugs and potential
                             problems in source code); can be launched as an ant target in build.xml
diff --git a/REVISION b/REVISION
index f2ad7dd..1a96431 100644
--- a/REVISION
+++ b/REVISION
@@ -1,18 +1,18 @@
 <?xml version="1.0"?>
 <info>
 <entry
+   kind="dir"
    path="trunk"
-   revision="7906"
-   kind="dir">
+   revision="7995">
 <url>http://josm.openstreetmap.de/svn/trunk</url>
 <repository>
 <root>http://josm.openstreetmap.de/svn</root>
 <uuid>0c6e7542-c601-0410-84e7-c038aed88b3b</uuid>
 </repository>
 <commit
-   revision="7906">
+   revision="7995">
 <author>Don-vip</author>
-<date>2014-12-28T23:13:58.752464Z</date>
+<date>2015-01-31T14:17:59.510945Z</date>
 </commit>
 </entry>
 </info>
diff --git a/build.xml b/build.xml
index e611844..6a4281f 100644
--- a/build.xml
+++ b/build.xml
@@ -278,7 +278,7 @@ Build-Date: ${build.tstamp}
             <include name="**/*.jar"/>
         </fileset>
         <pathelement path="dist/josm-custom.jar"/>
-        <pathelement path="tools/groovy-all-2.3.9.jar"/>
+        <pathelement path="tools/groovy-all-2.4.0.jar"/>
     </path>
     <macrodef name="init-test-preferences">
         <attribute name="testfamily"/>
@@ -325,7 +325,7 @@ Build-Date: ${build.tstamp}
         </sequential>
     </macrodef>
     <target name="test-compile" depends="test-init,dist">
-        <taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpath="tools/groovy-all-2.3.9.jar"/>
+        <taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" classpath="tools/groovy-all-2.4.0.jar"/>
         <call-groovyc testfamily="unit">
             <cp-elements>
                 <path refid="test.classpath"/>
@@ -448,7 +448,7 @@ Build-Date: ${build.tstamp}
         <local name="plugins"/>
         <property name="dir" value="plugin-check"/>
         <typedef uri="antlib:org.codehaus.mojo.animal_sniffer">
-            <classpath path="tools/animal-sniffer-ant-tasks-1.11.jar"/>
+            <classpath path="tools/animal-sniffer-ant-tasks-1.13.jar"/>
         </typedef>
         <mkdir dir="${dir}"/>
         <!-- List of deprecated plugins -->
@@ -520,6 +520,7 @@ Build-Date: ${build.tstamp}
             <ignore classname="au.edu.*"/>
             <ignore classname="au.com.*"/>
             <ignore classname="com.*"/>
+            <ignore classname="de.miethxml.*"/>
             <ignore classname="javax.*"/>
             <ignore classname="jogamp.*"/>
             <ignore classname="junit.*"/>
@@ -530,6 +531,7 @@ Build-Date: ${build.tstamp}
             <ignore classname="org.dom4j.*"/>
             <ignore classname="org.hsqldb.*"/>
             <ignore classname="org.ibex.*"/>
+            <ignore classname="org.iso_relax.*"/>
             <ignore classname="org.jaitools.*"/>
             <ignore classname="org.jaxen.*"/>
             <ignore classname="org.jdom2.*"/>
@@ -541,6 +543,7 @@ Build-Date: ${build.tstamp}
             <ignore classname="org.slf4j.*"/>
         	<!-- plugins used by another ones -->
             <ignore classname="org.openstreetmap.josm.plugins.geotools.*"/>
+            <ignore classname="org.openstreetmap.josm.plugins.jna.*"/>
             <ignore classname="org.openstreetmap.josm.plugins.jts.*"/>
             <ignore classname="org.openstreetmap.josm.plugins.log4j.*"/>
             <ignore classname="org.openstreetmap.josm.plugins.utilsplugin2.*"/>
diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index 38f42a8..951060d 100644
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -322,6 +322,7 @@
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:highway=motorway"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Tag:highway=motorway"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:highway=motorway"
+                  ko.href="http://wiki.openstreetmap.org/wiki/Ko:Tag:highway=motorway"
                   nl.href="http://wiki.openstreetmap.org/wiki/NL:Tag:highway=motorway"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:highway=motorway"
                   pt.href="http://wiki.openstreetmap.org/wiki/Pt:Tag:highway=motorway"
@@ -377,6 +378,7 @@
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:highway=trunk"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Tag:highway=trunk"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:highway=trunk"
+                  ko.href="http://wiki.openstreetmap.org/wiki/Ko:Tag:highway=trunk"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:highway=trunk"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:highway=trunk"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:highway=trunk"
@@ -401,13 +403,7 @@
             </optional>
         </item> <!-- Trunk -->
         <item name="Trunk Link" icon="presets/trunk.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Link_(highway)"
-                  de.href="http://wiki.openstreetmap.org/wiki/DE:Link_(highway)"
-                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Link_(highway)"
-                  it.href="http://wiki.openstreetmap.org/wiki/IT:Link_(highway)"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Link_(highway)"
-                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Link_(highway)"
-                  uk.href="http://wiki.openstreetmap.org/wiki/Uk:Link_(highway)" />
+            <link href="http://wiki.openstreetmap.org/wiki/Link_(highway)" />
             <space />
             <key key="highway" value="trunk_link" />
             <text key="ref" text="Reference" />
@@ -674,6 +670,20 @@
                 <check key="lit" text="Lit" />
             </optional>
         </item> <!-- Parking Aisle -->
+        <item name="Escape" icon="presets/way_unclassified.png" type="way" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=escape"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:highway=escape"
+                  es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:highway=escape"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:highway=escape" />
+            <space />
+            <key key="highway" value="escape" />
+            <label text="Emergency lane beside long descending slopes for trucks and other vehicles to stop safely after brake failure." />
+            <optional>
+                <reference ref="surface" />
+                <text key="width" text="Width (meters)" />
+                <check key="lit" text="Lit" />
+            </optional>
+        </item> <!-- Escape -->
         <item name="Road (Unknown Type)" icon="presets/way_unclassified.png" type="way,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=road"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:highway=road"
@@ -700,6 +710,7 @@
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Key:construction"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:construction" />
             <key key="highway" value="construction" />
+            <combo key="construction" text="Highway type" values="motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,secondary_link,tertiary,tertiary_link,unclassified,residential,service,bus_guideway,bridleway,living_street,pedestrian,track,path,footway,cycleway,steps" values_context="Highway" />
             <optional>
                 <text key="name" text="Name" />
                 <reference ref="highway_base" />
@@ -769,7 +780,7 @@
                   sv.href="http://wiki.openstreetmap.org/wiki/Sv:Tag:junction=roundabout" />
             <space />
             <key key="junction" value="roundabout" />
-            <combo key="highway" text="Type" values="motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,living_street,service,bus_guideway,construction" />
+            <combo key="highway" text="Type" values="motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,living_street,service,bus_guideway,construction" values_context="Highway" />
             <optional>
                 <reference ref="name_layer" />
                 <combo key="lanes" text="Lanes" values="1,2,3,4,5" length="3" />
@@ -894,7 +905,7 @@
             <check key="oneway:bicycle" text="Oneway (bicycle)" />
             <space />
             <optional text="Edit Highway Attributes:">
-                <combo key="highway" text="Highway" values="motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,living_street,service,bus_guideway,construction" />
+                <combo key="highway" text="Highway" values="motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,living_street,service,bus_guideway,construction" values_context="Highway" />
                 <check key="oneway" text="Oneway" />
             </optional>
         </item> <!-- Cycle Lane/Track -->
@@ -1119,6 +1130,7 @@
         </item> <!-- Traffic Calming -->
         <item name="Passing Place" icon="presets/passingplace.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=passing_place"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:highway=passing_place"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:highway=passing_place"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:highway=passing_place" />
             <key key="highway" value="passing_place" />
@@ -1155,6 +1167,7 @@
                   az.href="http://wiki.openstreetmap.org/wiki/Az:Tag:highway=speed_camera"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:highway=speed_camera"
                   fi.href="http://wiki.openstreetmap.org/wiki/Fi:Tag:highway=speed_camera"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:highway=speed_camera"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:highway=speed_camera"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:highway=speed_camera"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:highway=speed_camera" />
@@ -1169,7 +1182,8 @@
             <key key="highway" value="traffic_mirror" />
         </item> <!-- Traffic Mirror -->
         <item name="Named Junction" name_context="junction=yes" type="node,closedway" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:junction=yes" />
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:junction=yes"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:junction=yes" />
             <key key="junction" value="yes" />
             <label text="Used in some countries for a named road junction who’s name serves for local orientation." />
             <text key="name" text="Name" />
@@ -1193,6 +1207,7 @@
         <separator/>
         <item name="Mountain Pass" icon="presets/mountain_pass.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:mountain_pass"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Key:mountain_pass"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Key:mountain_pass"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:mountain_pass"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Key:mountain_pass"
@@ -1346,6 +1361,7 @@
         </item> <!-- Wall -->
         <item name="City Wall" icon="presets/city_wall.png" type="way,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:barrier=city_wall"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:barrier=city_wall"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:barrier=city_wall"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:barrier=city_wall"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:barrier=city_wall" />
@@ -1716,7 +1732,7 @@
             <key key="waterway" value="dam" />
             <reference ref="name_wikipedia" />
         </item> <!-- Dam -->
-        <item name="Groyne" icon="presets/groyne.png" type="node,way,closedway" preset_name_label="true">
+        <item name="Groyne" icon="presets/groyne.png" type="way,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=groyne"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=groyne"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:man_made=groyne"
@@ -1851,6 +1867,7 @@
         <item name="Mud" icon="presets/mud.png" type="closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=mud"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=mud"
+                  es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:natural=mud"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:natural=mud" />
             <label text="Large area covered with mud." />
             <space />
@@ -1927,7 +1944,7 @@
             </optional>
         </item> <!-- Ferry Route -->
         <separator/>
-        <item name="Marina" icon="presets/marina.png" type="node,closedway" preset_name_label="true">
+        <item name="Marina" icon="styles/standard/nautical/marina.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:leisure=marina"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:leisure=marina"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Tag:leisure=marina"
@@ -1939,7 +1956,7 @@
             <key key="leisure" value="marina" />
             <text key="name" text="Name" />
         </item> <!-- Marina -->
-        <item name="Pier" icon="presets/pier.png" type="way,closedway" preset_name_label="true">
+        <item name="Pier" icon="presets/pier.png" type="node,way,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=pier"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=pier"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:man_made=pier"
@@ -1994,6 +2011,7 @@
             <link href="http://wiki.openstreetmap.org/wiki/Tag:waterway=dock"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:waterway=dock"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:waterway=dock"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:waterway=dock"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:waterway=dock"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:waterway=dock" />
             <space />
@@ -2062,6 +2080,7 @@
         <item name="Subway" icon="presets/rail_light.png" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:railway=subway"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:railway=subway"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:railway=subway"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:railway=subway"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:railway=subway"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:railway=subway" />
@@ -2138,7 +2157,7 @@
                 <combo key="crossing:barrier" text="Barrier" values="yes,no,half,full,double_half" values_context="crossing:barrier" />
             </optional>
         </item> <!-- Level Crossing -->
-        <item name="Crossing" icon="presets/crossing.png" type="node" preset_name_label="true">
+        <item name="Crossing" icon="styles/standard/vehicle/crossing.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:crossing"
                   bg.href="http://wiki.openstreetmap.org/wiki/Bg:Key:crossing"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Key:crossing"
@@ -2179,36 +2198,13 @@
         </item> <!-- Railway Switch -->
     </group> <!-- Railway -->
     <group name="Aerialway" icon="presets/aerialway.png">
-        <item name="Chair Lift" icon="presets/chair_lift.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=chair_lift"
-                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:aerialway=chair_lift" />
-            <space />
-            <key key="aerialway" value="chair_lift" />
-            <reference ref="name_ref" />
-            <optional>
-                <text key="aerialway:capacity" text="Number of people per hour" />
-                <text key="aerialway:occupancy" text="Number of people per chair" />
-                <text key="aerialway:duration" text="Typical journey time in minutes" />
-                <check key="aerialway:bubble" text="Has bubble?" />
-                <check key="aerialway:heating" text="Has heating?" />
-            </optional>
-        </item> <!-- Chair Lift -->
-        <item name="Drag Lift" icon="presets/drag_lift.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=drag_lift" />
-            <space />
-            <key key="aerialway" value="drag_lift" />
-            <reference ref="name_ref" />
-            <optional>
-                <text key="aerialway:capacity" text="Number of people per hour" />
-                <text key="aerialway:duration" text="Typical journey time in minutes" />
-            </optional>
-        </item> <!-- Drag Lift -->
         <item name="Cable Car" icon="presets/cable_car.png" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=cable_car"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:aerialway=cable_car"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:aerialway=cable_car"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:aerialway=cable_car"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:aerialway=cable_car"
+                  ko.href="http://wiki.openstreetmap.org/wiki/Ko:Tag:aerialway=cable_car"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:aerialway=cable_car"
                   sv.href="http://wiki.openstreetmap.org/wiki/Sv:Tag:aerialway=cable_car" />
             <space />
@@ -2221,6 +2217,20 @@
                 <check key="aerialway:heating" text="Has heating?" />
             </optional>
         </item> <!-- Cable Car -->
+		<item name="Chair Lift" icon="presets/chair_lift.png" type="way" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=chair_lift"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:aerialway=chair_lift" />
+            <space />
+            <key key="aerialway" value="chair_lift" />
+            <reference ref="name_ref" />
+            <optional>
+                <text key="aerialway:capacity" text="Number of people per hour" />
+                <text key="aerialway:occupancy" text="Number of people per chair" />
+                <text key="aerialway:duration" text="Typical journey time in minutes" />
+                <check key="aerialway:bubble" text="Has bubble?" />
+                <check key="aerialway:heating" text="Has heating?" />
+            </optional>
+        </item> <!-- Chair Lift -->
         <item name="Gondola" icon="presets/aerialway.png" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=gondola" />
             <space />
@@ -2233,7 +2243,7 @@
                 <check key="aerialway:heating" text="Has heating?" />
             </optional>
         </item> <!-- Gondola -->
-        <item name="Mixed Lift" type="way" preset_name_label="true">
+        <item name="Mixed Lift" icon="styles/standard/transport/aerialway/mixed_lift.png" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=mixed_lift" />
             <space />
             <key key="aerialway" value="mixed_lift" />
@@ -2246,47 +2256,17 @@
                 <check key="aerialway:heating" text="Has heating?" />
             </optional>
         </item> <!-- Mixed Lift -->
-        <item name="T-bar Lift" icon="presets/drag_lift.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=t-bar" />
-            <space />
-            <key key="aerialway" value="t-bar" />
-            <reference ref="name_ref" />
-            <optional>
-                <text key="aerialway:capacity" text="Number of people per hour" />
-                <text key="aerialway:duration" text="Typical journey time in minutes" />
-            </optional>
-        </item> <!-- T-bar Lift -->
-        <item name="J-bar Lift" icon="presets/drag_lift.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=j-bar" />
-            <space />
-            <key key="aerialway" value="j-bar" />
-            <reference ref="name_ref" />
-            <optional>
-                <text key="aerialway:capacity" text="Number of people per hour" />
-                <text key="aerialway:duration" text="Typical journey time in minutes" />
-            </optional>
-        </item> <!-- J-bar Lift -->
-        <item name="Platter Lift" icon="presets/drag_lift.png" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=platter" />
-            <space />
-            <key key="aerialway" value="platter" />
-            <reference ref="name_ref" />
-            <optional>
-                <text key="aerialway:capacity" text="Number of people per hour" />
-                <text key="aerialway:duration" text="Typical journey time in minutes" />
-            </optional>
-        </item> <!-- Platter Lift -->
-        <item name="Rope Tow" type="way" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=rope_tow" />
+        <item name="Drag Lift" icon="presets/drag_lift.png" type="way" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=drag_lift" />
             <space />
-            <key key="aerialway" value="rope_tow" />
+            <combo key="aerialway" text="Type" values="drag_lift,t-bar,j-bar,platter,rope_tow" display_values="drag_lift (general type - use only if exact type (see values below) is unknown),t-bar,j-bar,platter,rope_tow" match="keyvalue" />
             <reference ref="name_ref" />
             <optional>
                 <text key="aerialway:capacity" text="Number of people per hour" />
                 <text key="aerialway:duration" text="Typical journey time in minutes" />
             </optional>
-        </item> <!-- Rope Tow -->
-        <item name="Magic Carpet" type="way" preset_name_label="true">
+        </item> <!-- Drag Lift -->
+        <item name="Magic Carpet" icon="styles/standard/transport/aerialway/magic_carpet.png" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=magic_carpet" />
             <space />
             <key key="aerialway" value="magic_carpet" />
@@ -2313,7 +2293,7 @@
             <key key="aerialway" value="station" />
             <text key="name" text="Name" />
         </item> <!-- Station -->
-        <item name="Pylon" icon="presets/power_tower.png" type="node" preset_name_label="true">
+        <item name="Pylon" icon="styles/standard/transport/aerialway/pylon.svg" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:aerialway=pylon" />
             <space />
             <key key="aerialway" value="pylon" />
@@ -2396,7 +2376,7 @@
                   zh_TW.href="http://wiki.openstreetmap.org/wiki/Zh-hant:Tag:amenity=fuel" />
             <space />
             <key key="amenity" value="fuel" />
-            <combo key="brand" text="Brand" values="Agip,Aral,Avia,BP,Chevron,Citgo,Esso,Exxon,Gulf,Mobil,OMV,Petro-Canada,Pioneer,Q8,Repsol,Shell,Sunoco,Statoil,Tamoil,Texaco,Total,Independent" values_searchable="true" />
+            <combo key="brand" text="Brand" values="Agip,Aral,Avia,BP,Chevron,Citgo,Eni,Esso,Exxon,Gulf,Mobil,OMV,Petro-Canada,Pioneer,Q8,Repsol,Shell,Socar,Statoil,Sunoco,Tamoil,Texaco,Total,Independent" values_searchable="true" />
             <optional>
                 <text key="name" text="Name" />
                 <text key="operator" text="Operator" />
@@ -2621,6 +2601,16 @@
             <text key="name" text="Name" />
             <reference ref="link_contact" />
         </item> <!-- Rental -->
+        <item name="Public Bicycle Repair Station" icon="styles/standard/vehicle/bicycle_repair_station.svg" type="node,closedway" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=bicycle_repair_station"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=bicycle_repair_station" />
+            <space />
+            <key key="amenity" value="bicycle_repair_station" />
+            <optional>
+            <reference ref="name_operator_oh" />
+            <check key="service:bicycle:pump" text="Free bicycle pump" />
+            </optional>
+        </item> <!-- Public Bicycle Repair Station -->
     </group> <!-- Bicycle -->
     <group name="Public Transport" icon="presets/bus.png">
         <item name="Public Transport Route" icon="presets/path.png" type="relation" preset_name_label="true">
@@ -2640,7 +2630,7 @@
                 <combo key="colour" text="Color (HTML name or hexadecimal code)" values_context="color" values="black,brown,green,red,blue,gray,white,#CD853F" />
             </optional>
             <roles>
-                <role key="" text="route segment" requisite="required" type="way" member_expression="highway OR railway OR waterway OR aerialway" />
+                <role key="" text="route segment" requisite="required" type="way,closedway" member_expression="highway OR railway OR waterway OR aerialway" />
                 <role key="stop" text="stop position" requisite="optional" type="node" member_expression="public_transport=stop_position" />
                 <role key="stop_exit_only" text="stop position (exit only)" requisite="optional" type="node" member_expression="public_transport=stop_position" />
                 <role key="stop_entry_only" text="stop position (entry only)" requisite="optional" type="node" member_expression="public_transport=stop_position" />
@@ -2771,7 +2761,7 @@
                 <check key="bicycle" text="Bicycle" />
             </optional>
         </item> <!-- Subway Entrance -->
-        <item name="Ticket Machine" icon="presets/vending_machine.png" type="node" preset_name_label="true">
+        <item name="Ticket Machine" icon="styles/standard/transport/ticket-machine.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=vending_machine"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=vending_machine"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=vending_machine"
@@ -2802,9 +2792,9 @@
                 <combo key="colour" text="Color (HTML name or hexadecimal code)" values_context="color" values="black,brown,green,red,blue,gray,white,#CD853F" />
             </optional>
             <roles>
-                <role key="" text="route segment" requisite="optional" type="way" />
-                <role key="forward" text="forward segment" requisite="optional" type="way" />
-                <role key="backward" text="backward segment" requisite="optional" type="way" />
+                <role key="" text="route segment" requisite="optional" type="way,closedway" />
+                <role key="forward" text="forward segment" requisite="optional" type="way,closedway" />
+                <role key="backward" text="backward segment" requisite="optional" type="way,closedway" />
                 <role key="stop" text="halt point" requisite="optional" type="node" member_expression="highway=bus_stop OR railway=station OR railway=halt OR railway=tram_stop" />
                 <role key="forward_stop" text="forward halt point" requisite="optional" type="node" member_expression="highway=bus_stop OR railway=station OR railway=halt OR railway=tram_stop" />
                 <role key="backward_stop" text="backward halt point" requisite="optional" type="node" member_expression="highway=bus_stop OR railway=station OR railway=halt OR railway=tram_stop" />
@@ -2976,7 +2966,8 @@
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:aeroway=hangar"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:aeroway=hangar"
                   pt.href="http://wiki.openstreetmap.org/wiki/Pt:Tag:aeroway=hangar" />
-            <key key="building" value="hangar" />
+            <key key="aeroway" value="hangar" />
+            <combo key="building" text="Building" values="hangar,yes" values_context="building" default="hangar" values_searchable="true" />
         </item> <!-- Hangar -->
         <item name="Beacon" icon="styles/standard/misc/landmark/beacon.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=beacon"
@@ -3017,7 +3008,7 @@
   </group> <!-- Transport -->
   <group name="Facilities" icon="presets/bed.png">
     <group name="Accommodation" icon="presets/bed.png">
-        <item name="Hotel" icon="presets/bed.png" type="node,closedway" preset_name_label="true">
+        <item name="Hotel" icon="styles/standard/accommodation.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=hotel"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=hotel"
                   fi.href="http://wiki.openstreetmap.org/wiki/Fi:Tag:tourism=hotel"
@@ -3082,7 +3073,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Chalet -->
-        <item name="Hostel" icon="presets/hostel.png" type="node,closedway" preset_name_label="true">
+        <item name="Hostel" icon="styles/standard/accommodation/hostel.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=hostel"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=hostel"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:tourism=hostel"
@@ -3116,7 +3107,7 @@
             <reference ref="contact" />
         </item> <!-- Alpine Hut -->
         <separator/>
-        <item name="Caravan Site/RV Park" icon="presets/caravan2.png" type="node,closedway" preset_name_label="true">
+        <item name="Caravan Site/RV Park" icon="styles/standard/accommodation/camping/caravan.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=caravan_site"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=caravan_site"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:tourism=caravan_site"
@@ -3135,7 +3126,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Caravan Site/RV Park -->
-        <item name="Camping Site" icon="presets/tent.png" type="node,closedway" preset_name_label="true">
+        <item name="Camping Site" icon="styles/standard/accommodation/camping.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=camp_site"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=camp_site"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:tourism=camp_site"
@@ -3191,7 +3182,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Fast Food -->
-        <item name="Food Court" icon="presets/fastfood.png" type="node,closedway" preset_name_label="true">
+        <item name="Food Court" icon="presets/restaurant.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=food_court"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=food_court"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:amenity=food_court"
@@ -3256,7 +3247,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Beer Garden -->
-        <item name="Bar" icon="presets/bar.png" type="node,closedway" preset_name_label="true">
+        <item name="Bar" icon="styles/standard/food/bar.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=bar"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=bar"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:amenity=bar"
@@ -3273,7 +3264,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Bar -->
-        <item name="Night Club" icon="presets/bar.png" type="node,closedway" preset_name_label="true">
+        <item name="Night Club" icon="styles/standard/leisure/discoball.svg" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=nightclub"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:amenity=nightclub"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=nightclub"
@@ -3292,7 +3283,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Night Club -->
-        <item name="Strip Club" icon="styles/standard/leisure/stripclub.png" type="node,closedway" preset_name_label="true">
+        <item name="Strip Club" icon="styles/standard/leisure/nightclub.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=stripclub"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:amenity=stripclub"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=stripclub"
@@ -3316,7 +3307,7 @@
             <key key="tourism" value="attraction" />
             <reference ref="name_oh" />
         </item> <!-- Attraction -->
-        <item name="Viewpoint" icon="presets/viewpoint.png" type="node,closedway" preset_name_label="true">
+        <item name="Viewpoint" icon="styles/standard/sightseeing/viewpoint.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=viewpoint"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=viewpoint"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:tourism=viewpoint"
@@ -3407,7 +3398,7 @@
                 <label text="... other transportation modes possible" />
             </optional>
         </item> <!-- Guidepost -->
-        <item name="Information Terminal" icon="presets/information.png" type="node" preset_name_label="true">
+        <item name="Information Terminal" icon="styles/standard/misc/information.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:information"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Key:information"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:information"
@@ -3424,7 +3415,7 @@
             <reference ref="fee" />
             <reference ref="internet" />
         </item> <!-- Information Terminal -->
-        <item name="Audio Guide" icon="presets/information.png" type="node" preset_name_label="true">
+        <item name="Audio Guide" icon="styles/standard/misc/information.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:information"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Key:information"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:information"
@@ -3443,7 +3434,7 @@
             <label text="Audioguide via mobile phone?" />
             <text key="phone" text="Phone number" />
         </item> <!-- Audio Guide -->
-        <item name="Other Information Point" icon="presets/information.png" type="node,closedway" preset_name_label="true">
+        <item name="Other Information Point" icon="styles/standard/misc/information.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=information"
                   cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:tourism=information"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=information"
@@ -3514,7 +3505,7 @@
             <space />
             <reference ref="contact" />
         </item> <!-- Amusement/Theme Park -->
-        <item name="Water Park" icon="presets/swimming.png" type="node,closedway" preset_name_label="true">
+        <item name="Water Park" icon="styles/standard/leisure/water_park.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:leisure=water_park"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:leisure=water_park"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:leisure=water_park"
@@ -3584,7 +3575,7 @@
             <key key="leisure" value="playground" />
             <text key="name" text="Name" />
         </item> <!-- Playground -->
-        <item name="Picnic Site" icon="presets/picnic.png" type="node,closedway" preset_name_label="true">
+        <item name="Picnic Site" icon="styles/standard/leisure/picnic.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=picnic_site"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=picnic_site"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:tourism=picnic_site"
@@ -3596,13 +3587,13 @@
             <text key="name" text="Name" />
             <check key="fireplace" text="Fireplace" />
         </item> <!-- Picnic Site -->
-        <item name="Picnic Table" icon="presets/picnic.png" type="node" preset_name_label="true">
+        <item name="Picnic Table" icon="styles/standard/leisure/picnic.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:leisure=picnic_table" />
             <space />
             <key key="leisure" value="picnic_table" />
             <check key="covered" text="Covered" />
         </item> <!-- Picnic Table -->
-        <item name="Public Grill" icon="presets/bbq.png" type="node" preset_name_label="true">
+        <item name="Public Grill" icon="presets/bbq.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=bbq"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=bbq"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=bbq"
@@ -3623,7 +3614,7 @@
             <key key="leisure" value="firepit" />
             <text key="name" text="Name" />
         </item> <!-- Firepit -->
-        <item name="Fishing" icon="presets/fishing.png" type="node,closedway" preset_name_label="true">
+        <item name="Fishing" icon="styles/standard/sport/fishing.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:leisure=fishing"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:leisure=fishing"
                   pt.href="http://wiki.openstreetmap.org/wiki/Pt:Tag:leisure=fishing"
@@ -3632,7 +3623,7 @@
             <key key="leisure" value="fishing" />
             <text key="name" text="Name" />
         </item> <!-- Fishing -->
-        <item name="Private Swimming Pool" icon="presets/swimming.png" type="node,closedway" preset_name_label="true">
+        <item name="Private Swimming Pool" icon="styles/standard/sport/pool.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:leisure=swimming_pool"
                   ca.href="http://wiki.openstreetmap.org/wiki/Ca:Tag:leisure=swimming_pool"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:leisure=swimming_pool"
@@ -3646,9 +3637,10 @@
         </item> <!-- Private Swimming Pool -->
     </group> <!-- Leisure -->
     <group name="Culture" icon="presets/theater.png">
-        <item name="Museum" icon="presets/State_Public.png" type="node,closedway" preset_name_label="true">
+        <item name="Museum" icon="styles/standard/sightseeing/museum.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:tourism=museum"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:tourism=museum"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:tourism=museum"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:tourism=museum"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:tourism=museum"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:tourism=museum"
@@ -3671,7 +3663,7 @@
             <reference ref="name_operator" />
             <reference ref="link_contact" />
         </item> <!-- Theatre -->
-        <item name="Library" icon="styles/standard/shop/rental/library.png" type="node,closedway,relation" preset_name_label="true">
+        <item name="Library" icon="styles/standard/shop/library.png" type="node,closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=library"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=library"
                   et.href="http://wiki.openstreetmap.org/wiki/Et:Tag:amenity=library"
@@ -3861,7 +3853,7 @@
             <reference ref="service_times" />
             <reference ref="oh" />
         </item> <!-- Shinto Shrine -->
-        <item name="Other Place of Worship" type="node,closedway,relation" preset_name_label="true">
+        <item name="Other Place of Worship" icon="styles/standard/religion.png" type="node,closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=place_of_worship"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:amenity=place_of_worship"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=place_of_worship"
@@ -4149,9 +4141,9 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:amenity=pharmacy" />
             <space />
             <key key="amenity" value="pharmacy" />
-            <text key="name" text="Name" />
-            <combo key="dispensing" text="Dispensing" values="yes,no" default="no" />
-            <reference ref="oh" />
+            <reference ref="name_operator_oh" />
+            <combo key="dispensing" text="Dispensing" values="yes,no" />
+            <combo key="wheelchair" text="Wheelchairs" values="no,limited,yes" />
             <reference ref="link_contact" />
         </item> <!-- Pharmacy -->
         <item name="Hearing Aids" icon="presets/hearing_aids.png" type="node,closedway" preset_name_label="true">
@@ -4278,10 +4270,11 @@
             <reference ref="payment_base" />
             <check key="payment:telephone_cards" text="Telephone cards" />
         </item> <!-- Telephone -->
-        <item name="Emergency Phone" icon="presets/telephone.png" type="node" preset_name_label="true">
+        <item name="Emergency Phone" icon="styles/standard/vehicle/emergency_phone.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:emergency=phone"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:emergency=phone"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:emergency=phone"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:emergency=phone"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:emergency=phone" />
             <key key="emergency" value="phone" />
         </item> <!-- Emergency Phone -->
@@ -4367,6 +4360,7 @@
         </item> <!-- Waste Basket/Trash Can -->
         <item name="Waste Disposal/Dumpster" icon="styles/standard/service/recycling/waste_disposal.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=waste_disposal"
+                  es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:amenity=waste_disposal"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:amenity=waste_disposal"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=waste_disposal"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:amenity=waste_disposal"
@@ -4375,7 +4369,7 @@
             <key key="amenity" value="waste_disposal" />
         </item> <!-- Waste Disposal/Dumpster -->
         <separator/>
-        <item name="Bench" icon="presets/bench.png" type="node" preset_name_label="true">
+        <item name="Bench" icon="presets/bench.png" type="node,way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=bench"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=bench"
                   et.href="http://wiki.openstreetmap.org/wiki/Et:Tag:amenity=bench"
@@ -4395,7 +4389,7 @@
             <combo key="colour" text="Color (HTML name or hexadecimal code)" values_context="color" values="black,brown,green,red,blue,gray,white,#CD853F" />
             <combo key="seats" text="Amount of Seats" values="2,3,4,5,6,7,8,9,10" />
         </item> <!-- Bench -->
-        <item name="Shelter" icon="presets/shelter.png" type="node,closedway" preset_name_label="true">
+        <item name="Shelter" icon="styles/standard/accommodation/shelter.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=shelter"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=shelter"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:amenity=shelter"
@@ -4938,6 +4932,7 @@
             <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=raceway"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:highway=raceway"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:highway=raceway"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:highway=raceway"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:highway=raceway"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:highway=raceway"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:highway=raceway" />
@@ -4964,7 +4959,7 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:building"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Key:building" />
             <space />
-            <combo key="building" text="Building" values="yes,roof,garage,garages,industrial,school,hangar,commercial,farm,transportation,greenhouse,office,university,hospital,warehouse,retail,shed,cowshed,construction" values_context="building" default="yes" match="keyvalue!" values_searchable="true" />
+            <combo key="building" text="Building" values="yes,roof,garage,garages,industrial,school,hangar,commercial,barn,farm_auxiliary,transportation,greenhouse,office,university,hospital,warehouse,retail,shed,cowshed,construction" values_context="building" default="yes" match="keyvalue!" values_searchable="true" />
             <text key="name" text="Name" />
         </item> <!-- Building -->
         <item name="Residential Building" icon="styles/standard/misc/landmark/building.png" type="node,closedway,relation" preset_name_label="true">
@@ -4982,7 +4977,7 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:building"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Key:building" />
             <space />
-            <combo key="building" text="Building" values="residential,apartments,house,hut,dormitory,terrace,detached,roof" default="residential" match="keyvalue!" values_context="building" values_searchable="true" />
+            <combo key="building" text="Building" values="residential,apartments,house,hut,dormitory,terrace,detached,farm,roof" default="residential" match="keyvalue!" values_context="building" values_searchable="true" />
             <text key="name" text="Name" />
         </item> <!-- Residential Building -->
         <item name="Entrance" icon="styles/standard/misc/entrance-yes.png" type="node" preset_name_label="true">
@@ -5002,7 +4997,7 @@
                 <text key="addr:flats" text="Flat numbers" />
             </optional>
         </item> <!-- Entrance -->
-        <item name="Tower" icon="presets/tower.png" type="node,closedway" preset_name_label="true">
+        <item name="Tower" icon="styles/standard/misc/landmark/tower.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=tower"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=tower"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=tower"
@@ -5026,12 +5021,13 @@
             <key key="man_made" value="flagpole" />
         </item> <!-- Flagpole -->
         <separator/>
-        <item name="Works" icon="presets/works.png" type="node,closedway" preset_name_label="true">
+        <item name="Works" icon="styles/standard/misc/landmark/works.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=works"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=works"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:man_made=works"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:man_made=works"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:man_made=works" />
+                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:man_made=works"
+                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:man_made=works" />
             <space />
             <key key="man_made" value="works" />
             <text key="name" text="Name" />
@@ -5044,7 +5040,7 @@
             <reference ref="name_operator" />
             <text key="height" text="Height (meters)" />
         </item> <!-- Chimney -->
-        <item name="Windmill" icon="presets/windmill.png" type="node,closedway" preset_name_label="true">
+        <item name="Windmill" icon="styles/standard/misc/landmark/windmill.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=windmill"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=windmill"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=windmill"
@@ -5092,6 +5088,7 @@
         </item> <!-- Crane -->
         <item name="Mineshaft" icon="presets/mineshaft.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=mineshaft"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:man_made=mineshaft"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=mineshaft"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:man_made=mineshaft"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:man_made=mineshaft"
@@ -5108,6 +5105,7 @@
         </item> <!-- Mineshaft -->
         <item name="Adit" icon="presets/adit.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=adit"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:man_made=adit"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=adit"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=adit"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:man_made=adit"
@@ -5131,7 +5129,7 @@
             <key key="man_made" value="embankment" />
         </item> <!-- Embankment -->
         <separator/>
-        <item name="Water Tower" icon="presets/water_tower.png" type="node,closedway" preset_name_label="true">
+        <item name="Water Tower" icon="styles/standard/misc/landmark/water_tower.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=water_tower"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=water_tower"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=water_tower"
@@ -5188,7 +5186,7 @@
             <key key="amenity" value="fountain" />
             <text key="name" text="Name" />
         </item> <!-- Fountain -->
-        <item name="Water Well" icon="presets/water_well.png" type="node" preset_name_label="true">
+        <item name="Water Well" icon="presets/water_well.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=water_well"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=water_well"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=water_well"
@@ -5211,7 +5209,7 @@
             <key key="man_made" value="lighthouse" />
             <text key="name" text="Name" />
         </item> <!-- Lighthouse -->
-        <item name="Beacon" icon="styles/standard/misc/landmark/beacon.png" type="node" preset_name_label="true">
+        <item name="Beacon" icon="styles/standard/misc/landmark/beacon.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=beacon"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:man_made=beacon"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:man_made=beacon" />
@@ -5264,7 +5262,7 @@
                 <check key="display:digital" text="Digital" />
             </checkgroup>
         </item> <!-- Monitoring Station -->
-        <item name="Survey Point" icon="presets/survey_point.png" type="node" preset_name_label="true">
+        <item name="Survey Point" icon="styles/standard/misc/landmark/survey_point.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:man_made=survey_point"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:man_made=survey_point"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:man_made=survey_point"
@@ -5330,7 +5328,7 @@
             <combo key="bridge:movable" text="Type" values="bascule,drawbridge,lift,submersible,swing,transporter" match="key" />
             <reference ref="optional_bridge" />
         </item> <!-- Movable Bridge -->
-        <item name="Bridge Support" icon="presets/bridge.png" type="node,closedway" preset_name_label="true">
+        <item name="Bridge Support" icon="styles/standard/transport/bridge/support.svg" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:bridge:support" />
             <space />
             <combo key="bridge:support" text="Type" values="pier,abutment,lift_pier,pivot_pier" match="key" />
@@ -5646,7 +5644,7 @@
             <reference ref="ref_operator_branch" />
         </item> <!-- Cable Distribution Cabinet -->
         <separator/>
-        <item name="Power Tower" icon="icons/power_tower_high2.n.16.png" type="node" preset_name_label="true">
+        <item name="Power Tower" icon="styles/standard/misc/landmark/power/tower_small.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:power=tower"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:power=tower"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:power=tower"
@@ -5671,7 +5669,7 @@
                 <check key="design:incomplete" text="Incomplete tower" />
             </optional>
         </item> <!-- Power Tower -->
-        <item name="Pole" icon="icons/power_tower_low.n.16.png" type="node" preset_name_label="true">
+        <item name="Pole" icon="styles/standard/misc/landmark/power/pole.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:power=pole"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:power=pole"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:power=pole"
@@ -5686,7 +5684,7 @@
             <combo key="material" text="Material" values="metal,plastic,steel,stone,wood,concrete" />
             <reference ref="ref_operator_branch" />
         </item> <!-- Pole -->
-        <item name="Pole with Transformer" icon="icons/power_tower_low.n.16.png" type="node" preset_name_label="true">
+        <item name="Pole with Transformer" icon="styles/standard/misc/landmark/power/pole.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:power=pole"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:power=pole"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:power=pole"
@@ -5746,8 +5744,8 @@
             </optional>
         </item> <!-- Power Cable -->
     </group> <!-- Power -->
-    <group name="Historic Places" icon="presets/State_Tourist.png">
-        <item name="Castle" icon="presets/State_Tourist.png" type="node,closedway" preset_name_label="true">
+    <group name="Historic Places" icon="styles/standard/sightseeing/castle.svg">
+        <item name="Castle" icon="styles/standard/sightseeing/castle.svg" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:historic=castle"
                   cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:historic=castle"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:historic=castle"
@@ -5770,6 +5768,7 @@
         <item name="Archaeological Site" icon="styles/standard/sightseeing/archaeological.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:historic=archaeological_site"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:historic=archaeological_site"
+                  it.href="http://wiki.openstreetmap.org/wiki/IT:Tag:historic=archaeological_site"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:historic=archaeological_site"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:historic=archaeological_site"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:historic=archaeological_site" />
@@ -5924,7 +5923,7 @@
             <reference ref="name_oh" />
             <reference ref="link_contact" />
         </item> <!-- Bakery -->
-        <item name="Butcher" icon="presets/cow.png" type="node,closedway" preset_name_label="true">
+        <item name="Butcher" icon="styles/standard/shop/groceries/butcher.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=butcher"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:shop=butcher"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:shop=butcher"
@@ -5962,6 +5961,7 @@
         </item> <!-- Deli (Fine Food) -->
         <item name="Candy Store" icon="presets/confectionery.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=confectionery"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:shop=confectionery"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:shop=confectionery"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:shop=confectionery"
                   it.href="http://wiki.openstreetmap.org/wiki/IT:Tag:shop=confectionery"
@@ -6036,6 +6036,7 @@
         <separator/>
         <item name="Organic" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Key:organic"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Key:organic"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Key:organic"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:organic" />
             <space />
@@ -6047,7 +6048,7 @@
             <combo text="Fair Trade" key="fair_trade" values="no,yes,only" match="key" />
         </item> <!-- Fair Trade -->
         <separator/>
-        <item name="Alcohol" icon="styles/standard/shop/beverages.png" type="node,closedway" preset_name_label="true">
+        <item name="Alcohol" icon="styles/standard/shop/alcohol.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=alcohol"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:shop=alcohol"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:shop=alcohol"
@@ -6118,7 +6119,7 @@
             <combo key="organic" text="Organic" values="only,yes,no" />
             <reference ref="link_contact" />
         </item> <!-- Shoes -->
-        <item name="Outdoor" icon="presets/tent.png" type="node,closedway" preset_name_label="true">
+        <item name="Outdoor" icon="styles/standard/shop/outdoor.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=outdoor"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:shop=outdoor"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:shop=outdoor"
@@ -6129,7 +6130,7 @@
             <reference ref="name_oh" />
             <reference ref="link_contact" />
         </item> <!-- Outdoor -->
-        <item name="Sports" icon="presets/rowing.png" type="node,closedway" preset_name_label="true">
+        <item name="Sports" icon="styles/standard/sport/multi.png" type="node,closedway" preset_name_label="true">
              <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=sports"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:shop=sports"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:shop=sports" />
@@ -6162,21 +6163,7 @@
         </item> <!-- Laundry -->
         <item name="Tailor" icon="styles/standard/shop/tailor.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=tailor"
-                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Key:shop"
-                  de.href="http://wiki.openstreetmap.org/wiki/DE:Key:shop"
-                  es.href="http://wiki.openstreetmap.org/wiki/ES:Key:shop"
-                  fi.href="http://wiki.openstreetmap.org/wiki/Fi:Key:shop"
-                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:shop"
-                  hr.href="http://wiki.openstreetmap.org/wiki/Hr:Key:shop"
-                  hu.href="http://wiki.openstreetmap.org/wiki/Hu:Key:shop"
-                  it.href="http://wiki.openstreetmap.org/wiki/IT:Key:shop"
-                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:shop"
-                  nl.href="http://wiki.openstreetmap.org/wiki/NL:Key:shop"
-                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Key:shop"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Key:shop"
-                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:shop"
-                  sk.href="http://wiki.openstreetmap.org/wiki/Sk:Key:shop"
-                  tr.href="http://wiki.openstreetmap.org/wiki/Tr:Key:shop" />
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:shop=tailor" />
             <space />
             <key key="shop" value="tailor" />
             <reference ref="name_oh" />
@@ -6431,7 +6418,7 @@
             <key key="shop" value="copyshop" />
             <reference ref="name_operator_oh" />
         </item> <!-- Copy Shop -->
-        <item name="Book Store" icon="presets/book.png" type="node,closedway" preset_name_label="true">
+        <item name="Book Store" icon="styles/standard/shop/book.svg" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=books"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:shop=books"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:shop=books"
@@ -6466,6 +6453,7 @@
     <group name="Other" icon="styles/standard/shop/mall.png">
         <item name="Department Store" icon="styles/standard/shop/mall.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:shop=department_store"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:shop=department_store"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:shop=department_store"
                   nl.href="http://wiki.openstreetmap.org/wiki/NL:Tag:shop=department_store"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:shop=department_store"
@@ -6725,7 +6713,7 @@
         </item> <!-- Funeral Directors -->
     </group> <!-- Other -->
         <separator/>
-    <item name="Vending Machine" icon="presets/vending_machine.png" type="node" preset_name_label="true">
+    <item name="Vending Machine" icon="styles/standard/transport/ticket-machine.png" type="node" preset_name_label="true">
         <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=vending_machine"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=vending_machine"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:amenity=vending_machine"
@@ -6735,7 +6723,6 @@
         <multiselect key="vending" text="Vending products" values="animal_food;bicycle_tube;cigarettes;condoms;drinks;excrement_bags;food;news_papers;parking_tickets;photos;public_transport_plans;public_transport_tickets;SIM-cards;stamps;sweets;tampons;telephone_vouchers;toys;vouchers" values_searchable="true" />
         <text key="operator" text="Operator" />
         <text key="ref" text="Reference number" />
-        <text key="note" text="Note" />
         <reference ref="payment_account" />
     </item> <!-- Vending Machine -->
   </group> <!-- Shops -->
@@ -6791,7 +6778,7 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:boundary=protected_area" />
             <space />
             <key key="boundary" value="protected_area" />
-            <text key="protected_class" text="Protected Class" length="2" />
+            <text key="protect_class" text="Protect Class" length="2" />
             <text key="protection_title" text="Title or type of protection" />
             <optional>
                 <reference ref="name_operator_oh" />
@@ -6800,40 +6787,45 @@
             </optional>
         </item> <!-- Protected Area -->
     </group> <!-- Boundaries -->
-    <group name="Places" icon="presets/places.png">
-        <item name="Continent" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+    <group name="Places" icon="styles/standard/place/settlement/isolated_dwelling.png">
+        <item name="Continent" icon="styles/standard/place/settlement/capital.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=continent"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=continent"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=continent"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=continent" />
             <space />
             <key key="place" value="continent" />
             <reference ref="name_wikipedia" />
-        </item> <!-- Places -->
-        <item name="Country" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        </item> <!-- Continent -->
+        <item name="Country" icon="styles/standard/place/settlement/capital.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=country"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=country"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=country"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=country" />
             <space />
             <key key="place" value="country" />
             <reference ref="name_wikipedia" />
         </item> <!-- Country -->
-        <item name="State" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="State" icon="styles/standard/place/settlement/capital.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=state"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=state"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=state"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=state" />
             <space />
             <key key="place" value="state" />
             <reference ref="name_wikipedia" />
         </item> <!-- State -->
-        <item name="Region" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="Region" icon="styles/standard/place/settlement/capital.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=region"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=region" />
             <space />
             <key key="place" value="region" />
             <reference ref="name_wikipedia" />
         </item> <!-- Region -->
-        <item name="County" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="County" icon="styles/standard/place/settlement/capital.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=county"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=county"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=county"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=county" />
             <space />
             <key key="place" value="county" />
@@ -6841,10 +6833,11 @@
             <reference ref="population_postcode_website" />
         </item> <!-- County -->
         <separator/>
-        <item name="City" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="City" icon="styles/standard/place/settlement/city.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=city"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=city"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:place=city"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=city"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:place=city"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=city"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:place=city" />
@@ -6853,7 +6846,7 @@
             <reference ref="name_wikipedia" />
             <reference ref="population_postcode_website" />
         </item> <!-- City -->
-        <item name="Town" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="Town" icon="styles/standard/place/settlement/town.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=town"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:place=town"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=town"
@@ -6866,19 +6859,7 @@
             <reference ref="name_wikipedia" />
             <reference ref="population_postcode_website" />
         </item> <!-- Town -->
-        <item name="Suburb" icon="presets/places.png" type="node,closedway" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:place=suburb"
-                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=suburb"
-                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=suburb"
-                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:place=suburb"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=suburb"
-                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:place=suburb" />
-            <space />
-            <key key="place" value="suburb" />
-            <reference ref="name_wikipedia" />
-            <reference ref="population_postcode_website" />
-        </item> <!-- Suburb -->
-        <item name="Village" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="Village" icon="styles/standard/place/settlement/village.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=village"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:place=village"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=village"
@@ -6893,7 +6874,7 @@
             <reference ref="name_wikipedia" />
             <reference ref="population_postcode_website" />
         </item> <!-- Village -->
-        <item name="Hamlet" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="Hamlet" icon="styles/standard/place/settlement/hamlet.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=hamlet"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:place=hamlet"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=hamlet"
@@ -6906,18 +6887,7 @@
             <reference ref="name_wikipedia" />
             <reference ref="population_postcode_website" />
         </item> <!-- Hamlet -->
-        <item name="Farm" icon="presets/places.png" type="node,closedway" preset_name_label="true">
-            <link href="http://wiki.openstreetmap.org/wiki/Tag:place=farm"
-                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:place=farm"
-                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=farm" />
-            <space />
-            <label text="A farm within a bigger settlement" />
-            <label text="(please use isolated_dwelling for an isolated farm)" />
-            <key key="place" value="farm" />
-            <reference ref="name_wikipedia" />
-            <reference ref="population_postcode_website" />
-        </item> <!-- Farm -->
-        <item name="Isolated Dwelling" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <item name="Isolated Dwelling" icon="styles/standard/place/settlement/isolated_dwelling.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=isolated_dwelling"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=isolated_dwelling"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:place=isolated_dwelling"
@@ -6929,7 +6899,20 @@
             <reference ref="name_wikipedia" />
             <reference ref="population_postcode_website" />
         </item> <!-- Isolated Dwelling -->
-        <item name="Neighbourhood" icon="presets/places.png" type="node,closedway" preset_name_label="true">
+        <separator/>
+        <item name="Suburb" icon="styles/standard/place/settlement/suburb.png" type="node,closedway" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:place=suburb"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=suburb"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:place=suburb"
+                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:place=suburb"
+                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=suburb"
+                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:place=suburb" />
+            <space />
+            <key key="place" value="suburb" />
+            <reference ref="name_wikipedia" />
+            <reference ref="population_postcode_website" />
+        </item> <!-- Suburb -->
+        <item name="Neighbourhood" icon="styles/standard/place/settlement/neighbourhood.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=neighbourhood"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:place=neighbourhood"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:place=neighbourhood"
@@ -6942,6 +6925,17 @@
             <text key="population" text="Population" />
             <text key="website" text="Website" />
         </item> <!-- Neighbourhood -->
+        <item name="Farm" icon="styles/standard/place/settlement/farm.png" type="node,closedway" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:place=farm"
+                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:place=farm"
+                  pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:place=farm" />
+            <space />
+            <label text="A farm within a bigger settlement" />
+            <label text="(please use isolated_dwelling for an isolated farm)" />
+            <key key="place" value="farm" />
+            <reference ref="name_wikipedia" />
+            <reference ref="population_postcode_website" />
+        </item> <!-- Farm -->
         <separator/>
         <item name="Locality" icon="presets/locality.png" type="node,closedway" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:place=locality"
@@ -6959,6 +6953,7 @@
     <group name="Geography" icon="presets/peak.svg">
         <item name="Peak" icon="presets/peak.svg" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=peak"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:natural=peak"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=peak"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:natural=peak"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:natural=peak"
@@ -7010,7 +7005,9 @@
         </item> <!-- Volcano -->
         <item name="Cave Entrance" icon="presets/cave_entrance.png" type="node,closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=cave_entrance"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:natural=cave_entrance"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=cave_entrance"
+                  es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:natural=cave_entrance"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:natural=cave_entrance"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:natural=cave_entrance" />
             <label text="The entrance to a cave." />
@@ -7044,6 +7041,7 @@
         </item> <!-- Islet -->
         <item name="Ridge" icon="presets/empty.png" type="way,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=ridge"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:natural=ridge"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=ridge"
                   pl.href="http://wiki.openstreetmap.org/wiki/Pl:Tag:natural=ridge"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:natural=ridge" />
@@ -7054,8 +7052,8 @@
             <text key="ele" text="Elevation" />
         </item> <!-- Ridge -->
     </group> <!-- Geography -->
-    <group name="Nature" icon="presets/tree.png">
-        <item name="Tree" icon="presets/tree.png" type="node" preset_name_label="true">
+    <group name="Nature" icon="styles/standard/misc/landmark/trees.png">
+        <item name="Tree" icon="styles/standard/misc/landmark/trees.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=tree"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=tree"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:natural=tree"
@@ -7079,7 +7077,7 @@
                 <reference ref="leaf" />
             </optional>
         </item> <!-- Tree -->
-        <item name="Tree Row" icon="presets/tree.png" type="way" preset_name_label="true">
+        <item name="Tree Row" icon="styles/standard/misc/landmark/tree_row.svg" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=tree_row"
                   cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:natural=tree_row"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=tree_row"
@@ -7097,7 +7095,7 @@
                 <reference ref="leaf" />
             </optional>
         </item> <!-- Tree Row -->
-        <item name="Wood" icon="styles/standard/misc/landmark/trees.png" type="closedway,relation" preset_name_label="true">
+        <item name="Wood" icon="styles/standard/misc/landmark/forest.svg" type="closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=wood"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=wood"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:natural=wood"
@@ -7110,7 +7108,7 @@
             <text key="name" text="Name" />
             <reference ref="leaf" />
         </item> <!-- Wood -->
-        <item name="Forest" icon="styles/standard/misc/landmark/trees.png" type="closedway,relation" preset_name_label="true">
+        <item name="Forest" icon="styles/standard/misc/landmark/forest.svg" type="closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:landuse=forest"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:landuse=forest"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:landuse=forest"
@@ -7203,8 +7201,9 @@
             <key key="natural" value="heath" />
             <text key="name" text="Name" />
         </item> <!-- Heath -->
-        <item name="Sand" icon="presets/empty.png" type="closedway,relation" preset_name_label="true">
+        <item name="Sand" icon="styles/standard/misc/sand.svg" type="closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=sand"
+                  es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:natural=sand"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:natural=sand"
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:natural=sand" />
             <label text="Large area covered with sand." />
@@ -7224,6 +7223,7 @@
         </item> <!-- Bare Rock -->
         <item name="Stone" icon="presets/empty.png" type="node,closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=stone"
+                  cs.href="http://wiki.openstreetmap.org/wiki/Cs:Tag:natural=stone"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:natural=stone"
                   fr.href="http://wiki.openstreetmap.org/wiki/FR:Tag:natural=stone"
                   pt_BR.href="http://wiki.openstreetmap.org/wiki/Pt-br:Tag:natural=stone" />
@@ -7697,6 +7697,59 @@
             <text key="wikipedia" text="Wikipedia" />
             <text key="image" text="Image" />
         </item> <!-- Contact (Schema with 'contact:*' Prefix) -->
+        <item name="Description" type="node,way,closedway,relation" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Key:description"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Key:description"
+                  fi.href="http://wiki.openstreetmap.org/wiki/Fi:Key:description"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:description"
+                  it.href="http://wiki.openstreetmap.org/wiki/IT:Key:description"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:description"
+                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:description" />
+            <space />
+            <label text="A short text with additional information." text_context="description=*" />
+            <label text="It might be viewable to the end user (perhaps using a search system or a map with pop-ups)." text_context="description=*" />
+            <space />
+            <text key="description" text="Description" match="key" />
+            <space />
+            <label text="Similar but different tags:" text_context="note=*, fixme=*, description=*" />
+            <preset_link preset_name="Note" />
+            <preset_link preset_name="Fixme" />
+        </item> <!-- Description -->
+        <item name="Note" icon="styles/standard/misc/note-annotation.png" name_context="the tag note=*" type="node,way,closedway,relation" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Key:note"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Key:note"
+                  fi.href="http://wiki.openstreetmap.org/wiki/Fi:Key:note"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:note"
+                  it.href="http://wiki.openstreetmap.org/wiki/IT:Key:note"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:note"
+                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Key:note"
+                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:note" />
+            <space />
+            <label text="An important hint for other mappers (not for the end user)." text_context="note=*" />
+            <space />
+            <text key="note" text="Note" text_context="the tag note=*" match="key" />
+            <space />
+            <label text="Similar but different tags:" text_context="note=*, fixme=*, description=*" />
+            <preset_link preset_name="Fixme" />
+            <preset_link preset_name="Description" />
+        </item> <!-- Note -->
+        <item name="Fixme" icon="styles/standard/misc/fixme-annotation.png" type="node,way,closedway,relation" preset_name_label="true">
+            <link href="http://wiki.openstreetmap.org/wiki/Key:fixme"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Key:fixme"
+                  fr.href="http://wiki.openstreetmap.org/wiki/FR:Key:fixme"
+                  ja.href="http://wiki.openstreetmap.org/wiki/JA:Key:fixme"
+                  pl.href="http://wiki.openstreetmap.org/wiki/Pl:Key:fixme"
+                  ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:fixme"
+                  zh_TW.href="http://wiki.openstreetmap.org/wiki/Zh-hant:Key:fixme" />
+            <space />
+            <label text="A hint for other mappers (not for the end user), that an object needs an improvement."  text_context="fixme=*"/>
+            <space />
+            <text key="fixme" text="Fixme" match="key" />
+            <space />
+            <label text="Similar but different tags:" text_context="note=*, fixme=*, description=*" />
+            <preset_link preset_name="Note" />
+            <preset_link preset_name="Description" />
+        </item> <!-- Fixme -->
     </group> <!-- Annotation -->
     <group name="Relations" icon="presets/relations.png">
         <item name="Multipolygon" icon="presets/multipolygon.png" type="relation" preset_name_label="true">
@@ -7806,6 +7859,7 @@
         <group name="Routes">
             <item name="Bicycle Route" icon="presets/path.png" type="relation" preset_name_label="true">
                 <link href="http://wiki.openstreetmap.org/wiki/Tag:route=bicycle"
+                  de.href="http://wiki.openstreetmap.org/wiki/DE:Cycle_routes"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Cycle_routes"
                   sk.href="http://wiki.openstreetmap.org/wiki/Sk:Cycle_routes"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Cycle_routes" />
@@ -7818,7 +7872,9 @@
                     <reference ref="route_hikebike_optionals" />
                 </optional>
                 <roles>
-                    <role key="" text="route segment" requisite="required" type="way"/>
+                    <role key="" text="route segment" requisite="required" type="way,closedway"/>
+                    <role key="forward" text="forward segment" requisite="optional" type="way,closedway" />
+                    <role key="backward" text="backward segment" requisite="optional" type="way,closedway" />
                 </roles>
             </item> <!-- Bicycle Route -->
             <item name="Mountain Biking Route" icon="presets/path.png" type="relation" preset_name_label="true">
@@ -7838,7 +7894,9 @@
                     <reference ref="route_hikebike_optionals" />
                 </optional>
                 <roles>
-                    <role key="" text="route segment" requisite="required" type="way" member_expression="highway=path OR highway=track"/>
+                    <role key="" text="route segment" requisite="required" type="way,closedway" member_expression="highway=path OR highway=track"/>
+                    <role key="forward" text="forward segment" requisite="optional" type="way,closedway" />
+                    <role key="backward" text="backward segment" requisite="optional" type="way,closedway" />
                 </roles>
             </item> <!-- Mountain Biking Route -->
             <item name="Hiking Route" icon="presets/path.png" type="relation" preset_name_label="true">
@@ -7859,7 +7917,7 @@
                     <reference ref="route_hikebike_optionals" />
                 </optional>
                 <roles>
-                    <role key="" text="route segment" requisite="required" type="way" member_expression="highway=path OR highway=footway OR highway=track"/>
+                    <role key="" text="route segment" requisite="required" type="way,closedway" member_expression="highway=path OR highway=footway OR highway=track"/>
                     <role key="" text="infrastructure" requisite="optional" type="node,closedway" member_expression="tourism OR amenity"/>
                     <role key="" text="natural" requisite="optional" type="node,closedway" member_expression="natural=peak OR natural=volcano OR mountain_pass=yes OR natural=water OR tourism=viewpoint OR amenity=drinking_water OR natural=spring OR place=locality"/>
                 </roles>
@@ -7919,7 +7977,7 @@
                     <text key="detour" text="Ref of the way this is a detour to"/>
                 </optional>
                 <roles>
-                    <role key="" text="route segment" requisite="required" type="way"/>
+                    <role key="" text="route segment" requisite="required" type="way,closedway"/>
                     <role key="fork" text="fork node for alternative routes" requisite="optional" type="node"/>
                 </roles>
             </item> <!-- Detour Route -->
@@ -7959,10 +8017,10 @@
                 <text key="operator" text="Operator" />
                 <text key="distance" text="Distance (km)"/>
                 <roles>
-                    <role key="" text="route segment" requisite="optional" type="way" member_expression="highway"/>
-                    <role key="forward" text="forward segment" requisite="optional" type="way" member_expression="highway"/>
-                    <role key="backward" text="backward segment" requisite="optional" type="way" member_expression="highway"/>
-                    <role key="link" text="link segment" requisite="optional" type="way" member_expression="highway"/>
+                    <role key="" text="route segment" requisite="optional" type="way,closedway" member_expression="highway"/>
+                    <role key="forward" text="forward segment" requisite="optional" type="way,closedway" member_expression="highway"/>
+                    <role key="backward" text="backward segment" requisite="optional" type="way,closedway" member_expression="highway"/>
+                    <role key="link" text="link segment" requisite="optional" type="way,closedway" member_expression="highway"/>
                 </roles>
             </item> <!-- Road Route -->
         </group> <!-- Routes -->
diff --git a/data/maps.xsd b/data/maps.xsd
index 724e7b3..e73e7bd 100644
--- a/data/maps.xsd
+++ b/data/maps.xsd
@@ -26,7 +26,7 @@
 	<xs:simpleType name="type">
 		<xs:restriction base="xs:string">
 			<xs:enumeration value="wms" />
-            <xs:enumeration value="wms_endpoint" />
+			<xs:enumeration value="wms_endpoint" />
 			<xs:enumeration value="tms" />
 			<xs:enumeration value="html" />
 			<xs:enumeration value="bing" />
@@ -57,6 +57,14 @@
 		</xs:simpleContent>
 	</xs:complexType>
 
+	<xs:complexType name="description">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="lang" type="xs:string" use="required" />
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+
 	<xs:complexType name="point">
 		<xs:attribute name="lat" type="tns:latitude" use="required" />
 		<xs:attribute name="lon" type="tns:longitude" use="required" />
@@ -598,6 +606,8 @@
 					<xs:all>
 						<!-- The name of the imagery source -->
 						<xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string" />
+						<!-- A description of the imagery source -->
+						<xs:element name="description" minOccurs="0" type="tns:description" />
 						<!-- A unique id for the imagery source -->
 						<xs:element name="id" minOccurs="0" maxOccurs="1" type="tns:id" />
 						<!-- The type. Can be tms, wms and html. In addition, there are the special types bing and scanex 
@@ -637,7 +647,19 @@
 						<xs:element name="country-code" minOccurs="0" maxOccurs="1" type="tns:iso3166" />
 						<!-- A base64-encoded image that is displayed as menu/toolbar icon -->
 						<xs:element name="icon" minOccurs="0" maxOccurs="1" type="xs:string" />
+						<xs:element name="mirror" minOccurs="0">
+							<xs:complexType>
+								<xs:all>
+									<xs:element name="type" minOccurs="1" maxOccurs="1" type="tns:type" />
+									<xs:element name="url" minOccurs="1" maxOccurs="1" type="xs:string" />
+									<xs:element name="projections" minOccurs="0" maxOccurs="1" type="tns:projections" />
+									<xs:element name="min-zoom" minOccurs="0" maxOccurs="1" type="tns:zoom" />
+									<xs:element name="max-zoom" minOccurs="0" maxOccurs="1" type="tns:zoom" />
+								</xs:all>
+							</xs:complexType>
+						</xs:element>
 					</xs:all>
+					<xs:attribute name="last-check" type="xs:date" use="optional" />
 				</xs:complexType>
 			</xs:element>
 		</xs:sequence>
diff --git a/data/projection/epsg b/data/projection/epsg
index 86c7cdc..148eb00 100644
--- a/data/projection/epsg
+++ b/data/projection/epsg
@@ -52,12 +52,36 @@
 <3949> +proj=lcc +lat_0=49 +lat_1=48.25 +lat_2=49.75 +lon_0=3 +x_0=1700000 +y_0=8200000 +ellps=GRS80 +nadgrids=null +bounds=-5.5,46.5,10.2,51.1  <>
 # Lambert CC9 (France) Zone 50
 <3950> +proj=lcc +lat_0=50 +lat_1=49.25 +lat_2=50.75 +lon_0=3 +x_0=1700000 +y_0=9200000 +ellps=GRS80 +nadgrids=null +bounds=-5.5,47.5,10.2,51.1  <>
+# ETRS89
+<4258> +proj=lonlat +ellps=GRS80 +datum=GRS80 +bounds=-180,-90,180,90  <>
 # WGS 84
 <4326> +proj=lonlat +ellps=WGS84 +datum=WGS84 +bounds=-180,-90,180,90  <>
 # Swiss Grid (Switzerland)
 <21781> +proj=somerc +lat_0=46d57'8.66" +lon_0=7d26'22.5" +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346 +bounds=5.7,45.7,10.6,47.9  <>
 # HD72 / EOV (Hungary)
 <23700> +proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.17,-71.82,-14.9 +units=m +bounds=16.1200,45.7800,22.9100,48.6000  <>
+# ETRS89 / UTM zone 28N
+<25828> +proj=tmerc +lon_0=-15 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=-20,-5,-10,85 <>
+# ETRS89 / UTM zone 29N
+<25829> +proj=tmerc +lon_0=-9 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=-14,-5,-4,85  <>
+# ETRS89 / UTM zone 30N
+<25830> +proj=tmerc +lon_0=-3 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=-8,-5,2,85  <>
+# ETRS89 / UTM zone 31N
+<25831> +proj=tmerc +lon_0=3 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=-2,-5,8,85  <>
+# ETRS89 / UTM zone 32N
+<25832> +proj=tmerc +lon_0=9 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=4,-5,14,85  <>
+# ETRS89 / UTM zone 33N
+<25833> +proj=tmerc +lon_0=15 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=10,-5,20,85  <>
+# ETRS89 / UTM zone 34N
+<25834> +proj=tmerc +lon_0=21 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=16,-5,26,85  <>
+# ETRS89 / UTM zone 35N
+<25835> +proj=tmerc +lon_0=27 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=22,-5,32,85  <>
+# ETRS89 / UTM zone 36N
+<25836> +proj=tmerc +lon_0=33 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=28,-5,38,85  <>
+# ETRS89 / UTM zone 37N
+<25837> +proj=tmerc +lon_0=39 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=34,-5,44,85  <>
+# ETRS89 / UTM zone 38N
+<25838> +proj=tmerc +lon_0=45 +k_0=0.9996 +x_0=500000 +ellps=GRS80 +datum=GRS80 +bounds=40,-5,50,85  <>
 # Lambert 4 Zones France (Nord)
 <27561> +proj=lcc +lat_0=49.5 +lat_1=48d35'54.682" +lat_2=50d23'45.282" +lon_0=2d20'14.025" +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +nadgrids=ntf_r93_b.gsb +bounds=-4.416666666666665,46.65,9.18,51.300000000000004  <>
 # Lambert 4 Zones France (Centre)
diff --git a/data/validator/addresses.mapcss b/data/validator/addresses.mapcss
index 612fa42..9116c4e 100644
--- a/data/validator/addresses.mapcss
+++ b/data/validator/addresses.mapcss
@@ -1,6 +1,6 @@
-/* see #9667 - Verify interpolation range/values
-   Matches nodes with a decrease of addr:housenumber within addr:interpolation=even/odd.
-*/
-*[tag("addr:housenumber") > child_tag("addr:housenumber")][regexp_test("even|odd", parent_tag("addr:interpolation"))] + *[addr:housenumber] {
-  throwWarning: tr("Decreasing house numbers in addresses interpolation");
-}
+/* see #9667 - Verify interpolation range/values
+   Matches nodes with a decrease of addr:housenumber within addr:interpolation=even/odd.
+*/
+*[tag("addr:housenumber") > child_tag("addr:housenumber")][regexp_test("even|odd", parent_tag("addr:interpolation"))] + *[addr:housenumber] {
+  throwWarning: tr("Decreasing house numbers in addresses interpolation");
+}
diff --git a/data/validator/combinations.mapcss b/data/validator/combinations.mapcss
index 14ff4b3..2121088 100644
--- a/data/validator/combinations.mapcss
+++ b/data/validator/combinations.mapcss
@@ -105,6 +105,13 @@ way[junction                   ][!highway][junction!=yes],
   throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
 }
 
+/* {0.tag} without {1.key} */
+*[aeroway=terminal][!building],
+*[power=generator][!generator:source],
+*[amenity=place_of_worship][!religion] {
+  throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
+}
+
 /* {0.key} without {1.key} or {2.key} */
 *[incline                      ][!highway][!railway],
 *[oneway                       ][!highway][!railway] {
@@ -118,9 +125,9 @@ way[junction                   ][!highway][junction!=yes],
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
 }
 
-/* {0.key} without {1.tag} or {2.tag} */
-*[parking                      ][amenity!=parking][amenity!=parking_entrance] {
-  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
+/* {0.key} without {1.tag}, {2.tag} or {3.tag} */
+*[parking                      ][amenity!=parking][amenity!=parking_entrance][amenity!=motorcycle_parking] {
+  throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.tag}", "{2.tag}", "{3.tag}");
 }
 
 /* {0.key} without {1.key}, {2.key} or {3.key} */
@@ -149,9 +156,10 @@ way[junction                   ][!highway][junction!=yes],
   throwWarning: tr("{0} on suspicious object", "{0.key}");
 }
 
-node[amenity =~ /^(restaurant|cafe|fast_food)$/][!name] {
+node[amenity =~ /^(restaurant|cafe|fast_food)$/][!name][noname!=yes] {
   throwOther: tr("restaurant without name");
   assertMatch: "node amenity=restaurant";
+  assertNoMatch: "node amenity=restaurant noname=yes";
   assertNoMatch: "node amenity=restaurant name=Foobar";
 }
 
@@ -171,7 +179,7 @@ way[highway][natural],
 }
 
 /* see #9593 */
-*[sport][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground)$/][natural !~ /^(beach|bare_rock)$/][amenity !~ /^(pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/] {
+*[sport][!building][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground)$/][natural !~ /^(beach|bare_rock|peak)$/][amenity !~ /^(pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/] {
     throwWarning: tr("sport without physical feature");
     assertMatch: "node sport=tennis";
     assertNoMatch: "node sport=tennis leisure=pitch";
diff --git a/data/validator/deprecated.mapcss b/data/validator/deprecated.mapcss
index 21a604f..8764fa9 100644
--- a/data/validator/deprecated.mapcss
+++ b/data/validator/deprecated.mapcss
@@ -241,7 +241,7 @@
   assertMatch: "way fixme=yes";
 }
 
-/* see #10107, #10108 - http://wiki.openstreetmap.org/wiki/Proposed_features/leaftype#Features.2FPages_affected */
+/* see #10107, #10108, #10929 - http://wiki.openstreetmap.org/wiki/Proposed_features/leaftype#Features.2FPages_affected */
 *[wood=deciduous],
 *[type=broad_leaved],
 *[type=broad_leafed] {
@@ -250,9 +250,11 @@
   fixAdd: "leaf_type=broadleaved";
 }
 
-*[wood=coniferous] {
+*[wood=coniferous],
+*[type=coniferous],
+*[type=conifer] {
   throwWarning: tr("{0}={1} is deprecated", "{0.key}", "{0.value}");
-  fixRemove: "wood";
+  fixRemove: "{0.key}";
   fixAdd: "leaf_type=needleleaved";
 }
 
@@ -331,6 +333,7 @@
 
 /* see #10661, #10837 */
 *[barrier=yes],
+*[aerialway=yes],
 *[amenity=yes],
 *[place=yes] {
   throwWarning: tr("{0}={1} is unspecific. Please replace ''{1}'' by a specific value.", "{0.key}", "{0.value}");
@@ -362,8 +365,16 @@ way[sidewalk=yes] {
 }
 
 /* see #10837 */
-*[building][levels] {
+*[building][levels],
+*[building:part=yes][levels] {
   throwWarning: tr("{0} is deprecated", "{1.key}");
   suggestAlternative: "building:levels";
   fixChangeKey: "levels => building:levels";
+}
+
+/* see #10691 */
+*[protected_class] {
+  throwWarning: tr("{0} is deprecated", "{0.key}");
+  suggestAlternative: "protect_class";
+  fixChangeKey: "protected_class => protect_class";
 }
\ No newline at end of file
diff --git a/data/validator/geometry.mapcss b/data/validator/geometry.mapcss
index d6be64f..152dc55 100644
--- a/data/validator/geometry.mapcss
+++ b/data/validator/geometry.mapcss
@@ -1,22 +1,46 @@
 /* {0} on a node, should be a way */
 node[oneway],
-node[bridge?],
+node[bridge],
 node[sidewalk],
 node[footway],
+node[man_made=embankment],
+node[man_made=groyne],
+node[aerialway=cable_car],
+node[aerialway=gondola],
+node[aerialway=chair_lift],
+node[aerialway=mixed_lift],
+node[aerialway=drag_lift],
+node[aerialway=t-bar],
+node[aerialway=j-bar],
+node[aerialway=platter],
+node[aerialway=magic_carpet],
+node[aerialway=rope_tow],
+node[aerialway=goods],
+node[aeroway=taxiway],
+node[aeroway=runway],
+node[railway=rail],
+node[railway=narrow_gauge],
+node[railway=monorail],
+node[railway=preserved],
+node[railway=light_rail],
+node[railway=subway],
+node[railway=tram],
+node[railway=disused],
+node[railway=abandoned],
 node[waterway=river],
-node[waterway=riverbank],
 node[waterway=canal],
 node[waterway=wadi],
 node[waterway=stream],
 node[waterway=ditch],
+node[waterway=drain],
 node[natural=coastline],
 node[natural=ridge],
 node[natural=tree_row] {
-  throwWarning: tr("{0} on a node. Should be used on a way.", "{0.key}");
+  throwWarning: tr("{0} on a node. Should be used on a way.", "{0.tag}");
   assertMatch: "node oneway=-1";
   assertNoMatch: "way oneway=-1";
   assertMatch: "node bridge=yes";
-  assertNoMatch: "node bridge=13";
+  assertMatch: "node bridge=viaduct";
 }
 
 /* {0} on a node, should be an area; see ticket #10679 */
@@ -35,6 +59,10 @@ node[natural=sand],
 node[natural=wood],
 node[natural=bare_rock],
 node[waterway=riverbank],
+node[man_made=bridge],
+node[man_made=breakwater],
+node[aeroway=apron],
+node[power=plant],
 node[source:outline] {
   throwWarning: tr("{0} on a node. Should be drawn as an area.", "{0.tag}");
 }
@@ -45,6 +73,18 @@ node[restriction] {
   throwWarning: tr("{0}=* on a node. Should be used in a relation", "{0.key}"); 
 }
 
+/* {0} on a way, should be a node */
+way[entrance],
+way[man_made=survey_point],
+way[power=pole],
+way[amenity=vending_machine],
+way[natural=peak],
+way[natural=saddle],
+way[natural=volcano],
+way[natural=tree] {
+  throwWarning: tr("{0} on a way. Should be used on a node.", "{0.tag}"); 
+}
+
 /* {0} on a way, should be a relation; see #10252 */
 way[route=bus] {
   throwWarning: tr("{0} on a way. Should be used in a relation", "{0.tag}"); 
diff --git a/data/validator/highway.mapcss b/data/validator/highway.mapcss
index 9b4a715..9066661 100644
--- a/data/validator/highway.mapcss
+++ b/data/validator/highway.mapcss
@@ -16,7 +16,7 @@ way[highway][name =~ /(?i).* (Ave|Blvd|Br|Brg|Cct|Cir|Cl|Cr|Crct|Cres|Crt|Ct|Dr|
   assertMatch: "way highway=unclassified name=\"Bou blvd.\"";
 }
 
-node[highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service|living_street|pedestrian|track|path|footway/][highway!=motorway_junction][highway!=services] {
+node[highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][highway!=motorway_junction][highway!=services] {
   throwWarning: tr("wrong highway tag on a node");
   assertMatch: "node highway=primary";
   assertMatch: "node highway=primary_link";
@@ -37,15 +37,18 @@ node[highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|resident
   assertNoMatch: "node highway=turning_circle";
 }
 
-way[highway=crossing], way[railway=crossing] {
+way[highway=crossing],
+way[railway=crossing],
+way[railway=level_crossing] {
   throwWarning: tr("wrong crossing tag on a way");
   assertMatch: "way highway=crossing";
   assertNoMatch: "node highway=crossing";
 }
 
-way[highway=unclassified][!name] {
+way[highway=unclassified][!name][noname!=yes] {
   throwOther: tr("Unnamed unclassified highway");
   assertMatch: "way highway=unclassified";
+  assertNoMatch: "way highway=unclassified noname=yes";
   assertNoMatch: "way highway=unclassified name=Foo";
 }
 
diff --git a/data/validator/multiple.mapcss b/data/validator/multiple.mapcss
index fac1c93..9607bea 100644
--- a/data/validator/multiple.mapcss
+++ b/data/validator/multiple.mapcss
@@ -1,44 +1,44 @@
-/* see #9757, #10869 - Better handling of semicolon in values
-*/
-*["addr:street" =~ /.+;(.+)?/],
-*[highway =~ /.+;(.+)?/],
-*[lanes =~ /.+;(.+)?/],
-*[maxspeed =~ /.+;(.+)?/],
-*[name =~ /.+;(.+)?/],
-*[surface =~ /.+;(.+)?/],
-*[water =~ /.+;(.+)?/] {
-    throwWarning: tr("{0} with multiple values", "{0.key}");
-}
-
-*[source              =~ /^(;.*|.*;;.*|.*;)$/],
-*["source:addr"       =~ /^(;.*|.*;;.*|.*;)$/],
-*["source:maxspeed"   =~ /^(;.*|.*;;.*|.*;)$/],
-*["source:name"       =~ /^(;.*|.*;;.*|.*;)$/],
-*["source:position"   =~ /^(;.*|.*;;.*|.*;)$/],
-*["source:postcode"   =~ /^(;.*|.*;;.*|.*;)$/],
-*[ref                 =~ /^(;.*|.*;;.*|.*;)$/],
-*[int_ref             =~ /^(;.*|.*;;.*|.*;)$/],
-*[old_ref             =~ /^(;.*|.*;;.*|.*;)$/],
-*[source_ref          =~ /^(;.*|.*;;.*|.*;)$/],
-*[route_ref           =~ /^(;.*|.*;;.*|.*;)$/],
-*[attribution         =~ /^(;.*|.*;;.*|.*;)$/],
-*[name                =~ /^(;.*|.*;;.*|.*;)$/],
-*[alt_name            =~ /^(;.*|.*;;.*|.*;)$/],
-*[note                =~ /^(;.*|.*;;.*|.*;)$/],
-*[fixme               =~ /^(;.*|.*;;.*|.*;)$/],
-*["addr:housenumber"  =~ /^(;.*|.*;;.*|.*;)$/],
-*[destination         =~ /^(;.*|.*;;.*|.*;)$/],
-*[exit_to             =~ /^(;.*|.*;;.*|.*;)$/],
-*[surface             =~ /^(;.*|.*;;.*|.*;)$/],
-*["building:use"      =~ /^(;.*|.*;;.*|.*;)$/],
-*[traffic_sign        =~ /^(;.*|.*;;.*|.*;)$/],
-*[voltage             =~ /^(;.*|.*;;.*|.*;)$/],
-*[cuisine             =~ /^(;.*|.*;;.*|.*;)$/] {
-	throwWarning: tr("empty value in semicolon-separated ''{0}''", "{0.key}");
-	assertMatch: "node ref=;A1";
-	assertMatch: "node ref=A1;";
-	assertMatch: "node ref=;";
-	assertMatch: "node ref=A1;;A2";
-	assertNoMatch: "node ref=A1";
-	assertNoMatch: "node ref=A1;A2";
-}
+/* see #9757, #10869 - Better handling of semicolon in values
+*/
+*["addr:street" =~ /.+;(.+)?/],
+*[highway =~ /.+;(.+)?/],
+*[lanes =~ /.+;(.+)?/],
+*[maxspeed =~ /.+;(.+)?/],
+*[name =~ /.+;(.+)?/],
+*[surface =~ /.+;(.+)?/],
+*[water =~ /.+;(.+)?/] {
+    throwWarning: tr("{0} with multiple values", "{0.key}");
+}
+
+*[source              =~ /^(;.*|.*;;.*|.*;)$/],
+*["source:addr"       =~ /^(;.*|.*;;.*|.*;)$/],
+*["source:maxspeed"   =~ /^(;.*|.*;;.*|.*;)$/],
+*["source:name"       =~ /^(;.*|.*;;.*|.*;)$/],
+*["source:position"   =~ /^(;.*|.*;;.*|.*;)$/],
+*["source:postcode"   =~ /^(;.*|.*;;.*|.*;)$/],
+*[ref                 =~ /^(;.*|.*;;.*|.*;)$/],
+*[int_ref             =~ /^(;.*|.*;;.*|.*;)$/],
+*[old_ref             =~ /^(;.*|.*;;.*|.*;)$/],
+*[source_ref          =~ /^(;.*|.*;;.*|.*;)$/],
+*[route_ref           =~ /^(;.*|.*;;.*|.*;)$/],
+*[attribution         =~ /^(;.*|.*;;.*|.*;)$/],
+*[name                =~ /^(;.*|.*;;.*|.*;)$/],
+*[alt_name            =~ /^(;.*|.*;;.*|.*;)$/],
+*[note                =~ /^(;.*|.*;;.*|.*;)$/],
+*[fixme               =~ /^(;.*|.*;;.*|.*;)$/],
+*["addr:housenumber"  =~ /^(;.*|.*;;.*|.*;)$/],
+*[destination         =~ /^(;.*|.*;;.*|.*;)$/],
+*[exit_to             =~ /^(;.*|.*;;.*|.*;)$/],
+*[surface             =~ /^(;.*|.*;;.*|.*;)$/],
+*["building:use"      =~ /^(;.*|.*;;.*|.*;)$/],
+*[traffic_sign        =~ /^(;.*|.*;;.*|.*;)$/],
+*[voltage             =~ /^(;.*|.*;;.*|.*;)$/],
+*[cuisine             =~ /^(;.*|.*;;.*|.*;)$/] {
+	throwWarning: tr("empty value in semicolon-separated ''{0}''", "{0.key}");
+	assertMatch: "node ref=;A1";
+	assertMatch: "node ref=A1;";
+	assertMatch: "node ref=;";
+	assertMatch: "node ref=A1;;A2";
+	assertNoMatch: "node ref=A1";
+	assertNoMatch: "node ref=A1;A2";
+}
diff --git a/data/validator/numeric.mapcss b/data/validator/numeric.mapcss
index ae5d18b..f5b78b0 100644
--- a/data/validator/numeric.mapcss
+++ b/data/validator/numeric.mapcss
@@ -1,154 +1,154 @@
-/* measurement values and units warnings (ticket #8687) */
-
-*[/^[0-9]+$/] {
-  throwWarning: tr("numerical key");
-  assertMatch: "way 123=foo";
-  assertNoMatch: "way ref.1=foo";
-}
-
-*[layer =~ /\+.*/] {
-  throwWarning: tr("layer tag with + sign");
-  fixAdd: concat("layer=", replace(tag("layer"), "+", ""));
-  assertMatch: "node layer=+1";
-  assertNoMatch: "node layer=1";
-  assertNoMatch: "node layer=-1";
-}
-
-*[layer][layer !~ /^0$|^(-|\+)?[1-5]$/] {
-  throwWarning: tr("layer should be between -5 and 5");
-  assertMatch: "node layer=-50";
-  assertMatch: "node layer=6";
-  assertMatch: "node layer=+100";
-  assertNoMatch: "node layer=-5";
-  assertNoMatch: "node layer=0";
-  assertNoMatch: "node layer=2";
-  assertNoMatch: "node layer=+5";
-}
-
-*[level][level !~ /^((([0-9]|-[1-9])|[1-9][0-9]*)(\.5)?)(;(([0-9]|-[1-9])|[1-9][0-9]*)(\.5)?)*$|^-0\.5$/] {
-  throwWarning: tr("level should be numbers with optional .5 increments");
-  assertMatch: "node level=one";
-  assertNoMatch: "node level=0";
-  assertNoMatch: "node level=1";
-  assertNoMatch: "node level=-1";
-  assertNoMatch: "node level=-0.5";
-  assertNoMatch: "node level=1.5";
-}
-
-*[height][height !~ /^(([0-9]+\.?[0-9]*( (m|ft))?)|([1-9][0-9]*\'((10|11|[0-9])((\.[0-9]+)?)\")?))$/] {
-  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "height");
-  assertMatch: "node height=medium";
-  assertMatch: "node height=-5";
-  assertNoMatch: "node height=2 m";
-  assertNoMatch: "node height=5";
-  assertNoMatch: "node height=7.8";
-  assertNoMatch: "node height=20 ft";
-  assertNoMatch: "node height=22'";
-}
-
-*[maxheight][maxheight !~ /^(([1-9][0-9]*(\.[0-9]+)?( (m|ft))?)|([0-9]+\'(([0-9]|10|11)(\.[0-9]*)?\")?))$/] {
-  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "maxheight");
-  assertMatch: "node maxheight=something";
-  assertMatch: "node maxheight=-5";
-  assertMatch: "node maxheight=0";
-  assertNoMatch: "node maxheight=4";
-  assertNoMatch: "node maxheight=3.5";
-  assertNoMatch: "node maxheight=2 m";
-  assertNoMatch: "node maxheight=14 ft";
-  assertNoMatch: "node maxheight=10'";
-  assertNoMatch: "node maxheight=16'3\"";
-}
-
-way[width][width !~ /^(([0-9]+\.?[0-9]*( [a-z]+)?)|([0-9]+\'([0-9]+\.?[0-9]*\")?))$/] {
-  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "width");
-  assertMatch: "way width=something";
-  assertMatch: "way width=-5";
-  assertNoMatch: "way width=3";
-  assertNoMatch: "way width=0.5";
-  assertNoMatch: "way width=1 m";
-  assertNoMatch: "way width=10 ft";
-  assertNoMatch: "way width=1'";
-  assertNoMatch: "way width=10'5\"";
-}
-
-*[maxwidth][maxwidth !~ /^(([0-9]+\.?[0-9]*( (m|ft))?)|([0-9]+\'[0-9]+\.?[0-9]*\"))$/] {
-  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "maxwidth");
-  assertMatch: "way maxwidth=something";
-  assertMatch: "way maxwidth=-5";
-  assertNoMatch: "way maxwidth=2";
-  assertNoMatch: "way maxwidth=6'6\"";
-  assertNoMatch: "way maxwidth=2.5";
-  assertNoMatch: "way maxwidth=7 ft";
-}
-
-way[maxspeed][maxspeed !~ /^(signals|none|unposted|unknown|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/] {
-  throwWarning: tr("unusual {0} format", "maxspeed");
-  assertMatch: "way maxspeed=something";
-  assertMatch: "way maxspeed=-50";
-  assertMatch: "way maxspeed=0";
-  assertNoMatch: "way maxspeed=50";
-  assertNoMatch: "way maxspeed=30 mph";
-  assertNoMatch: "way maxspeed=RO:urban";
-  assertNoMatch: "way maxspeed=RU:rural";
-  assertNoMatch: "way maxspeed=RU:living_street";
-  assertNoMatch: "way maxspeed=DE:motorway";
-  assertNoMatch: "way maxspeed=signals";
-  assertNoMatch: "way maxspeed=none";
-  assertNoMatch: "way maxspeed=variable";
-}
-
-way[voltage][voltage =~ /(.*[A-Za-z].*)|.*,.*|.*( ).*/] {
-  throwWarning: tr("voltage should be in volts with no units/delimiter/spaces");
-  assertMatch: "way voltage=medium";
-  assertNoMatch: "way voltage=15000";
-}
-
-/* some users are using frequency for other purposes (not electromagnetic) 
-   with the values 'perennial' and 'intermittent'; the vast majority are 0, 16.7, 50 and 60 */
-way[frequency][frequency !~ /^(0|[1-9][0-9]*(\.[0-9]+)?)( (kHz|MHz|GHz|THz))?$/] {
-  throwWarning: tr("unusual {0} specification", "frequency");
-  assertMatch: "way frequency=something";
-  assertNoMatch: "way frequency=0"; /* DC */
-  assertNoMatch: "way frequency=16.7";
-  assertNoMatch: "way frequency=50";
-  assertNoMatch: "way frequency=680 kHz";
-  assertNoMatch: "way frequency=123.5 MHz";
-}
-
-way[gauge][gauge !~ /^([1-9][0-9]{1,3}(;[1-9][0-9]{1,3})*|broad|standard|narrow)$/] {
-  throwWarning: tr("unusual train track gauge; use mm with no separator");
-  assertMatch: "way gauge=something";
-  assertNoMatch: "way gauge=1435";
-  assertNoMatch: "way gauge=1000;1435";
-  assertNoMatch: "way gauge=standard";
-  assertNoMatch: "way gauge=narrow";
-}
-
-/* the numbers for percentage and degrees include could probably be bracketed a bit more precisely */
-way[incline][incline !~ /^(up|down|-?([0-9]+?(\.[1-9]%)?|100)[%°]?)$/] {
-  throwWarning: tr("unusual incline; use percentages/degrees or up/down");
-  assertMatch: "way incline=extreme";
-  assertNoMatch: "way incline=up";
-  assertNoMatch: "way incline=down";
-  assertNoMatch: "way incline=10%";
-  assertNoMatch: "way incline=-5%";
-  assertNoMatch: "way incline=10°";
-}
-
-/* see ticket #9631 */
-*[population][population !~ /^[0-9]+$/ ] {
-  throwWarning: tr("{0} must be a numeric value", "{0.key}");
-}
-
-/* lanes* must be an integer positive number only, see #10837 */
-way[highway][lanes][lanes !~ /^[1-9]([0-9]*)$/],
-way[highway]["lanes:backward"]["lanes:backward" !~ /^[1-9]([0-9]*)$/],
-way[highway]["lanes:forward"]["lanes:forward" !~ /^[1-9]([0-9]*)$/] {
-  throwError: tr("{0} must be a positive integer number", "{1.key}");
-  assertMatch: "way highway=residential lanes=-1";
-  assertMatch: "way highway=residential lanes=5.5";
-  assertMatch: "way highway=residential lanes=1;2";
-  assertMatch: "way highway=residential lanes:forward=-1";
-  assertMatch: "way highway=residential lanes:backward=-1";
-  assertNoMatch: "way highway=residential lanes=1";
-}
+/* measurement values and units warnings (ticket #8687) */
+
+*[/^[0-9]+$/] {
+  throwWarning: tr("numerical key");
+  assertMatch: "way 123=foo";
+  assertNoMatch: "way ref.1=foo";
+}
+
+*[layer =~ /\+.*/] {
+  throwWarning: tr("layer tag with + sign");
+  fixAdd: concat("layer=", replace(tag("layer"), "+", ""));
+  assertMatch: "node layer=+1";
+  assertNoMatch: "node layer=1";
+  assertNoMatch: "node layer=-1";
+}
+
+*[layer][layer !~ /^0$|^(-|\+)?[1-5]$/] {
+  throwWarning: tr("layer should be between -5 and 5");
+  assertMatch: "node layer=-50";
+  assertMatch: "node layer=6";
+  assertMatch: "node layer=+100";
+  assertNoMatch: "node layer=-5";
+  assertNoMatch: "node layer=0";
+  assertNoMatch: "node layer=2";
+  assertNoMatch: "node layer=+5";
+}
+
+*[level][level !~ /^((([0-9]|-[1-9])|[1-9][0-9]*)(\.5)?)(;(([0-9]|-[1-9])|[1-9][0-9]*)(\.5)?)*$|^-0\.5$/] {
+  throwWarning: tr("level should be numbers with optional .5 increments");
+  assertMatch: "node level=one";
+  assertNoMatch: "node level=0";
+  assertNoMatch: "node level=1";
+  assertNoMatch: "node level=-1";
+  assertNoMatch: "node level=-0.5";
+  assertNoMatch: "node level=1.5";
+}
+
+*[height][height !~ /^(([0-9]+\.?[0-9]*( (m|ft))?)|([1-9][0-9]*\'((10|11|[0-9])((\.[0-9]+)?)\")?))$/] {
+  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "height");
+  assertMatch: "node height=medium";
+  assertMatch: "node height=-5";
+  assertNoMatch: "node height=2 m";
+  assertNoMatch: "node height=5";
+  assertNoMatch: "node height=7.8";
+  assertNoMatch: "node height=20 ft";
+  assertNoMatch: "node height=22'";
+}
+
+*[maxheight][maxheight !~ /^(([1-9][0-9]*(\.[0-9]+)?( (m|ft))?)|([0-9]+\'(([0-9]|10|11)(\.[0-9]*)?\")?))$/] {
+  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "maxheight");
+  assertMatch: "node maxheight=something";
+  assertMatch: "node maxheight=-5";
+  assertMatch: "node maxheight=0";
+  assertNoMatch: "node maxheight=4";
+  assertNoMatch: "node maxheight=3.5";
+  assertNoMatch: "node maxheight=2 m";
+  assertNoMatch: "node maxheight=14 ft";
+  assertNoMatch: "node maxheight=10'";
+  assertNoMatch: "node maxheight=16'3\"";
+}
+
+way[width][width !~ /^(([0-9]+\.?[0-9]*( [a-z]+)?)|([0-9]+\'([0-9]+\.?[0-9]*\")?))$/] {
+  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "width");
+  assertMatch: "way width=something";
+  assertMatch: "way width=-5";
+  assertNoMatch: "way width=3";
+  assertNoMatch: "way width=0.5";
+  assertNoMatch: "way width=1 m";
+  assertNoMatch: "way width=10 ft";
+  assertNoMatch: "way width=1'";
+  assertNoMatch: "way width=10'5\"";
+}
+
+*[maxwidth][maxwidth !~ /^(([0-9]+\.?[0-9]*( (m|ft))?)|([0-9]+\'[0-9]+\.?[0-9]*\"))$/] {
+  throwWarning: tr("{0}: meters is default; period is separator; if units, put space then unit", "maxwidth");
+  assertMatch: "way maxwidth=something";
+  assertMatch: "way maxwidth=-5";
+  assertNoMatch: "way maxwidth=2";
+  assertNoMatch: "way maxwidth=6'6\"";
+  assertNoMatch: "way maxwidth=2.5";
+  assertNoMatch: "way maxwidth=7 ft";
+}
+
+way[maxspeed][maxspeed !~ /^(signals|none|unposted|unknown|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/] {
+  throwWarning: tr("unusual {0} format", "maxspeed");
+  assertMatch: "way maxspeed=something";
+  assertMatch: "way maxspeed=-50";
+  assertMatch: "way maxspeed=0";
+  assertNoMatch: "way maxspeed=50";
+  assertNoMatch: "way maxspeed=30 mph";
+  assertNoMatch: "way maxspeed=RO:urban";
+  assertNoMatch: "way maxspeed=RU:rural";
+  assertNoMatch: "way maxspeed=RU:living_street";
+  assertNoMatch: "way maxspeed=DE:motorway";
+  assertNoMatch: "way maxspeed=signals";
+  assertNoMatch: "way maxspeed=none";
+  assertNoMatch: "way maxspeed=variable";
+}
+
+way[voltage][voltage =~ /(.*[A-Za-z].*)|.*,.*|.*( ).*/] {
+  throwWarning: tr("voltage should be in volts with no units/delimiter/spaces");
+  assertMatch: "way voltage=medium";
+  assertNoMatch: "way voltage=15000";
+}
+
+/* some users are using frequency for other purposes (not electromagnetic) 
+   with the values 'perennial' and 'intermittent'; the vast majority are 0, 16.7, 50 and 60 */
+way[frequency][frequency !~ /^(0|[1-9][0-9]*(\.[0-9]+)?)( (kHz|MHz|GHz|THz))?$/] {
+  throwWarning: tr("unusual {0} specification", "frequency");
+  assertMatch: "way frequency=something";
+  assertNoMatch: "way frequency=0"; /* DC */
+  assertNoMatch: "way frequency=16.7";
+  assertNoMatch: "way frequency=50";
+  assertNoMatch: "way frequency=680 kHz";
+  assertNoMatch: "way frequency=123.5 MHz";
+}
+
+way[gauge][gauge !~ /^([1-9][0-9]{1,3}(;[1-9][0-9]{1,3})*|broad|standard|narrow)$/] {
+  throwWarning: tr("unusual train track gauge; use mm with no separator");
+  assertMatch: "way gauge=something";
+  assertNoMatch: "way gauge=1435";
+  assertNoMatch: "way gauge=1000;1435";
+  assertNoMatch: "way gauge=standard";
+  assertNoMatch: "way gauge=narrow";
+}
+
+/* the numbers for percentage and degrees include could probably be bracketed a bit more precisely */
+way[incline][incline !~ /^(up|down|-?([0-9]+?(\.[1-9]%)?|100)[%°]?)$/] {
+  throwWarning: tr("unusual incline; use percentages/degrees or up/down");
+  assertMatch: "way incline=extreme";
+  assertNoMatch: "way incline=up";
+  assertNoMatch: "way incline=down";
+  assertNoMatch: "way incline=10%";
+  assertNoMatch: "way incline=-5%";
+  assertNoMatch: "way incline=10°";
+}
+
+/* see ticket #9631 */
+*[population][population !~ /^[0-9]+$/ ] {
+  throwWarning: tr("{0} must be a numeric value", "{0.key}");
+}
+
+/* lanes* must be an integer positive number only, see #10837 */
+way[highway][lanes][lanes !~ /^[1-9]([0-9]*)$/],
+way[highway]["lanes:backward"]["lanes:backward" !~ /^[1-9]([0-9]*)$/],
+way[highway]["lanes:forward"]["lanes:forward" !~ /^[1-9]([0-9]*)$/] {
+  throwError: tr("{0} must be a positive integer number", "{1.key}");
+  assertMatch: "way highway=residential lanes=-1";
+  assertMatch: "way highway=residential lanes=5.5";
+  assertMatch: "way highway=residential lanes=1;2";
+  assertMatch: "way highway=residential lanes:forward=-1";
+  assertMatch: "way highway=residential lanes:backward=-1";
+  assertNoMatch: "way highway=residential lanes=1";
+}
diff --git a/data_nodist/projection-regression-test-data.csv b/data_nodist/projection-regression-test-data.csv
index 5f7f44a..fde455a 100644
--- a/data_nodist/projection-regression-test-data.csv
+++ b/data_nodist/projection-regression-test-data.csv
@@ -624,3 +624,63 @@ EPSG:3008
   ll  61.864054488897295 13.084399903079879
   en  128126.42078859449 6861850.502124558
   ll2 61.86405448889923 13.084399903079852
+EPSG:25831
+  ll  15.703714685419541 1.9029805492944067
+  en  382450.5936273647 1736467.0083671734
+  ll2 15.703714685418815 1.9029805492946246
+EPSG:25832
+  ll  43.42381791085779 9.690565246887022
+  en  555898.5039359011 4808112.365172946
+  ll2 43.42381791085591 9.69056524688702
+EPSG:25833
+  ll  75.7892704557877 11.207180641450057
+  en  396131.7404880665 8415005.737873647
+  ll2 75.7892704557614 11.207180641594613
+EPSG:25834
+  ll  46.44885204974395 22.405231854156536
+  en  607926.6287454234 5144879.313368673
+  ll2 46.448852049741696 22.405231854157073
+EPSG:25835
+  ll  42.57574419494572 31.562543802846626
+  en  874467.6530367588 4723802.227199246
+  ll2 42.57574419459534 31.562543803062233
+EPSG:25836
+  ll  28.15042601064217 29.551501695152517
+  en  161292.70745459147 3118678.701691007
+  ll2 28.150426010621363 29.551501695058164
+EPSG:25837
+  ll  36.3487499992021 40.79948792586663
+  en  661474.4463378746 4024134.2543947804
+  ll2 36.34874999920129 40.799487925869784
+EPSG:25838
+  ll  31.188113573425966 46.337070725825676
+  en  627399.0197288111 3451219.8221930494
+  ll2 31.18811357342744 46.33707072582629
+EPSG:25830
+  ll  37.25171140290211 -2.8211874597155333
+  en  515857.4448277882 4122811.106932232
+  ll2 37.25171140290173 -2.821187459715534
+EPSG:25829
+  ll  65.82806470287636 -9.554928597345642
+  en  474644.50820229325 7300857.887810782
+  ll2 65.82806470287812 -9.55492859734568
+EPSG:25828
+  ll  47.117782320935554 -16.503525409604464
+  en  385946.0034092715 5219349.635451921
+  ll2 47.11778232093319 -16.5035254096052
+EPSG:3004
+  ll  46.42503928302209 18.74399103983138
+  en  2807677.1985695027 5148277.433652771
+  ll2 46.42503930908268 18.743991039891295
+EPSG:3003
+  ll  38.09725651416973 7.4345625019044315
+  en  1362731.716367063 4217921.7769305315
+  ll2 38.09725654133193 7.434562501902943
+EPSG:23700
+  ll  46.46561041539386 21.520339346245464
+  en  839912.6237410088 127576.65601134414
+  ll2 46.46561041643151 21.520339350984706
+EPSG:4258
+  ll  68.95423702701359 -136.7642652058481
+  en  -136.76426520584806 68.95423702701359
+  ll2 68.95423702701359 -136.76426520584806
diff --git a/i18n/po/af.po b/i18n/po/af.po
index bf54bb5..172c3fd 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-10-13 02:39+0000\n"
 "Last-Translator: Grant Slater <Unknown>\n"
 "Language-Team: Afrikaans <af at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:31+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:31+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: af\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/am.po b/i18n/po/am.po
index d13d86d..70ba5f2 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2010-03-30 12:09+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Amharic <am at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:33+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:33+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: am\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ar.po b/i18n/po/ar.po
index 090d29c..02b44f8 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 14:17+0000\n"
 "Last-Translator: Chdoula <chdoula 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: 2014-12-29 04:34+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:34+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ar\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "لا يوجد طبقات هدف"
 
+msgid "Select"
+msgstr "إختر"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2042,9 +2049,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "إختر"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5638,10 +5642,6 @@ msgstr "حلّ"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9076,7 +9076,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9097,6 +9097,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "صور  (*.jpg)JPEG"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11072,7 +11078,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14258,6 +14264,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15250,12 +15262,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15351,45 +15439,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr "شارع سكني"
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16224,31 +16274,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
-msgstr "مصعد كرسي"
+msgid "Cable Car"
+msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr ""
+msgid "Chair Lift"
+msgstr "مصعد كرسي"
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16263,16 +16310,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16357,6 +16412,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16387,12 +16445,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16588,6 +16649,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "النقل المشترك"
 
@@ -16846,6 +16910,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "عمود إضائة"
 
@@ -18089,10 +18161,6 @@ msgid "Man Made"
 msgstr "من صنع الإنسان"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18113,15 +18181,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18195,6 +18263,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19692,7 +19764,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19722,28 +19794,28 @@ msgstr "مدينة"
 msgid "Town"
 msgstr "بلدة"
 
-msgid "Suburb"
-msgstr "ضاحية"
-
 msgid "Village"
 msgstr "قرية"
 
 msgid "Hamlet"
 msgstr "قرية صغيرة"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "ضاحية"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20261,6 +20333,37 @@ msgstr "الصورة"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "الفلق الخارجي"
 
@@ -20624,16 +20727,13 @@ msgstr "إختبار"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20645,13 +20745,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20684,6 +20784,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20727,7 +20875,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20748,6 +20899,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20876,7 +21033,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20959,6 +21116,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21175,16 +21338,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21193,6 +21356,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21460,6 +21626,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21552,6 +21721,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26886,6 +27058,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26946,9 +27133,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ast.po b/i18n/po/ast.po
index d86acfe..7b5064b 100644
--- a/i18n/po/ast.po
+++ b/i18n/po/ast.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-28 13:03+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-25 02:17+0000\n"
 "Last-Translator: Don-vip <Unknown>\n"
 "Language-Team: Asturian <ast 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: 2014-12-29 04:36+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:35+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ast\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -224,6 +224,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Nun hai capes destín"
 
+msgid "Select"
+msgstr "Escoyer"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Escueye nel mapa los elementos escoyíos na llista cimera."
+
 msgid "Add imagery layer {0}"
 msgstr "Amestar capa de imaxes {0}"
 
@@ -1210,7 +1217,7 @@ msgid "Report bug"
 msgstr "Reportar error"
 
 msgid "Report a ticket to JOSM bugtracker"
-msgstr ""
+msgstr "Mandar una solicitú al siguimientu de fallos de JOSM"
 
 msgid "Restart"
 msgstr "Reaniciar"
@@ -1650,13 +1657,13 @@ msgid "Nothing to upload. Get some data first."
 msgstr "Ná que xubir. Primero inxerta dellos datos."
 
 msgid "Upload note changes to server"
-msgstr ""
+msgstr "Xubir los cambios de la nota al sirvidor"
 
 msgid "Upload notes"
-msgstr ""
+msgstr "Xubir les notes"
 
 msgid "Uploading notes to server"
-msgstr ""
+msgstr "Xubir les notes al sirvidor"
 
 msgid "Upload selection"
 msgstr "Xubir seleición"
@@ -1937,25 +1944,25 @@ msgid "Error during download"
 msgstr "Fallu na descarga"
 
 msgid "Add a new Note"
-msgstr ""
+msgstr "Amestar una nota nueva"
 
 msgid "Add note mode"
-msgstr ""
+msgstr "Amestar mou de nota"
 
 msgid "Click the location where you wish to create a new note"
-msgstr ""
+msgstr "Fai clic nel llugar onde quieras crear una nota nueva"
 
 msgid "Create new note"
-msgstr ""
+msgstr "Crear nota nueva"
 
 msgid "Create note"
-msgstr ""
+msgstr "Crear nota"
 
 msgid "Enter a detailed comment to create a note"
-msgstr ""
+msgstr "Escribi un comentariu detalláu pa crear una nota"
 
 msgid "You must enter a comment to create a new note"
-msgstr ""
+msgstr "Tienes d''escribir un comentariu pa crear una nota nueva"
 
 msgid "Delete Mode"
 msgstr "Mou de desaniciu"
@@ -2208,9 +2215,6 @@ msgstr ""
 "Mueva la flecha de reproducción y suéltela cerca de la trazar pa reproducir "
 "audiu dende esi puntu; usa MAYUS+soltar pa sincronizar l''audiu nesi puntu."
 
-msgid "Select"
-msgstr "Escoyer"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Seleicionar, mover, escalar y xirar los oxetos"
 
@@ -2932,7 +2936,7 @@ msgid "Cycling dependencies"
 msgstr "Dependencies cícliques"
 
 msgid "Uploading modified notes"
-msgstr ""
+msgstr "Cargando notes camudaes"
 
 msgid "Note {0} failed: {1}"
 msgstr ""
@@ -4084,7 +4088,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Busca erros n''etiquetes rellacionaes a Internet."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " La URL nun pue convertise a ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4312,17 +4316,19 @@ msgid "Relation is empty"
 msgstr "La relación tá vacida"
 
 msgid "Role member does not match expression {0} in template {1}"
-msgstr ""
+msgstr "El rol del miembru nun casa cola espresión {0} de la plantía {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
 msgstr ""
+"El tipu de rol de miembru {0} nun casa cola llista aceptada de {1} de la "
+"plantía {2}"
 
 msgid "<empty>"
 msgstr "<vacíu>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Rol {0} desconocíu nes plantíes {1}"
 
 msgid "Empty role type found when expecting one of {0}"
 msgstr ""
@@ -4882,25 +4888,25 @@ msgid "options provided as Java system properties"
 msgstr "opciones proporcionaes como propiedaes de sistema Java"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/PATH/TO/JOSM/PREF    "
 
 msgid "Set the preferences directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/PATH/TO/JOSM/USERDATA"
 
 msgid "Set the user data directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/PATH/TO/JOSM/CACHE   "
 
 msgid "Set the cache directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/PATH/TO/JOSM/HOMEDIR "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
@@ -6147,10 +6153,6 @@ msgstr "Resolver"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Abrir un diálogu pa amestar tolos oxetos de la llista d''arriba"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Escueye nel mapa los elementos escoyíos na llista cimera."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Detectóse {0} conflictu."
@@ -9973,10 +9975,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -10002,6 +10002,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imaxes JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Escoyer traces visibles"
 
@@ -12239,8 +12245,8 @@ msgstr "Incorporáu:"
 msgid "Projection bounds (in degrees)"
 msgstr "Llendes de proyección (en graos)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (códigu EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -15957,6 +15963,12 @@ msgstr "Apurre capacidaes d''enrutamientu."
 msgid "Loads data from SDS"
 msgstr "Carga datos dende SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16984,12 +16996,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Pasiellu d''aparcamientu"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Carretera (tipoloxía desconocida)"
 
 msgid "Construction"
 msgstr "En construcción"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Intersección"
 
@@ -17085,47 +17173,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rotonda"
 
-msgid "motorway"
-msgstr "Autopista"
-
-msgid "motorway_link"
-msgstr "Accesu a autopista"
-
-msgid "trunk"
-msgstr "Carretera principal"
-
-msgid "trunk_link"
-msgstr "Enllaz a carretera principal"
-
-msgid "primary"
-msgstr "vía primaria"
-
-msgid "primary_link"
-msgstr "accesu a vía primaria"
-
-msgid "secondary"
-msgstr "vía secundaria"
-
-msgid "tertiary"
-msgstr "carretera local"
-
-msgid "unclassified"
-msgstr "carretera ensin clasificación"
-
-msgid "residential"
-msgstr "cai urbana"
-
-msgid "living_street"
-msgstr "cai residencial"
-
-msgid "service"
-msgstr "vía de serviciu"
-
-msgid "bus_guideway"
-msgstr "carril-guía bus"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "en construcción"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vau"
@@ -17982,32 +18032,29 @@ msgstr "Interruptor de víes"
 msgid "Aerialway"
 msgstr "Remonte"
 
-msgid "Chair Lift"
-msgstr "Telesilla"
+msgid "Cable Car"
+msgstr "Telecabina"
 
 msgid "Number of people per hour"
 msgstr "Númberu de persones per hora"
 
-msgid "Number of people per chair"
-msgstr "Númberu de persones per siella"
+msgid "Number of people per car"
+msgstr "Númberu de persona per coche"
 
 msgid "Typical journey time in minutes"
 msgstr "Tiempu de viaxe típicu en cuestión de minutos"
 
-msgid "Has bubble?"
-msgstr "¿Tien cápsula protectora?"
-
 msgid "Has heating?"
 msgstr "¿Ta calefactáu?"
 
-msgid "Drag Lift"
-msgstr "Telearrastre"
+msgid "Chair Lift"
+msgstr "Telesilla"
 
-msgid "Cable Car"
-msgstr "Telecabina"
+msgid "Number of people per chair"
+msgstr "Númberu de persones per siella"
 
-msgid "Number of people per car"
-msgstr "Númberu de persona per coche"
+msgid "Has bubble?"
+msgstr "¿Tien cápsula protectora?"
 
 msgid "Gondola"
 msgstr "Góndola"
@@ -18021,17 +18068,25 @@ msgstr "Telemix (sielles y cabines)"
 msgid "Number of people per gondola/chair"
 msgstr "Númberu de persones per góndola/siella"
 
-msgid "T-bar Lift"
-msgstr "Telesquí T-chigre"
+msgid "Drag Lift"
+msgstr "Telearrastre"
 
-msgid "J-bar Lift"
-msgstr "Telesquí J-chigre"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Telesquí"
+msgid "t-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Telecuerda"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Alfombra máxica"
@@ -18115,6 +18170,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18145,12 +18203,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18348,6 +18409,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Llávense bicicletes (pagando)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Tresporte públicu"
 
@@ -18606,6 +18670,14 @@ msgstr "Plataforma d''estacionamientu"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "sí"
+
 msgid "Beacon"
 msgstr "Baliza"
 
@@ -19851,10 +19923,6 @@ msgid "Man Made"
 msgstr "Fechu pol home"
 
 msgctxt "building"
-msgid "yes"
-msgstr "sí"
-
-msgctxt "building"
 msgid "roof"
 msgstr "teyáu"
 
@@ -19875,16 +19943,16 @@ msgid "school"
 msgstr "colexu"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "comercial"
 
 msgctxt "building"
-msgid "farm"
-msgstr "granxa"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19957,6 +20025,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "vivienda unifamiliar"
 
+msgctxt "building"
+msgid "farm"
+msgstr "granxa"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -21456,7 +21528,7 @@ msgstr "Parque Nacional"
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21486,11 +21558,6 @@ msgstr "Ciudá (>100.000 hab.)"
 msgid "Town"
 msgstr "Ciudá (10.000 - 100.000 hab.)"
 
-msgid "Suburb"
-msgstr ""
-"Poblamientu compactu (grandes barrios, suburbios, polígonos de viviendes, "
-"distritos, etc.)"
-
 msgid "Village"
 msgstr "Población (< 10.000 hab.)"
 
@@ -21498,6 +21565,18 @@ msgid "Hamlet"
 msgstr ""
 "Poblamientu laxo (pequenos barrios, aldegues, caseríos, tremaos, etc.)"
 
+msgid "Isolated Dwelling"
+msgstr "Vivienda aisllada"
+
+msgid "Suburb"
+msgstr ""
+"Poblamientu compactu (grandes barrios, suburbios, polígonos de viviendes, "
+"distritos, etc.)"
+
+msgid "Neighbourhood"
+msgstr ""
+"Vecinderu (área d''un llugar habitáu, urbanización, colonia, barriu, etc.)"
+
 msgid "Farm"
 msgstr "Granxa"
 
@@ -21507,13 +21586,6 @@ msgstr "Una granxa dientro d''un establecimientu mayor"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(por favor utilice isolated_dwelling pa una granxa aisllada)"
 
-msgid "Isolated Dwelling"
-msgstr "Vivienda aisllada"
-
-msgid "Neighbourhood"
-msgstr ""
-"Vecinderu (área d''un llugar habitáu, urbanización, colonia, barriu, etc.)"
-
 msgid "Locality"
 msgstr "Paraxa"
 
@@ -22046,6 +22118,37 @@ msgstr "Imaxe"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contactu (esquema col prefixu ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "segmentu esterior"
 
@@ -22409,17 +22512,14 @@ msgstr "Prueba"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22430,14 +22530,14 @@ msgstr "OpenStreetMap GPS Traces"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Blancu y Negru)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, ensin etiquetes)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "mapa de calor de skobbler"
@@ -22469,6 +22569,54 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI blancu-y-negru 2.5m"
 
@@ -22512,7 +22660,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22533,6 +22684,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Czech CUZK:KM"
 
@@ -22663,8 +22820,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22749,6 +22906,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italy"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -22965,16 +23128,16 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22983,6 +23146,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -23250,6 +23416,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Decrementando númberos de portal na interpolación de portales"
 
@@ -23347,6 +23516,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -29146,6 +29318,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Grabar arquivu SDS"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Simplificar área"
 
@@ -29220,9 +29407,6 @@ msgstr "Factor de distancia"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Estragal de Combinación de Nodos Allegaos"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "Autograbar LiveData"
 
diff --git a/i18n/po/az.po b/i18n/po/az.po
index 900955f..bfaa9d5 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\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: 2014-12-29 04:37+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:36+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -214,6 +214,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2035,9 +2042,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5610,10 +5614,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9047,7 +9047,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9068,6 +9068,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11037,7 +11043,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14217,6 +14223,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15209,12 +15221,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15310,45 +15398,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16183,31 +16233,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16222,16 +16269,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16316,6 +16371,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16346,12 +16404,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16547,6 +16608,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16805,6 +16869,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18048,10 +18120,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18072,15 +18140,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18154,6 +18222,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19651,7 +19723,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19681,28 +19753,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20220,6 +20292,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20583,16 +20686,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20604,13 +20704,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20643,6 +20743,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20686,7 +20834,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20707,6 +20858,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20835,7 +20992,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20918,6 +21075,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21134,16 +21297,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21152,6 +21315,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21419,6 +21585,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21511,6 +21680,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26845,6 +27017,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26905,9 +27092,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/be.po b/i18n/po/be.po
index 0f1a109..928a95a 100644
--- a/i18n/po/be.po
+++ b/i18n/po/be.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-07-08 12:07+0000\n"
 "Last-Translator: Andrew West <2thewest at gmail.com>\n"
 "Language-Team: Belarusian <i18n at mova.org>\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: 2014-12-29 04:38+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:38+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: be\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -220,6 +220,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Няма канчатковых слаёў"
 
+msgid "Select"
+msgstr "Выбар"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Дадаць слой здымка {0}"
 
@@ -2177,9 +2184,6 @@ msgstr ""
 "прайгравання гуку ў гэтым месцы. SHIFT + адпусціць для сінхранізацыі гуку ў "
 "гэтай кропцы"
 
-msgid "Select"
-msgstr "Выбар"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Выдзяляць, перамяшчаць, маштабаваць і круціць аб'екты"
 
@@ -5785,10 +5789,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9231,7 +9231,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9252,6 +9252,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11221,7 +11227,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14401,6 +14407,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15393,12 +15405,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15494,45 +15582,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16367,31 +16417,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16406,16 +16453,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16500,6 +16555,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16530,12 +16588,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16731,6 +16792,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16989,6 +17053,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18232,10 +18304,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18256,15 +18324,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18338,6 +18406,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19835,7 +19907,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19865,28 +19937,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20404,6 +20476,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20767,16 +20870,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20788,13 +20888,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20827,6 +20927,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20870,7 +21018,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20891,6 +21042,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21019,7 +21176,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21102,6 +21259,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21318,16 +21481,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21336,6 +21499,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21603,6 +21769,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21695,6 +21864,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27033,6 +27205,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27093,9 +27280,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/bg.po b/i18n/po/bg.po
index 109a07a..f77f608 100644
--- a/i18n/po/bg.po
+++ b/i18n/po/bg.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-11-05 05:58+0000\n"
 "Last-Translator: pl <Unknown>\n"
 "Language-Team: Bulgarian <bg at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:42+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:41+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: bg\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -223,6 +223,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Няма целеви слоеве"
 
+msgid "Select"
+msgstr "Избиране"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Изберете на картата всички обекти, избрани в списъка по-горе."
+
 msgid "Add imagery layer {0}"
 msgstr "Добавете слой с изображения {0}"
 
@@ -2121,9 +2128,6 @@ msgstr ""
 "възпроизвеждате оттам нататък; SHIFT+отпускане за да синхронизирате звука в "
 "тази точка."
 
-msgid "Select"
-msgstr "Избиране"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5742,10 +5746,6 @@ msgstr "Разрешаване"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Отваряне диалог за сливане на избраните обекти от горния списък."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Изберете на картата всички обекти, избрани в списъка по-горе."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9230,10 +9230,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} км/ч"
 
 msgid ""
 "\n"
@@ -9253,6 +9251,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Изображения JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11266,7 +11270,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14487,6 +14491,12 @@ msgstr "Предоставя маршрутизиращи възможности
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15483,12 +15493,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Улица паркинг"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Път (неизвестен тип)"
 
 msgid "Construction"
 msgstr "Пътен ремонт"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Пътен възел"
 
@@ -15584,47 +15670,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Кръгово движение"
 
-msgid "motorway"
-msgstr "автомагистрала"
-
-msgid "motorway_link"
-msgstr "Автомагистрална връзка"
-
-msgid "trunk"
-msgstr "скоростен път"
-
-msgid "trunk_link"
-msgstr "връзка към скоростен път"
-
-msgid "primary"
-msgstr "главен / първокласен"
-
-msgid "primary_link"
-msgstr "Връзка с главен път"
-
-msgid "secondary"
-msgstr "второкласен"
-
-msgid "tertiary"
-msgstr "третокласен"
-
-msgid "unclassified"
-msgstr "Некласифициран"
-
-msgid "residential"
-msgstr "улица"
-
-msgid "living_street"
-msgstr "Жилищна улица"
-
-msgid "service"
-msgstr "служебна"
-
-msgid "bus_guideway"
-msgstr "Направлява автобуси"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "ремонт"
+msgstr ""
 
 msgid "Ford"
 msgstr "Брод"
@@ -16457,31 +16505,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Надземни линии"
 
-msgid "Chair Lift"
-msgstr "Седалков лифт"
+msgid "Cable Car"
+msgstr "Кабинков лифт"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Влек"
+msgid "Chair Lift"
+msgstr "Седалков лифт"
 
-msgid "Cable Car"
-msgstr "Кабинков лифт"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16496,16 +16541,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Влек"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16590,6 +16643,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16620,12 +16676,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16821,6 +16880,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Обществен транспорт"
 
@@ -17079,6 +17141,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Маяк / Радиопредавател"
 
@@ -18322,10 +18392,6 @@ msgid "Man Made"
 msgstr "Изкуствени"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18346,15 +18412,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18428,6 +18494,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Вход"
 
@@ -19925,7 +19995,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19955,28 +20025,28 @@ msgstr "Град (над 100 000)"
 msgid "Town"
 msgstr "Град (под 100 000)"
 
-msgid "Suburb"
-msgstr "Квартал/предградие"
-
 msgid "Village"
 msgstr "Село"
 
 msgid "Hamlet"
 msgstr "Махала"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Квартал/предградие"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20494,6 +20564,37 @@ msgstr "Изображение"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "външен сегмент"
 
@@ -20857,16 +20958,13 @@ msgstr "Тест"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20878,13 +20976,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20917,6 +21015,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20960,7 +21106,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20981,6 +21130,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21109,7 +21264,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21192,6 +21347,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21408,16 +21569,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21426,6 +21587,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21693,6 +21857,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21785,6 +21952,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27169,6 +27339,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27229,9 +27414,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "Автоматичен запис на данни на живо"
 
diff --git a/i18n/po/bn.po b/i18n/po/bn.po
index f6cf724..c00bf5f 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-06-13 16:28+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: 2014-12-29 04:39+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:38+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: bn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "কোনও লক্ষ্য স্তর না"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2039,9 +2046,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5614,10 +5618,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9051,7 +9051,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9072,6 +9072,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11041,7 +11047,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14221,6 +14227,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15213,12 +15225,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15314,45 +15402,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16187,31 +16237,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16226,16 +16273,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16320,6 +16375,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16350,12 +16408,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16551,6 +16612,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16809,6 +16873,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18052,10 +18124,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18076,15 +18144,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18158,6 +18226,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19655,7 +19727,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19685,28 +19757,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20224,6 +20296,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20587,16 +20690,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20608,13 +20708,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20647,6 +20747,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20690,7 +20838,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20711,6 +20862,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20839,7 +20996,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20922,6 +21079,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21138,16 +21301,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21156,6 +21319,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21423,6 +21589,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21515,6 +21684,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26849,6 +27021,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26909,9 +27096,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/br.po b/i18n/po/br.po
index 3210239..a924f25 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-10-17 12:11+0000\n"
 "Last-Translator: Fulup <Unknown>\n"
 "Language-Team: Breton <br at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:41+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:40+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: br\n"
 
 msgid "License"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/bs.po b/i18n/po/bs.po
index bdf985a..e87fcec 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-11-03 23:07+0000\n"
 "Last-Translator: Alen Mahovic <eyeofthestorm at windowslive.com>\n"
 "Language-Team: Bosnian <bs at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:40+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:39+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: bs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2039,9 +2046,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5614,10 +5618,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9051,7 +9051,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9072,6 +9072,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11041,7 +11047,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14221,6 +14227,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15213,12 +15225,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15314,45 +15402,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16187,31 +16237,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16226,16 +16273,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16320,6 +16375,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16350,12 +16408,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16551,6 +16612,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16809,6 +16873,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18052,10 +18124,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18076,15 +18144,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18158,6 +18226,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19655,7 +19727,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19685,28 +19757,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20224,6 +20296,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20587,16 +20690,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20608,13 +20708,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20647,6 +20747,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20690,7 +20838,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20711,6 +20862,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20839,7 +20996,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20922,6 +21079,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21138,16 +21301,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21156,6 +21319,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21423,6 +21589,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21515,6 +21684,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26849,6 +27021,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26909,9 +27096,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ca.po b/i18n/po/ca.po
index 0b1c0a6..f7dfb74 100644
--- a/i18n/po/ca.po
+++ b/i18n/po/ca.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-26 23:17+0000\n"
-"Last-Translator: Don-vip <Unknown>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-31 17:59+0000\n"
+"Last-Translator: pitort <pitort at eclipso.eu>\n"
 "Language-Team: el_libre - - www.catmidia.cat\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: 2014-12-29 04:43+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:42+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ca\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -121,7 +121,7 @@ msgid ""
 msgstr ""
 "<h2>JOSM necessita la versió {0} de Java.</h2>Ha estat detectada la versió: "
 "{1}.<br>Podeu <ul><li>actualitzar la vostra versió de Java (JRE) o</li><li>o "
-"bé utilitzar una versió anterior de JOSM compatible amb Java "
+"bé utilitzar una versió anterior del JOSM compatible amb Java "
 "{2}.</li></ul>Més informació:"
 
 msgid "Exit JOSM"
@@ -227,6 +227,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "No hi ha capes de destí"
 
+msgid "Select"
+msgstr "Selecciona"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Selecciona sobre el mapa els elements seleccionats a la llista de sobre."
+
 msgid "Add imagery layer {0}"
 msgstr "Afegeix la capa d''imatge {0}"
 
@@ -283,8 +291,7 @@ msgstr "No és possible determinar el centre dels nodes seleccionats."
 msgid ""
 "One or more nodes involved in this action is outside of the downloaded area."
 msgstr ""
-"Hi ha un o més nodes involucrats en l''acció que són fora de l''àrea "
-"descarregada."
+"Hi ha un o més nodes involucrats en l''acció que són fora de l''àrea baixada."
 
 msgid "Align Nodes in Line"
 msgstr "Alinea els nodes en una línia"
@@ -478,7 +485,7 @@ msgid ""
 "<html>This action will require {0} individual<br>download requests. Do you "
 "wish<br>to continue?</html>"
 msgstr ""
-"<html>Aquesta acció requerirà {0} peticions <br>de descàrrega. Voleu "
+"<html>Aquesta acció requerirà {0} peticions <br>de baixada. Voleu "
 "<br>continuar?</html>"
 
 msgid "Download data"
@@ -1009,13 +1016,13 @@ msgid "Select if the data should be downloaded into a new layer"
 msgstr "Seleccioneu si les dades haurien de baixar-se en una capa nova"
 
 msgid "Enter URL to download:"
-msgstr "Entreu URL per descarregar"
+msgstr "Entreu URL per a baixar"
 
 msgid "Enter an URL from where data should be downloaded"
-msgstr "Introduïu una URL des d''on les dades han de ser descarregades"
+msgstr "Introduïu una URL des d''on les dades han de ser baixades"
 
 msgid "Download Location"
-msgstr "Ubicació de descàrrega"
+msgstr "Ubicació de baixada"
 
 msgid "Download URL"
 msgstr "URL de baixada"
@@ -1033,8 +1040,8 @@ msgid ""
 "Cannot open URL ''{0}''<br>The following download tasks accept the URL "
 "patterns shown:<br>{1}"
 msgstr ""
-"No ha estat possible d''obrir la URL ''{0}''<br>Les segünets tasques de "
-"descàrrega accepten els patrons d''URL que d''indiquen:<br>{1}"
+"No ha estat possible d''obrir l''URL ''{0}''<br>Les segünets tasques de "
+"baixada accepten els patrons d''URL que d''indiquen:<br>{1}"
 
 msgid ""
 "<h3>When one or more ways are selected, the shape is adjusted such, that all "
@@ -1214,7 +1221,7 @@ msgid "Report bug"
 msgstr "Informa d''un error"
 
 msgid "Report a ticket to JOSM bugtracker"
-msgstr "Informa d''un problema al sistema de de seguiment d''errors de JOSM"
+msgstr "Informa d''un problema al sistema de de seguiment d''errors del JOSM"
 
 msgid "Restart"
 msgstr "Reinicia"
@@ -1537,9 +1544,9 @@ msgid ""
 "downloaded.<br>This can cause problems because other objects (that you do "
 "not see) might use them.<br>Do you really want to unglue?"
 msgstr ""
-"Sou a punt de separar nodes situats fora de la zona que heu "
-"descarregat.<br>Això pot causar problemes perquè altres objectes (que no "
-"veieu) els poden estar utilitzant.<br>Segur que els voleu separar?"
+"Sou a punt de separar nodes situats fora de la zona que heu baixat.<br>Això "
+"pot causar problemes perquè altres objectes (que no veieu) els poden estar "
+"utilitzant.<br>Segur que els voleu separar?"
 
 msgid ""
 "You are about to unglue incomplete objects.<br>This will cause problems "
@@ -1819,10 +1826,10 @@ msgid "Slower Forward"
 msgstr "Avança a poc a poc"
 
 msgid "Download GPS"
-msgstr "Descarrega GPS"
+msgstr "Baixa del GPS"
 
 msgid "Downloading GPS data"
-msgstr "Descarregant dades del GPS"
+msgstr "S''estan baixant les dades del GPS"
 
 msgid "Downloaded GPX Data"
 msgstr "Dades GPX baixades"
@@ -1831,27 +1838,27 @@ msgid "Markers from {0}"
 msgstr "Marcadors de {0}"
 
 msgid "Downloading Notes"
-msgstr "Descarregant notes"
+msgstr "S''estan baixant les notes"
 
 msgid "Download Compressed OSM Change"
-msgstr "Descarrega modificacions OSM comprimides"
+msgstr "Baixa modificacions OSM comprimides"
 
 msgid "Download OSM Change"
-msgstr "Descarrega modificacions OSM"
+msgstr "Baixa modificacions OSM"
 
 msgid "Download Compressed OSM"
-msgstr "Descarrega OSM comprimit"
+msgstr "Baixa OSM comprimit"
 
 msgid "Download OSM"
-msgstr "Descarregar OSM"
+msgstr "Baixar OSM"
 
 msgid "Downloading data"
-msgstr "Descarregant dades"
+msgstr "S''estan baixant dades"
 
 msgid ""
 "Ignoring exception because download has been canceled. Exception was: {0}"
 msgstr ""
-"Ignorant l''excepció perquè la descàrrega ha estat cancel·lada. L''excepció "
+"Ignorant l''excepció perquè la baixada ha estat cancel·lada. L''excepció "
 "era: {0}"
 
 msgid "No data found in this area."
@@ -1867,7 +1874,7 @@ msgid "Request details: {0}"
 msgstr "Detalls de la petició: {0}"
 
 msgid "Download OSM URL"
-msgstr "Descarrega la URL d''OSM"
+msgstr "Baixla l''URL de l''OSM"
 
 msgid "There was {0} conflict during import."
 msgid_plural "There were {0} conflicts during import."
@@ -1876,8 +1883,8 @@ msgstr[1] "Ha hagut {0} conflictes durant la importació."
 
 msgid "Conflict during download"
 msgid_plural "Conflicts during download"
-msgstr[0] "Conflicte durant la descàrrega."
-msgstr[1] "Conflictes durant la descàrrega."
+msgstr[0] "Conflicte durant la baixada."
+msgstr[1] "Conflictes durant la baixada."
 
 msgid "({0}/{1}) Loading parents of node {2}"
 msgstr "({0}/{1}) Carregant parents del node {2}"
@@ -1889,7 +1896,7 @@ msgid "({0}/{1}) Loading parents of relation {2}"
 msgstr "({0}/{1}) Carregant parents de la relació {2}"
 
 msgid "Download session"
-msgstr "Descarrega sessió"
+msgstr "Baixa la sessió"
 
 msgid "Download {0} of {1} ({2} left)"
 msgstr "Baixa {0} de {1} (manquen {2})"
@@ -1948,13 +1955,13 @@ msgid "Deleted or moved objects"
 msgstr "Objectes esborrats o moguts"
 
 msgid "The following errors occurred during mass download: {0}"
-msgstr "Els errors següents han aparegut durant la descàrrega massiva: {0}"
+msgstr "Els errors següents han aparegut durant la baixada massiva: {0}"
 
 msgid "Errors during download"
-msgstr "Errors durant la descàrrega"
+msgstr "Errors durant la baixada"
 
 msgid "Error during download"
-msgstr "Error durant la descàrrega"
+msgstr "Error durant la baixada"
 
 msgid "Add a new Note"
 msgstr "Afegeix una Nota nova"
@@ -2231,9 +2238,6 @@ msgstr ""
 "llegir; Majúscules+deixar anar el capçal per sincronitzar l''àudio en aquell "
 "punt."
 
-msgid "Select"
-msgstr "Selecciona"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Selecciona, mou, escala i rota objectes"
 
@@ -2322,16 +2326,16 @@ msgid "Delete the selected relation"
 msgstr "Suprimir la relació seleccionada"
 
 msgid "Download all members of the selected relations"
-msgstr "Descarrega els membres de la relació seleccionada"
+msgstr "Baixa els membres de la relació seleccionada"
 
 msgid "Download members"
-msgstr "Descarrega membres"
+msgstr "Baixa els membres"
 
 msgid "Download incomplete members of selected relations"
-msgstr "Descarrega els membres incomplets de la relació seleccionada"
+msgstr "Baixa els membres incomplets de la relació seleccionada"
 
 msgid "Download incomplete members"
-msgstr "Descarrega membres incomplets"
+msgstr "Baixa els membres incomplets"
 
 msgid "Create a copy of this relation and open it in another editor window"
 msgstr ""
@@ -2623,8 +2627,8 @@ msgid ""
 "<b>(all)indownloadedarea</b> - objects (and all its way nodes / relation "
 "members) in downloaded area"
 msgstr ""
-"<b>(tot)dins_zona_descarregada</b> - objectes (i tots els seus nodes / "
-"relacions ) de la zona descarregada"
+"<b>(tot)dins_zona_baixada</b> - objectes (i tots els seus nodes / relacions "
+") de la zona baixada"
 
 msgid ""
 "<b>(all)inview</b> - objects (and all its way nodes / relation members) in "
@@ -2805,7 +2809,7 @@ msgstr ""
 "objectes (i tots els seus nodes / membres de relació) a la vista actual"
 
 msgid "objects in downloaded area"
-msgstr "objectes a l''àrea descarregada"
+msgstr "objectes a l''àrea baixada"
 
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
@@ -3117,10 +3121,9 @@ msgid ""
 "downloaded.<br>This can cause problems because other objects (that you do "
 "not see) might use them.<br>Do you really want to delete?"
 msgstr ""
-"Sou a punt de suprimir nodes situats fora de la zona que heu "
-"descarregat.<br>Això pot provocar problemes perquè pot haver altres "
-"obejectes, que no veieu, que els poden estar utilitzant.<br>Segur que els "
-"voleu eliminar?"
+"Sou a punt de suprimir nodes situats fora de la zona que heu baixat.<br>Això "
+"pot provocar problemes perquè pot haver altres obejectes, que no veieu, que "
+"els poden estar utilitzant.<br>Segur que els voleu eliminar?"
 
 msgid ""
 "You are about to delete incomplete objects.<br>This will cause problems "
@@ -3484,7 +3487,7 @@ msgstr "Desconegut"
 
 msgid "Unexpected JOSM version number in revision file, value is ''{0}''"
 msgstr ""
-"Número inesperat de la versió de JOSM al fitxer de revisió, el valor és "
+"Número inesperat de la versió del JOSM al fitxer de revisió, el valor és "
 "''{0}''"
 
 msgid "The revision file ''/REVISION'' is missing."
@@ -3881,25 +3884,25 @@ msgid "E-mail address contains an invalid domain: {0}"
 msgstr "L''adreça de correu electrònic conté un domini incorrecte: {0}"
 
 msgid "URL contains non-ascii characters"
-msgstr "La URL conté caràcters que no són de tipus ASCII"
+msgstr "l''URL conté caràcters que no són de tipus ASCII"
 
 msgid "URL is invalid"
-msgstr "La URL no és vàlida"
+msgstr "l''URL no és vàlida"
 
 msgid "URL contains an invalid protocol: {0}"
-msgstr "La URL indica un protocol que no és vàlid: {0}"
+msgstr "l''URL indica un protocol que no és vàlid: {0}"
 
 msgid "URL contains an invalid authority: {0}"
-msgstr "La URL indica una autoritat que no és vàlida: {0}"
+msgstr "l''URL indica una autoritat que no és vàlida: {0}"
 
 msgid "URL contains an invalid path: {0}"
-msgstr "La URL indica un camí que no és vàlid: {0}"
+msgstr "l''URL indica un camí que no és vàlid: {0}"
 
 msgid "URL contains an invalid query: {0}"
-msgstr "La URLconté una consulta que no és vàlida: {0}"
+msgstr "l''URLconté una consulta que no és vàlida: {0}"
 
 msgid "URL contains an invalid fragment: {0}"
-msgstr "La URL conté un fragment que no és vàlid: {0}"
+msgstr "l''URL conté un fragment que no és vàlid: {0}"
 
 msgid "Addresses"
 msgstr "Adreces"
@@ -4118,7 +4121,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Verifica si hi ha errors a les etiquetes relacionades amb Internet"
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr " La URL no pot ser convertida a ASCII: {0}"
+msgstr " l''URL no pot ser convertida a ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4351,19 +4354,22 @@ msgstr "La relació és buida"
 
 msgid "Role member does not match expression {0} in template {1}"
 msgstr ""
+"El membre del rol no coincideix amb l''expressió {0} a la plantilla {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
 msgstr ""
+"El membre de tipus {0} del rol no coincideix amb la llista de {1} de la "
+"plantilla {2}"
 
 msgid "<empty>"
 msgstr "<buit>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Rol {0} desconegut a les plantilles {1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "S''ha trobat un rol amb tipus buit, s''esperava un rol de tipus {0}"
 
 msgid "Role {0} missing"
 msgstr "Manca rol {0}"
@@ -4870,20 +4876,20 @@ msgid "Standard unix geometry argument"
 msgstr "Argument de geometria estàndard UNIX"
 
 msgid "Download the bounding box"
-msgstr "Descarrega la zona delimitada"
+msgstr "Baixa la zona delimitada"
 
 msgid "Download the location at the URL (with lat=x&lon=y&zoom=z)"
-msgstr "Descarrega la localització de la URL (amb lat=x&lon=y&zoom=z)"
+msgstr "Baixa la localització de l''URL (amb lat=x&lon=y&zoom=z)"
 
 msgid "Open a file (any file type that can be opened with File/Open)"
 msgstr "Obre un fitxer (de qualsevol tipus que pugui ser obert per osm)"
 
 msgid "Download the bounding box as raw GPS"
-msgstr "Descarrega la zona delimitada com a dades GPS"
+msgstr "Baixa la zona delimitada com a dades GPS"
 
 msgid "Download the location at the URL (with lat=x&lon=y&zoom=z) as raw GPS"
 msgstr ""
-"Descarrega la localització de la URL (amb lat=x&lon=y&zoom=z) com a dades GPS"
+"Baixa la localització de l''URL (amb lat=x&lon=y&zoom=z) com a dades GPS"
 
 msgid "Select with the given search"
 msgstr "Selecciona amb la cerca donada"
@@ -4904,7 +4910,7 @@ msgid "Set the language"
 msgstr "Tria l''idioma"
 
 msgid "Displays the JOSM version and exits"
-msgstr "Mostra la versió de JOSM i sortir"
+msgstr "Mostra la versió del JOSM i sortir"
 
 msgid "Print debugging messages to console"
 msgstr "Mostra els missatges de depuració del codi a la consola"
@@ -5018,7 +5024,7 @@ msgstr[1] ""
 "JOSM funciona en mode fora de línia. Aquests recursos no està disponible: {0}"
 
 msgid "Unsaved osm data"
-msgstr "Dades d''osm no enregistrades"
+msgstr "Dades de l''OSM no enregistrades"
 
 msgid "Restore"
 msgstr "Restaura"
@@ -5028,8 +5034,8 @@ msgstr "Descarta"
 
 msgid "JOSM found {0} unsaved osm data layer. "
 msgid_plural "JOSM found {0} unsaved osm data layers. "
-msgstr[0] "JOSM ha trobat {0} capa d''osm sense enregistrar. "
-msgstr[1] "JOSM ha trobat {0} capes d''osm sense enregistrar. "
+msgstr[0] "JOSM ha trobat {0} capa de l''OSM sense enregistrar. "
+msgstr[1] "JOSM ha trobat {0} capes de l''OSM sense enregistrar. "
 
 msgid ""
 "It looks like JOSM crashed last time. Would you like to restore the data?"
@@ -5349,7 +5355,7 @@ msgid "Apply the tile address"
 msgstr "Aplica l''adreça de la tessel·la"
 
 msgid "Please enter a tile address"
-msgstr "Si us plau, introduïu una adreça de tessel·la"
+msgstr "Introduïu una adreça de tessel·la"
 
 msgid "The current value isn''t a valid tile address"
 msgstr "El valor no és una adreça de tessel·la vàlida"
@@ -6111,12 +6117,12 @@ msgid "Select all objects assigned to the currently selected changesets"
 msgstr "Selecciona tot els objectes al conjunt de canvis seleccionat"
 
 msgid "Download"
-msgstr "Descarrega"
+msgstr "Baixa"
 
 msgid ""
 "Download information about the selected changesets from the OSM server"
 msgstr ""
-"Descarrega del servidor OSM informació sobre el conjunt de canvis seleccionat"
+"Baixa del servidor OSM informació sobre el conjunt de canvis seleccionat"
 
 msgid "Closes the selected open changesets"
 msgstr "Tanca els conjunts de canvis oberts que s''han seleccionats"
@@ -6187,11 +6193,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Obre una finestra per fusionar els elements seleccionats a la llista."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Selecciona sobre el mapa els elements seleccionats a la llista de sobre."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Ha estat detectat {0} conflicte."
@@ -6982,27 +6983,27 @@ msgstr ""
 "servidor OSM"
 
 msgid "Download changeset content"
-msgstr "Descarregar el contingut del conjunt de canvis"
+msgstr "Baixar el contingut del conjunt de canvis"
 
 msgid "Download the content of the selected changesets from the server"
 msgstr ""
-"Descarregar del servidor el contingut dels conjunts de canvis seleccionats"
+"Baixar del servidor el contingut dels conjunts de canvis seleccionats"
 
 msgid "My changesets"
 msgstr "El meu conjunt de canvis"
 
 msgid "Download my changesets from the OSM server (max. 100 changesets)"
 msgstr ""
-"Descarregar del servidor OSM els meus conjunts de canvis (màx. 100 conjunts)"
+"Baixar del servidor OSM els meus conjunts de canvis (màx. 100 conjunts)"
 
 msgid ""
 "<html>JOSM is currently running with an anonymous user. It cannot "
 "download<br>your changesets from the OSM server unless you enter your OSM "
 "user name<br>in the JOSM preferences.</html>"
 msgstr ""
-"<html>Esteu utilitzant JOSM com a usuari anònim. No podeu "
-"descarregar<br>yels vostres conjunts de canvis del servidor OSM sense entrar "
-"un nom d''usuari<br>a les preferències de JOSM.</html>"
+"<html>Esteu utilitzant JOSM com a usuari anònim. No podeu baixar<br>yels "
+"vostres conjunts de canvis del servidor OSM sense entrar un nom "
+"d''usuari<br>a les preferències del JOSM.</html>"
 
 msgctxt "changeset.upload-comment"
 msgid "empty"
@@ -7035,13 +7036,13 @@ msgid "Discussions"
 msgstr "Discussions"
 
 msgid "Downloading changeset content"
-msgstr "Descarregant el contingut del conjunt de canvis"
+msgstr "Baixant el contingut del conjunt de canvis"
 
 msgid "({0}/{1}) Downloading changeset {2}..."
-msgstr "({0}/{1}) Descarregant el conjunt de canvis {2}..."
+msgstr "({0}/{1}) Baixant el conjunt de canvis {2}..."
 
 msgid "({0}/{1}) Downloading content for changeset {2}..."
-msgstr "({0}/{1}) Descarregant el contingut del conjunt de canvis {2}..."
+msgstr "({0}/{1}) Baixant el contingut del conjunt de canvis {2}..."
 
 msgid ""
 "<html>The selected object is not available in the current<br>edit layer "
@@ -7057,10 +7058,10 @@ msgstr[1] ""
 "edició ''{0}''.</html>"
 
 msgid "Download content"
-msgstr "Descarregar el contingut"
+msgstr "Baixar el contingut"
 
 msgid "Download the changeset content from the OSM server"
-msgstr "Descarregar del servidor OSM el contingut del conjunt de canvis"
+msgstr "Baixar del servidor OSM el contingut del conjunt de canvis"
 
 msgid "Update content"
 msgstr "Actualitzar el contingut"
@@ -7070,7 +7071,7 @@ msgstr ""
 "Actualitzar el contingut del conjunt de canvis amb dades del servidor OSM"
 
 msgid "Download and show the history of the selected objects"
-msgstr "Descarregar i mostrar l''historial de l''objecte seleccionat"
+msgstr "Baixar i mostrar l''historial de l''objecte seleccionat"
 
 msgid "Select in layer"
 msgstr "Seleccionar a la capa"
@@ -7091,14 +7092,13 @@ msgid "Nothing to zoom to"
 msgstr "Res a ampliar"
 
 msgid "The content of this changeset is not downloaded yet."
-msgstr ""
-"El contingut d''aquest conjunt de canvis encara no ha estat descarregat."
+msgstr "El contingut d''aquest conjunt de canvis encara no ha estat baixat."
 
 msgid "Download now"
 msgstr "Baixa-ho ara"
 
 msgid "Download the changeset content"
-msgstr "Descarregar el contingut del conjunt de canvis"
+msgstr "Baixar el contingut del conjunt de canvis"
 
 msgid "Created"
 msgstr "Creat"
@@ -7169,7 +7169,7 @@ msgid "Date"
 msgstr "Data"
 
 msgid "Download changesets"
-msgstr "Descarregar els conjunts de canvis"
+msgstr "Baixar els conjunts de canvis"
 
 msgid "{0} [incomplete]"
 msgstr "{0} [incomplet]"
@@ -7189,8 +7189,8 @@ msgstr "Indiqueu un ID de conjunt de canvis"
 msgid ""
 "Download the changeset with the specified id, including the changeset content"
 msgstr ""
-"Descarregar el conjunt de canvis corresponent a l''ID especificat, incloent-"
-"hi el seu contingut"
+"Baixar el conjunt de canvis corresponent a l''ID especificat, incloent-hi el "
+"seu contingut"
 
 msgid "Select changesets owned by specific users"
 msgstr "Els conjunts de canvis seleccionats pertanyen a diferents usuaris"
@@ -7254,13 +7254,13 @@ msgstr ""
 "d''usuari ''{0}''"
 
 msgid "Please enter a valid user ID"
-msgstr "Si us plau, indiqueu un ID d''usuari vàlid"
+msgstr "Indiqueu un ID d''usuari vàlid"
 
 msgid "Invalid user ID"
 msgstr "L''ID de l''usuari no és vàlid"
 
 msgid "Please enter a non-empty user name"
-msgstr "Si us plau, indiqueu un nom d''usuari"
+msgstr "Indiqueu un nom d''usuari"
 
 msgid "Invalid user name"
 msgstr "Nom d''usuari no vàlid"
@@ -7298,8 +7298,8 @@ msgid ""
 "<html>Please enter valid date/time values to restrict<br>the query to a "
 "specific time range.</html>"
 msgstr ""
-"<html>Si us plau, indiqueu una data i hora vàlides per a limitar<br>la "
-"consulta a un interval de temps específic.</html>"
+"<html>Indiqueu una data i hora vàlides per a limitar<br>la consulta a un "
+"interval de temps específic.</html>"
 
 msgid "Invalid date/time values"
 msgstr "Els valors de data i hora no són vàlids"
@@ -7315,9 +7315,8 @@ msgid ""
 "<html>Please enter valid longitude/latitude values to restrict<br>the "
 "changeset query to a specific bounding box.</html>"
 msgstr ""
-"<html>Si us plau, indiqueu una longitud i latitud vàlides per a "
-"limitar<br>al consulta sobre els conjunts de canvis a una zona "
-"específica.</html>"
+"<html>Indiqueu una longitud i latitud vàlides per a limitar<br>al consulta "
+"sobre els conjunts de canvis a una zona específica.</html>"
 
 msgid "Invalid bounding box"
 msgstr "El límits no són vàlids"
@@ -7325,11 +7324,10 @@ msgstr "El límits no són vàlids"
 msgid ""
 "The current value is not a valid user ID. Please enter an integer value > 0"
 msgstr ""
-"El valor actual no és un ID d''usuari vàlid. Si us plau, introduïu un valor "
-"enter > 0"
+"El valor actual no és un ID d''usuari vàlid. Introduïu un valor enter > 0"
 
 msgid "Please enter an integer value > 0"
-msgstr "Si us plau, indiqueu un valor enter més gran que 0"
+msgstr "Indiqueu un valor enter més gran que 0"
 
 msgid ""
 "<html>The  current value is not a valid user name.<br>Please enter an non-"
@@ -7345,18 +7343,18 @@ msgid ""
 "Please enter a date in the usual format for your locale.<br>Example: "
 "{0}<br>Example: {1}<br>Example: {2}<br>Example: {3}<br>"
 msgstr ""
-"Si us plau, indiqueu una data en el vostre format local.<br>Exemple: "
-"{0}<br>Exemple: {1}<br>Exemple: {2}<br>Exemple: {3}<br>"
+"Indiqueu una data en el vostre format local.<br>Exemple: {0}<br>Exemple: "
+"{1}<br>Exemple: {2}<br>Exemple: {3}<br>"
 
 msgid ""
 "Please enter a valid time in the usual format for your locale.<br>Example: "
 "{0}<br>Example: {1}<br>Example: {2}<br>Example: {3}<br>"
 msgstr ""
-"Si us plau, indiqueu una hora en el vostre format local.<br>Exemple: "
-"{0}<br>Exemple: {1}<br>Exemple: {2}<br>Exemple: {3}<br>"
+"Indiqueu una hora en el vostre format local.<br>Exemple: {0}<br>Exemple: "
+"{1}<br>Exemple: {2}<br>Exemple: {3}<br>"
 
 msgid "Download my changesets only"
-msgstr "Descarregar només els meus conjunts de canvis"
+msgstr "Baixar només els meus conjunts de canvis"
 
 msgid ""
 "<html>Select to restrict the query to your changesets only.<br>Unselect to "
@@ -7373,35 +7371,34 @@ msgid ""
 "download max. 100 changesets.</html>"
 msgstr ""
 "<html>Si us plau, seleccioneu una de les següents <strong>consultes "
-"estàndard</strong>.Seleccioneu <strong>Descarregar només els meus conjunts "
-"de canvis</strong> si només voleu descarregar els que heu creat.<br>Tingueu "
-"en consideració que JOSM descarregarà un màxim de 100 conjunts de "
-"canvis.</html>"
+"estàndard</strong>.Seleccioneu <strong>Baixar només els meus conjunts de "
+"canvis</strong> si només voleu baixar els que heu creat.<br>Tingueu en "
+"consideració que JOSM baixarà un màxim de 100 conjunts de canvis.</html>"
 
 msgid "<html>Download the latest changesets</html>"
-msgstr "<html>Descarregar els conjunts de canvis més recents</html>"
+msgstr "<html>Baixar els conjunts de canvis més recents</html>"
 
 msgid ""
 "<html>Download my open changesets<br><em>Disabled. Please enter your OSM "
 "user name in the preferences first.</em></html>"
 msgstr ""
-"<html>Descarregar els meus conjunts de canvis oberts<br><em>Deshabilitat. Si "
-"us plau, indiqueu primer el vostre nom d''usuari OSM a les "
+"<html>Baixar els meus conjunts de canvis oberts<br><em>Deshabilitat. Si us "
+"plau, indiqueu primer el vostre nom d''usuari OSM a les "
 "preferències.</em></html>"
 
 msgid "<html>Download my open changesets</html>"
-msgstr "<html>Descarregar els meus conjunts de canvis oberts</html>"
+msgstr "<html>Baixar els meus conjunts de canvis oberts</html>"
 
 msgid ""
 "<html>Download changesets in the current map view.<br><em>Disabled. There is "
 "currently no map view active.</em></html>"
 msgstr ""
-"<html>Descarregar els conjunts de canvis de la vista actual del "
+"<html>Baixar els conjunts de canvis de la vista actual del "
 "mapa.<br><em>Deshabilitat. Actualment no hi ha cap vista activa.</em></html>"
 
 msgid "<html>Download changesets in the current map view</html>"
 msgstr ""
-"<html>Descarregar els conjunts de canvis de la vista actual del mapa</html>"
+"<html>Baixar els conjunts de canvis de la vista actual del mapa</html>"
 
 msgid ""
 "Unexpected value for preference ''{0}'', got ''{1}''. Resetting to default "
@@ -7418,8 +7415,7 @@ msgid "Basic"
 msgstr "Bàsic"
 
 msgid "Download changesets using predefined queries"
-msgstr ""
-"Descarregar els conjunts de canvis utilitzant les consultes predefinides"
+msgstr "Baixar els conjunts de canvis utilitzant les consultes predefinides"
 
 msgid "From URL"
 msgstr "D''una URL"
@@ -7437,11 +7433,10 @@ msgid "Query changesets"
 msgstr "Consultar conjunts de canvis"
 
 msgid "Query and download changesets"
-msgstr "Consultar i descarregar conjunts de canvis"
+msgstr "Consultar i baixar conjunts de canvis"
 
 msgid "Please enter a valid changeset query URL first."
-msgstr ""
-"Si us plau, indiqueu una consulta de URL de conjunts de canvis vàlida"
+msgstr "Indiqueu una consulta de URL de conjunts de canvis vàlida"
 
 msgid "Illegal changeset query URL"
 msgstr "Consulta de URL de conjunts de canvis incorecta"
@@ -7450,21 +7445,20 @@ msgid "Close the dialog and abort querying of changesets"
 msgstr "Tancar la finestra i anular la consulta de conjunts de canvis"
 
 msgid "Querying and downloading changesets"
-msgstr "Consultant i descarregant conjunts de canvis"
+msgstr "Consultant i baixant conjunts de canvis"
 
 msgid "Determine user id for current user..."
 msgstr "Determinar l''ID de l''usuari actual..."
 
 msgid "Query and download changesets ..."
-msgstr "Consultar i descarregar conjunts de canvis ..."
+msgstr "Consultar i baixar conjunts de canvis ..."
 
 msgid "URL: "
 msgstr "Adreça URL: "
 
 msgid "Please enter or paste an URL to retrieve changesets from the OSM API."
 msgstr ""
-"Si us plau, indiqueu o enganxeu una URL per recuperar conjunts de canvis de "
-"l''API OSM"
+"Indiqueu o enganxeu una URL per recuperar conjunts de canvis de l''API OSM"
 
 msgid "Examples"
 msgstr "Exemples"
@@ -7474,7 +7468,7 @@ msgid ""
 "regardless of the host, port and path of the URL entered below."
 msgstr ""
 "Noteu que les peticions del conjunt de canvis són sempre enviades a ''{0}'', "
-"sense tenir en compte el servidor, el port i el camí de la URL que s''havia "
+"sense tenir en compte el servidor, el port i el camí de l''URL que s''havia "
 "entrat."
 
 msgid "This changeset query URL is invalid"
@@ -7676,16 +7670,16 @@ msgstr ""
 "seleccionada."
 
 msgid "Download all child relations (recursively)"
-msgstr "Descarregar totes les relacions filles (recursivament)"
+msgstr "Baixar totes les relacions filles (recursivament)"
 
 msgid "Download All Children"
-msgstr "Descarregar tots els fills"
+msgstr "Baixar tots els fills"
 
 msgid "Download selected relations"
-msgstr "Descarregar les relacions seleccionades"
+msgstr "Baixar les relacions seleccionades"
 
 msgid "Download Selected Children"
-msgstr "Descarregar els fills seleccionats"
+msgstr "Baixar els fills seleccionats"
 
 msgid "Conflict in data"
 msgid_plural "Conflicts in data"
@@ -7706,7 +7700,7 @@ msgid "Relation is deleted"
 msgstr "La relació està suprimida"
 
 msgid "Downloading relation {0}"
-msgstr "Descarregant relació {0}"
+msgstr "Baixant relació {0}"
 
 msgid "Ignoring exception because task was canceled. Exception: {0}"
 msgstr ""
@@ -7714,24 +7708,24 @@ msgstr ""
 
 msgid "Downloading {0} incomplete object"
 msgid_plural "Downloading {0} incomplete objects"
-msgstr[0] "Descarregant {0} objecte incomplet"
-msgstr[1] "Descarregant {0} objectes incomplets"
+msgstr[0] "Baixant {0} objecte incomplet"
+msgstr[1] "Baixant {0} objectes incomplets"
 
 msgid "Downloading {0} incomplete child of relation ''{1}''"
 msgid_plural "Downloading {0} incomplete children of relation ''{1}''"
-msgstr[0] "Descarregant {0} fill incomplet de la relació ''{1}''"
-msgstr[1] "Descarregant {0} fills incomplets de la relació ''{1}''"
+msgstr[0] "Baixant {0} fill incomplet de la relació ''{1}''"
+msgstr[1] "Baixant {0} fills incomplets de la relació ''{1}''"
 
 msgid "Downloading {0} incomplete child of {1} parent relations"
 msgid_plural "Downloading {0} incomplete children of {1} parent relations"
-msgstr[0] "Descarregant {0} fill incomplet de {1} relacions"
-msgstr[1] "Descarregant {0} fills incomplets de {1} relacions"
+msgstr[0] "Baixant {0} fill incomplet de {1} relacions"
+msgstr[1] "Baixant {0} fills incomplets de {1} relacions"
 
 msgid "Download relations"
-msgstr "Descarregant relacions"
+msgstr "Baixant relacions"
 
 msgid "({0}/{1}): Downloading relation ''{2}''..."
-msgstr "({0}/{1}): Descarregant relació ''{2}''..."
+msgstr "({0}/{1}): Baixant relació ''{2}''..."
 
 msgid "Tags and Members"
 msgstr "Atributs i membres"
@@ -7942,16 +7936,16 @@ msgid "Add an empty tag"
 msgstr "Afegeix una etiqueta buida"
 
 msgid "Download all incomplete members"
-msgstr "Descarregant els membres incomplets"
+msgstr "Baixant els membres incomplets"
 
 msgid "Download Members"
-msgstr "Descarregant els membres"
+msgstr "Baixant els membres"
 
 msgid "Relation Editor: Download Members"
-msgstr "Editor de relacions: Descarregar membres"
+msgstr "Editor de relacions: Baixar membres"
 
 msgid "Download selected incomplete members"
-msgstr "Descarregar els mmebres incomplets seleccionats"
+msgstr "Baixar els mmebres incomplets seleccionats"
 
 msgid "Sets a role for the selected members"
 msgstr "Establir un rol per als membres seleccionats"
@@ -8013,7 +8007,7 @@ msgid "Refers to"
 msgstr "Fa referència a"
 
 msgid "Download referring relations"
-msgstr "Descarrega les relacions que s''hi refereixen"
+msgstr "Baixa les relacions que s''hi refereixen"
 
 msgid "There were {0} conflicts during import."
 msgstr "Hi havia {0} conflictes durant la importació."
@@ -8075,29 +8069,29 @@ msgid "Bookmarks"
 msgstr "Favorits"
 
 msgid "<html>There is currently no download area selected.</html>"
-msgstr "<html>Cap zona descarregada ha estat seleccionada.</html>"
+msgstr "<html>Cap zona baixada ha estat seleccionada.</html>"
 
 msgid ""
 "<html><strong>Current download area</strong> (minlon, minlat, maxlon, "
 "maxlat): </html>"
 msgstr ""
-"<html><strong>Zona descarregada</strong> (long. min., lat. min., lon. màx., "
-"lat. màx.): </html>"
+"<html><strong>Zona baixada</strong> (long. min., lat. min., lon. màx., lat. "
+"màx.): </html>"
 
 msgid "Create bookmark"
 msgstr "Crear un favorit"
 
 msgid "Add a bookmark for the currently selected download area"
-msgstr "Afegeix un marcador per la zona descarregada"
+msgstr "Afegeix un marcador per la zona baixada"
 
 msgid ""
 "Currently, there is no download area selected. Please select an area first."
 msgstr ""
-"No hi ha cap zona seleccionada a l''àrea descarregada. Si us plau, "
-"seleccioneu-ne una."
+"No hi ha cap zona seleccionada a l''àrea baixada. Si us plau, seleccioneu-ne "
+"una."
 
 msgid "Please enter a name for the bookmarked download area."
-msgstr "Si us plau, indiqueu un nom pel marcador de la zona descarregada."
+msgstr "Indiqueu un nom pel marcador de la zona baixada."
 
 msgid "Name of location"
 msgstr "Nom de la ubicació"
@@ -8128,7 +8122,7 @@ msgid ""
 "area)"
 msgstr ""
 "URL de www.openstreetmap.org (aqui podeu enganxar l''adreça de la zona a "
-"descarregar)"
+"baixar)"
 
 msgid "Bounding Box"
 msgstr "Límits"
@@ -8155,23 +8149,23 @@ msgid "Raw GPS data"
 msgstr "Dades GPS"
 
 msgid "Select to download GPS traces in the selected download area."
-msgstr "Descarregar les traces GPS de la zona seleccionada"
+msgstr "Baixar les traces GPS de la zona seleccionada"
 
 msgid "Notes"
 msgstr "Notes"
 
 msgid "Select to download notes in the selected download area."
-msgstr "Seleccioneu baixar notes de l''àrea descarregada."
+msgstr "Seleccioneu baixar notes de l''àrea baixada."
 
 msgid "Download as new layer"
-msgstr "Descarregar com una capa nova"
+msgstr "Baixar com una capa nova"
 
 msgid ""
 "<html>Select to download data into a new data layer.<br>Unselect to download "
 "into the currently active data layer.</html>"
 msgstr ""
-"<html>Seleccioneu per descarregar dades a una nova capa.<br>Desseleccioneu "
-"per descarregar-les a la capa activa.</html>"
+"<html>Seleccioneu per baixar dades a una nova capa.<br>Desseleccioneu per "
+"baixar-les a la capa activa.</html>"
 
 msgid "Open this dialog on startup"
 msgstr "Obre aquesta finestra a l''inici"
@@ -8180,7 +8174,7 @@ msgid ""
 "<html>Autostart ''Download from OSM'' dialog every time JOSM is "
 "started.<br>You can open it manually from File menu or toolbar.</html>"
 msgstr ""
-"Obre automàticament la finestra ''Descarrega d''OSM'' cada vegada que JOSM "
+"Obre automàticament la finestra ''Baixa de l''OSM'' cada vegada que JOSM "
 "s''inicia.<br>El podeu obrir manualment utilitzant el menú Fitxer o la barra "
 "d''eines.</html>"
 
@@ -8197,21 +8191,20 @@ msgstr "Encara no hi ha cap zona seleccionada"
 
 msgid "Download area too large; will probably be rejected by server"
 msgstr ""
-"La zona a descarregar és massa gran; probablement serà refusada pel servidor"
+"La zona a baixar és massa gran; probablement serà refusada pel servidor"
 
 msgid "Download area ok, size probably acceptable to server"
 msgstr ""
-"L''àrea de descàrrega és correcta, la seva mida sembla aceptable per al "
-"servidor"
+"L''àrea de baixada és correcta, la seva mida sembla aceptable per al servidor"
 
 msgid "Click to close the dialog and to abort downloading"
-msgstr "Feu clic per a anul·lar la descàrrega i tancar la finestra"
+msgstr "Feu clic per a anul·lar la baixada i tancar la finestra"
 
 msgid "Click to download the currently selected area"
-msgstr "Feu clic per descarregar la zona seleccionada"
+msgstr "Feu clic per baixar la zona seleccionada"
 
 msgid "Please select a download area first."
-msgstr "Seleccioneu abans una zona a descarregar"
+msgstr "Seleccioneu abans una zona a baixar"
 
 msgid ""
 "<html>Neither <strong>{0}</strong> nor <strong>{1}</strong> is "
@@ -8239,7 +8232,7 @@ msgstr ""
 "relacionen."
 
 msgid "Select if the members of a relation should be downloaded as well"
-msgstr "Indiqueu si els membres de la relació també han de ser descarregats"
+msgstr "Indiqueu si els membres de la relació també han de ser baixats"
 
 msgid "Download referrers (parent relations and ways)"
 msgstr "Baixa lesrelacions (relacions de parentiu i vies)"
@@ -8297,7 +8290,7 @@ msgid "Tile Numbers"
 msgstr "Nombres de les tessel·les"
 
 msgid "JOSM Help Browser"
-msgstr "Ajuda de JOSM"
+msgstr "Ajuda del JOSM"
 
 msgid "Failed to read CSS file ''help-browser.css''. Exception is: {0}"
 msgstr ""
@@ -8315,7 +8308,7 @@ msgstr ""
 "<html><p class=\"warning-header\">Manca informació d''ajuda pel tema</p><p "
 "class=\"warning-body\">Encara no hi ha contigut disponible pel tema "
 "<strong>{0}</strong>. Manca tant a la vostra llengua ({1}) com en "
-"anglès.<br><br>Si us plau, ajudeu a millorar el sistema d''ajuda de JOSM "
+"anglès.<br><br>Si us plau, ajudeu a millorar el sistema d''ajuda del JOSM "
 "afegint la informació que manca. Podeu editar el <a href=\"{2}\">tema en la "
 "vostra llengua ({1})</a> i/o en <a href=\"{3}\">anglès</a>.</p></html>"
 
@@ -8334,12 +8327,12 @@ msgid ""
 "<html>Failed to open help page for url {0}.<br>This is most likely due to a "
 "network problem, please check<br>your internet connection</html>"
 msgstr ""
-"<html>Ha fallat l''obertura de la pàgina d''ajuda a la url {0}.<br>Això "
+"<html>Ha fallat l''obertura de la pàgina d''ajuda a l''URL {0}.<br>Això "
 "acostuma a ser degut a un problema amb la xarxa, si us plau, comproveu<br>la "
 "vostra connexió a Internet</html>"
 
 msgid "Failed to open URL"
-msgstr "Ha fallat l''obertura de la URL"
+msgstr "Ha fallat l''obertura de l''URL"
 
 msgid "Open the current help page in an external browser"
 msgstr "Obre la pàgina d''ajuda a un navegador web extern"
@@ -8351,7 +8344,7 @@ msgid ""
 "<html>The current URL <tt>{0}</tt><br>is an external URL. Editing is only "
 "possible for help topics<br>on the help server <tt>{1}</tt>.</html>"
 msgstr ""
-"<html>La URL <tt>{0}</tt><br>és externa. La modificació només és possible "
+"<html>l''URL <tt>{0}</tt><br>és externa. La modificació només és possible "
 "per a les pàgines <br>que són al servidor d''ajuda <tt>{1}</tt>.</html>"
 
 msgid "Reload the current help page"
@@ -8364,13 +8357,13 @@ msgid "Go to the next page"
 msgstr "Vés a la pàgina següent"
 
 msgid "Go to the JOSM help home page"
-msgstr "Va a la pàgina incial d''ajuda de JOSM"
+msgstr "Va a la pàgina incial d''ajuda del JOSM"
 
 msgid "Bad location in HTML document. Exception was: {0}"
 msgstr "Posició incorrecta al document HTML. L''excepció ha estat: {0}"
 
 msgid "Failed to open help page. The target URL is empty."
-msgstr "No s''ha pogut obrir la pàgina d''ajuda. La URL és buida."
+msgstr "No s''ha pogut obrir la pàgina d''ajuda. l''URL és buida."
 
 msgid "Failed to open help page"
 msgstr "No ha estat possible d''obrir la pàgina d''ajuda"
@@ -8587,7 +8580,7 @@ msgid "Prepare conflict resolution"
 msgstr "Preparar la resolució de conflictes"
 
 msgid "Click to download all referring objects for {0}"
-msgstr "Feu clic per a descarregat tots els objectes que es refereixen a {0}"
+msgstr "Feu clic per a baixar tots els objectes que es refereixen a {0}"
 
 msgid "Click to cancel and to resume editing the map"
 msgstr "Feu clic per a anul·lar i reprendre la modificació del mapa"
@@ -8725,17 +8718,17 @@ msgid "Warning: The password is transferred unencrypted."
 msgstr "Avís: La contrasenya és enviada sense encriptar."
 
 msgid "Please enter the user name of your OSM account"
-msgstr "Si us plau, indiqueu el vostre nom d''usuari OSM"
+msgstr "Indiqueu el vostre nom d''usuari OSM"
 
 msgid "Please enter the password of your OSM account"
-msgstr "Si us plau, indiqueu la vostra contrasenya"
+msgstr "Indiqueu la vostra contrasenya"
 
 msgid ""
 "Authenticating at the OSM API ''{0}'' failed. Please enter a valid username "
 "and a valid password."
 msgstr ""
-"Ha fallat l''autenticació a l''API OSM ''{0}''. Si us plau, indiqueu un nom "
-"d''usuari i una contrasenya vàlids."
+"Ha fallat l''autenticació a l''API OSM ''{0}''. Indiqueu un nom d''usuari i "
+"una contrasenya vàlids."
 
 msgid "Please enter the user name of your account"
 msgstr "Si us plau indiqueu el vostre nom d''usuari"
@@ -8747,16 +8740,14 @@ msgid ""
 "Authenticating at the host ''{0}'' failed. Please enter a valid username and "
 "a valid password."
 msgstr ""
-"Ha fallat l''autenticació al servidor ''{0}''. Si us plau, indiqueu un nom "
-"d''usuari i una contrasenya vàlids."
+"Ha fallat l''autenticació al servidor ''{0}''. Indiqueu un nom d''usuari i "
+"una contrasenya vàlids."
 
 msgid "Please enter the user name for authenticating at your proxy server"
-msgstr ""
-"Si us plau, indiqueu un nom d''usuari per autenticar-vos al servidor proxi"
+msgstr "Indiqueu un nom d''usuari per autenticar-vos al servidor proxi"
 
 msgid "Please enter the password for authenticating at your proxy server"
-msgstr ""
-"Si us plau, indiqueu la contrasenya per autieticar-vos al servidor proxi"
+msgstr "Indiqueu la contrasenya per autieticar-vos al servidor proxi"
 
 msgid ""
 "Authenticating at the HTTP proxy ''{0}'' failed. Please enter a valid "
@@ -8782,13 +8773,13 @@ msgid "Cancel authentication"
 msgstr "Anul·la l''autenticació"
 
 msgid "Downloading file"
-msgstr "Descarregant fitxer"
+msgstr "S''esta baixant fitxer"
 
 msgid "Downloading File {0}: {1} bytes..."
-msgstr "Descarregant fitxer {0}: {1} bytes..."
+msgstr "S''està baixant el fitxer {0}: {1} bytes..."
 
 msgid "Download finished"
-msgstr "Descàrrega finalitzada"
+msgstr "Baixada finalitzada"
 
 msgid "Unpacking {0} into {1}"
 msgstr "Desempaquetant {0} en {1}"
@@ -8797,8 +8788,8 @@ msgid ""
 "Cannot download file ''{0}''. Its download link ''{1}'' is not a valid URL. "
 "Skipping download."
 msgstr ""
-"El fitxer ''{0}'' no pot ser descarregat. El seu enllaç de descàrrega "
-"''{1}''  no és una URL vàlida. Omentent la descàrrega."
+"El fitxer ''{0}'' no es pot baixar. El seu enllaç de baixada ''{1}''  no és "
+"una URL vàlida. Omentent la baixada."
 
 msgid ""
 "Could not retrieve the list of your open changesets because<br>JOSM does not "
@@ -8816,19 +8807,19 @@ msgstr "Manca la identitat de l''usuari"
 msgid ""
 "Failed to retrieve user infos for the current JOSM user. Exception was: {0}"
 msgstr ""
-"Ha fallat l''obtenció d''informació de l''usuari de JOSM. L''excepció ha "
+"Ha fallat l''obtenció d''informació de l''usuari del JOSM. L''excepció ha "
 "estat: {0}"
 
 msgid "Download objects"
-msgstr "Descarregar objectes"
+msgstr "Baixar objectes"
 
 msgid "Initializing nodes to download ..."
-msgstr "Inicialitzant nodes a descarregar ..."
+msgstr "Inicialitzant nodes a baixar ..."
 
 msgid "Object could not be downloaded"
 msgid_plural "Some objects could not be downloaded"
 msgstr[0] "L''objecte no s''ha pogut baixar"
-msgstr[1] "Alguns dels objectes no han pogut ser descarregats"
+msgstr[1] "Alguns dels objectes no han pogut ser baixats"
 
 msgid "One object could not be downloaded.<br>"
 msgid_plural "{0} objects could not be downloaded.<br>"
@@ -8848,7 +8839,7 @@ msgstr "objectes que manquen:"
 msgid "One downloaded object is deleted."
 msgid_plural "{0} downloaded objects are deleted."
 msgstr[0] "Un dels objectes baixats està marcat com suprimit."
-msgstr[1] "{0} dels objectes descarregats són marcats com suprimits."
+msgstr[1] "{0} dels objectes baixats són marcats com suprimits."
 
 msgid ""
 "Either edit the path manually in the text field or click the \"...\" button "
@@ -8966,7 +8957,7 @@ msgstr "Sortir ara!"
 
 msgid "Exit JOSM without saving. Unsaved changes are lost."
 msgstr ""
-"Sortir de JOSM sense enregistrar. Els canvis pendents d''enregistrar es "
+"Sortir del JOSM sense enregistrar. Els canvis pendents d''enregistrar es "
 "perdran."
 
 msgid "Delete now!"
@@ -9404,8 +9395,7 @@ msgstr "Si us plau indiqueu un nombre enter més gran que 1"
 
 msgid "Value ''{0}'' is not a number. Please enter an integer > 1"
 msgstr ""
-"El valor ''{0}'' no és un nombre. Si us plau, indiqueu un nombre enter més "
-"gran que 1"
+"El valor ''{0}'' no és un nombre. Indiqueu un nombre enter més gran que 1"
 
 msgid "Objects to add:"
 msgstr "Objectes a afegir:"
@@ -9530,7 +9520,7 @@ msgid "Data Layer {0}"
 msgstr "Capa de dades {0}"
 
 msgid "outside downloaded area"
-msgstr "fore de l''àrea descarregada"
+msgstr "fore de l''àrea baixada"
 
 msgid "Merging layers"
 msgstr "Combinant capes"
@@ -9666,8 +9656,7 @@ msgid "Best zoom: {0}"
 msgstr "Millor ampliació: {0}"
 
 msgid "TMS layer ({0}), downloading in zoom {1}"
-msgstr ""
-"La capa TMS ({0}) està sent descarregada amb un nivell d''ampliació {1}"
+msgstr "La capa TMS ({0}) està sent baixada amb un nivell d''ampliació {1}"
 
 msgid "EPSG:4326 and Mercator projection are supported"
 msgstr "EPSG: les projeccions 4326 i Mercator són suportades"
@@ -9682,18 +9671,16 @@ msgid "Blank Layer"
 msgstr "Capa buida"
 
 msgid "Downloaded {0}/{1} tiles"
-msgstr "Descarregades {0}/{1} tessel·les"
+msgstr "Baixades {0}/{1} tessel·les"
 
 msgid "WMS layer ({0}), automatically downloading in zoom {1}"
-msgstr ""
-"La capa WMS ({0}), està sent descarregada amb un nivell d''ampliació {1}"
+msgstr "La capa WMS ({0}), està sent baixada amb un nivell d''ampliació {1}"
 
 msgid "WMS layer ({0}), downloading in zoom {1}"
-msgstr ""
-"La capa WMS ({0}), està sent descarregada amb un nivell d''ampliació {1}"
+msgstr "La capa WMS ({0}), està sent baixada amb un nivell d''ampliació {1}"
 
 msgid "Download visible tiles"
-msgstr "Descarrega les tessel·les visibles"
+msgstr "Baixa les tessel·les visibles"
 
 msgid ""
 "The requested area is too big. Please zoom in a little, or change resolution"
@@ -9717,7 +9704,7 @@ msgid "Set WMS Bookmark"
 msgstr "Establir un favorit WMS"
 
 msgid "Automatic downloading"
-msgstr "Descàrrega automàtica"
+msgstr "Baixada automàtica"
 
 msgid "Zoom to native resolution"
 msgstr "Amplia a la resolució nativa"
@@ -10029,10 +10016,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Velocitat: {0} km/h"
 
 msgid ""
 "\n"
@@ -10058,6 +10045,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imatges JPEG (.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Mostra les miniatures"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Mostra miniatures de les imatges en comptes d''icones"
+
 msgid "Choose visible tracks"
 msgstr "Escollir tracks visibles"
 
@@ -10110,10 +10103,10 @@ msgid "Select to download OSM data."
 msgstr "Triar per baixar dades OSM."
 
 msgid "Select to download GPS traces."
-msgstr "Seleccioneu per a descarregar les dades GPS."
+msgstr "Seleccioneu per a baixar les dades GPS."
 
 msgid "Download everything within:"
-msgstr "Descarregar tot el que hi hagi en:"
+msgstr "Baixar tot el que hi hagi en:"
 
 msgid "meters"
 msgstr "metres"
@@ -10125,7 +10118,7 @@ msgid "sq km"
 msgstr "km quadrats"
 
 msgid "Download near:"
-msgstr "Descarregar a prop:"
+msgstr "Baixar a prop:"
 
 msgid "track only"
 msgstr "només el track"
@@ -10137,16 +10130,16 @@ msgid "track and waypoints"
 msgstr "el track i les fites"
 
 msgid "Click to download"
-msgstr "Feu clic per a descarregar"
+msgstr "Feu clic per a baixar"
 
 msgid "Click to cancel"
 msgstr "Feu clic per a anul·lar"
 
 msgid "Download from OSM along this track"
-msgstr "Descarregar d''OSM al llarg d''aquest track"
+msgstr "Baixar de l''OSM al llarg d''aquest track"
 
 msgid "Calculating Download Area"
-msgstr "Calculant l''àrea a descarregar"
+msgstr "Calculant l''àrea a baixar"
 
 msgid "Precache imagery tiles along this track"
 msgstr "Precarrega en memòria tessel·les d''imatgeria al llarg del track"
@@ -10189,7 +10182,7 @@ msgid ""
 "server.<br>Because its way points do not include a timestamp we cannot "
 "correlate them with audio data.</html>"
 msgstr ""
-"<html>Les dades de la capa GPX ''{0}'' han estat descarregades del "
+"<html>Les dades de la capa GPX ''{0}'' han estat baixades del "
 "servidor.<br>Però no poden ser correlacionades amb les dades d''àudio perquè "
 "els seus punts no contenen informació de data i hora.</html>"
 
@@ -10227,7 +10220,7 @@ msgid ""
 "server.<br>Because its way points do not include a timestamp we cannot "
 "correlate them with images.</html>"
 msgstr ""
-"<html>Les dades de la capa GPX ''{0}'' han estat descarregades del "
+"<html>Les dades de la capa GPX ''{0}'' han estat baixades del "
 "servidor.<br>Però no poden ser correlacionades amb les dades d''àudio perquè "
 "els seus punts no contenen informació de data i hora.</html>"
 
@@ -10301,10 +10294,10 @@ msgstr "No és possible de crear un nou marcador d''àudio"
 
 msgid "There was an error while trying to display the URL for this marker"
 msgstr ""
-"Ha hagut un error mentre s''intentava mostrar la URL d''aquest marcador"
+"Ha hagut un error mentre s''intentava mostrar l''URL d''aquest marcador"
 
 msgid "(URL was: "
-msgstr "(La URL era: "
+msgstr "(l''URL era: "
 
 msgid "Select the map painting styles"
 msgstr "Seleccionar els estils per dibuixar el mapa"
@@ -10370,7 +10363,7 @@ msgid ""
 "to use the Access Token in this JOSM session only.</html>"
 msgstr ""
 "<html>Seleccioneu per desar el testimoni d''autenticació a les preferències "
-"de JOSM.<br>Desseleccioneu per utilitzar el testimoni d''autenticació només "
+"del JOSM.<br>Desseleccioneu per utilitzar el testimoni d''autenticació només "
 "en aquesta sessió.</html>"
 
 msgid "Use default settings"
@@ -10383,7 +10376,7 @@ msgid "Consumer Secret:"
 msgstr "Codi secre de l''usuari:"
 
 msgid "Request Token URL:"
-msgstr "Demana la URL del testimoni:"
+msgstr "Demana l''URL del testimoni:"
 
 msgid "Access Token URL:"
 msgstr "URL del testimoni d''autenticació"
@@ -10428,7 +10421,7 @@ msgid ""
 "Token.</html>"
 msgstr ""
 "<html>Segueix un procediment automàtic per obtenir un testimoni "
-"d''autenticació del lloc web d''OSM.<br>JOSM accedeix al lloc web com "
+"d''autenticació del lloc web de l''OSM.<br>JOSM accedeix al lloc web com "
 "l''usuari i de manera totalment <br>automàtica autoritza l''usuari i obté un "
 "testimoni d''autenticació.</html>"
 
@@ -10440,9 +10433,9 @@ msgid ""
 "submitted by JOSM.</html>"
 msgstr ""
 "<html>Segueix un procediment semiautomàtic per obtenir un testimoni "
-"d''autenticació del lloc web d''OSM.<br>JOSM enviarà la petició OAuth "
+"d''autenticació del lloc web de l''OSM.<br>JOSM enviarà la petició OAuth "
 "estandard per demanar un testimoni i un<br>testimoni d''autenticació. "
-"Enviarà l''usuari al lloc web d''OSM a través d''un navegador "
+"Enviarà l''usuari al lloc web de l''OSM a través d''un navegador "
 "extern<br>perquè s''autentiqui ell mateix i accepti el testimoni demanat "
 "enviat per JOSM.</html>"
 
@@ -10451,7 +10444,7 @@ msgid ""
 "outside<br>of JOSM.</html>"
 msgstr ""
 "<html>Entreu manualment un testimoni d''autenticació si ha estat generat i "
-"obtigut fora<br>de JOSM.</html>"
+"obtigut fora<br>del JOSM.</html>"
 
 msgid ""
 "Please enter your OSM user name and password. The password will "
@@ -10459,8 +10452,8 @@ msgid ""
 "will be submitted to the OSM server <strong>only once</strong>. Subsequent "
 "data upload requests don''t use your password any more."
 msgstr ""
-"Escriu el teu nom d''usuari i contrasenya d''OSM. <strong>NO</strong> es "
-"guardarà la teva contrasenya sense codificar a les preferències de JOSM i "
+"Escriu el teu nom d''usuari i contrasenya de l''OSM. <strong>NO</strong> es "
+"guardarà la teva contrasenya sense codificar a les preferències del JOSM i "
 "s''enviarà al servidor OSM <strong>una sola vegada</strong>. Les dades que "
 "pugis a partir de llavors no l''utilitzaran."
 
@@ -10491,7 +10484,7 @@ msgid ""
 "website. Click on <strong>{0}</strong> to accept the token. JOSM will use it "
 "in subsequent requests to gain access to the OSM API.</html>"
 msgstr ""
-"<html>Heu obtingut un testimoni d''autenticació OAuth del lloc web d''OSM "
+"<html>Heu obtingut un testimoni d''autenticació OAuth del lloc web de l''OSM "
 "Feu clic sobre <strong>{0}</strong> per acceptar el testimoni. JOSM "
 "l''utilitzarà a les peticions següents per obtenir l''accés a l''API "
 "OSM.</html>"
@@ -10502,7 +10495,7 @@ msgstr "Autoritzar ara"
 msgid "Click to redirect you to the authorization form on the JOSM web site"
 msgstr ""
 "Feu clic per tal que sigueu redirigits al procés d''autorització del lloc "
-"web de JOSM"
+"web del JOSM"
 
 msgid "Back"
 msgstr "Endarrere"
@@ -10514,20 +10507,18 @@ msgid "Test Access Token"
 msgstr "Provar el testimoni d''autenticació"
 
 msgid "Please enter your OSM user name"
-msgstr "Si us plau, introduïu el vostre nom d''usuari OSM"
+msgstr "Introduïu el vostre nom d''usuari OSM"
 
 msgid "The user name cannot be empty. Please enter your OSM user name"
 msgstr ""
-"El nom d''usuari no pot estar buit. Si us plau, introduïu el vostre nom "
-"d''usuari OSM"
+"El nom d''usuari no pot estar buit. Introduïu el vostre nom d''usuari OSM"
 
 msgid "Please enter your OSM password"
-msgstr "Si us plau, introduïu la vostra contrasenya OSM"
+msgstr "Introduïu la vostra contrasenya OSM"
 
 msgid "The password cannot be empty. Please enter your OSM password"
 msgstr ""
-"La contrasenya no pot estar buida. Si us plau, introduïu la vostra "
-"contrasenya OSM"
+"La contrasenya no pot estar buida. Introduïu la vostra contrasenya OSM"
 
 msgid "Authorize JOSM to access the OSM API"
 msgstr "Autoritzar JOSM a accedir a l''API OSM"
@@ -10553,7 +10544,7 @@ msgid ""
 msgstr ""
 "<html>El procés automàtic per obtenir un testimoni d''autenticació OAuth<br> "
 "del servidor OSM ha fallat perquè JOSM no ha pogut construir<br> una URL de "
-"login vàlida a partir del punt final de la URL d''autoritzacions d''OAuth "
+"login vàlida a partir del punt final de l''URL d''autoritzacions d''OAuth "
 "''{0}''.<br><br>Si us plau, comproveu la vostra configuració avançada i "
 "proveu un altre cop.</html>"
 
@@ -10685,13 +10676,12 @@ msgid "Select to grant JOSM the right to upload GPS traces on your behalf"
 msgstr "Autoritza a JOSM a pujar tracks GPS en el vostre nom"
 
 msgid "Allow to download your private GPS traces"
-msgstr "Autoritzar la descàrrega dels vostres tracks GPS privats"
+msgstr "Autoritzar la baixada dels vostres tracks GPS privats"
 
 msgid ""
 "Select to grant JOSM the right to download your private GPS traces into JOSM "
 "layers"
-msgstr ""
-"Autoritza a JOSM a descarregar els vostres tracks GPS privats a les capes"
+msgstr "Autoritza a JOSM a baixar els vostres tracks GPS privats a les capes"
 
 msgid "Allow to read your preferences"
 msgstr "Autoritzar la lectura de les vostres preferències"
@@ -10859,7 +10849,7 @@ msgstr ""
 "<html>No s''ha aconseguit informació sobre l''usuari del servidor OSM "
 "''{0}''.<br>Possiblement no sigui un problema causat pel testimoni "
 "d''autenticació testejat, sinó<br>provocat per la configuració del servidor. "
-"Comproveu acuradament el servidor<br>la URL i la vostra connexió a "
+"Comproveu acuradament el servidor<br>l''URL i la vostra connexió a "
 "Internet.</html>"
 
 msgid ""
@@ -10891,7 +10881,7 @@ msgid "Save the preferences and close the dialog"
 msgstr "Desar les preferències i tancar la finestra"
 
 msgid "Download plugins"
-msgstr "Descarregar connector"
+msgstr "Baixar connector"
 
 msgid "You have to restart JOSM for some settings to take effect."
 msgstr ""
@@ -10919,7 +10909,7 @@ msgid "Version:"
 msgstr "Versió:"
 
 msgid "Minimum JOSM Version:"
-msgstr "Versió mínima de JOSM:"
+msgstr "Versió mínima del JOSM:"
 
 msgid "by {0}"
 msgstr "per {0}"
@@ -10947,7 +10937,7 @@ msgstr "Modificar la font:"
 
 msgid "Entry ''{0}'' requires JOSM Version {1}. (Currently running: {2})"
 msgstr ""
-"L''entrada ''{0}'' requereix la versió {1} de JOSM. (Actualment utilitzeu: "
+"L''entrada ''{0}'' requereix la versió {1} del JOSM. (Actualment utilitzeu: "
 "{2})"
 
 msgid "Continue anyway"
@@ -11055,15 +11045,14 @@ msgid "Export selected items"
 msgstr "Exportar els elements seleccionats"
 
 msgid "JOSM custom settings files (*.xml)"
-msgstr "Fitxers de configuracions personalitzades de JOSM (*.xml)"
+msgstr "Fitxers de configuracions personalitzades del JOSM (*.xml)"
 
 msgid "Please select some preference keys not marked as default"
 msgstr ""
-"Si us plau seleccioneu algunes claus de les preferències no marcades per "
-"defecte"
+"Seleccioneu algunes claus de les preferències no marcades per defecte"
 
 msgid "Export preferences keys to JOSM customization file"
-msgstr "Exportar les preferències a un fitxer de persoalització de JOSM"
+msgstr "Exportar les preferències a un fitxer de persoalització del JOSM"
 
 msgid "What to do with preference lists when this file is to be imported?"
 msgstr ""
@@ -11077,7 +11066,7 @@ msgid "Replace existing values"
 msgstr "Reemplaçar els valors existents"
 
 msgid "Open JOSM customization file"
-msgstr "Obre el fitxer de personalització de JOSM"
+msgstr "Obre el fitxer de personalització del JOSM"
 
 msgid "Import log"
 msgstr "Registre de la importació"
@@ -11152,7 +11141,7 @@ msgid "Entry {0}"
 msgstr "Entrada {0}"
 
 msgid "Please select the row to edit."
-msgstr "Si us plau, seleccioneu la línia a modificar"
+msgstr "Seleccioneu la línia a modificar"
 
 msgid "Select Setting Type:"
 msgstr "Seleccionar el tipus de paràmetre:"
@@ -11173,7 +11162,7 @@ msgid "Add setting"
 msgstr "Afegir paràmetre"
 
 msgid "Please select the row to delete."
-msgstr "Si us plau, seleccioneu la línia a suprimir"
+msgstr "Seleccioneu la línia a suprimir"
 
 msgid "Advanced Background: Changed"
 msgstr "Fons avançat: canviat"
@@ -11348,7 +11337,7 @@ msgid "Draw segment order numbers"
 msgstr "Mostrar nombres d''ordre de segment"
 
 msgid "Draw boundaries of downloaded data"
-msgstr "Dibuixar els límits de les dades descarregades"
+msgstr "Dibuixar els límits de les dades baixades"
 
 msgid "Draw virtual nodes in select mode"
 msgstr "Dibuixar nodes virtuals al mode seleccionat"
@@ -11389,7 +11378,7 @@ msgid "Draw the order numbers of all segments within their way."
 msgstr "Mostrar el nombre d''ordre de tots els segments a la seva via"
 
 msgid "Draw the boundaries of data loaded from the server."
-msgstr "Dibuixar els límits de les dades descarregades del servidor"
+msgstr "Dibuixar els límits de les dades baixades del servidor"
 
 msgid "Draw virtual nodes in select mode for easy way modification."
 msgstr ""
@@ -11744,7 +11733,7 @@ msgid "2. Enter maximum zoom (optional)"
 msgstr "2. Entreu el nivell màxim d''ampliació (opcional)"
 
 msgid "3. Verify generated TMS URL"
-msgstr "3. Verifique la URL TMS generada"
+msgstr "3. Verifique l''URL TMS generada"
 
 msgid "4. Enter name for this layer"
 msgstr "4. Entreu un nom per a la capa"
@@ -11756,7 +11745,7 @@ msgid "Show bounds"
 msgstr "Mostra límits"
 
 msgid "1. Enter service URL"
-msgstr "1. Entreu la URL de servei"
+msgstr "1. Entreu l''URL de servei"
 
 msgid "Get layers"
 msgstr "Obté capes"
@@ -11768,7 +11757,7 @@ msgid "3. Select image format"
 msgstr "3. Seleccioneu el format de la imatge"
 
 msgid "4. Verify generated WMS URL"
-msgstr "4. Comproveu la URL generada pel servidor WMS"
+msgstr "4. Comproveu l''URL generada pel servidor WMS"
 
 msgid "5. Enter name for this layer"
 msgstr "5. Indiqueu un nom per aquesta capa"
@@ -11838,7 +11827,7 @@ msgid "copy selected defaults"
 msgstr "copiar els valors de defecte seleccionats"
 
 msgid "Please select at least one row to copy."
-msgstr "Si us plau, seleccioneu com a mínim una fila per copiar"
+msgstr "Seleccioneu com a mínim una fila per copiar"
 
 msgid "reload defaults"
 msgstr "recarregar valors per defecte"
@@ -11856,10 +11845,10 @@ msgid "Imagery URL (Default)"
 msgstr "URL d''imatgeria (Defecte)"
 
 msgid "EULA license URL not available: {0}"
-msgstr "La URL de la llicència EULA no està disponible: {0}"
+msgstr "l''URL de la llicència EULA no està disponible: {0}"
 
 msgid "Malformed URL for the EULA licence: {0}"
-msgstr "La URL de la llicència EULA no té el format correcte: {0}"
+msgstr "l''URL de la llicència EULA no té el format correcte: {0}"
 
 msgid "Projection"
 msgstr "Projecció"
@@ -11895,11 +11884,11 @@ msgid ""
 "That layer does not support any of JOSM''s projections,\n"
 "so you can not use it. This message will not show again."
 msgstr ""
-"Aquesta capa no suporta cap de les projeccions de JOSM,\n"
+"Aquesta capa no suporta cap de les projeccions del JOSM,\n"
 "per això no la podeu utilitzar. Aquest missatge no toranarà a ser mostrat."
 
 msgid "Downloader:"
-msgstr "Descarregador:"
+msgstr "Baixador:"
 
 msgid "Simultaneous connections:"
 msgstr "Connexions simultànies:"
@@ -11932,7 +11921,7 @@ msgid ""
 msgstr ""
 "<i>(El desament automàtic enregistrarà les capes modificades en intervals "
 "periòdics. Aquestes còpies de seguretat són creats  a la carpeta "
-"especificada a les preferències de JOSM. En cas de problemes JOSM intentarà "
+"especificada a les preferències del JOSM. En cas de problemes JOSM intentarà "
 "recuperar els canvis no desats \r\n"
 "la següent vegada que sigui iniciat.)</i>"
 
@@ -11980,7 +11969,7 @@ msgid "Remove the selected styles from the list of active styles"
 msgstr "Suprimir els estils seleccionats de la llista d''estils actius"
 
 msgid "Edit the filename or URL for the selected active style"
-msgstr "Modificar el nom d''arxiu o la URL de l''estil seleccionat"
+msgstr "Modificar el nom d''arxiu o l''URL de l''estil seleccionat"
 
 msgid "Add the selected available styles to the list of active styles"
 msgstr "Afegir els estils seleccionats a la llista d''estils actius"
@@ -12097,7 +12086,7 @@ msgstr ""
 
 msgid "Edit the filename or URL for the selected active preset"
 msgstr ""
-"Modifica el nom de l''arxiu o la URL de la predefinció activa seleccionada"
+"Modifica el nom de l''arxiu o l''URL de la predefinció activa seleccionada"
 
 msgid "Add the selected available presets to the list of active presets"
 msgstr ""
@@ -12125,7 +12114,7 @@ msgid "Internal Preset"
 msgstr "Predefincions internes"
 
 msgid "The default preset for JOSM"
-msgstr "Les predefinicions per defecte de JOSM"
+msgstr "Les predefinicions per defecte del JOSM"
 
 msgid "Plugin bundled with JOSM"
 msgstr "Connector empaquetat amb JOSM"
@@ -12134,8 +12123,8 @@ msgid ""
 "Please click on <strong>Download list</strong> to download and display a "
 "list of available plugins."
 msgstr ""
-"Si us plau, feu clic sobre<strong>Descarregar llista</strong> per tal de "
-"descarregar i mostrar una llista amb els connectors disponibles."
+"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:"
@@ -12156,21 +12145,19 @@ msgid ""
 msgid_plural ""
 "The following {0} plugins have been downloaded <strong>successfully</strong>:"
 msgstr[0] ""
-"El següent connector ha estat descarregat <strong>correctament</strong>:"
+"El següent connector ha estat baixat <strong>correctament</strong>:"
 msgstr[1] ""
-"Els següents {0} connectors han estat descarregats "
-"<strong>correctament</strong>:"
+"Els següents {0} connectors han estat baixats <strong>correctament</strong>:"
 
 msgid "Downloading the following plugin has <strong>failed</strong>:"
 msgid_plural ""
 "Downloading the following {0} plugins has <strong>failed</strong>:"
-msgstr[0] "La descàrrega del següent connector <strong>ha fallat</strong>:"
+msgstr[0] "La baixada del següent connector <strong>ha fallat</strong>:"
 msgstr[1] ""
-"La descàrrega dels següents connectors {0} <strong>ha fallat</strong>:"
+"La baixada dels següents connectors {0} <strong>ha fallat</strong>:"
 
 msgid "Please restart JOSM to activate the downloaded plugins."
-msgstr ""
-"Si us plau, reinicieu JOSM per tal d''activar els connectors descarregats."
+msgstr "Reinicieu JOSM per tal d''activar els connectors baixats."
 
 msgid "Update plugins"
 msgstr "Actualitzar connectors"
@@ -12191,10 +12178,10 @@ msgid "Configure Plugin Sites"
 msgstr "Configurar els llocs web de connectors"
 
 msgid "Download list"
-msgstr "Descarregar la llista"
+msgstr "Baixar la llista"
 
 msgid "Download the list of available plugins"
-msgstr "Descarregar la llista de connectors disponibles"
+msgstr "Baixar la llista de connectors disponibles"
 
 msgid "Update the selected plugins"
 msgstr "Actualitzar els connectors seleccionats"
@@ -12203,8 +12190,8 @@ msgid ""
 "All installed plugins are up to date. JOSM does not have to download newer "
 "versions."
 msgstr ""
-"Tots els connectors instal·lats estan actualitzats. JOSM no necessita "
-"descarregar cap nova versió."
+"Tots els connectors instal·lats estan actualitzats. JOSM no necessita baixar "
+"cap nova versió."
 
 msgid "Plugins up to date"
 msgstr "Connectors actualitzats"
@@ -12213,22 +12200,22 @@ msgid "Configure sites..."
 msgstr "Configurar els llocs web..."
 
 msgid "Configure the list of sites where plugins are downloaded from"
-msgstr "Configurar la llista de llocs web per a descarregar connectors"
+msgstr "Configurar la llista de llocs web per a baixar connectors"
 
 msgid "Add JOSM Plugin description URL."
-msgstr "Afegeix una URL descriptiva del connector de JOSM"
+msgstr "Afegeix una URL descriptiva del connector del JOSM"
 
 msgid "Enter URL"
 msgstr "Introduir una URL"
 
 msgid "Please select an entry."
-msgstr "Si us plau seleccioneu una entrada"
+msgstr "Seleccioneu una entrada"
 
 msgid "Edit JOSM Plugin description URL."
-msgstr "Modificar la descripció de la URL de connectors de JOSM"
+msgstr "Modificar la descripció de l''URL de connectors del JOSM"
 
 msgid "JOSM Plugin description URL"
-msgstr "Descripció de la URL de connectors de JOSM"
+msgstr "Descripció de l''URL de connectors del JOSM"
 
 msgid "Ask before updating"
 msgstr "Preguntar abans d''actualitzar"
@@ -12243,8 +12230,8 @@ msgid ""
 "Please decide whether JOSM shall automatically update active plugins at "
 "startup after an update of JOSM itself."
 msgstr ""
-"Si us plau, decidiu si JOSM ha d''actualitzar automàticament els connectors "
-"actius en iniciar-se després d''una actualització de JOSM"
+"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):"
@@ -12253,8 +12240,8 @@ msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
 msgstr ""
-"Si us plau, decidiu si JOSM ha d''actualitzar els connectors actius després "
-"d''un cert període de temps"
+"Decidiu si JOSM ha d''actualitzar els connectors actius després d''un cert "
+"període de temps"
 
 msgid "By Code (EPSG)"
 msgstr "Per codi (EPSG)"
@@ -12313,8 +12300,8 @@ msgstr "Integrat:"
 msgid "Projection bounds (in degrees)"
 msgstr "Límits de la projecció (en graus)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (codi EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Estableix el paràmetre SRS=... a la petició WMS"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -12440,7 +12427,7 @@ msgid "Settings for the remote control feature."
 msgstr "Configuració de la funció de control remot"
 
 msgid "Download objects to new layer"
-msgstr "Descarregar objectes a la nova capa"
+msgstr "Baixar objectes a la nova capa"
 
 msgid "Confirm all Remote Control actions manually"
 msgstr "Confirmar manualment les accions de control remot"
@@ -12506,14 +12493,14 @@ msgid "Permitted actions:"
 msgstr "Accions permeses:"
 
 msgid "Testing OSM API URL ''{0}''"
-msgstr "Provant la URL de l''API OSM ''{0}''"
+msgstr "Provant l''URL de l''API OSM ''{0}''"
 
 msgid ""
 "<html>''{0}'' is not a valid OSM API URL.<br>Please check the spelling and "
 "validate again.</html>"
 msgstr ""
-"''{0}'' no és una URL d''una API OSM vàlida.<br>Si us plau, comproveu "
-"l''ortografia i torneu a validar un altre cop.</html>"
+"''{0}'' no és una URL d''una API OSM vàlida.<br>Comproveu l''ortografia i "
+"torneu a validar un altre cop.</html>"
 
 msgid "Invalid API URL"
 msgstr "URL d''API no vàlida"
@@ -12522,17 +12509,17 @@ msgid ""
 "<html>Failed to build URL ''{0}'' for validating the OSM API "
 "server.<br>Please check the spelling of ''{1}'' and validate again.</html>"
 msgstr ""
-"<html>Ha fallat la construcció de la URL ''{0}'' per a validar el servidor "
-"d''API OSM.<br>Si us plau, comproveu l''ortografia de ''{1}'' i torneu a "
-"validar un altre cop.</html>"
+"<html>Ha fallat la construcció de l''URL ''{0}'' per a validar el servidor "
+"d''API OSM.<br>Comproveu l''ortografia de ''{1}'' i torneu a validar un "
+"altre cop.</html>"
 
 msgid ""
 "<html>Failed to connect to the URL ''{0}''.<br>Please check the spelling of "
 "''{1}'' and your Internet connection and validate again.</html>"
 msgstr ""
-"<html>Ha fallat la connexió a la URL ''{0}.<br>Si us plau, verifiqueu "
-"l''ortografia de ''{1}'' i la vostra connexió a Internet i torneu a validar "
-"un altre cop.</html>"
+"<html>Ha fallat la connexió a l''URL ''{0}.<br>Verifiqueu l''ortografia de "
+"''{1}'' i la vostra connexió a Internet i torneu a validar un altre "
+"cop.</html>"
 
 msgid "Connection to API failed"
 msgstr "Ha fallat la connexió a l''API"
@@ -12544,8 +12531,8 @@ msgid ""
 msgstr ""
 "<html>Ha fallat la recuperació de la llista de conjunts de canvis del "
 "servidor d''API OSM a <br>''{1}. El servidor ha contestat retornant el codi "
-"d''error {0} en comptes de 200.<br>Si us plau, comproveu l''ortografia de "
-"''{1}'' i torneu a validar un altre cop.</html>"
+"d''error {0} en comptes de 200.<br>Comproveu l''ortografia de ''{1}'' i "
+"torneu a validar un altre cop.</html>"
 
 msgid ""
 "<html>The OSM API server at ''{0}'' did not return a valid response.<br>It "
@@ -12553,8 +12540,8 @@ msgid ""
 "spelling of ''{0}'' and validate again.</html>"
 msgstr ""
 "<html>El servidor d''API OSM a ''{0}'' no ha donat una resposta "
-"vàlida.<br>És com si ''{0}'' no fos un servidor d''API OSM.<br>Si us plau, "
-"comproveu l''ortografia de ''{0}'' i torneu a validar un altre cop.</html>"
+"vàlida.<br>És com si ''{0}'' no fos un servidor d''API OSM.<br>Comproveu "
+"l''ortografia de ''{0}'' i torneu a validar un altre cop.</html>"
 
 msgid "Authentication"
 msgstr "Autenticació"
@@ -12622,7 +12609,7 @@ msgid ""
 "Please authorize first."
 msgstr ""
 "Encara no teniu un testimoni d''autenticació per accedir al servidor OSM "
-"utilitzant OAuth. Si us plau, autoritzeu primer."
+"utilitzant OAuth. Autoritzeu primer."
 
 msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
@@ -12652,27 +12639,26 @@ msgstr ""
 
 msgid "<html>Use the default OSM server URL (<strong>{0}</strong>)</html>"
 msgstr ""
-"<html>Utilitzar la URL per defecte del servidor OSM "
+"<html>Utilitzar l''URL per defecte del servidor OSM "
 "(<strong>{0}</strong>)</html>"
 
 msgid "Test the API URL"
-msgstr "Provar la URL de l''API"
+msgstr "Provar l''URL de l''API"
 
 msgid "The API URL is valid."
-msgstr "La URL de l''API és vàlida"
+msgstr "l''URL de l''API és vàlida"
 
 msgid "Validation failed. The API URL seems to be invalid."
-msgstr "La validació ha fallat. La URL de l''API no sembla vàlida."
+msgstr "La validació ha fallat. l''URL de l''API no sembla vàlida."
 
 msgid "OSM API URL must not be empty. Please enter the OSM API URL."
-msgstr ""
-"La URL de l''API no pot ser buida. Si us plau indiqueu la URL de l''API."
+msgstr "l''URL de l''API no pot ser buida. Indiqueu l''URL de l''API."
 
 msgid "The current value is not a valid URL"
 msgstr "El valor actual no és una URL vàlida."
 
 msgid "Please enter the OSM API URL."
-msgstr "Si us plau, indiqueu la URL de l''API"
+msgstr "Indiqueu l''URL de l''API"
 
 msgid "Proxy settings"
 msgstr "Configuració del servidor intermediari"
@@ -12690,8 +12676,8 @@ msgstr "Port:"
 msgid ""
 "Please enter a username and a password if your proxy requires authentication."
 msgstr ""
-"Si us plau, indiqueu un nom d''usuari i una contrasenya si el vostre "
-"servidor intermediari requereix autenticació."
+"Indiqueu un nom d''usuari i una contrasenya si el vostre servidor "
+"intermediari requereix autenticació."
 
 msgid "Password:"
 msgstr "Contrasenya:"
@@ -12783,7 +12769,7 @@ msgid "Remove the selected rules from the list of active rules"
 msgstr "Suprimeix les regles seleccionades de la llista de regles actives"
 
 msgid "Edit the filename or URL for the selected active rule"
-msgstr "Modifica el nom de fitxer o la URL de la regla activa seleccionada"
+msgstr "Modifica el nom de fitxer o l''URL de la regla activa seleccionada"
 
 msgid "Add the selected available rules to the list of active rules"
 msgstr ""
@@ -13116,15 +13102,15 @@ msgid ""
 "URL from www.openstreetmap.org (you can paste a download URL here to specify "
 "a bounding box)"
 msgstr ""
-"URL de www.openstreetmap.org (aquí podeu enganxar la URL d''una àrea "
-"descarregada per especificar una zona determinada)"
+"URL de www.openstreetmap.org (aquí podeu enganxar l''URL d''una àrea baixada "
+"per especificar una zona determinada)"
 
 msgid ""
 "The current value is not a valid changeset ID. Please enter an integer value "
 "> 0"
 msgstr ""
-"El valor actual no és vàlid com a ID d''un conjunt de canvis. Si us plau, "
-"indiqueu un valor enter > 0"
+"El valor actual no és vàlid com a ID d''un conjunt de canvis. Indiqueu un "
+"valor enter > 0"
 
 msgid "Add a new source to the list."
 msgstr "Afegeix una nova font a la llista"
@@ -13138,8 +13124,7 @@ msgstr "Suprimir de la llista la font seleccionada"
 msgid ""
 "The current value is not a valid OSM ID. Please enter an integer value > 0"
 msgstr ""
-"El valor no és un ID vàlid. Si us plau, indiqueu un valor enter més gran que "
-"zero"
+"El valor no és un ID vàlid. Indiqueu un valor enter més gran que zero"
 
 msgid "false: the property is explicitly switched off"
 msgstr "fals: la propietat ha estat deshabilitada expressament"
@@ -13226,7 +13211,7 @@ msgid "All Formats"
 msgstr "Tots els formats"
 
 msgid "Downloading points {0} to {1}..."
-msgstr "Descarregant punts del {0} al {1}..."
+msgstr "S''estan baixant punts del {0} al {1}..."
 
 msgid "Contacting OSM Server..."
 msgstr "Contactant amb el servidor OSM..."
@@ -13257,10 +13242,10 @@ msgstr ""
 "''Location''. La redirecció no és possible. Anul·lant."
 
 msgid "Too many redirects to the download URL detected. Aborting."
-msgstr "Massa redireccions vers la URL descarregada. Anul·lant."
+msgstr "Massa redireccions vers l''URL baixada. Anul·lant."
 
 msgid "Download redirected to ''{0}''"
-msgstr "La descàrrega ha estat redirigida vers ''{0}''"
+msgstr "La baixada ha estat redirigida vers ''{0}''"
 
 msgid "Failed to read from ''{0}''. Server responded with status code {1}."
 msgstr ""
@@ -13294,7 +13279,7 @@ msgstr "Latitud incorrecta per al paràmetre ''{0}'', hi ha {1}"
 
 msgid "Unexpected value for ''{0}'' in changeset query url, got {1}"
 msgstr ""
-"Valor no esperat per ''{0}'' a la URL de consulta del conjunt de canvis, els "
+"Valor no esperat per ''{0}'' a l''URL de consulta del conjunt de canvis, els "
 "seu valor és {1}"
 
 msgid ""
@@ -13505,8 +13490,8 @@ msgstr "Recuperant un conjunt de relacions de ''{0}''"
 
 msgid "Downloading {0} object from ''{1}''"
 msgid_plural "Downloading {0} objects from ''{1}''"
-msgstr[0] "Descarregant {0} objecte de ''{1}''"
-msgstr[1] "Descarregant {0} objectes de ''{1}''"
+msgstr[0] "S''està baixant {0} objecte de ''{1}''"
+msgstr[1] "S''estan baixnat {0} objectes de ''{1}''"
 
 msgid ""
 "Server replied with response code 404, retrying with an individual request "
@@ -13516,7 +13501,7 @@ msgstr ""
 "per a cada objecte."
 
 msgid "Downloading OSM data..."
-msgstr "Descarregant dades des de OSM..."
+msgstr "S''està baixant dades des de OSM..."
 
 msgid "Fetching node with id {0} from ''{1}''"
 msgstr "Recuperant el node amb ID {0} de ''{1}''"
@@ -13562,7 +13547,7 @@ msgid "OSM API"
 msgstr "API OSM"
 
 msgid "JOSM website"
-msgstr "Lloc web de JOSM"
+msgstr "Lloc web del JOSM"
 
 msgid "Unable to access ''{0}'': {1} not available (offline mode)"
 msgstr ""
@@ -13573,7 +13558,7 @@ msgid "Unable to initialize OSM API."
 msgstr "No és possible la inicialització de l''API OSM."
 
 msgid "This version of JOSM is incompatible with the configured server."
-msgstr "Aquesta versió de JOSM és incompatible amb el servidor configurat"
+msgstr "Aquesta versió del JOSM és incompatible amb el servidor configurat"
 
 msgid ""
 "It supports protocol version 0.6, while the server says it supports {0} to "
@@ -13662,13 +13647,13 @@ msgstr "Servidor OSM fitxers comprimits bzip2"
 
 msgid "Prolog of OsmChange document already written. Please write only once."
 msgstr ""
-"El pròleg del document OsmChange ja ha estat escrit. Si us plau, només s''ha "
-"d''escriure un cop."
+"El pròleg del document OsmChange ja ha estat escrit. Només s''ha d''escriure "
+"un cop."
 
 msgid "Prolog of OsmChange document not written yet. Please write first."
 msgstr ""
-"El pròleg del document OsmChange encara no ha estat escrit. Si us plau, cal "
-"escriure''l primer."
+"El pròleg del document OsmChange encara no ha estat escrit. Cal escriure''l "
+"primer."
 
 msgid "OsmChange File"
 msgstr "Fitxer OsmChange"
@@ -13877,42 +13862,42 @@ msgid "Line {0} column {1}: "
 msgstr "Línia {0} columna {1}: "
 
 msgid "Downloading referring ways ..."
-msgstr "Descarregant vies referides ..."
+msgstr "S''estan baixant les vies referides ..."
 
 msgid "Downloading referring relations ..."
-msgstr "Descarregant relacions referides ..."
+msgstr "S''estan baixant les relacions referides ..."
 
 msgid "Reading changesets..."
 msgstr "Llegint el conjunt de canvis..."
 
 msgid "Downloading changesets ..."
-msgstr "Descarregant conjunt de canvis..."
+msgstr "S''estan baixant els conjunt de canvis..."
 
 msgid "Reading changeset {0} ..."
 msgstr "Llegint el conjunt de canvis {0} ..."
 
 msgid "Downloading changeset {0} ..."
-msgstr "Descarregant el conjunt de canvis {0} ..."
+msgstr "S''esta baixant el conjunt de canvis {0} ..."
 
 msgid "Downloading {0} changeset ..."
 msgid_plural "Downloading {0} changesets ..."
-msgstr[0] "Descarregant {0} conjunt de canvis ..."
-msgstr[1] "Descarregant {0} conjunts de canvis ..."
+msgstr[0] "S''està baixant {0} conjunt de canvis ..."
+msgstr[1] "S''estan baixant {0} conjunts de canvis ..."
 
 msgid "({0}/{1}) Downloading changeset {2} ..."
-msgstr "({0}/{1}) Descarregant conjunt de canvis {2} ..."
+msgstr "({0}/{1}) S''està baixant el conjunt de canvis {2} ..."
 
 msgid "Downloading content for changeset {0} ..."
-msgstr "Descarregant el contingut del conjunt de canvis {0} ..."
+msgstr "S''està baixant el contingut del conjunt de canvis {0} ..."
 
 msgid "Downloading history..."
-msgstr "Descarregant historial..."
+msgstr "S''està baixant l''historial..."
 
 msgid "Contacting Server..."
 msgstr "Contactant amb el servidor"
 
 msgid "Downloading OSM notes..."
-msgstr "Descarregant notes d''OSM ..."
+msgstr "S''estan baixant les notes de l''OSM ..."
 
 msgid "Failed to open connection to API {0}."
 msgstr "Ha fallat l''obertura de la connexió amb l''API {0}."
@@ -13920,8 +13905,8 @@ msgstr "Ha fallat l''obertura de la connexió amb l''API {0}."
 msgid ""
 "Could not connect to the OSM server. Please check your internet connection."
 msgstr ""
-"No ha estat possible de connectar amb el servidor OSM. Si us plau, "
-"verifiqueu la vostra connexió a Internet."
+"No ha estat possible de connectar amb el servidor OSM. Verifiqueu la vostra "
+"connexió a Internet."
 
 msgid "Reading error text failed."
 msgstr "Ha fallat la lectura del text de l''error"
@@ -13984,7 +13969,7 @@ msgid ""
 "server. <strong>Do not use a valuable password.</strong></p></body></html>"
 msgstr ""
 "<html><body><p class=\"warning-body\"><strong>Avís:</strong> La contrasenya "
-"s''emmagatzema en format de text pla al fitxer de preferències de JOSM. A "
+"s''emmagatzema en format de text pla al fitxer de preferències del JOSM. A "
 "més, és transferida <strong>sense encriptar</strong> amb cada petició que "
 "s''envia al servidor OSM. <strong>No utilitzeu una contrasenya "
 "valuosa.</strong></p></body></html>"
@@ -14030,7 +14015,7 @@ msgid "Load data from API"
 msgstr "Carregar dades de l''API"
 
 msgid "Import data from URL"
-msgstr "Importar dades de la URL"
+msgstr "Importar dades de l''URL"
 
 msgid "Open local files"
 msgstr "Obre fitxers locals"
@@ -14095,7 +14080,7 @@ msgid ""
 "web sites to guess a running JOSM version"
 msgstr ""
 "S''ha demanat al Control Remot que informi de les característiques que "
-"suporta. Això permet els llocs web saber la versió de JOSM que s''eatà "
+"suporta. Això permet els llocs web saber la versió del JOSM que s''eatà "
 "utilitzant."
 
 msgid ""
@@ -14289,39 +14274,39 @@ msgid "expected .jos file inside .joz archive"
 msgstr "s''esperava un fitxer .jos dins del fitxer .joz"
 
 msgid "Skip download"
-msgstr "Ignorar la descàrrega"
+msgstr "Ignorar la baixada"
 
 msgid "Download Plugin"
-msgstr "Connector descarregat"
+msgstr "Baixa el connector"
 
 msgid "Skip Download"
-msgstr "Ignorar la descàrrega"
+msgstr "Ignorar la baixada"
 
 msgid "JOSM version {0} required for plugin {1}."
-msgstr "Es necessita la versió {0} de JOSM per utilitzar el connector {1}."
+msgstr "Es necessita la versió {0} del JOSM per utilitzar el connector {1}."
 
 msgid "Download skipped"
-msgstr "Descàrrega ignorada"
+msgstr "Baixada ignorada"
 
 msgid ""
 "Cannot download plugin ''{0}''. Its download link is not known. Skipping "
 "download."
 msgstr ""
-"No és possible la descàrrega del connector ''{0}''. No es coneix l''enllaç "
-"de descàrrega. Omentent la descàrrega."
+"No és possible la baixada del connector ''{0}''. No es coneix l''enllaç de "
+"baixada. Omentent la baixada."
 
 msgid ""
 "Cannot download plugin ''{0}''. Its download link ''{1}'' is not a valid "
 "URL. Skipping download."
 msgstr ""
-"No és possible la descàrrega del connector ''{0}''. El seu enllaç de "
-"descàrrega  ''{1}'' no és una URL vàlida. Omentent la descàrrega."
+"No és possible la baixada del connector ''{0}''. El seu enllaç de baixada  "
+"''{1}'' no és una URL vàlida. Omentent la baixada."
 
 msgid "Failed to create plugin directory ''{0}''"
 msgstr "Ha fallat la creació del directori de connectors ''{0}''"
 
 msgid "Downloading Plugin {0}..."
-msgstr "Descarregant el connector {0}..."
+msgstr "S''està baixant el connector {0}..."
 
 msgid "An error occurred in plugin {0}"
 msgstr "Ha hagut un erro al connector {0}"
@@ -14347,7 +14332,7 @@ msgid ""
 "longer developed and very likely will produce errors.<br>It should be "
 "disabled.<br>Delete from preferences?</html>"
 msgstr ""
-"<html>Ha estat demanada la descàrrega del connector \"{0}\".<br>Aq1uest "
+"<html>Ha estat demanada la baixada del connector \"{0}\".<br>Aq1uest "
 "connector ha deixat de ser mantingut pels desenvolupadors i pot produir "
 "errors.<br>Hauria de ser deshabilitat.<br>L''esborrem de les "
 "preferències?</html>"
@@ -14424,7 +14409,7 @@ msgid ""
 "<html>Plugin {0} requires JOSM version {1}. The current JOSM version is "
 "{2}.<br>You have to update JOSM in order to use this plugin.</html>"
 msgstr ""
-"<html>El connector {0} necessita la versió {1} de JOSM. La versió actual és "
+"<html>El connector {0} necessita la versió {1} del JOSM. La versió actual és "
 "{2}.<br>Heu d''actualitzar JOSM si voleu utilitzar aquest connector.</html>"
 
 msgid "Could not load plugin {0}. Delete from preferences?"
@@ -14442,7 +14427,7 @@ msgstr ""
 "preferències?</html>"
 
 msgid "Loading plugins ..."
-msgstr "Descarregant connectors ..."
+msgstr "S''estan carregant els connectors ..."
 
 msgid "Checking plugin preconditions..."
 msgstr "Comprovant els requisits del connector ..."
@@ -14461,7 +14446,7 @@ msgstr[0] "El connector no serà carregat."
 msgstr[1] "Els connectors no seran carregats."
 
 msgid "Determine plugins to load..."
-msgstr "Determinar els connectors a descarregar ..."
+msgstr "Determinar els connectors a baixar ..."
 
 msgid "Removing deprecated plugins..."
 msgstr "Suprimint els connectors obsolets..."
@@ -14481,11 +14466,11 @@ msgid_plural ""
 "Please open the Preference Dialog after JOSM has started and try to update "
 "them manually."
 msgstr[0] ""
-"Si us plau, obriu la finestra de preferències un cop JOSM s''hagi inciat i "
-"proveu d''actualitzar-lo manualment."
+"Obriu la finestra de preferències un cop JOSM s''hagi inciat i proveu "
+"d''actualitzar-lo manualment."
 msgstr[1] ""
-"Si us plau, obriu la finestra de preferències un cop JOSM s''hagi inciat i "
-"proveu d''actualitzar-los manualment."
+"Obriu la finestra de preferències un cop JOSM s''hagi inciat i proveu "
+"d''actualitzar-los manualment."
 
 msgid "Plugin update failed"
 msgstr "Ha fallat l''actualització del connector"
@@ -14494,7 +14479,7 @@ msgid "Failed to find plugin {0}"
 msgstr "No ha estat possible de trobar el connector {0}"
 
 msgid "Failed to download plugin information list"
-msgstr "Ha fallat la descàrrega de la llista d''informació de connectors"
+msgstr "Ha fallat la baixada de la llista d''informació de connectors"
 
 msgid "Disable plugin"
 msgstr "Deshabilitar connector"
@@ -14515,21 +14500,21 @@ msgid ""
 "Failed to install already downloaded plugin ''{0}''. Skipping installation. "
 "JOSM is still going to load the old plugin version."
 msgstr ""
-"Ha fallat la instal·lació del connector descarregat ''{0}''. Ometent la "
+"Ha fallat la instal·lació del connector baixat ''{0}''. Ometent la "
 "instal·lació. JOSM continuarà carregant la versió anterior del connector."
 
 msgid ""
 "Failed to install plugin ''{0}'' from temporary download file ''{1}''. {2}"
 msgstr ""
 "Ha fallat la instal·lació del connector ''{0}'' del fitxer temporal ''{1}'' "
-"descarregat. {2}"
+"baixat. {2}"
 
 msgid ""
 "Failed to install plugin ''{0}'' from temporary download file ''{1}''. "
 "Renaming failed."
 msgstr ""
 "Ha fallat la instal·lació del connector ''{0}'' del fitxer temporal ''{1}'' "
-"descarregat. Ha fallat el canvi de nom."
+"baixat. Ha fallat el canvi de nom."
 
 msgid "Update plugin"
 msgstr "Connector actualitzat"
@@ -14559,8 +14544,8 @@ msgid ""
 "The plugin has been removed from the configuration. Please restart JOSM to "
 "unload the plugin."
 msgstr ""
-"El connector ha estat suprimit de la configuració. Si us plau, reinicieu "
-"JOSM per tal de carregar el connector."
+"El connector ha estat suprimit de la configuració. Reinicieu JOSM per tal de "
+"carregar el connector."
 
 msgid "Plugin information"
 msgstr "Informació del connector"
@@ -14626,16 +14611,16 @@ msgid "Processing plugin files..."
 msgstr "Processant els fitxers del connnector..."
 
 msgid "Download plugin list..."
-msgstr "Descarregada la llista de connectors..."
+msgstr "Baixa la llista de connectors..."
 
 msgid "Downloading plugin list from ''{0}''"
-msgstr "Descarregant la llista de connectors de ''{0}''"
+msgstr "S''està baixant la llista de connectors de ''{0}''"
 
 msgid "Plugin list download error"
-msgstr "Error a la descàrrega de la llista de connectors"
+msgstr "Error a la baixada de la llista de connectors"
 
 msgid "JOSM failed to download plugin list:"
-msgstr "JOSM no ha aconseguit descarregar la llista de connectors:"
+msgstr "JOSM no ha aconseguit baixar la llista de connectors:"
 
 msgid "Details:"
 msgstr "Detalls:"
@@ -14685,7 +14670,7 @@ msgid ""
 "file a bug report."
 msgstr ""
 "Ha hagut una excepció no esperada.<br>Això sempre és a causa d''un error al "
-"codi del programa. Si esteu utilitzant<br>la darrera versió de JOSM, si us "
+"codi del programa. Si esteu utilitzant<br>la darrera versió del JOSM, si us "
 "plau, considereu l''opció d''omplir un informe d''error."
 
 msgid "Update JOSM"
@@ -14701,8 +14686,8 @@ msgstr ""
 "Ha hagut una excepció inesperada. Això sempre és a causa d''un error de "
 "codificació.<br><br>No obstant això, esteu utilitzant una versió antiga del "
 "JOSM ({0}),<br>en comptes d''utilitzar la versió actual "
-"verificada(<b>{1}</b>).<br><br><b>Si us plau, actualitzeu el JOSM</b> abans "
-"de considerar de reportar un error."
+"verificada(<b>{1}</b>).<br><br><b>Actualitzeu el JOSM</b> abans de "
+"considerar de reportar un error."
 
 msgid "Unexpected Exception"
 msgstr "Excepció no esperada"
@@ -14722,7 +14707,7 @@ msgid ""
 "bug report in our bugtracker using this link:"
 msgstr ""
 "Hauríeu d''actualitzar també els vostres connectors. Si el problema "
-"persisteix, si us plau, ompliu un informe d''error al nostre lloc web:"
+"persisteix, ompliu un informe d''error al nostre lloc web:"
 
 msgid ""
 "There the error information provided below should already be filled in for "
@@ -14751,7 +14736,7 @@ msgid ""
 "the server URL in your preferences and your internet connection."
 msgstr ""
 "<html>Ha fallat la inicialització de la comunicació amb el servidor OSM "
-"{0}.<br>comproveu la URL del servidor a les preferències i la vostra "
+"{0}.<br>comproveu l''URL del servidor a les preferències i la vostra "
 "connexió a Internet."
 
 msgid ""
@@ -14762,8 +14747,8 @@ msgid ""
 msgstr ""
 "<html>Ha fallat l''autenticació al servidor OSM ''{0}''.<br>Esteu utilitzant "
 "OAuth per autenticar-vos però no hi ha un<br>testimoni d''autenticació OAuth "
-"configurat.<br>Si us plau, obriu la finestra de preferències i genereu o "
-"introduïu-ne un.</html>"
+"configurat.<br>Obriu la finestra de preferències i genereu o introduïu-ne "
+"un.</html>"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>node {0}</strong>. It is still "
@@ -14936,8 +14921,8 @@ msgid ""
 "preferences.</html>"
 msgstr ""
 "<html>Ha fallat l''autenticació al servidor OSM amb el nom d''usuari "
-"''{0}''.<br>Si us plau, verifiqueu el nom d''usuari i la contrasenya a les "
-"preferències de JOSM.</html>"
+"''{0}''.<br>Verifiqueu el nom d''usuari i la contrasenya a les preferències "
+"del JOSM.</html>"
 
 msgid ""
 "<html>Authentication at the OSM server with the OAuth token ''{0}'' "
@@ -14945,8 +14930,8 @@ msgid ""
 "token.</html>"
 msgstr ""
 "<html>L''autenticació al servidor OSM amb el testimoni d''autenticació oaUTH "
-"''{0}'' ha fallat.<br>Si us plau, obriu la finestra de preferències i "
-"aconseguiu un altre.</html>"
+"''{0}'' ha fallat.<br>Obriu la finestra de preferències i aconseguiu un "
+"altre.</html>"
 
 msgid ""
 "<html>Authorisation at the OSM server failed.<br>The server reported the "
@@ -14966,8 +14951,8 @@ msgid ""
 msgstr ""
 "<html>Ha fallat l''autorització al servidor OSM anb el testimoni "
 "d''autenticació ''{0}''. <br>El testimoni no està autoritzat a accedir al "
-"recurs protegit<br>''{1}''.<br>Si us plau, obriu la finestra de les "
-"preferències i obtingueu un altre testimoni d''autenticació OAuth.</html>"
+"recurs protegit<br>''{1}''.<br>Obriu la finestra de les preferències i "
+"obtingueu un altre testimoni d''autenticació OAuth.</html>"
 
 msgid ""
 "<html>Communication with the OSM server ''{0}'' timed out. Please retry "
@@ -15028,7 +15013,7 @@ msgid ""
 msgstr ""
 "<html>Ha fallat l''obertura de la connexió amb el servidor "
 "remot<br>''{0}''<br>per raons de seguretat. Això és degut a que esteu "
-"executant un microprograma<br>que no heu descarregat de ''{1}''."
+"executant un microprograma<br>que no heu baixat de ''{1}''."
 
 msgid ""
 "<html>Failed to open a connection to the remote server<br>''{0}''.<br>Please "
@@ -15048,9 +15033,9 @@ msgid ""
 "<html>Failed to download data. Its format is either unsupported, ill-formed, "
 "and/or inconsistent.<br><br>Details (untranslated): {0}</html>"
 msgstr ""
-"<html>Ha fallat la descàrrega de dades perquè el seu format no està "
-"suportat, està malformat  i/o és inconsistent.<br><br>Detalls (sense "
-"traduir): {0}</html>"
+"<html>Ha fallat la baixada de dades perquè el seu format no està suportat, "
+"està malformat  i/o és inconsistent.<br><br>Detalls (sense traduir): "
+"{0}</html>"
 
 msgid "<html>Failed to download data.<br><br>Details: {0}</html>"
 msgstr "<html>Ha fallat la baixada de dades.<br><br>Detalls: {0}</html>"
@@ -15060,8 +15045,8 @@ msgid ""
 "error.<br>This is most likely a temporary problem. Please try again later."
 msgstr ""
 "<html>El servidor OSM<br>''{0}''<br>ha informat d''un error intern del "
-"mateix servidor.<br>Això acostuma a ser un problema temporal. Si us plau, "
-"torneu a intentar-ho més tard."
+"mateix servidor.<br>Això acostuma a ser un problema temporal. Torneu a "
+"intentar-ho més tard."
 
 msgid "The OSM server ''{0}'' reported a bad request.<br>"
 msgstr "El servidor OSM ''{0}'' ha informat d''una petició dolenta."
@@ -15071,7 +15056,7 @@ msgid ""
 "large.<br>Either request a smaller area or use an export file provided by "
 "the OSM community."
 msgstr ""
-"L''àrea que intenteu descarregar és massa gran o la vostra petició és massa "
+"L''àrea que intenteu baixar és massa gran o la vostra petició és massa "
 "gran.<br>Demaneu una àrea més petita o utilitzeu un fitxer d''exportació "
 "dels que proveeix la comunitat OSM."
 
@@ -15096,9 +15081,8 @@ msgid ""
 "preferences and your internet connection."
 msgstr ""
 "<html>Ha fallat l''obertura d''una connexió amb el servidor "
-"remot<br>''{0}''.<br>El nom ''{1}'' no ha pogut ser resolt. <br>Si us plau "
-"comproveu la URL de l''API a les vostres preferències i la vostra connexió a "
-"Internet."
+"remot<br>''{0}''.<br>El nom ''{1}'' no ha pogut ser resolt. <br>Comproveu "
+"l''URL de l''API a les vostres preferències i la vostra connexió a Internet."
 
 msgid ""
 "<html>The server reports that an object is deleted.<br><strong>Uploading "
@@ -15137,17 +15121,17 @@ msgstr ""
 "ha estat: {1}"
 
 msgid "{0}... [please type its number]"
-msgstr "{0}... [si us plau escriviu el nombre]"
+msgstr "{0}... [escriviu el nombre]"
 
 msgid ""
 "Failed to open URL. There is currently no platform set. Please set a "
 "platform first."
 msgstr ""
-"Ha fallat l''obertura de la URL. No hi ha una plataforma establerta. Si us "
+"Ha fallat l''obertura de l''URL. No hi ha una plataforma establerta. Si us "
 "plau, establiu-ne una primer."
 
 msgid "Opening URL: {0}"
-msgstr "Obrint la URL: {0}"
+msgstr "Obrint l''URL: {0}"
 
 msgid "zoom"
 msgstr "ampliació"
@@ -15159,10 +15143,10 @@ msgid "longitude"
 msgstr "longitud"
 
 msgid "URL does not contain {0}/{1}/{2}"
-msgstr "La URL no conté {0}/{1}/{2}"
+msgstr "l''URL no conté {0}/{1}/{2}"
 
 msgid "URL does not contain valid {0}"
-msgstr "La URL no conté un {0} vàlid"
+msgstr "l''URL no conté un {0} vàlid"
 
 msgid "reserved"
 msgstr "reservat"
@@ -15200,7 +15184,7 @@ msgid ""
 "A previous version of JOSM has installed a custom certificate in order to "
 "provide HTTPS support for Remote Control:"
 msgstr ""
-"Una versió anterior de JOSM ha instal·lat un certificat personalitzat per "
+"Una versió anterior del JOSM ha instal·lat un certificat personalitzat per "
 "donar suport al control remot amb HTTPS:"
 
 msgid ""
@@ -15219,7 +15203,7 @@ msgid "Unable to remove insecure certificate from keystore: {0}"
 msgstr "Unable to remove insecure certificate from keystore: {0}"
 
 msgid "JOSM localhost certificate found in {0} keystore: {1}"
-msgstr "Certificat de JOSM localhost trobat a les claus {0}: {1}"
+msgstr "Certificat del JOSM localhost trobat a les claus {0}: {1}"
 
 msgid ""
 "Remote Control is configured to provide HTTPS support.<br>This requires to "
@@ -15240,7 +15224,7 @@ msgid "HTTPS support in Remote Control"
 msgstr "Suport a HTTPS al control remot"
 
 msgid "Adding JOSM localhost certificate to {0} keystore"
-msgstr "Afegint certificat de JOSM localhost a les claus {0}"
+msgstr "Afegint certificat del JOSM localhost a les claus {0}"
 
 msgid "Silent shortcut conflict: ''{0}'' moved by ''{1}'' to ''{2}''."
 msgstr "Conflicte de drecera:  ''{0}'' ha estat mogut per ''{1}'' a ''{2}''."
@@ -15384,7 +15368,7 @@ msgid "Database offline for maintenance"
 msgstr "La base de dades és fora de línia per manteniment"
 
 msgid "You have downloaded too much data. Please try again later."
-msgstr "Heu descarregat massa dades. Si us plau, proveu més tard."
+msgstr "Heu baixat massa dades. Proveu més tard."
 
 msgid ""
 "The maximum bbox size is 0.25, and your request was too large. Either "
@@ -15398,7 +15382,7 @@ msgstr "Entrada a JOSM-Trac a josm.openstreetmap.de"
 
 msgid "could not get audio input stream from input URL"
 msgstr ""
-"no es pot obtenir un flux d''entrada d''àudio a partir de la URL d''entrada"
+"no es pot obtenir un flux d''entrada d''àudio a partir de l''URL d''entrada"
 
 msgid "Audio Device Unavailable"
 msgstr "Dispositiu d''àudio fora de l''abast"
@@ -15702,7 +15686,7 @@ msgid ""
 msgstr ""
 "Superposa la graella de tessel·les canvec sobre el mapa i escriu les "
 "respectives adreces URL als fitxers zip. Objectius de futur: permetre la "
-"descàrrega automàtica i la càrrega dels fitxers .osm de canvec."
+"baixada automàtica i la càrrega dels fitxers .osm de canvec."
 
 msgid ""
 "Allows the user to create different color schemes and to switch between "
@@ -15748,17 +15732,17 @@ msgstr ""
 "són suportats: TangoGPS, Garmin Trainings Center TCX."
 
 msgid "Download your GPX tracks from openstreetmap.org"
-msgstr "Descarrega els vostres tracks d''openstreetmap.org"
+msgstr "Baixeu les vostres traces d''openstreetmap.org"
 
 msgid ""
 "This plugin directly upload GPS Traces from current active layer in JOSM to "
 "openstreetmap.org."
 msgstr ""
-"Aquest connector puja tracks GPS directament des de la capa activa de JOSM a "
-"openstreetmap.org."
+"Aquest connector puja tracks GPS directament des de la capa activa del JOSM "
+"a openstreetmap.org."
 
 msgid "Downloads OSM data along a way"
-msgstr "Descarrega dades OSM al llarg d''una via"
+msgstr "Baixa les dades OSM al llarg d''una via"
 
 msgid ""
 "Allows the user to anonymize timestamps and delete parts of huge GPX tracks "
@@ -15794,13 +15778,13 @@ msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
 msgstr ""
-"Aporta parts de la llibreria GeoTools per al connectors de JOSM. Això "
+"Aporta parts de la llibreria GeoTools per al connectors del JOSM. Això "
 "significa que aquestconnector no ha de ser instal·lat pels usuaris sinó com "
 "una dependència d''altres."
 
 msgid ""
 "Download GPS points from Globalsat dg100 data logger directly in JOSM."
-msgstr "Descarrega punts GPS de Globalsat dg100 directament a JOSM."
+msgstr "Baixa els punts GPS de Globalsat dg100 directament a JOSM."
 
 msgid ""
 "Analyse a set of GPS points to obtain its centre and direction of spread."
@@ -15928,7 +15912,7 @@ msgid "Adds no left turn for sets of 4 or 5 ways"
 msgstr "Afegeix una prohibició de gir a l''esquerra a conjunts de 4 o 5 vies"
 
 msgid "Simplifies download from different read-only APIs."
-msgstr "Simplifica la descàrrega de diferents APIs de només lectura"
+msgstr "Simplifica la baixada de diferents APIs de només lectura"
 
 msgid "Allows to attribute tags to all objects in any selected area at once"
 msgstr ""
@@ -15949,7 +15933,7 @@ msgid ""
 "Disallow using JOSM forever (WARNING: this plugin prevents JOSM from loading "
 "and is hard to rid of)"
 msgstr ""
-"Dehabilita la utilització de JOSM per sempre (AVÍS: aquest connector evita "
+"Dehabilita la utilització del JOSM per sempre (AVÍS: aquest connector evita "
 "que JOSM es carregui i és difícil de treure''l un cop instal·lat)"
 
 msgid "Convert data from Open Data portals to OSM layer"
@@ -15974,7 +15958,7 @@ msgid ""
 "Bring in errors from Osm Inspector and display it on the current JOSM "
 "bounding box"
 msgstr ""
-"Pren errors d''Osm Inspector i els mostra al requadre del mapa actual."
+"Pren errors de l''OSM Inspector i els mostra al requadre del mapa actual."
 
 msgid "Import/export OSM data in PBF format"
 msgstr "Importa/exporta dades OSM en format PBF"
@@ -16055,6 +16039,12 @@ msgstr "Afegeix capacitat de generar rutes."
 msgid "Loads data from SDS"
 msgstr "Carrega dades de SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Capa d''imatgeria per Sea Charts"
+
+msgid "Edit features for Sea Charts"
+msgstr "Modifica funcionalitats de Sea Chart"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16135,7 +16125,7 @@ msgstr ""
 "sobre prohibicions de gir a la base de dades d''OpenStreetMap."
 
 msgid "Allows undeleting object from OSM database"
-msgstr "Permet recuperar objectes esborrats de la base de dades d''OSM"
+msgstr "Permet recuperar objectes esborrats de la base de dades de l''OSM"
 
 msgid "Several utilities that make your life easier."
 msgstr "Vàries utilitats per fer-vos més fàcil la vostra feina."
@@ -16152,13 +16142,13 @@ msgid ""
 "Supports downloading tiled, scanned maps from walking-papers.org. This "
 "plugin is still under early development and may be buggy."
 msgstr ""
-"Suporta la descàrrega de walking-papers.org de tessel·les de mapes "
-"escanejats. Aquest connnector és encara en un estadi inicial de "
-"desenvolupament i pot tenir errors."
+"Suporta la baixada de walking-papers.org de tessel·les de mapes escanejats. "
+"Aquest connnector és encara en un estadi inicial de desenvolupament i pot "
+"tenir errors."
 
 msgid "Easy downloading along a long set of interconnected ways"
 msgstr ""
-"Facilita la descàrrega al llarg d''un gran conjunt de vies interconnectades"
+"Facilita la baixada al llarg d''un gran conjunt de vies interconnectades"
 
 msgid "Enables searching for waypoint imported from gpx file."
 msgstr "Habilita la cerca de fites importades d''un fitxer gpx"
@@ -17078,12 +17068,91 @@ msgstr "accés a servei amb cotxe (drive-through)"
 msgid "Parking Aisle"
 msgstr "Via d''aparcament"
 
+msgid "Escape"
+msgstr "Zona de frenada d''emergència"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Carril d''emergència al costat de vies amb baixades fortes i continuades per "
+"a ser utilitzada pels camions o d''altres vehicles per aturar-se en cas de "
+"fallada dels frens."
+
 msgid "Road (Unknown Type)"
 msgstr "Carretera (tipus no conegut)"
 
 msgid "Construction"
 msgstr "En construcció"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "autopista"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "enllaç d''autopista"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "principal"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "enllaç de carretera principal"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "primària"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "enllaç de carretera primària"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "secundària"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "enllaç de carretera secundària"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "terciària"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "enllaç de carretera terciària"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "autobús guiat"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "via eqüestre"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "via de zona residencial (20)"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "carrer de vianants"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "pista"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "camí per vianants (àmbit urbà)"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "escales"
+
 msgid "Junction"
 msgstr "Cruïlla"
 
@@ -17179,45 +17248,7 @@ msgstr "no"
 msgid "Roundabout"
 msgstr "Rotonda"
 
-msgid "motorway"
-msgstr "autopista"
-
-msgid "motorway_link"
-msgstr "enllaç_autopista"
-
-msgid "trunk"
-msgstr "autovia"
-
-msgid "trunk_link"
-msgstr "enllaç_autovia"
-
-msgid "primary"
-msgstr "principal"
-
-msgid "primary_link"
-msgstr "principal_enllaç"
-
-msgid "secondary"
-msgstr "secundaria"
-
-msgid "tertiary"
-msgstr "terciaria"
-
-msgid "unclassified"
-msgstr "referencia_no"
-
-msgid "residential"
-msgstr "carrer/residencial"
-
-msgid "living_street"
-msgstr "carrer_zona_residencial"
-
-msgid "service"
-msgstr "via_servei"
-
-msgid "bus_guideway"
-msgstr "via per autobusos amb sistema de guiatge"
-
+msgctxt "Highway"
 msgid "construction"
 msgstr "construcció"
 
@@ -18076,32 +18107,29 @@ msgstr "Bifurcació de ferrocarril"
 msgid "Aerialway"
 msgstr "Via aèria"
 
-msgid "Chair Lift"
-msgstr "Telecadira"
+msgid "Cable Car"
+msgstr "Telecabina"
 
 msgid "Number of people per hour"
 msgstr "Nombre de persones per hora"
 
-msgid "Number of people per chair"
-msgstr "Nombre de persones per cadira"
+msgid "Number of people per car"
+msgstr "Nombre de persones per cabina"
 
 msgid "Typical journey time in minutes"
 msgstr "Temps de viatge normal en minuts"
 
-msgid "Has bubble?"
-msgstr "Té cabina?"
-
 msgid "Has heating?"
 msgstr "Disposa de calefacció?"
 
-msgid "Drag Lift"
-msgstr "Teleesquí"
+msgid "Chair Lift"
+msgstr "Telecadira"
 
-msgid "Cable Car"
-msgstr "Telecabina"
+msgid "Number of people per chair"
+msgstr "Nombre de persones per cadira"
 
-msgid "Number of people per car"
-msgstr "Nombre de persones per cabina"
+msgid "Has bubble?"
+msgstr "Té cabina?"
 
 msgid "Gondola"
 msgstr "Telefèric / Aeri"
@@ -18115,16 +18143,26 @@ msgstr "Ascensor mixt"
 msgid "Number of people per gondola/chair"
 msgstr "Nombre de persones per cabina/cadira"
 
-msgid "T-bar Lift"
-msgstr "Teleesquí de T"
+msgid "Drag Lift"
+msgstr "Teleesquí"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"remuntador (tipus genèric - utilitzeu-lo només si el tipus concret (vegeu "
+"més avall) no és conegut)"
 
-msgid "J-bar Lift"
-msgstr "Teleesquí de J"
+msgid "t-bar"
+msgstr "telequí d''àncora"
 
-msgid "Platter Lift"
-msgstr "Remuntador"
+msgid "j-bar"
+msgstr "telesquí en forma de J"
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr "telesquí de disc"
+
+msgid "rope_tow"
 msgstr "Telecorda"
 
 msgid "Magic Carpet"
@@ -18209,6 +18247,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18239,12 +18280,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18442,6 +18486,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Es renten bicis (de pagament)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Estació pública de reparació de bicicletes"
+
 msgid "Public Transport"
 msgstr "Transport públic"
 
@@ -18700,6 +18747,14 @@ msgstr "Estacionament"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "si"
+
 msgid "Beacon"
 msgstr "Balisa"
 
@@ -19364,7 +19419,7 @@ msgid "seasonal"
 msgstr "estacional"
 
 msgid "flush"
-msgstr "descàrrega"
+msgstr "baixada"
 
 msgid "pitlatrine"
 msgstr "pou mort"
@@ -19945,10 +20000,6 @@ msgid "Man Made"
 msgstr "Construccions"
 
 msgctxt "building"
-msgid "yes"
-msgstr "si"
-
-msgctxt "building"
 msgid "roof"
 msgstr "cobert"
 
@@ -19969,16 +20020,16 @@ msgid "school"
 msgstr "escola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "comercial"
 
 msgctxt "building"
-msgid "farm"
-msgstr "granja"
+msgid "barn"
+msgstr "graner"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "auxiliar de granja"
 
 msgctxt "building"
 msgid "transportation"
@@ -20051,6 +20102,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "casa unifamiliar"
 
+msgctxt "building"
+msgid "farm"
+msgstr "granja"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -20810,8 +20865,8 @@ msgid ""
 "(Please only use this tag if more detailed mapping using busbars and bays is "
 "impossible!)"
 msgstr ""
-"(Si us plau utilitzeu aquesta etiqueta només si no és possible disposar de "
-"més detall  dels jocs de barres i badies d''alimentació!)"
+"(Utilitzeu aquesta etiqueta només si no és possible disposar de més detall  "
+"dels jocs de barres i badies d''alimentació!)"
 
 msgid "Power Busbar"
 msgstr "Joc de barres"
@@ -21550,7 +21605,7 @@ msgstr "Parc nacional"
 msgid "Protected Area"
 msgstr "Àrea protegida"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Grup protegit"
 
 msgid "Title or type of protection"
@@ -21580,15 +21635,21 @@ msgstr "Ciutat"
 msgid "Town"
 msgstr "Vila"
 
-msgid "Suburb"
-msgstr "Districte"
-
 msgid "Village"
 msgstr "Poble"
 
 msgid "Hamlet"
 msgstr "Llogaret"
 
+msgid "Isolated Dwelling"
+msgstr "Masia/Habitatge aïllat"
+
+msgid "Suburb"
+msgstr "Districte"
+
+msgid "Neighbourhood"
+msgstr "Barri/Urbanització"
+
 msgid "Farm"
 msgstr "Granja"
 
@@ -21596,14 +21657,7 @@ msgid "A farm within a bigger settlement"
 msgstr "Una granja a un assentament més gran"
 
 msgid "(please use isolated_dwelling for an isolated farm)"
-msgstr ""
-"(si us plau utilitzeu l''etiqueta isolated_dwelling per les masies aïllades)"
-
-msgid "Isolated Dwelling"
-msgstr "Masia/Habitatge aïllat"
-
-msgid "Neighbourhood"
-msgstr "Barri/Urbanització"
+msgstr "(utilitzeu l''etiqueta isolated_dwelling per les masies aïllades)"
 
 msgid "Locality"
 msgstr "Indret / altres topònims"
@@ -22132,6 +22186,42 @@ msgstr "Imatge"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contacte (esquema amb \"contact:*\" Prefix)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Un text curt amb informació addicional"
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Pot mostrar-se als usuaris finals (potser fent servir una sistema de cerca o "
+"un mapa amb finestres emergents)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Etiquetes semblants però diferents:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+"Una indicació improtant per altres mapadors (no per als usuaris finals)"
+
+msgid "Fixme"
+msgstr "Corregiu-me"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Una indicació per als altres mapadors (no per als usuaris finals), que cal "
+"millorar un objecte."
+
 msgid "outer segment"
 msgstr "segment extern"
 
@@ -22495,17 +22585,14 @@ msgstr "Prova"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr "Imatgeria aèria Bing"
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr "Mapbox Satèl·lit"
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22516,15 +22603,15 @@ msgstr "OpenStreetMap Tracks GPS"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik Blanc i negre)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, sense etiquetes)"
 
-msgid "skobbler"
-msgstr "skobbler"
-
 msgid "skobbler heatmap"
 msgstr "skobbler mapa de calor"
 
@@ -22555,6 +22642,54 @@ msgstr "Mapa ciclista Strava"
 msgid "Strava running heatmap"
 msgstr "Mapa de curses Strava"
 
+msgid "Locator Overlay"
+msgstr "Locator Overlay"
+
+msgid "QA No Address"
+msgstr "QA sense adreces"
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Waymarked Trails: Excursionisme"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Waymarked Trails: Ciclisme"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Waymarked Trails: BTT"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Waymarked Trails: Patinatge"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Waymarked Trails: Cavall"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Waymarked Trails: Esports d'hivern"
+
+msgid "OSM Inspector: Geometry"
+msgstr "Inspector OSM: Geometria"
+
+msgid "OSM Inspector: Tagging"
+msgstr "Inspector OSM: etiquetatge"
+
+msgid "OSM Inspector: Places"
+msgstr "Inspector OSM: llocs"
+
+msgid "OSM Inspector: Highways"
+msgstr "Inspector OSM: vies"
+
+msgid "OSM Inspector: Multipolygon"
+msgstr "Inspector OSM: multipolígons"
+
+msgid "OSM Inspector: Routing"
+msgstr "Inspector OSM: enrutament"
+
+msgid "OSM Inspector: Addresses"
+msgstr "Inspector OSM: adreces"
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr "Inspector OSM: Fronteres (UE)"
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI blanc i negre 2.5m"
 
@@ -22597,9 +22732,14 @@ msgstr "VoGIS: DOM (Model de superfície)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"AGIV(laanderen) imatgeria aeria (cobreix la regió de Brusel·les prou bé) "
+"(2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW(allonie) 2012 imatgeria aèria"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW(allonie) 2009 imatgeria aèria"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Sectors Urbans"
@@ -22619,6 +22759,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Mosaic Columbia Britànica"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Kelowna carreteres"
+
 msgid "Czech CUZK:KM"
 msgstr "Txèquia CUZK:KM"
 
@@ -22738,7 +22884,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburg (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburg (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburg (DK5)"
@@ -22749,8 +22895,8 @@ msgstr "Baviera(2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr "Erlangen imatgeria aèria (2013 6,25 cm)"
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22835,6 +22981,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 -  Itàlia"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Tirol de Sud Ortofotomapa 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Tirol de Sud topogràfic"
+
 msgid "USSR - Latvia"
 msgstr "USSR - Letònia"
 
@@ -23051,17 +23203,17 @@ msgstr "MSR Mapes Topogràfics"
 msgid "MSR Maps Urban"
 msgstr "MSR Mapes Urbans"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Mapes topogràfics escanejats"
+msgid "USGS Topographic Maps"
+msgstr "USGS mapes topogràfics"
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Imatgeria a escala gran"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr "Carreteres TIGER 2012"
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "Carreteres TIGER noves i mal alineades"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr "Noves carreteres TIGER no alineades (2014)"
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcels"
@@ -23069,6 +23221,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC darrera Ortoimatgeria"
 
+msgid "U.S. Forest Service roads"
+msgstr "Carreteres Servei Forestal USA"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ucraïna - Ortofotomapes 2012"
 
@@ -23336,6 +23491,9 @@ msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Nombres de carrer decreixents en interpolació d''adreces"
 
@@ -23397,12 +23555,11 @@ msgid ""
 "{0}={1} is unspecific. Instead of ''{1}'' please give more information about "
 "what exactly should be fixed."
 msgstr ""
-"{0}={1} no és específic. Al contrari que ''{1}'', si us plau aporteu més "
-"informació sobre el que cal corregir."
+"{0}={1} no és específic. Al contrari que ''{1}'', aporteu més informació "
+"sobre el que cal corregir."
 
 msgid "{0}={1} is deprecated. Please use instead a multipolygon."
-msgstr ""
-"{0}={1} és obsolet. Si us plau, utilitzeu un multiplolígon com a alternativa."
+msgstr "{0}={1} és obsolet. utilitzeu un multiplolígon com a alternativa."
 
 msgid ""
 "{0} is deprecated. Please specify interval by using opening_hours syntax"
@@ -23443,6 +23600,9 @@ msgstr "{0} a un node. Ha de ser utilitzat a una àrea."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* a un node. S''ha d''utilitzar a una relació"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} a una via. Ha de ser utilitzat a un node."
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} a una via. S''ha d''utilitzar a una relació"
 
@@ -23664,7 +23824,7 @@ msgid ""
 "No command has been found. Would you like to download and install default "
 "commands now?"
 msgstr ""
-"No s''ha trobat cap comanda. voleu descarregar i instal·lar les comandes "
+"No s''ha trobat cap comanda. voleu baixar i instal·lar les comandes "
 "predefinides?"
 
 msgid "No command found"
@@ -23678,7 +23838,7 @@ msgid ""
 "\n"
 "Error: {0}"
 msgstr ""
-"Ha fallat la descàrrega i instal·lació de les comandes predefinides.\n"
+"Ha fallat la baixada i instal·lació de les comandes predefinides.\n"
 "\n"
 "Error: {0}"
 
@@ -23747,10 +23907,10 @@ msgid "Create a grid of ways"
 msgstr "Crea una graella de vies"
 
 msgid "Download Track ..."
-msgstr "Descarrega Recorregut ..."
+msgstr "Baixa el recorregut ..."
 
 msgid "Download GPX track from openstreetmap.org"
-msgstr "Descarrega recorregut en GPX des de openstreetmap.org"
+msgstr "Baixa el recorregut en GPX des de openstreetmap.org"
 
 msgid ""
 "Error occurred while parsing gpx file {0}. Only a part of the file will be "
@@ -23769,7 +23929,7 @@ msgid "Error parsing data from URL {0}"
 msgstr "Error en analitzar les dades de l''adreça URL {0}"
 
 msgid "Download Track"
-msgstr "Descarrega Recorregut"
+msgstr "Baixa el recorregut"
 
 msgid "Filename"
 msgstr "Nom del fitxer"
@@ -23800,7 +23960,7 @@ msgid "Upload Traces"
 msgstr "Pujar traçats"
 
 msgid "Defines the visibility of your trace for other OSM users."
-msgstr "Defineix la visibilitat del traçat pels altres usuaris/es d''OSM."
+msgstr "Defineix la visibilitat del traçat pels altres usuaris/es de l''OSM."
 
 msgid "http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
 msgstr "http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
@@ -23809,13 +23969,13 @@ msgid "(What does that mean?)"
 msgstr "(Què significa això?)"
 
 msgid "Please enter Description about your trace."
-msgstr "Si us plau, introdueix la descripció del teu traçat."
+msgstr "Introdueix la descripció del teu traçat."
 
 msgid "Tags (comma delimited)"
 msgstr "Etiquetes (delimitades per comes)"
 
 msgid "Please enter tags about your trace."
-msgstr "Si us plau, introdueix les etiquetes sobre el teu traçat."
+msgstr "Introdueix les etiquetes sobre el teu traçat."
 
 msgid "Selected track: {0}"
 msgstr "Recorregut seleccionat: {0}"
@@ -24180,7 +24340,7 @@ msgid "Default image projection"
 msgstr "Projecció per defecte de la imatge"
 
 msgid "JOSM''s current projection"
-msgstr "Projecció actual de JOSM"
+msgstr "Projecció actual del JOSM"
 
 msgid ""
 "No projection file (.prj) found.<br>You can choose the default image "
@@ -24281,7 +24441,7 @@ msgid "open end"
 msgstr "extrem obert"
 
 msgid "Import Osm Inspector Bugs..."
-msgstr "Importa errors d''Osm Inspector ..."
+msgstr "Importa errors de l''OSM Inspector ..."
 
 msgid "OsmInspector"
 msgstr "OsmInspector"
@@ -24293,7 +24453,7 @@ msgid "OsmBugInfo"
 msgstr "OsmBugInfo"
 
 msgid "Open a OSM Inspector selection list window."
-msgstr "Obre una finetra amb una llista de selecció d''OSM Inspector"
+msgstr "Obre una finetra amb una llista de selecció de l''OSM Inspector"
 
 msgid "Current Selected Bug Info"
 msgstr "Informació sobre els errors seleccionats"
@@ -24305,10 +24465,10 @@ msgid "Next OSMI bug"
 msgstr "Error OSMI següent"
 
 msgid "Osm Inspector Bugs"
-msgstr "Errors d''Osm Inspector"
+msgstr "Errors de l''OSM Inspector"
 
 msgid "OSM Inspector Bugs"
-msgstr "Inspector d''errors d''OSM"
+msgstr "Inspector d''errors de l''OSM"
 
 msgid "Selected Bug Info"
 msgstr "Informació dels errors seleccionats"
@@ -24407,8 +24567,7 @@ msgid "Country code must be 2 letters"
 msgstr "El codi de país ha de contenir dues lletres"
 
 msgid "Please enter valid number for starting and ending address"
-msgstr ""
-"Si us plau, introduïu un nombre vàlid per les adreces inicial i final"
+msgstr "Introduïu un nombre vàlid per les adreces inicial i final"
 
 msgid "Alphabetic address must end with a letter"
 msgstr "Les adreces alfabètiques han d''acabar amb una lletra"
@@ -24422,10 +24581,10 @@ msgid "Starting address letter must be less than ending address letter"
 msgstr "La lletra inicial de l''adreça ha de ser més petita que la final"
 
 msgid "Please enter valid number for starting address"
-msgstr "Si us plau, indiqueu un nombre vàlid per l''adreça inicial"
+msgstr "Indiqueu un nombre vàlid per l''adreça inicial"
 
 msgid "Please enter valid number for ending address"
-msgstr "Si us plau, indiqueu un nombre vàlid per l''adreça final"
+msgstr "Indiqueu un nombre vàlid per l''adreça final"
 
 msgid "Starting address number must be less than ending address number"
 msgstr "el nombre inicial de l''adreça ha de ser més petit que el final"
@@ -24896,9 +25055,11 @@ msgstr "combina nodes"
 
 msgid "How often thinning operation should be applied (Default {0})."
 msgstr ""
+"Com de sovint s''ha d''aplicar l''operció d''esqueletització (valor "
+"predeterminat {0})"
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Iteracions d''esqueletització"
 
 msgid "Street Name:"
 msgstr "Nom del carrer:"
@@ -24979,7 +25140,7 @@ msgid ""
 msgstr ""
 "Localització \"{0}\" trobada a la memòria cau.\n"
 "Carregar primer la memòria cau?\n"
-"(No = nova descàrrega)"
+"(No = nova baixada)"
 
 msgid "Select Feuille"
 msgstr "Fulla seleccionada"
@@ -25045,10 +25206,10 @@ msgid ""
 "in the shortcut settings if you want."
 msgstr ""
 "el connector del cadastre francès utilitzava la tecla de drecera F11per "
-"descarregar,\n"
+"baixar,\n"
 "aquesta tecla ara està assignada a la commutació a la visualització en "
 "pantalla completa.\n"
-"La nova tecla per descarregar és F10, però si voleu, podeu canviar-la\n"
+"La nova tecla per baixar és F10, però si voleu, podeu canviar-la\n"
 "a la configuració de dreceres."
 
 msgid ""
@@ -25080,7 +25241,7 @@ msgid "Change the current projection"
 msgstr "Canvia la projecció actual"
 
 msgid "Replace original background by JOSM background color."
-msgstr "Reemplaça el fons original pel color de fons de JOSM"
+msgstr "Reemplaça el fons original pel color de fons del JOSM"
 
 msgid "Reverse grey colors (for black backgrounds)."
 msgstr "Inverteix els colors grisos (pels fons negres)"
@@ -25089,7 +25250,7 @@ msgid "Set background transparent."
 msgstr "Configura el fons com transparent."
 
 msgid "Draw boundaries of downloaded data."
-msgstr "Dibuixa els límits de les dades descarregades."
+msgstr "Dibuixa els límits de les dades baixades."
 
 msgid "Disable image cropping during georeferencing."
 msgstr "Desactiva l''enquadrament de les imatges durant la georeferenciació"
@@ -25176,7 +25337,7 @@ msgid ""
 "Replace the original white background by the background color defined in "
 "JOSM preferences."
 msgstr ""
-"Reemplaçar el color de fons blanc pel color definit a les preferències de "
+"Reemplaçar el color de fons blanc pel color definit a les preferències del "
 "JOSM"
 
 msgid ""
@@ -25196,7 +25357,7 @@ msgstr ""
 
 msgid "Draw a rectangle around downloaded data from WMS server."
 msgstr ""
-"Dibuixar un rectangle al voltant de les dades descarregades del servidor WMS."
+"Dibuixar un rectangle al voltant de les dades baixades del servidor WMS."
 
 msgid "Image resolution:"
 msgstr "Resolució de la imatge:"
@@ -25226,11 +25387,11 @@ msgid "Vector images grab multiplier:"
 msgstr "Multiplicador d''imatges vectorials:"
 
 msgid "Grab one image full screen"
-msgstr "Descarrega una imatge a pantalla sencera"
+msgstr "Baixa una imatge a pantalla sencera"
 
 msgid "Grab smaller images (higher quality but use more memory)"
 msgstr ""
-"Descarrega imatges més petites (millor qualitat però requereix més memória)"
+"Baixa imatges més petites (millor qualitat però requereix més memória)"
 
 msgid "Fixed size square (default is 100m)"
 msgstr "Mida fixada de quadrat (defecte és 100 m)"
@@ -25275,7 +25436,7 @@ msgid ""
 "Add the \"Tableau(x) d''assemblage\" in the list of cadastre sheets to grab."
 msgstr ""
 "Afegeix els ''tableaux d''assemblage\" (taulers d''assemblatge) a la llista "
-"de capes cadastrals a descarregar"
+"de capes cadastrals a baixar"
 
 msgid "Replace greyscale by white color (smaller files and memory usage)."
 msgstr ""
@@ -25296,7 +25457,7 @@ msgid ""
 "Automatically selects the first WMS layer if multiple layers exist when "
 "grabbing."
 msgstr ""
-"Selecciona automàticament la primera capa WMS després de la descàrrega del "
+"Selecciona automàticament la primera capa WMS després de la baixada del "
 "cadastre si n''hi ha més d''una"
 
 msgid "Enable this to use the tag \"add:street\" on nodes."
@@ -25309,7 +25470,7 @@ msgid "Add \"source=...\" to elements?"
 msgstr "Afegir \"source=...\" (font) als objectes?"
 
 msgid "Downloading {0}"
-msgstr "Descarregant {0}"
+msgstr "S''està baixant {0}"
 
 msgid "Contacting WMS Server..."
 msgstr "Contactant el servidor WMS..."
@@ -25348,7 +25509,7 @@ msgid ""
 "Use the normal Cadastre Grab menu."
 msgstr ""
 "Municipi vectoritzat !\n"
-"Utilitzeu el menú de descàrrega del cadastre francès."
+"Utilitzeu el menú de baixada del cadastre francès."
 
 msgid ""
 "This commune is not vectorized.\n"
@@ -25364,16 +25525,16 @@ msgid "Only on vectorized layers"
 msgstr "Només sobre capes vectorials"
 
 msgid "Cancel current grab"
-msgstr "Anul·lar la descàrrega"
+msgstr "Anul·lar la baixada"
 
 msgid "Cancel current grab (only vector images)"
-msgstr "Anul·lar la descàrrega (només les imatges vectorials)"
+msgstr "Anul·lar la baixada (només les imatges vectorials)"
 
 msgid "Cadastre grab"
-msgstr "Descàrrega del cadastre"
+msgstr "Baixada del cadastre"
 
 msgid "Download Image from French Cadastre WMS"
-msgstr "Descarregar imatge del cadastre francès WMS"
+msgstr "Baixar imatge del cadastre francès WMS"
 
 msgid "Cadastre: {0}"
 msgstr "Cadastre: {0}"
@@ -25772,23 +25933,22 @@ msgid "TCX Files (*.tcx)"
 msgstr "Fitxers TCX (*.tcx)"
 
 msgid "Download along..."
-msgstr "Descarrega al llarg.."
+msgstr "Baixa al llarg.."
 
 msgid "Download OSM data along the selected ways."
 msgstr "Baixa les dades OSM al llarg de les vies seleccionades."
 
 msgid "Download Along"
-msgstr "Descarrega al llarg"
+msgstr "Baixa al llarg"
 
 msgid "Please select 1 or more ways to download along"
-msgstr ""
-"Si us plau seleccioneu 1 o més vies per descarregar dades al seu llarg"
+msgstr "Si us plau seleccioneu 1 o més vies per baixar dades al seu llarg"
 
 msgid "Download from OSM along selected ways"
-msgstr "Descarrega dades d''OSM al llarg de les vies seleccionades"
+msgstr "Baixa dades de l''OSM al llarg de les vies seleccionades"
 
 msgid "{0} intermediate nodes to download."
-msgstr "{0} nodes intermedis a descarregar"
+msgstr "{0} nodes intermedis a baixar"
 
 msgid "between {0} {1} and {2} {3}"
 msgstr "entre {0} {1} i {2} {3}"
@@ -26397,7 +26557,7 @@ msgid "edit bounds for selected defaults"
 msgstr "modificar límits pels predeterminats seleccionats"
 
 msgid "Download imagery XML bounds"
-msgstr "Descarrega els límits XML de la imatgeria"
+msgstr "Baixa els límits XML de la imatgeria"
 
 msgid ""
 "Validating error in file {0}:\n"
@@ -26437,19 +26597,20 @@ msgstr "Avís: l''obsolescència és irreversible!"
 
 msgid "To store imagery offsets you must be a registered OSM user."
 msgstr ""
-"Per enregistrar decalatges d''imatgeria heu de ser un usuari registrat d''OSM"
+"Per enregistrar decalatges d''imatgeria heu de ser un usuari registrat de "
+"l''OSM"
 
 msgid ""
 "Please enter the reason why you mark this imagery offset as deprecated"
 msgstr ""
-"Si us plau, indiqueu la raó per la que voleu marcar aquest decalatge "
-"d''imatgeria com a obsolet"
+"Indiqueu la raó per la que voleu marcar aquest decalatge d''imatgeria com a "
+"obsolet"
 
 msgid ""
 "Please enter the reason why you mark this calibration geometry as deprecated"
 msgstr ""
-"Si us plau, indiqueu la raó per la que voleu marcar aquest calibratge de "
-"geometria com a obsolet"
+"Indiqueu la raó per la que voleu marcar aquest calibratge de geometria com a "
+"obsolet"
 
 msgid "Notifying the server of the deprecation..."
 msgstr "Notificant de l''obsolescència al servidor..."
@@ -26458,7 +26619,7 @@ msgid "Get Imagery Offset..."
 msgstr "Obté el decalatge de la imatgeria...."
 
 msgid "Download offsets for current imagery from a server"
-msgstr "Descarrega del servidor els decalatges de la imatgeria actual"
+msgstr "Baixa del servidor els decalatges de la imatgeria actual"
 
 msgid ""
 "No data for this region. Please adjust imagery layer and upload an offset."
@@ -27032,7 +27193,7 @@ msgid "Data source text. Default is Landsat."
 msgstr "Text de la font de dades. Landsat per defecte."
 
 msgid "Downloading image tile..."
-msgstr "Descarregant imatge en mosaic ..."
+msgstr "S''està baixant imatge en mosaic ..."
 
 msgid "Could not acquire image"
 msgstr "No és possible d''adquirir la imatge"
@@ -27195,11 +27356,11 @@ msgid ""
 "XAPI query, e.g., '''' (to download all data), ''[highway=*]'', or "
 "''[[network=VRR][ref=603|613]''"
 msgstr ""
-"Consulta XAPI, per exemple, '''' (per descarregar totes les dades), "
+"Consulta XAPI, per exemple, '''' (per baixar totes les dades), "
 "''[highway=*]'', o ''[[network=VRR][ref=603|613]''"
 
 msgid "Download from OSM mirror..."
-msgstr "Descarregar del servidor rèplica OSM ..."
+msgstr "Baixar del servidor rèplica OSM ..."
 
 msgid "This XAPI query seems to be invalid, please doublecheck"
 msgstr ""
@@ -27209,25 +27370,25 @@ msgid "Object type: "
 msgstr "Tipus d''objecte "
 
 msgid "OSM object type to download (''*'' stands for any)"
-msgstr "Tipus d''objecte OSM a descarregar (''*'' indica qualsevol)"
+msgstr "Tipus d''objecte OSM a baixar (''*'' indica qualsevol)"
 
 msgid "XAPI query: "
 msgstr "Consulta XAPI: "
 
 msgid "Download from Overpass API ..."
-msgstr "Descarrega de l''API d''Overpass..."
+msgstr "Baixa de l''API d''Overpass..."
 
 msgid "Download map data from Overpass API server."
-msgstr "Descarrega dades del servidor de l''API d''Overpass..."
+msgstr "Baixa dades del servidor de l''API d''Overpass..."
 
 msgid "Overpass query: "
 msgstr "Consulta d''Overpass: "
 
 msgid "Select OSM mirror URL"
-msgstr "Seleccionar la URL del servidor rèplica d''OSM"
+msgstr "Seleccionar l''URL del servidor rèplica de l''OSM"
 
 msgid "Select OSM mirror URL to download from."
-msgstr "Seleccioneu una rèplica de la URL d''OSM per fer la descàrrega."
+msgstr "Seleccioneu una rèplica de l''URL de l''OSM per fer la baixada."
 
 msgid "Base URL"
 msgstr "Adreça URL base"
@@ -27253,14 +27414,14 @@ msgstr ""
 
 msgid "No thanks, use JOSM''s plain text preferences storage"
 msgstr ""
-"No gràcies, utilitzar el sistema d''enregistrament en text pla de JOSM"
+"No gràcies, utilitzar el sistema d''enregistrament en text pla del JOSM"
 
 msgid ""
 "Found sensitive data that is still saved in JOSM''s preference file (plain "
 "text)."
 msgstr ""
-"Han estat trobades dades sensibles emmagatzemades a les preferències de JOSM "
-"(en text pla)."
+"Han estat trobades dades sensibles emmagatzemades a les preferències del "
+"JOSM (en text pla)."
 
 msgid "Transfer to password manager and remove from preference file"
 msgstr ""
@@ -27341,7 +27502,7 @@ msgid "Save user and password ({0})"
 msgstr "Enregistrar usuari i contrasenya ({0})"
 
 msgid "Plain text, JOSM default"
-msgstr "Text pla, defecte de JOSM"
+msgstr "Text pla, defecte del JOSM"
 
 msgid "Use {0}"
 msgstr "Usa  {0}"
@@ -27383,7 +27544,7 @@ msgid "Split this data by neighbourhood (admin_level=11)."
 msgstr "Dividir aquestes dades per barris (admin_level=11)."
 
 msgid "Download open data"
-msgstr "Descarrega dades lliues"
+msgstr "Baixa dades lliures"
 
 msgid "License URL not available: {0}"
 msgstr "URL de llicència no disponible: {0}"
@@ -27407,7 +27568,7 @@ msgid "View the full text of this license"
 msgstr "Veure el text sencer d''aquesta llicència"
 
 msgid "I refuse these terms and conditions. Cancel download."
-msgstr "No accepto aquestes condicions. Cancel·lar la descàrregar"
+msgstr "No accepto aquestes condicions. Cancel·lar la baixadar"
 
 msgid "Module bundled with opendata plugin"
 msgstr "Mòdul inclòs amb el connector opendata"
@@ -27416,17 +27577,16 @@ msgid ""
 "Please click on <strong>Download list</strong> to download and display a "
 "list of available modules."
 msgstr ""
-"Si us plau, feu clic sobre <strong>llista de descàrrega</strong> per "
-"descarregar i mostrar un llista amb els mòduls disponibles."
+"Si us plau, feu clic sobre <strong>llista de baixada</strong> per baixar i "
+"mostrar un llista amb els mòduls disponibles."
 
 msgid ""
 "The following module has been downloaded <strong>successfully</strong>:"
 msgid_plural ""
 "The following {0} modules have been downloaded <strong>successfully</strong>:"
-msgstr[0] ""
-"El següent mòdul ha estat descarregat <strong>correctament</strong>:"
+msgstr[0] "El següent mòdul ha estat baixat <strong>correctament</strong>:"
 msgstr[1] ""
-"Els següents mòduls {0} han estat descarregats <strong>correctament</strong>:"
+"Els següents mòduls {0} han estat baixats <strong>correctament</strong>:"
 
 msgid "Downloading the following module has <strong>failed</strong>:"
 msgid_plural ""
@@ -27444,7 +27604,7 @@ msgid "Configure Module Sites"
 msgstr "Configura llocs web dels mòduls"
 
 msgid "Download the list of available modules"
-msgstr "Descarregar la llista de mòduls disponibles"
+msgstr "Baixar la llista de mòduls disponibles"
 
 msgid "Update modules"
 msgstr "Actualitzar mòduls"
@@ -27453,29 +27613,27 @@ msgid "Update the selected modules"
 msgstr "Actualitzar els mòduls seleccionats"
 
 msgid "Please restart JOSM to activate the downloaded modules."
-msgstr ""
-"Si us plau reinicieu JOSM per tal d''activar els mmòduls descarregats"
+msgstr "Si us plau reinicieu el JOSM per tal d''activar els mmòduls baixats"
 
 msgid ""
 "All installed modules are up to date. JOSM does not have to download newer "
 "versions."
 msgstr ""
-"Tots els mòduls instal·lats han estat actualitzats. JOSM no ha de "
-"descarregar cap nova versió"
+"Tots els mòduls instal·lats han estat actualitzats. El JOSM no ha de baixar "
+"cap nova versió"
 
 msgid "Modules up to date"
 msgstr "Mòduls actualitzats"
 
 msgid "Configure the list of sites where modules are downloaded from"
 msgstr ""
-"Configura la llista de llocs que poden ser utilitzats per a descarregar els "
-"mòduls"
+"Configura la llista de llocs que poden ser utilitzats per a baixar els mòduls"
 
 msgid "Add Open Data Module description URL."
 msgstr "Afegeix una URL de descripció del mòdul OpenData"
 
 msgid "Edit Open Data Module description URL."
-msgstr "Modifica la URL de descripció del mòdul OpenData"
+msgstr "Modifica l''URL de descripció del mòdul OpenData"
 
 msgid "Open Data Module description URL"
 msgstr "URL de descripció del mòdul OpenData"
@@ -27520,7 +27678,7 @@ msgid ""
 "standard OSM tags)"
 msgstr ""
 "Importar només dades sense tractar. (per exemple, sense afegir, editar o "
-"reemplaçar les etiquetes per les estàndars d''OSM)"
+"reemplaçar les etiquetes per les estàndars de l''OSM)"
 
 msgid "Overpass API server:"
 msgstr "Servidor d''API Overpass:"
@@ -27534,11 +27692,11 @@ msgstr "Servidor XAPI:"
 msgid ""
 "XAPI server used to download OSM data when Overpass API is not available"
 msgstr ""
-"El servidor XAPI utilitzat per baixar dades d''OSM quan no és possible "
+"El servidor XAPI utilitzat per baixar dades de l''OSM quan no és possible "
 "utilitzar l''API Overpass"
 
 msgid "Download modules"
-msgstr "Mòduls descarregats"
+msgstr "Mòduls baixats"
 
 msgid "View summary"
 msgstr "Veure resum"
@@ -27554,7 +27712,7 @@ msgstr ""
 "per X i Y: "
 
 msgid "Downloading data..."
-msgstr "S''estan descarregant les dades..."
+msgstr "S''estan baixant les dades..."
 
 msgid "OpenData XML files"
 msgstr "Fitxers OpenData XML"
@@ -27641,12 +27799,12 @@ msgid "XLS files"
 msgstr "Fitxers XLS"
 
 msgid "View OSM Wiki page"
-msgstr "Veure la pàgina wiki d''OSM"
+msgstr "Veure la pàgina wiki de l''OSM"
 
 msgid "Launch browser to the OSM Wiki page of the selected data set"
 msgstr ""
-"Obre al navegador web la pàgina del wiki d''OSM relativa al conjunt de dades "
-"seleccionat"
+"Obre al navegador web la pàgina del wiki de l''OSM relativa al conjunt de "
+"dades seleccionat"
 
 msgid "View Local Portal page"
 msgstr "Visualitza la pàgina del portal local"
@@ -27687,15 +27845,15 @@ msgid ""
 "Warning: Cannot download module ''{0}''. Its download link is not known. "
 "Skipping download."
 msgstr ""
-"Avís: No és possible de descarregar el mòdul ''{0}''. El seu enllaç de "
-"descàrrega és desconegut. Ignorant la descàrrega."
+"Avís: No és possible de baixar el mòdul ''{0}''. El seu enllaç de baixada és "
+"desconegut. Ignorant la baixada."
 
 msgid ""
 "Warning: Cannot download module ''{0}''. Its download link ''{1}'' is not a "
 "valid URL. Skipping download."
 msgstr ""
-"Avís: No és possible de descarregar el mòdul ''{0}''. El seu enllaç de "
-"descàrrega ''{1}'' no és una URL vàlida. Ignorant la descàrrega."
+"Avís: No és possible de baixar el mòdul ''{0}''. El seu enllaç de baixada "
+"''{1}'' no és una URL vàlida. Ignorant la baixada."
 
 msgid "Downloading Module {0}..."
 msgstr "Decarregant mòdul {0}..."
@@ -27790,16 +27948,16 @@ msgid ""
 "Warning: failed to install already downloaded module ''{0}''. Skipping "
 "installation. JOSM is still going to load the old module version."
 msgstr ""
-"Avís: ha fallat la instal·lació del mòdul ''{0}'' que ja s''havia "
-"descarregat. Ignorant la instal·lació. JOSM encara està intentant la càrrega "
-"de l''antiga versió del mòdul."
+"Avís: ha fallat la instal·lació del mòdul ''{0}'' que ja s''havia baixat. "
+"Ignorant la instal·lació. JOSM encara està intentant la càrrega de l''antiga "
+"versió del mòdul."
 
 msgid ""
 "Warning: failed to install module ''{0}'' from temporary download file "
 "''{1}''. Renaming failed."
 msgstr ""
 "Avís: ha fallat la instal·lació del mòdul ''{0}'' a partir del fitxer "
-"temporal ''{1}'' descarregat. Ha fallat l''operació d''anomenar-lo."
+"temporal ''{1}'' baixat. Ha fallat l''operació d''anomenar-lo."
 
 msgid ""
 "Do not ask again and remember my decision (go to Preferences->Modules to "
@@ -27845,10 +28003,10 @@ msgid "Processing module files..."
 msgstr "Processant els fitxers del mòdul..."
 
 msgid "Download module list..."
-msgstr "Descarrega la llista de mòduls..."
+msgstr "Baixa la llista de mòduls..."
 
 msgid "Downloading module list from ''{0}''"
-msgstr "Descarregant la llista de mòduls de ''{0}''"
+msgstr "S''esta baixant la llista de mòduls de ''{0}''"
 
 msgid ""
 "Warning: failed to create module directory ''{0}''. Cannot cache module list "
@@ -27906,7 +28064,7 @@ msgid "OSM Server Files pbf compressed"
 msgstr "Fitxers pbf comprimits del servidor OSM"
 
 msgid "Download PBF"
-msgstr "Descarrega dades PBF (Protocolbuffer Binary Format)"
+msgstr "Baixa dades PBF (Protocolbuffer Binary Format)"
 
 msgid "Invalid changeset id: {0}"
 msgstr "Identificador invàlid del conjunt de canvis: {0}"
@@ -28213,6 +28371,8 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Clic+arrossegament d''una fotografia, Maj+clic per a posicionar una "
+"fotografia, Control+clic per a establir la direcció."
 
 msgid "Please load some photos."
 msgstr "Si us plau carregeu alguna foto"
@@ -28434,7 +28594,7 @@ msgid "New address point added."
 msgstr "Afegit un nou punt d''adreça"
 
 msgid "Download Osmosis poly"
-msgstr "Descarrega dades Osmosis poly (Osmosis polygon filter file format)"
+msgstr "Baixa les dades Osmosis poly (Osmosis polygon filter file format)"
 
 msgid "Reading polygon filter file..."
 msgstr "Llegint el fitxer de filtre de polígons..."
@@ -28560,8 +28720,8 @@ msgid ""
 "There exists no dataset. Try to download data from the server or open an OSM "
 "file."
 msgstr ""
-"No hi ha conjunt de dades. Proveu de descarregar dades del servidor o "
-"d''obrir un fitxer OSM."
+"No hi ha conjunt de dades. Proveu de baixar dades del servidor o d''obrir un "
+"fitxer OSM."
 
 msgid "No data found"
 msgstr "No s''han trobat dades"
@@ -28861,13 +29021,13 @@ msgid "Delete relation"
 msgstr "Suprimir relació"
 
 msgid "Download incomplete members for the chosen relation"
-msgstr "Descarregar els membres incomplets per a la relació escollida"
+msgstr "Baixar els membres incomplets per a la relació escollida"
 
 msgid "Download referrers"
-msgstr "Descarrega els referents"
+msgstr "Baixa els referents"
 
 msgid "Download referrers for the chosen relation and its members."
-msgstr "Descarrega els referents de la relació escollida i dels seus membres"
+msgstr "Baixa els referents de la relació escollida i dels seus membres"
 
 msgid "Duplicate relation"
 msgstr "Duplicar relació"
@@ -28987,7 +29147,7 @@ msgid ""
 msgstr ""
 "Aquest conjunt de canvis te objectes que no són presents al conjunt de dades "
 "actual.\n"
-"Caldria descarregar-los abans de revertir. Voleu continuar?"
+"Caldria baixar-los abans de revertir. Voleu continuar?"
 
 msgid "Confirm"
 msgstr "Confirma"
@@ -28996,7 +29156,7 @@ msgid "Fetching missing primitives"
 msgstr "Obtenint les primitives que manquen"
 
 msgid "Downloading changeset"
-msgstr "Descarregant conjunt de canvis"
+msgstr "S''està baixant el conjunt de canvis"
 
 msgid "See {0}"
 msgstr "Vegeu {0}"
@@ -29161,8 +29321,8 @@ msgid ""
 "is stored in plain text in the JOSM preferences file. </p></body></html>"
 msgstr ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> La "
-"contrasenya està enregistrada en text pla añ fitxer de preferències de JOSM. "
-"</p></body></html>"
+"contrasenya està enregistrada en text pla añ fitxer de preferències del "
+"JOSM. </p></body></html>"
 
 msgid "Enter credentials for Separate Data Store API"
 msgstr "Introduïu les credencials per a l''API Separate Data Store (SDS)"
@@ -29214,7 +29374,7 @@ msgid "Server"
 msgstr "Servidor"
 
 msgid "The URL under which the SDS server can be contacted."
-msgstr "La URL a la que el servidor SDS pot ser contactat"
+msgstr "l''URL a la que el servidor SDS pot ser contactat"
 
 msgid ""
 "The user name at the SDS server. You need to create an account with the SDS "
@@ -29268,6 +29428,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Enregistrar el fitxer SDS"
 
+msgid "No object selected"
+msgstr "No hi ha cap objecte seleccionat"
+
+msgid "SeaMap Editor"
+msgstr "Editor de cartes nàutiques"
+
+msgid "Seamark Inspector"
+msgstr "Seamark Inspector"
+
+msgid "Select only one object"
+msgstr "Seleccioneu nomé un objecte"
+
+msgid "Select a map object"
+msgstr "Seleccioneu un objecte del mapa"
+
 msgid "Simplify Area"
 msgstr "Simplifica àrea"
 
@@ -29278,8 +29453,7 @@ msgid "Yes, delete nodes"
 msgstr "Si, suprimir els nodes"
 
 msgid "Delete nodes outside of downloaded data regions"
-msgstr ""
-"Suprimir els nodes que són fora de les regions amb dades descarregades"
+msgstr "Suprimir els nodes que són fora de les regions amb dades baixades"
 
 msgid "No, abort"
 msgstr "No, cancel·lar"
@@ -29343,9 +29517,6 @@ msgstr "Factor de distància"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Llindar per fusionar nodes propers"
 
-msgid "SeaMap Editor"
-msgstr "Editor de cartes nàutiques"
-
 msgid "AutoSave LiveData"
 msgstr "Desament automàtic de LiveData"
 
@@ -29571,7 +29742,7 @@ msgid ""
 "{1}."
 msgstr ""
 "La versió del servidor Tracer2 no és compatible amb aquest connector. Si us "
-"plau descarregueu la versió {0} de\n"
+"plau baixeu la versió {0} de\n"
 "{1}."
 
 msgid ""
@@ -29644,7 +29815,7 @@ msgid ""
 "{0}."
 msgstr ""
 "El servidor Tracer2 no està iniciat. Si us plau inicieu el servidor.\n"
-"Si no teniu el servidor, el podeu descarregar de\n"
+"Si no teniu el servidor, el podeu baixar de\n"
 "{0}."
 
 msgid "Tracer2Server hasn''t found anything."
@@ -29673,7 +29844,7 @@ msgid ""
 msgstr "Obtenir tots els objectes OSM referenciats però absents al servidor."
 
 msgid "Download referenced osm objects..."
-msgstr "Descarregar els objectes osm referenciats..."
+msgstr "Baixar els objectes osm referenciats..."
 
 msgid "{0} Signatures loaded. All referenced OSM objects found."
 msgstr ""
@@ -29684,13 +29855,13 @@ msgid ""
 "Do you want to load them from OSM-Server?"
 msgstr ""
 "{0} dels {1} objectes OSM referenciats no hi són.\n"
-"Els voleu descarregar del servidor OSM?"
+"Els voleu baixar del servidor OSM?"
 
 msgid "Load objects from server"
-msgstr "Descarregar objectes del servidor"
+msgstr "Baixar objectes del servidor"
 
 msgid "Download signed data"
-msgstr "Descarregar dades signades"
+msgstr "Baixar dades signades"
 
 msgid "Warning: Ignoring exception because task was canceled. Exception: {0}"
 msgstr ""
@@ -30773,10 +30944,10 @@ msgid "Configure custom URL"
 msgstr "Configurar una URL personalitzada"
 
 msgid "Open custom URL"
-msgstr "Obre la URL personalitzada"
+msgstr "Obre l''URL personalitzada"
 
 msgid "Opens specified URL browser"
-msgstr "Obre la URL especificada al nevegador web"
+msgstr "Obre l''URL especificada al nevegador web"
 
 msgid "Utilsplugin2 settings"
 msgstr "Paràmetres d''Utilsplugin2"
@@ -30806,7 +30977,7 @@ msgstr ""
 "\"node\", la \"via\" o la \"relació\" <br/> <b>{#lat} , "
 "{#lon}</b> és reemplaçat per latitud/longitud del centre del mapa "
 "<br/> Podeu carregar manualment la configuració  del fitxer "
-"<b>customurl.txt</b> que trobareu a la carpeta de JOSM."
+"<b>customurl.txt</b> que trobareu a la carpeta del JOSM."
 
 msgid "Custom URL configuration"
 msgstr "Configuració d''una URL personalitzada"
@@ -30872,7 +31043,7 @@ msgid "Tag multiple objects"
 msgstr "Etiqueta múltiples objectes"
 
 msgid "Sync with JOSM selection"
-msgstr "Sincronitza amb la selecció de JOSM"
+msgstr "Sincronitza amb la selecció del JOSM"
 
 msgid "Zoom to objects"
 msgstr "Amplia els objectes"
@@ -30936,7 +31107,7 @@ msgstr ""
 "amb una geometria correcta."
 
 msgid "The ways must be entirely within the downloaded area."
-msgstr "Les vies han de ser completament dins de l''àrea descarregada."
+msgstr "Les vies han de ser completament dins de l''àrea baixada."
 
 msgid ""
 "The way to be replaced cannot have any nodes with properties or relation "
@@ -31220,7 +31391,7 @@ msgid ""
 "Enter a walking-papers.org URL or ID (the bit after the ?id= in the URL)"
 msgstr ""
 "Introduïu una adreça web de walking-papers.org o un ID (el valor que hi ha "
-"després de ?id= a la URL)"
+"després de ?id= a l''URL)"
 
 msgid "Could not read information from walking-papers.org the id \"{0}\""
 msgstr ""
@@ -31234,10 +31405,10 @@ msgid "Walking Papers layer ({0}) in zoom {1}"
 msgstr "Capa Walking Papers ({0}) en nivell d''ampliació {1}"
 
 msgid "Way Download"
-msgstr "Descarregar una via"
+msgstr "Baixar una via"
 
 msgid "Download map data on the end of selected way"
-msgstr "Descarregar dades carogràfiques al final de la via seleccionada"
+msgstr "Baixar dades carogràfiques al final de la via seleccionada"
 
 msgid ""
 "<html>Neither a node nor a way with an endpoint outside of the<br>current "
@@ -31245,13 +31416,13 @@ msgid ""
 "an entire way first.</html>"
 msgstr ""
 "<html>No ha estat seleccionat cap node ni cap via<br>amb el seu final situat "
-"fora de la zona descarregada.<br>Seleccioneu un node al principi o al final "
+"fora de la zona baixada.<br>Seleccioneu un node al principi o al final "
 "d''una via o una via.</html>"
 
 msgid "<html>Could not find a unique node to start downloading from.</html>"
 msgstr ""
 "<html>No ha estat possible de trobar un node únic on començar la "
-"descàrrega.</html>"
+"baixada.</html>"
 
 msgid "<html>There are no ways connected to node ''{0}''. Aborting.</html>"
 msgstr ""
@@ -31261,8 +31432,8 @@ msgid ""
 "Way downloader data inconsistency. Prior connected way ''{0}'' wasn''t "
 "discovered after download"
 msgstr ""
-"Les dades descarregades no són coherents. La via connectada ''{0}'' no fou "
-"trobada desrpés de la descàrrega."
+"Les dades baixades no són coherents. La via connectada ''{0}'' no fou "
+"trobada desrpés de la baixada."
 
 msgid ""
 "<html>There aren''t further connected ways to download.<br>A potential "
@@ -31271,17 +31442,17 @@ msgid ""
 "''{1}''<br>Merge the duplicate node onto the currently selected node and "
 "continue way downloading?</html>"
 msgstr ""
-"<html>No hi ha cap via connectada a descarregar<br>Tnamateix dins de la "
-"selecció ha estat trobat un node que podria estat duplicat.<br><br>El node "
+"<html>No hi ha cap via connectada a baixar<br>Tnamateix dins de la selecció "
+"ha estat trobat un node que podria estat duplicat.<br><br>El node "
 "seleccionat és ''{0}''<br>El node que podria estar duplicat és "
 "''{1}''<br>Voleu fusionar el node duplicat amb el seleccionat i continuar la "
-"descàrrega?</html>"
+"baixada?</html>"
 
 msgid "Merge duplicate node?"
 msgstr "Fusionar els nodes duplicats?"
 
 msgid "<html>No more connected ways to download.</html>"
-msgstr "<html>No hi ha més vies connectades per descarregar.</html>"
+msgstr "<html>No hi ha més vies connectades per baixar.</html>"
 
 msgid "Node ''{0}'' is a junction with more than 2 connected ways."
 msgstr "El node ''{0}'' és una unió entre més de 2 vies."
diff --git a/i18n/po/ca at valencia.po b/i18n/po/ca at valencia.po
index bb20aba..d82c6b6 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-10-22 10:01+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: 2014-12-29 05:41+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:36+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ca at valencia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -219,6 +219,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "No hi ha capes de destí"
 
+msgid "Select"
+msgstr "Selecciona"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Selecciona sobre el mapa els elements seleccionats a la llista de sobre."
+
 msgid "Add imagery layer {0}"
 msgstr "Afig la capa d''imatge {0}"
 
@@ -2219,9 +2227,6 @@ msgstr ""
 "llegir; Majúscules+deixar anar el capçal per sincronitzar l''àudio en aquell "
 "punt."
 
-msgid "Select"
-msgstr "Selecciona"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Selecciona, mou, escala i rota objectes"
 
@@ -6074,11 +6079,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Obri una finestra per fusionar els elements seleccionats a la llista."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Selecciona sobre el mapa els elements seleccionats a la llista de sobre."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Ha estat detectat {0} conflicte."
@@ -9899,10 +9899,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9928,6 +9926,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imatges JPEG (.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Escollir tracks visibles"
 
@@ -12171,7 +12175,7 @@ msgstr "Integrat:"
 msgid "Projection bounds (in degrees)"
 msgstr "Límits de la projecció (en graus)"
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -15862,6 +15866,12 @@ msgstr "Afig capacitat de generar rutes."
 msgid "Loads data from SDS"
 msgstr "Carrega dades de SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16879,12 +16889,88 @@ msgstr "accés a servei amb cotxe (drive-through)"
 msgid "Parking Aisle"
 msgstr "Via d''aparcament"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Carretera (tipus no conegut)"
 
 msgid "Construction"
 msgstr "En construcció"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Cruïlla"
 
@@ -16980,47 +17066,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rotonda"
 
-msgid "motorway"
-msgstr "autopista"
-
-msgid "motorway_link"
-msgstr "autopista_enllaç"
-
-msgid "trunk"
-msgstr "via_rapida"
-
-msgid "trunk_link"
-msgstr "via_rapida_enllaç"
-
-msgid "primary"
-msgstr "principal"
-
-msgid "primary_link"
-msgstr "principal_enllaç"
-
-msgid "secondary"
-msgstr "secundaria"
-
-msgid "tertiary"
-msgstr "terciaria"
-
-msgid "unclassified"
-msgstr "referencia_no"
-
-msgid "residential"
-msgstr "carrer/residencial"
-
-msgid "living_street"
-msgstr "carrer_zona_residencial"
-
-msgid "service"
-msgstr "via_servei"
-
-msgid "bus_guideway"
-msgstr "via per autobusos amb sistema de guiatge"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "construcció"
+msgstr ""
 
 msgid "Ford"
 msgstr "Gual"
@@ -17868,32 +17916,29 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Via aèria"
 
-msgid "Chair Lift"
-msgstr "Telecadira"
+msgid "Cable Car"
+msgstr "Telecabina"
 
 msgid "Number of people per hour"
 msgstr "Nombre de persones per hora"
 
-msgid "Number of people per chair"
-msgstr "Nombre de persones per cadira"
+msgid "Number of people per car"
+msgstr "Nombre de persones per cabina"
 
 msgid "Typical journey time in minutes"
 msgstr "Temps de viatge normal en minuts"
 
-msgid "Has bubble?"
-msgstr "Té cabina?"
-
 msgid "Has heating?"
 msgstr "Disposa de calefacció?"
 
-msgid "Drag Lift"
-msgstr "Teleesquí"
+msgid "Chair Lift"
+msgstr "Telecadira"
 
-msgid "Cable Car"
-msgstr "Telecabina"
+msgid "Number of people per chair"
+msgstr "Nombre de persones per cadira"
 
-msgid "Number of people per car"
-msgstr "Nombre de persones per cabina"
+msgid "Has bubble?"
+msgstr "Té cabina?"
 
 msgid "Gondola"
 msgstr "Telefèric / Aeri"
@@ -17907,17 +17952,25 @@ msgstr "Ascensor mixt"
 msgid "Number of people per gondola/chair"
 msgstr "Nombre de persones per cabina/cadira"
 
-msgid "T-bar Lift"
-msgstr "Teleesquí de T"
+msgid "Drag Lift"
+msgstr "Teleesquí"
 
-msgid "J-bar Lift"
-msgstr "Teleesquí de J"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Remuntador"
+msgid "t-bar"
+msgstr ""
+
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Telecorda"
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Catifa màgica"
@@ -18001,6 +18054,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18031,12 +18087,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18234,6 +18293,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Es renten bicis (de pagament)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transport públic"
 
@@ -18492,6 +18554,14 @@ msgstr "Estacionament"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "si"
+
 msgid "Beacon"
 msgstr "Balisa"
 
@@ -19735,10 +19805,6 @@ msgid "Man Made"
 msgstr "Construccions"
 
 msgctxt "building"
-msgid "yes"
-msgstr "si"
-
-msgctxt "building"
 msgid "roof"
 msgstr "cobert"
 
@@ -19759,16 +19825,16 @@ msgid "school"
 msgstr "escola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "comercial"
 
 msgctxt "building"
-msgid "farm"
-msgstr "granja"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19841,6 +19907,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "casa unifamiliar"
 
+msgctxt "building"
+msgid "farm"
+msgstr "granja"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -21338,7 +21408,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21368,15 +21438,21 @@ msgstr "Ciutat"
 msgid "Town"
 msgstr "Vila"
 
-msgid "Suburb"
-msgstr "Barri/Districte"
-
 msgid "Village"
 msgstr "Poble"
 
 msgid "Hamlet"
 msgstr "Llogaret"
 
+msgid "Isolated Dwelling"
+msgstr "Masia/Habitatge aïllat"
+
+msgid "Suburb"
+msgstr "Barri/Districte"
+
+msgid "Neighbourhood"
+msgstr "Veïnatge/Urbanització"
+
 msgid "Farm"
 msgstr ""
 
@@ -21386,12 +21462,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Masia/Habitatge aïllat"
-
-msgid "Neighbourhood"
-msgstr "Veïnatge/Urbanització"
-
 msgid "Locality"
 msgstr "Indret"
 
@@ -21907,6 +21977,37 @@ msgstr "Imatge"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "segment extern"
 
@@ -22270,16 +22371,13 @@ msgstr "Prova"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -22291,13 +22389,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -22330,6 +22428,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -22373,7 +22519,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22394,6 +22543,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -22522,7 +22677,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22605,6 +22760,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22821,16 +22982,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22839,6 +23000,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -23106,6 +23270,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -23198,6 +23365,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -28998,6 +29168,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Enregistrar el fitxer SDS"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor de cartes nàutiques"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Simplifica àrea"
 
@@ -29073,9 +29258,6 @@ msgstr "Factor de distància"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Llindar per fusionar nodes propers"
 
-msgid "SeaMap Editor"
-msgstr "Editor de cartes nàutiques"
-
 msgid "AutoSave LiveData"
 msgstr "Desament automàtic de LiveData"
 
diff --git a/i18n/po/cs.po b/i18n/po/cs.po
index 9394094..5897740 100644
--- a/i18n/po/cs.po
+++ b/i18n/po/cs.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-19 02:57+0000\n"
-"Last-Translator: Martin Petricek <singularita at gmail.com>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-30 10:42+0000\n"
+"Last-Translator: Dalibor Jelínek <launchpad.net at dalibor.cz>\n"
 "Language-Team: Czech <cs at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:44+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:43+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: cs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -228,6 +228,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Žádné cílové vrstvy"
 
+msgid "Select"
+msgstr "Vybrat"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Přidá vybrané prvky na mapě do výběru výše."
+
 msgid "Add imagery layer {0}"
 msgstr "Přidat vrstvu podkladových map {0}"
 
@@ -2214,9 +2221,6 @@ msgstr ""
 "Pro přehrání zvuku od určitého místa přetáhněte symbol přehrávání poblíž GPS "
 "záznamu. Chcete-li v tomto bodě synchronizovat zvuk podržte Shift."
 
-msgid "Select"
-msgstr "Vybrat"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Vybrat, přesouvat, měnit velikost a otáčet objekty"
 
@@ -4089,7 +4093,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Kontroluje chyby v značkách sovisejících s Internetem."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " URL nelze převést do ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4312,20 +4316,20 @@ msgid "Relation is empty"
 msgstr "Relace je prázdná"
 
 msgid "Role member does not match expression {0} in template {1}"
-msgstr ""
+msgstr "Role členu neodpovídá výrazu {0} v šabloně {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr ""
+msgstr "Typ role členu {0} není v seznamu přípustných {1} v šabloně {2}"
 
 msgid "<empty>"
 msgstr "<prázdné>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Role {0} neznámá v šablonách {1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "Nalezen prázdný typ role, když bylo očekáváno jedno z {0}"
 
 msgid "Role {0} missing"
 msgstr "Role {0} chybí"
@@ -4877,35 +4881,38 @@ msgid "options provided as Java system properties"
 msgstr "Volby poskytované jako systémové vlastnosti Java"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/CESTA/K/JOSM/PREF    "
 
 msgid "Set the preferences directory"
-msgstr ""
+msgstr "Nastavit adresář předvoleb"
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/CESTA/K/JOSM/USERDATA"
 
 msgid "Set the user data directory"
-msgstr ""
+msgstr "Nastavit adresář s uživatelskými daty"
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/CESTA/K/JSOM/CACHE   "
 
 msgid "Set the cache directory"
-msgstr ""
+msgstr "Nastavit adresář keše"
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/CESTA/K/JOSM/HOMEDIR "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
 "homedir/cache"
 msgstr ""
+"Přesunout všechny tři adresáře do homedir. Adresář keše bude v homedir/cache"
 
 msgid ""
 "-Djosm.home has lower precedence, i.e. the specific setting overrides the "
 "general one"
 msgstr ""
+"-Djosm.home má nižší prioritu, tedy konkrétnější nastavení přepíše to "
+"obecnější"
 
 msgid ""
 "note: For some tasks, JOSM needs a lot of memory. It can be necessary to add "
@@ -6130,10 +6137,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Otevřít dialog Sloučení pro všechny vybrané položky z předchozího seznamu."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Přidá vybrané prvky na mapě do výběru výše."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Byl nalezen {0} konflikt."
@@ -9927,10 +9930,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Rychlost: {0} km/h"
 
 msgid ""
 "\n"
@@ -9956,6 +9959,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG obrázky (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Zobrazit náhledy"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Zobrazit náhledy obrázků namísto ikon."
+
 msgid "Choose visible tracks"
 msgstr "Vyberte viditeľné stopy"
 
@@ -11659,7 +11668,7 @@ msgid "Offset bookmarks"
 msgstr "Záložky posunu podkladu"
 
 msgid "Imagery Background: Default"
-msgstr "Pozadie snímok: Predvolené"
+msgstr "Pozadí snímků: Výchozí"
 
 msgid "Available default entries:"
 msgstr "Dostupné výchozí položky:"
@@ -11832,7 +11841,7 @@ msgid ""
 "<html>Failed to load the list of style sources "
 "from<br>''{0}''.<br><br>Details (untranslated):<br>{1}</html>"
 msgstr ""
-"<html>Neúspešné načítanie obsahu zdrojov štýlov z<br>''{0}''.<br><br>Detaily "
+"<html>Nepodařilo se načíst seznam zdrojů stylů z<br>''{0}''.<br><br>Detaily "
 "(nepreložené):<br>{1}</html>"
 
 msgid "Warning: illegal format of entry in style list ''{0}''. Got ''{1}''"
@@ -11881,30 +11890,29 @@ msgid ""
 "really want to use it?<br><br><table width=600>Error is: [{1}:{2}] "
 "{3}</table></html>"
 msgstr ""
-"<html>Zdroj predvolieb označovania {0} môže byť nahratý, ale obsahuje chyby. "
-"Naozaj ho chcete používať?<br><br><table width=600>Chyba je: [{1}:{2}] "
-"{3}</table></html>"
+"<html>Zdroj předvoleb značek {0} lze načíst, ale obsahuje chyby. Opravdu ho "
+"chcete použít?<br><br><table width=600>Chyba je: [{1}:{2}] {3}</table></html>"
 
 msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=400>Error is: [{1}:{2}] {3}</table></html>"
 msgstr ""
-"<html>Nemožno spracovať zdroj predvolieb označovania: {0}. Naozaj ho chcete "
-"používať?<br><br><table width=400>Chyba je: [{1}:{2}] {3}</table></html>"
+"<html>Nelze zpracovat zdroj předvoleb značek: {0}. Opravdu ho chcete "
+"použít?<br><br><table width=400>Chyba je: [{1}:{2}] {3}</table></html>"
 
 msgid ""
 "<html>Tagging preset source {0} can be loaded but it contains errors. Do you "
 "really want to use it?<br><br><table width=600>Error is: {1}</table></html>"
 msgstr ""
-"<html>Zdroj predvolieb označovania {0} môže byť nahratý, ale obsahuje chyby. "
-"Naozaj chcete používať?<br><br><table width=600>Chyba je: {1}</table></html>"
+"<html>Zdroj předvoleb značek {0} lze načíst, ale obsahuje chyby. Opravdu ho "
+"chcete použít?<br><br><table width=600>Chyba je: {1}</table></html>"
 
 msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=600>Error is: {1}</table></html>"
 msgstr ""
-"<html>Nemožno spracovať zdroj predvolieb označovania: {0}. Naozaj ho chcete "
-"používať?<br><br><table width=600>Chyba je: {1}</table></html>"
+"<html>Nelze zpracovat zdroj předvoleb značek: {0}. Opravdu ho chcete "
+"použít?<br><br><table width=600>Chyba je: {1}</table></html>"
 
 msgid "Sort presets menu"
 msgstr "Setřídit nabídku s přednastaveními"
@@ -12141,8 +12149,8 @@ msgstr "Zabudované:"
 msgid "Projection bounds (in degrees)"
 msgstr "Ohraničení projekce (ve stupních)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (kódy EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Nastavuje parametr SRS=... ve WMS požadavku"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -13637,7 +13645,7 @@ msgstr ""
 "Neplatná dlhá hodnota pre vlastnosť \"{0}\". Prijatá hodnota je \"{1}\""
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "{0} bajtů bylo načteno"
 
 msgid "Prepare OSM data..."
 msgstr "Připravuji OSM data..."
@@ -15825,6 +15833,12 @@ msgstr "Poskytuje směrování"
 msgid "Loads data from SDS"
 msgstr "Načíta dáta z SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Obrazová vrstva pro Sea Charts"
+
+msgid "Edit features for Sea Charts"
+msgstr "Upravit vlastnosti Sea Charts"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16844,7 +16858,17 @@ msgid "drive-through"
 msgstr "prodej do auta (drive-through)"
 
 msgid "Parking Aisle"
-msgstr "parkovací ulička"
+msgstr "Parkovací ulička"
+
+msgid "Escape"
+msgstr "Únikový pruh"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Nouzový pruh vedle dlouhých klesání pro bezpečné zastavení nákladních a "
+"jiných vozidel v případě selhání brzd."
 
 msgid "Road (Unknown Type)"
 msgstr "Cesta (neznámý typ)"
@@ -16852,6 +16876,74 @@ msgstr "Cesta (neznámý typ)"
 msgid "Construction"
 msgstr "Komunikace ve výstavbě"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "dálnice"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "dálnice - nájezd"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "čtyřproudá silnice"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "čtyřproudá silnice - nájezd"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "silnice první třídy"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "silnice první třídy - nájezd"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "silnice druhé třídy"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "silnice druhé třídy - nájezd"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "silnice třetí třídy"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "silnice třetí třídy - nájezd"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "autobusová dráha"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "stezka pro koně"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "obytná zóna"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "pěší zóna"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "lesní/polní cesta"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "chodník"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "schody"
+
 msgid "Junction"
 msgstr "Křižovatka"
 
@@ -16947,47 +17039,9 @@ msgstr "ne"
 msgid "Roundabout"
 msgstr "Kruhový objezd"
 
-msgid "motorway"
-msgstr "dálnice"
-
-msgid "motorway_link"
-msgstr "Dálnice - nájezd"
-
-msgid "trunk"
-msgstr "čtyřproudá silnice"
-
-msgid "trunk_link"
-msgstr "čtyřproudá silnice - nájezd"
-
-msgid "primary"
-msgstr "silnice první třídy"
-
-msgid "primary_link"
-msgstr "Silnice 1. třídy - nájezd"
-
-msgid "secondary"
-msgstr "silnice druhé třídy"
-
-msgid "tertiary"
-msgstr "silnice třetí třídy"
-
-msgid "unclassified"
-msgstr "silnice bez klasifikace"
-
-msgid "residential"
-msgstr "obytná oblast"
-
-msgid "living_street"
-msgstr "obytná zóna"
-
-msgid "service"
-msgstr "obslužná cesta"
-
-msgid "bus_guideway"
-msgstr "Autobusová dráha"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "konstrukce"
+msgstr "výstavba"
 
 msgid "Ford"
 msgstr "Brod"
@@ -17020,7 +17074,7 @@ msgid "MTB Scale"
 msgstr "MTB klasifikace"
 
 msgid "Path"
-msgstr "Pěšina, vychozená cesta pro pěší/cyklo (path)"
+msgstr "Pěšina"
 
 msgid "SAC Scale"
 msgstr "SAC klasifikace"
@@ -17331,12 +17385,14 @@ msgstr "Dopravní zrcadlo"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Pojmenovaná křižovatka"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Používá se v některých zemích pro pojmenované křižovatky, jejichž název "
+"slouží pro orientaci"
 
 msgid "Elevator"
 msgstr "Výtah"
@@ -17746,22 +17802,22 @@ msgid "Rail"
 msgstr "Železnice"
 
 msgid "main"
-msgstr "hlavná"
+msgstr "hlavní"
 
 msgid "branch"
-msgstr "vetva"
+msgstr "vedlejší"
 
 msgid "industrial"
-msgstr "průmysl"
+msgstr "průmyslové"
 
 msgid "military"
-msgstr "vojenský"
+msgstr "vojenské"
 
 msgid "tourism"
 msgstr "turistika"
 
 msgid "freight"
-msgstr "náklad"
+msgstr "nákladní"
 
 msgid "Narrow Gauge Rail"
 msgstr "Úzkorozchodná železnice"
@@ -17773,7 +17829,7 @@ msgid "Preserved"
 msgstr "Historická trať"
 
 msgid "Light Rail"
-msgstr "Krátká/lehká trať"
+msgstr "Nadzemní dráha"
 
 msgid "Subway"
 msgstr "Metro"
@@ -17837,56 +17893,63 @@ msgstr "Výhybka"
 msgid "Aerialway"
 msgstr "Lanovka"
 
-msgid "Chair Lift"
-msgstr "Sedačková lanovka"
+msgid "Cable Car"
+msgstr "Kyvadlová kabinková lanovka"
 
 msgid "Number of people per hour"
 msgstr "Počet osob za hodinu"
 
-msgid "Number of people per chair"
-msgstr "Počet ľudí na sedadlo"
+msgid "Number of people per car"
+msgstr "Počet lidí v kabince"
 
 msgid "Typical journey time in minutes"
 msgstr "Typický čas trasy v minutách"
 
-msgid "Has bubble?"
-msgstr "Má kryt?"
-
 msgid "Has heating?"
 msgstr "Vyhřívaná?"
 
-msgid "Drag Lift"
-msgstr "Lyžařský vlek"
+msgid "Chair Lift"
+msgstr "Sedačková lanovka"
 
-msgid "Cable Car"
-msgstr "Kyvadlová kabinková lanovka"
+msgid "Number of people per chair"
+msgstr "Počet lidí na sedačku"
 
-msgid "Number of people per car"
-msgstr "Počet ľudí v kabínke"
+msgid "Has bubble?"
+msgstr "Má kryt?"
 
 msgid "Gondola"
 msgstr "Oběžná kabinková lanovka"
 
 msgid "Number of people per gondola"
-msgstr "Počet ľudí v gondole"
+msgstr "Počet lidí v gondole"
 
 msgid "Mixed Lift"
-msgstr "Zmiešané lanovky"
+msgstr "Smíšená lanovka"
 
 msgid "Number of people per gondola/chair"
-msgstr "Počet ľudí na gondolu/kreslo"
+msgstr "Počet lidí na gondolu/sedačku"
+
+msgid "Drag Lift"
+msgstr "Lyžařský vlek"
 
-msgid "T-bar Lift"
-msgstr "Kotva"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"lyžařský vlek (obecný typ - použijte pouze pokud neznáte konkrátní typ vleku "
+"(viz níže))"
+
+msgid "t-bar"
+msgstr "kotva"
 
-msgid "J-bar Lift"
-msgstr "Vlek s jednomiestnou kotvou"
+msgid "j-bar"
+msgstr "jednokotva"
 
-msgid "Platter Lift"
-msgstr "Vlek Poma (disk)"
+msgid "platter"
+msgstr "poma"
 
-msgid "Rope Tow"
-msgstr "Dětský provazový vlek"
+msgid "rope_tow"
+msgstr "kotvičkový"
 
 msgid "Magic Carpet"
 msgstr "Pojízdný pás"
@@ -17970,6 +18033,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18000,12 +18066,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18201,6 +18270,9 @@ msgstr "Nástroje pro opravu svépomocí (může to být cyklistické družstvo)
 msgid "Bicycles are washed (for a fee)"
 msgstr "Mytí jízdních kol (za poplatek)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Věřejná opravna bicyklů"
+
 msgid "Public Transport"
 msgstr "Hromadná doprava"
 
@@ -18217,7 +18289,7 @@ msgid "monorail"
 msgstr "jednokolejnicová dráha (monorail)"
 
 msgid "light_rail"
-msgstr "lehké metro"
+msgstr "nadzemka"
 
 msgid "trolleybus"
 msgstr "trolejbus"
@@ -18459,6 +18531,14 @@ msgstr "Letištní plocha"
 msgid "Hangar"
 msgstr "Hangár"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangár"
+
+msgctxt "building"
+msgid "yes"
+msgstr "ano"
+
 msgid "Beacon"
 msgstr "Vodní bój"
 
@@ -18786,7 +18866,7 @@ msgid "Fireplace"
 msgstr "Ohniště"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Piknikový stůl"
 
 msgid "Public Grill"
 msgstr "Veřejný gril"
@@ -19702,10 +19782,6 @@ msgid "Man Made"
 msgstr "Umělé objekty"
 
 msgctxt "building"
-msgid "yes"
-msgstr "ano"
-
-msgctxt "building"
 msgid "roof"
 msgstr "střecha"
 
@@ -19726,16 +19802,16 @@ msgid "school"
 msgstr "škola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangár"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "komerční"
 
 msgctxt "building"
-msgid "farm"
-msgstr "farma"
+msgid "barn"
+msgstr "stodola"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "budova na farmě"
 
 msgctxt "building"
 msgid "transportation"
@@ -19808,6 +19884,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "rodinný dům (samostatně stojící)"
 
+msgctxt "building"
+msgid "farm"
+msgstr "farma"
+
 msgid "Entrance"
 msgstr "Vchod"
 
@@ -20442,7 +20522,7 @@ msgid "pelton_turbine"
 msgstr "peltonova turbína"
 
 msgid "Tidal Water Turbine"
-msgstr "přílivová turbína"
+msgstr "Přílivová turbína"
 
 msgctxt "generator method"
 msgid "barrage"
@@ -21307,7 +21387,7 @@ msgstr "Národní park"
 msgid "Protected Area"
 msgstr "Chráněná oblast"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Třída ochrany"
 
 msgid "Title or type of protection"
@@ -21337,15 +21417,21 @@ msgstr "Velkoměsto"
 msgid "Town"
 msgstr "Město"
 
-msgid "Suburb"
-msgstr "Městská část/obvod"
-
 msgid "Village"
 msgstr "Obec"
 
 msgid "Hamlet"
 msgstr "Osada"
 
+msgid "Isolated Dwelling"
+msgstr "Samota"
+
+msgid "Suburb"
+msgstr "Městská část/obvod"
+
+msgid "Neighbourhood"
+msgstr "Část městské čtvrti, obce"
+
 msgid "Farm"
 msgstr "Statek"
 
@@ -21355,12 +21441,6 @@ msgstr "Statek uvnitř většího osídlení"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(prosím použijte tag \"isolated_dwelling\" pro izolovaný statek)"
 
-msgid "Isolated Dwelling"
-msgstr "Samota"
-
-msgid "Neighbourhood"
-msgstr "Část městské čtvrti, obce"
-
 msgid "Locality"
 msgstr "Místní název"
 
@@ -21885,6 +21965,41 @@ msgstr "Obrázek"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Kontakt (schéma s předponou ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Krátký text s doplňujícími informacemi."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Může být zobrazeno koncovému uživateli (možná při vyhledávání nebo jako "
+"vyskakovací popiska na mapě)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Podobné ale jiné značky:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Poznámka"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr "Důležitá poznámka pro ostatní tvůrce map (ne pro uživatele)."
+
+msgid "Fixme"
+msgstr "Opravit"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Tip pro ostatní tvůrce mapy (nikoliv pro koncové uživatele), že objekt "
+"potřebuje vylepšení."
+
 msgid "outer segment"
 msgstr "vnější část"
 
@@ -21922,7 +22037,7 @@ msgid "Label point"
 msgstr "Místo pro jmenovku"
 
 msgid "Site"
-msgstr "Areál (site)"
+msgstr "Areál"
 
 msgid "Site name"
 msgstr "Jméno areálu"
@@ -22248,17 +22363,14 @@ msgstr "Test"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr "Bing letecké snímky"
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitární tým OpenStreetMap)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr "Mapbox Satellite"
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22269,15 +22381,15 @@ msgstr "OpenStreetMap trasy GPS"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik černobíle)"
+msgstr "OpenStreetMap (Mapnik, černobíle)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, bez popisek)"
 
-msgid "skobbler"
-msgstr "skobbler"
-
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
 
@@ -22308,6 +22420,54 @@ msgstr "Strava heatmap - jízda na kole"
 msgid "Strava running heatmap"
 msgstr "Strava heatmap - běh"
 
+msgid "Locator Overlay"
+msgstr "Překryvná vrstva Locator"
+
+msgid "QA No Address"
+msgstr "QA Žádná adresa"
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Značené trasy: Turistika"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Značené trasy: Cyklo"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Značené trasy: MTB"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Značené trasy: Bruslení"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Značené trasy: Jízda na koních"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Značené trasy: Zimní sporty"
+
+msgid "OSM Inspector: Geometry"
+msgstr "OSM Inspector: Geometrie"
+
+msgid "OSM Inspector: Tagging"
+msgstr "OSM Inspector: Značení"
+
+msgid "OSM Inspector: Places"
+msgstr "OSM Inspector: Místa"
+
+msgid "OSM Inspector: Highways"
+msgstr "OSM Inspector: Silnice"
+
+msgid "OSM Inspector: Multipolygon"
+msgstr "OSM Inspector: Multipolygon"
+
+msgid "OSM Inspector: Routing"
+msgstr "OSM Inspector: Navigace"
+
+msgid "OSM Inspector: Addresses"
+msgstr "OSM Inspector: Adresy"
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr "OSM Inspector: Hranice (EU)"
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI černobíle 2.5m"
 
@@ -22350,9 +22510,13 @@ msgstr "VoGIS: DOM (model povrchu)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW(allonie) 2012 aerial imagery"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW(allonie) 2009 aerial imagery"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -22372,6 +22536,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Kelowna Roads overlay"
+
 msgid "Czech CUZK:KM"
 msgstr "Český CUZK:KM"
 
@@ -22491,7 +22661,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburg (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburg (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburg (DK5)"
@@ -22502,8 +22672,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr "Erlangen Luftbild (2013 6,25 cm)"
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22587,6 +22757,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italy"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "South Tyrol Orthofoto 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "South Tyrol Topomap"
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -22803,17 +22979,17 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr "USGS Topographic Maps"
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr "TIGER 2012 Roads Overlay"
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr "New & Misaligned TIGER Roads (2014)"
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcels"
@@ -22821,6 +22997,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr "U.S. Forest Service roads"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -23088,6 +23267,9 @@ msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "V interpolaci adres se čísla domů snižují"
 
@@ -23189,6 +23371,9 @@ msgstr "{0} na uzlu. Mělo by být nakresleno jako plocha."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* na uzlu. Mělo by být použito v relaci"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} na cestě. Mělo by být použito na uzlu."
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} na cestě. Mělo by být použito v relaci"
 
@@ -23248,7 +23433,7 @@ msgid "{0} with multiple values"
 msgstr "{0} s vícenásobnou hodnotou"
 
 msgid "empty value in semicolon-separated ''{0}''"
-msgstr ""
+msgstr "prázdná hodnota ve středníkem odděleném ''{0}''"
 
 msgid "numerical key"
 msgstr "číselný klíč"
@@ -23292,7 +23477,7 @@ msgid "{0} must be a numeric value"
 msgstr "{0} musí být číselná hodnota"
 
 msgid "{0} must be a positive integer number"
-msgstr ""
+msgstr "{0} musí být celé kladné číslo"
 
 msgid "relation without type"
 msgstr "relace bez \"type\""
@@ -24630,10 +24815,10 @@ msgid "merge nodes"
 msgstr "sloučit uzly"
 
 msgid "How often thinning operation should be applied (Default {0})."
-msgstr ""
+msgstr "Jak často má být být provedena operace ztenčování (výchozí {0})."
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Iterace ztenčování"
 
 msgid "Street Name:"
 msgstr "Jméno ulice:"
@@ -27884,6 +28069,8 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Klikněte+táhněte fotografii, Shift+kliknutím polohujte fotografii, "
+"Ctrl+kliknutím nastavte směr."
 
 msgid "Please load some photos."
 msgstr "Načtěte prosím nějaké fotografie."
@@ -28928,6 +29115,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Uložit SDS soubor"
 
+msgid "No object selected"
+msgstr "Žádný vybraný objekt"
+
+msgid "SeaMap Editor"
+msgstr "SeaMap Editor"
+
+msgid "Seamark Inspector"
+msgstr "Seamark Inspector"
+
+msgid "Select only one object"
+msgstr "Vyberte pouze jeden objekt"
+
+msgid "Select a map object"
+msgstr "Vyberte objekt na mapě"
+
 msgid "Simplify Area"
 msgstr "Zjednodušit plochu"
 
@@ -29001,9 +29203,6 @@ msgstr "Faktor vzdálenosti"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Práh sloučení blízkých uzlů"
 
-msgid "SeaMap Editor"
-msgstr "SeaMap Editor"
-
 msgid "AutoSave LiveData"
 msgstr "Automatické ukládání LiveData"
 
@@ -29127,7 +29326,7 @@ msgid "create an associatedStreet relation"
 msgstr "vytvořit relaci Přiřazená ulice (associatedStreet)"
 
 msgid "keep outline way"
-msgstr ""
+msgstr "zachovat obrysovou cestu"
 
 msgid "Street name: "
 msgstr "Jméno ulice: "
diff --git a/i18n/po/cy.po b/i18n/po/cy.po
index 06da170..6ef49e8 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-07-17 21:45+0000\n"
 "Last-Translator: iggy23 <Unknown>\n"
 "Language-Team: Welsh <cy at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
 "2 : 3;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:34+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:29+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: cy\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2037,9 +2044,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5612,10 +5616,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9049,7 +9049,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9070,6 +9070,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11039,7 +11045,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14219,6 +14225,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15211,12 +15223,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15312,45 +15400,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16185,31 +16235,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16224,16 +16271,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16318,6 +16373,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16348,12 +16406,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16549,6 +16610,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16807,6 +16871,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18050,10 +18122,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18074,15 +18142,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18156,6 +18224,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19653,7 +19725,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19683,28 +19755,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20222,6 +20294,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20585,16 +20688,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20606,13 +20706,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20645,6 +20745,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20688,7 +20836,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20709,6 +20860,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20837,7 +20994,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20920,6 +21077,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21136,16 +21299,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21154,6 +21317,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21421,6 +21587,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21513,6 +21682,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26847,6 +27019,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26907,9 +27094,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/da.po b/i18n/po/da.po
index 274343e..33616f1 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-26 15:51+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-31 16:49+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: 2014-12-29 04:45+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:44+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: da_DK\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
@@ -230,6 +230,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Ingen ønskede lag"
 
+msgid "Select"
+msgstr "Markering"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Sæt de markerede elementer på kortet til de markerede genstande i listen "
+"ovenfor."
+
 msgid "Add imagery layer {0}"
 msgstr "Tilføj billedlag {0}"
 
@@ -286,6 +295,8 @@ msgstr "Kan ikke bestemme centrum af udvalgte punkter."
 msgid ""
 "One or more nodes involved in this action is outside of the downloaded area."
 msgstr ""
+"En eller flere punkter involveret i denne handling er uden for det "
+"downloadede område."
 
 msgid "Align Nodes in Line"
 msgstr "Stil punkter op på linje"
@@ -300,10 +311,10 @@ msgid "Can not align a polygon. Abort."
 msgstr "Kan ikke justere en polygon. Afbryder."
 
 msgid "Intersection of three or more ways can not be solved. Abort."
-msgstr ""
+msgstr "Skæringspunktet af tre eller flere veje kan ikke løses. Afbryder."
 
 msgid "Two parallels ways found. Abort."
-msgstr ""
+msgstr "To parallelle veje fundet. Afbryder."
 
 msgid "data"
 msgstr "data"
@@ -682,7 +693,7 @@ msgstr ""
 "venligst at der ikke er kommet nogen fejl."
 
 msgid "Fix tag conflicts"
-msgstr "Løs tag konflikter"
+msgstr "Ret tag konflikter"
 
 msgid "Split ways into fragments"
 msgstr "Opdel veje til fragmenter"
@@ -1031,31 +1042,33 @@ msgid ""
 "can undo the movement for certain nodes:<br>Select them and press the "
 "shortcut for Orthogonalize / Undo. The default is Shift-Q.)"
 msgstr ""
-"<h3>Når en eller flere veje er markeret bliver formen justeret, så alle "
-"vinkler er 90 eller 180 grader.</h3>Du kan tilføje to punkter til "
-"markeringen. Så vil retningen blive justeret efter disse referencepunkter. "
-"(Bagefter kan du annullere flytningen af enkelte punkter:<br>Vælg dem og "
-"tast genvejen for Retvinkel/fortryd. Standard-genvejen er Shift-Q)"
+"<h3>Når en eller flere veje er valgt bliver formen justeret, så alle vinkler "
+"er 90 eller 180 grader.</h3>Du kan tilføje to punkter til markeringen. Så "
+"vil retningen blive justeret efter disse to referencepunkter. (Bagefter kan "
+"du fortryde flytningen af enkelte punkter:<br>Vælg dem og tast genvejen for "
+"Retvinkel / Fortryd. Standarden er Shift-Q.)"
 
 msgid "Orthogonalize Shape"
-msgstr "Retvinkl figur"
+msgstr "Retvinkel form"
 
 msgid "Move nodes so all angles are 90 or 180 degrees"
 msgstr "Flyt punkter så alle vinkler er 90 eller 180 grader"
 
 msgid "Orthogonalize Shape / Undo"
-msgstr "Retvinkl figur / Fortryd"
+msgstr "Retvinkel form / Fortryd"
 
 msgid "Undo orthogonalization for certain nodes"
 msgstr "Fortryd retvinkling for visse punkter"
 
 msgid "Orthogonalize / Undo"
-msgstr "Retvinkl / Fortryd"
+msgstr "Retvinkel / Fortryd"
 
 msgid ""
 "Orthogonalize Shape / Undo<br>Please select nodes that were moved by the "
 "previous Orthogonalize Shape action!"
 msgstr ""
+"Retvinkel form / Fortryd<br>Vælg noder der blev flyttet ved den tidligere "
+"Retvinkel form handling!"
 
 msgid ""
 "<html>You are using the EPSG:4326 projection which might lead<br>to "
@@ -1071,7 +1084,7 @@ msgid "Selection must consist only of ways and nodes."
 msgstr "Markeringen må kun bestå af veje og punkter."
 
 msgid "Orthogonalize"
-msgstr "Retvinkl"
+msgstr "Retvinkel"
 
 msgid "Usage"
 msgstr "Anvendelse"
@@ -1080,8 +1093,8 @@ msgid ""
 "<html>Please make sure all selected ways head in a similar direction<br>or "
 "orthogonalize them one by one.</html>"
 msgstr ""
-"<html> Sørg for, at alle valgte veje peger i lignende retning <br> eller "
-"orthogonalize dem én efter én. </ html>"
+"<html>Sørg for alle valgte veje peger i samme retning<br>eller retvinkel dem "
+"en efter en.</html>"
 
 msgid "Please select ways with angles of approximately 90 or 180 degrees."
 msgstr "Vælg venligst veje med vinkler på cirka 90 eller 180 grader."
@@ -1149,7 +1162,7 @@ msgid ""
 "removed from the layer, but <i>not</i> deleted<br> on the server when "
 "uploading."
 msgstr ""
-"Denne operation får JOSM til at glemme de valgte objekter <br> Disse vil "
+"Denne handling får JOSM til at glemme de valgte objekter <br> Disse vil "
 "blive fjernet fra laget, men <i>ikke</i> slettet fra <br> serveren ved "
 "upload."
 
@@ -1198,7 +1211,7 @@ msgid "Report bug"
 msgstr "Anmeld fejl"
 
 msgid "Report a ticket to JOSM bugtracker"
-msgstr ""
+msgstr "Opret en sag i JOSM fejlrapporteringssystem."
 
 msgid "Restart"
 msgstr "Genstart"
@@ -1350,7 +1363,7 @@ msgid "Simplify all selected ways"
 msgstr "Forenkl alle valgte veje"
 
 msgid "Cancel operation"
-msgstr "Afbryd operation"
+msgstr "Afbryd handling"
 
 msgid ""
 "The selection contains {0} ways. Are you sure you want to simplify them all?"
@@ -2079,14 +2092,14 @@ msgid "Dual alignment active."
 msgstr "Dobbelt tilpasning aktiv."
 
 msgid "Segment collapsed due to its direction reversing."
-msgstr ""
+msgstr "Segment kollapsede på grund af dets retningsskift."
 
 msgid "Move a segment along its normal, then release the mouse button."
 msgstr "Flyt et segment langs dets normale og slip så museknappen."
 
 msgid ""
 "Move the node along one of the segments, then release the mouse button."
-msgstr ""
+msgstr "Flyt punkt langs en af segmenterne, og slip så museknappen."
 
 msgid "Draw a rectangle of the desired size, then release the mouse button."
 msgstr "Tegn en firkant af passende størrelse og slip så museknappen."
@@ -2189,9 +2202,6 @@ msgstr ""
 "Træk spillehoved og slip nær spor for at afspille lyd derfra; SHIFT+slip for "
 "at synkronisere lyd på det sted."
 
-msgid "Select"
-msgstr "Markering"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Vælg, flyt, skalér eller rotér objekter"
 
@@ -2885,7 +2895,7 @@ msgid "Removed obsolete tags"
 msgstr "Fjernede forældede tags"
 
 msgid "Fix deprecated tags"
-msgstr "Fiks forældede tags"
+msgstr "Ret forældede tags"
 
 msgid ""
 "<html>{0} relations build a cycle because they refer to each other.<br>JOSM "
@@ -3241,6 +3251,8 @@ msgid ""
 "When reversing this way, the following changes are suggested in order to "
 "maintain data consistency."
 msgstr ""
+"Når denne vejs retning vendes, foreslås de følgende ændringer for at bevare "
+"datakonsistens."
 
 msgid "Relation"
 msgstr "Relation"
@@ -3273,7 +3285,7 @@ msgid "Please select which changes you want to apply."
 msgstr "Vælg hvilke ændringer du vil anvende."
 
 msgid "Tags of "
-msgstr ""
+msgstr "Tags for "
 
 msgid "Roles in relations referring to"
 msgstr "Roller i relationer refererende til"
@@ -3496,6 +3508,9 @@ msgid ""
 "Please report this at {2}. This is not a critical error, it should be safe "
 "to continue in your work."
 msgstr ""
+"JOSM forventede at finde primitiv [{0} {1}] i datasættet, men det er ikke "
+"der. Rapporter dette på {2}. Dette er ikke en kritisk fejl, det bør være "
+"sikkert at fortsætte med dit arbejde."
 
 msgid "Missing merge target for way with id {0}"
 msgstr "Manglende sammenlægningsmål for vej med id {0}"
@@ -3706,13 +3721,13 @@ msgid "Ellipsoid required (+ellps=* or +a=*, +b=*)"
 msgstr "Ellipsoide påkrævet (+ellps=* eller +a=*, +b=*)"
 
 msgid "Grid shift file ''{0}'' for option +nadgrids not supported."
-msgstr ""
+msgstr "Grid shift filen ''{0}'' for option +nadgrids understøttes ikke."
 
 msgid "Unknown datum identifier: ''{0}''"
-msgstr ""
+msgstr "Ukendt datum identifikator: ''{0}''"
 
 msgid "Datum required (+datum=*, +towgs84=* or +nadgrids=*)"
-msgstr ""
+msgstr "Datum krævet (+datum=*, +towgs84=* eller +nadgrids=*)"
 
 msgid ""
 "Unexpected number of arguments for parameter ''towgs84'' (must be 3 or 7)"
@@ -3726,7 +3741,7 @@ msgid "Projection required (+proj=*)"
 msgstr "Projektion påkrævet (+proj=*)"
 
 msgid "Unknown projection identifier: ''{0}''"
-msgstr ""
+msgstr "Ukendt projektion identifikator: ''{0}''"
 
 msgid "Unexpected number of arguments for parameter ''+bounds'' (must be 4)"
 msgstr "Ukendt antal argumenter til parameteren \"+bounds\" (skal være 4)"
@@ -3794,37 +3809,37 @@ msgid "Running test {0}"
 msgstr "Kører test {0}"
 
 msgid "E-mail address contains non-ascii characters"
-msgstr ""
+msgstr "E-mail adresse indeholder ikke-ASCII-tegn"
 
 msgid "E-mail address is invalid"
-msgstr ""
+msgstr "E-mail adresse er ugyldig"
 
 msgid "E-mail address contains an invalid username: {0}"
-msgstr ""
+msgstr "E-mail adresse indeholder et ugyldigt brugernavn: {0}"
 
 msgid "E-mail address contains an invalid domain: {0}"
-msgstr ""
+msgstr "E-mail adresse indeholder et ugyldigt domæne: {0}"
 
 msgid "URL contains non-ascii characters"
-msgstr ""
+msgstr "URL indeholder ikke-ASCII-tegn"
 
 msgid "URL is invalid"
-msgstr ""
+msgstr "URL er ugyldig"
 
 msgid "URL contains an invalid protocol: {0}"
-msgstr ""
+msgstr "URL indeholder en ugyldig protokol: {0}"
 
 msgid "URL contains an invalid authority: {0}"
-msgstr ""
+msgstr "URL indeholder en ugyldig autoritet: {0}"
 
 msgid "URL contains an invalid path: {0}"
-msgstr ""
+msgstr "URL indeholder en ugyldig sti: {0}"
 
 msgid "URL contains an invalid query: {0}"
-msgstr ""
+msgstr "URL indeholder en ugyldig forespørgsel: {0}"
 
 msgid "URL contains an invalid fragment: {0}"
-msgstr ""
+msgstr "URL indeholder et ugyldigt fragment: {0}"
 
 msgid "Addresses"
 msgstr "Adresser"
@@ -3859,9 +3874,10 @@ msgstr "Kontrollerer for fejl mod API-egenskaber"
 msgid ""
 "Way contains more than {0} nodes. It should be replaced by a multipolygon"
 msgstr ""
+"Vej indeholder mere end {0} punkter. Den bør erstattes af en multipolygon"
 
 msgid "Way contains more than {0} nodes. It should be split or simplified"
-msgstr ""
+msgstr "Vej indeholder mere end {0} punkter. Den bør opdeles eller forenkles"
 
 msgid "Barriers and entrances"
 msgstr "Barrierer og indgange"
@@ -4022,10 +4038,10 @@ msgid "Highway link is not linked to adequate highway/link"
 msgstr ""
 
 msgid "Missing pedestrian crossing information"
-msgstr ""
+msgstr "Manglende fodgængerfelt information"
 
 msgid "Unknown country code: {0}"
-msgstr ""
+msgstr "Ukendt landekode: {0}"
 
 msgid "Unknown source:maxspeed context: {0}"
 msgstr ""
@@ -4037,7 +4053,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Kontrollerer for fejl i internet relaterede tags."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " URL kan ikke konverteres til ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4070,10 +4086,10 @@ msgid "This test checks for errors in tag keys and values."
 msgstr "Denne test kontrollerer for fejl i tag nøgler og værdier."
 
 msgid "Unable to replace argument {0} in {1}: {2}"
-msgstr ""
+msgstr "Kan ikke erstatte argument {0} i {1}: {2}"
 
 msgid "Fix of {0}"
-msgstr ""
+msgstr "Rettelse af {0}"
 
 msgid " or "
 msgstr " eller "
@@ -4100,7 +4116,7 @@ msgid "No outer way for multipolygon"
 msgstr "Ingen ydre vej for multipolygon"
 
 msgid "Role for ''{0}'' should be ''{1}''"
-msgstr ""
+msgstr "Rolle for ''{0}'' bør være ''{1}''"
 
 msgid "No area style for multipolygon"
 msgstr ""
@@ -4190,7 +4206,7 @@ msgid "Unexpected token in year range:"
 msgstr ""
 
 msgid "Invalid/unsupported syntax."
-msgstr ""
+msgstr "Ugyldig/ikke understøttet syntaks."
 
 msgid "Overlapping ways"
 msgstr "Overlappende veje"
@@ -4221,7 +4237,7 @@ msgid "Overlapping railways"
 msgstr "Overlappende jernbaner"
 
 msgid "Way contains segment twice"
-msgstr ""
+msgstr "Vej indeholder segment to gange"
 
 msgid "Power lines"
 msgstr "Strømledninger"
@@ -4241,7 +4257,7 @@ msgid "Relation checker"
 msgstr "Relationschecker"
 
 msgid "Checks for errors in relations."
-msgstr ""
+msgstr "Kontrollerer for fejl i relationer"
 
 msgid ""
 "Route scheme is unspecified. Add {0} ({1}=public_transport; {2}=legacy)"
@@ -4686,13 +4702,13 @@ msgid "Illegal Data"
 msgstr "Ugyldig data"
 
 msgid "Offline mode"
-msgstr ""
+msgstr "Offlinetilstand"
 
 msgid "Internal Server Error"
 msgstr "Intern server fejl"
 
 msgid "Bad Request"
-msgstr "Ugyldig forespørgsel"
+msgstr "Dårlig forespørgsel"
 
 msgid "Not Found"
 msgstr "Ikke fundet"
@@ -5124,7 +5140,7 @@ msgid "Select note sorting method"
 msgstr ""
 
 msgid "Click to cancel the current operation"
-msgstr "Klik for at afbryde den aktuelle operation"
+msgstr "Klik for at afbryde den aktuelle handling"
 
 msgid "In background"
 msgstr "I baggrunden"
@@ -5316,10 +5332,10 @@ msgid "Conflict foreground: keep all tags"
 msgstr "Konflikt forgrund: behold alle tags"
 
 msgid "Conflict background: sum all numeric tags"
-msgstr ""
+msgstr "Konflikt baggrund: adderer alle numeriske tags"
 
 msgid "Conflict foreground: sum all numeric tags"
-msgstr ""
+msgstr "Konflikt forgrund: adderer alle numeriske tags"
 
 msgid "Conflict background: keep member"
 msgstr "Konflikt baggrund: behold medlem"
@@ -6032,12 +6048,6 @@ msgstr ""
 "Åbn en fletnings-dialogboks for alle valgte elementer i den ovenstående "
 "liste."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Sæt de markerede elementer på kortet til de markerede genstande i listen "
-"ovenfor."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Der blev opdaget {0} konflikt"
@@ -6606,6 +6616,8 @@ msgid ""
 "Invalid ID list specified\n"
 "Cannot continue."
 msgstr ""
+"Ugyldig ID liste specificeret\n"
+"Kan ikke fortsætte."
 
 msgid "Relations"
 msgstr "Relationer"
@@ -6777,10 +6789,10 @@ msgid "Display the objects created, updated, and deleted by the changeset"
 msgstr "Vis objekterne oprettet,opdateret og slettet af rettesættet"
 
 msgid "Discussion"
-msgstr ""
+msgstr "Diskussion"
 
 msgid "Display the public discussion around this changeset"
-msgstr ""
+msgstr "Vis offentlig diskussion omkring dette rettesæt"
 
 msgid "Changeset Management Dialog"
 msgstr "Rettesætshåndteringsdialog"
@@ -6858,7 +6870,7 @@ msgid "Closed at"
 msgstr "Lukket"
 
 msgid "Discussions"
-msgstr ""
+msgstr "Diskussioner"
 
 msgid "Downloading changeset content"
 msgstr "Downloader indhold af rettesæt"
@@ -6980,10 +6992,10 @@ msgstr ""
 "Zoom til objekterne i indholdet af dette rettesæt i det aktuelle datalag"
 
 msgid "Update changeset discussion"
-msgstr ""
+msgstr "Opdatere rettesæt diskussion"
 
 msgid "Update the changeset discussion from the OSM server"
-msgstr ""
+msgstr "Opdatere rettesæt diskussionen fra OSM serveren"
 
 msgid "Date"
 msgstr "Dato"
@@ -7374,13 +7386,13 @@ msgid "Copy selected Key(s)/Value(s)"
 msgstr "Kopier valgte nøgle(r)/Værdi(er)"
 
 msgid "Copy the key and value of the selected tag(s) to clipboard"
-msgstr ""
+msgstr "Kopier nøgle og værdi for den valgte tag(s) til udklipsholderen"
 
 msgid "Copy all Keys/Values"
-msgstr "Kopiér alle nøgler/værdier"
+msgstr "Kopier alle nøgler/værdier"
 
 msgid "Copy the key and value of all the tags to clipboard"
-msgstr ""
+msgstr "Kopier nøgle og værdien af alle tags til udklipsholderen"
 
 msgid "Search Key/Value/Type"
 msgstr "Søg nøgle/værdi/type"
@@ -8075,13 +8087,13 @@ msgid "Querying name server ..."
 msgstr "Forespørger på navneserver ..."
 
 msgid "Error occured with query ''{0}'': ''{1}''"
-msgstr ""
+msgstr "Der opstod en fejl med forespørgslen ''{0}'': ''{1}''"
 
 msgid "Name server returned invalid data. Please try again."
-msgstr ""
+msgstr "Navne server returnerede ugyldige data. Prøv venligst igen."
 
 msgid "Bad response"
-msgstr ""
+msgstr "Dårlig respons"
 
 msgid "Type"
 msgstr "Type"
@@ -8415,10 +8427,10 @@ msgid "Specify the data source for the changes"
 msgstr "Angiv datakilden for ændringerne"
 
 msgid "obtain from current layers"
-msgstr ""
+msgstr "få fra de nuværende lag"
 
 msgid "Enter a source"
-msgstr ""
+msgstr "Indtast en kilde"
 
 msgid "Changeset id:"
 msgstr "Rettesæts-ID"
@@ -8577,6 +8589,8 @@ msgid ""
 "Cannot download file ''{0}''. Its download link ''{1}'' is not a valid URL. "
 "Skipping download."
 msgstr ""
+"Kan ikke downloade filen ''{0}''. Dens download-link ''{1}'' er ikke en "
+"gyldig URL. Springer over download."
 
 msgid ""
 "Could not retrieve the list of your open changesets because<br>JOSM does not "
@@ -8776,7 +8790,7 @@ msgstr[1] ""
 "annulleret eller mislykkedes.</html>"
 
 msgid "Incomplete upload and/or save"
-msgstr "Ufuldstændig upload og/eller gemme operation"
+msgstr "Ufuldstændig upload og/eller gemme handling"
 
 msgid "should be uploaded"
 msgstr "bør uploades"
@@ -8930,6 +8944,8 @@ msgid ""
 "Object ''{0}'' is already deleted on the server. Skipping this object and "
 "retrying to upload."
 msgstr ""
+"Objekt ''{0}'' er allerede slettet på serveren. Springer over dette objekt "
+"og prøver igen at uploade."
 
 msgid "Preparing objects to upload ..."
 msgstr "Forbereder objekter der skal uploades ..."
@@ -9100,7 +9116,7 @@ msgid "Cancel uploading"
 msgstr "Annullér upload"
 
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
-msgstr ""
+msgstr "Uventet værdi for nøgle ''{0}'' i indstillinger, fik ''{1}''"
 
 msgid "Please select the upload strategy:"
 msgstr "Vælg venligst upload-strategien:"
@@ -9744,7 +9760,7 @@ msgid "Delete File from disk"
 msgstr "Slet fil fra disk"
 
 msgid "Copy image path"
-msgstr ""
+msgstr "Kopier billede sti"
 
 msgid "Next"
 msgstr "Næste"
@@ -9776,10 +9792,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/t"
+"Hastighed: {0} km/t"
 
 msgid ""
 "\n"
@@ -9805,6 +9821,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-billeder (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Vælg synlige spor"
 
@@ -10361,7 +10383,7 @@ msgid "Close the dialog and accept the Access Token"
 msgstr "Luk dialogen og acceptér adgangsudtrykket"
 
 msgid "Failed to cancel running OAuth operation"
-msgstr ""
+msgstr "Kunne ikke annullere igangværende OAuth handling"
 
 msgid "Retrieving OAuth Request Token from ''{0}''"
 msgstr "Henter OAuth anmodningsudtryk fra ''{0}''"
@@ -11984,8 +12006,8 @@ msgstr "Indbygget:"
 msgid "Projection bounds (in degrees)"
 msgstr "Projektionsgrænser (i grader)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG kode)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -12132,16 +12154,16 @@ msgstr ""
 "programmer der taler med JOSM."
 
 msgid "Enable remote control"
-msgstr "Aktivér fjernstyring"
+msgstr "Aktiver fjernstyring"
 
 msgid "Enable HTTPS support"
-msgstr ""
+msgstr "Aktiver HTTPS understøttelse"
 
 msgid "Install..."
-msgstr ""
+msgstr "Installer..."
 
 msgid "Uninstall..."
-msgstr ""
+msgstr "Afinstaller..."
 
 msgid "Install JOSM localhost certificate to system/browser root keystores"
 msgstr ""
@@ -12917,7 +12939,7 @@ msgstr ""
 "forespørgselsparametrene \"uid\" og \"display_name\""
 
 msgid "Unsupported parameter ''{0}'' in changeset query string"
-msgstr "Ikkeunderstøttet parameter ''{0}'' i rettesætsforespørgselsstreng"
+msgstr "Ikke understøttet parameter ''{0}'' i rettesætsforespørgselsstreng"
 
 msgid "Unexpected format for port number in preference ''{0}''. Got ''{1}''."
 msgstr ""
@@ -13793,7 +13815,7 @@ msgid "Unable to locate file  ''{0}''."
 msgstr "Kunne ikke finde filen \"{0}\"."
 
 msgid "Unsupported scheme ''{0}'' in URI ''{1}''."
-msgstr "Ej-understøttet skema \"{0}\" i URI \"{1}\"."
+msgstr "Ikke understøttet skema \"{0}\" i URI \"{1}\"."
 
 msgid "Unexpected root element ''{0}'' in session file"
 msgstr "Uventet rodelement \"{0}\" i sessionsfilen"
@@ -14257,7 +14279,8 @@ msgid ""
 "bug report in our bugtracker using this link:"
 msgstr ""
 "Du bør også opdatere dine plugins. Hvis intet af dette hjælper, så opret "
-"venligst en fejlrapport i vores \"bugtracker\" ved hjælp af dette link:"
+"venligst en fejlrapport i vores fejlrapporteringssystem ved hjælp af dette "
+"link:"
 
 msgid ""
 "There the error information provided below should already be filled in for "
@@ -15484,6 +15507,12 @@ msgstr "Tilføjer ruteplan-egenskaber"
 msgid "Loads data from SDS"
 msgstr "Indlæser data fra SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15814,26 +15843,27 @@ msgid "18:00"
 msgstr "18:00"
 
 msgid "sunset,sunrise"
-msgstr ""
+msgstr "sunset,sunrise"
 
 msgid "Su 09:30,11:00"
-msgstr ""
+msgstr "Su 09:30,11:00"
 
 msgid "Sa,Su,PH 09:00"
-msgstr ""
+msgstr "Sa,Su,PH 09:00"
 
 msgid "Sa 18:00; Su 10:45"
-msgstr ""
+msgstr "Sa 18:00; Su 10:45"
 
 msgid ""
 "Fr 08:00-18:00; Apr 10-15 off; Jun 07:00-20:00; Aug off; Dec 24 08:00-24:00"
 msgstr ""
+"Fr 08:00-18:00; Apr 10-15 off; Jun 07:00-20:00; Aug off; Dec 24 08:00-24:00"
 
 msgid "Sa 10:00+"
-msgstr ""
+msgstr "Sa 10:00+"
 
 msgid "week 1-53/2 Fr 09:00-12:00; week 2-52/2 We 09:00-12:00"
-msgstr ""
+msgstr "week 1-53/2 Fr 09:00-12:00; week 2-52/2 We 09:00-12:00"
 
 msgid "Opening Hours"
 msgstr "Åbningstider"
@@ -15845,23 +15875,24 @@ msgid "08:30-12:30,15:30-20:00"
 msgstr "08:30-12:30,15:30-20:00"
 
 msgid "Sa-Su 00:00-24:00"
-msgstr ""
+msgstr "Sa-Su 00:00-24:00"
 
 msgid "Mo-Fr 08:30-20:00; Sa,Su 08:00-15:00; PH off"
-msgstr ""
+msgstr "Mo-Fr 08:30-20:00; Sa,Su 08:00-15:00; PH off"
 
 msgid "Mo-Fr 08:30-20:00, Tu-Su 08:00-15:00; Sa 08:00-12:00"
-msgstr ""
+msgstr "Mo-Fr 08:30-20:00, Tu-Su 08:00-15:00; Sa 08:00-12:00"
 
 msgid ""
 "Mo-Su 08:00-18:00; Apr 10-15 off; Jun 08:00-14:00; Aug off; Dec 25 off"
 msgstr ""
+"Mo-Su 08:00-18:00; Apr 10-15 off; Jun 08:00-14:00; Aug off; Dec 25 off"
 
 msgid "sunrise-sunset"
-msgstr ""
+msgstr "sunrise-sunset"
 
 msgid "Su 10:00+"
-msgstr ""
+msgstr "Su 10:00+"
 
 msgid "Brand"
 msgstr "Mærke"
@@ -15926,147 +15957,147 @@ msgstr "multi"
 
 msgctxt "sport"
 msgid "archery"
-msgstr ""
+msgstr "bueskydning"
 
 msgctxt "sport"
 msgid "athletics"
-msgstr ""
+msgstr "atletik"
 
 msgctxt "sport"
 msgid "american_football"
-msgstr ""
+msgstr "amerikansk fodbold"
 
 msgctxt "sport"
 msgid "australian_football"
-msgstr ""
+msgstr "australsk fodbold"
 
 msgctxt "sport"
 msgid "baseball"
-msgstr ""
+msgstr "baseball"
 
 msgctxt "sport"
 msgid "basketball"
-msgstr ""
+msgstr "basketball"
 
 msgctxt "sport"
 msgid "boules"
-msgstr ""
+msgstr "kuglespil"
 
 msgctxt "sport"
 msgid "bowls"
-msgstr ""
+msgstr "plænebowling"
 
 msgctxt "sport"
 msgid "canadian_football"
-msgstr ""
+msgstr "canadisk fodbold"
 
 msgctxt "sport"
 msgid "canoe"
-msgstr ""
+msgstr "kano"
 
 msgctxt "sport"
 msgid "climbing"
-msgstr ""
+msgstr "klatring"
 
 msgctxt "sport"
 msgid "cricket"
-msgstr ""
+msgstr "cricket"
 
 msgctxt "sport"
 msgid "cricket_nets"
-msgstr ""
+msgstr "cricketnet"
 
 msgctxt "sport"
 msgid "croquet"
-msgstr ""
+msgstr "kroket"
 
 msgctxt "sport"
 msgid "cycling"
-msgstr ""
+msgstr "cykling"
 
 msgctxt "sport"
 msgid "dog_racing"
-msgstr ""
+msgstr "hundevæddeløb"
 
 msgctxt "sport"
 msgid "equestrian"
-msgstr ""
+msgstr "ridning"
 
 msgctxt "sport"
 msgid "gaelic_games"
-msgstr ""
+msgstr "gæliske sportsgrene"
 
 msgctxt "sport"
 msgid "golf"
-msgstr ""
+msgstr "golf"
 
 msgctxt "sport"
 msgid "gymnastics"
-msgstr ""
+msgstr "gymnastik"
 
 msgctxt "sport"
 msgid "handball"
-msgstr ""
+msgstr "håndbold"
 
 msgctxt "sport"
 msgid "hockey"
-msgstr ""
+msgstr "hockey"
 
 msgctxt "sport"
 msgid "horse_racing"
-msgstr ""
+msgstr "hestevæddeløb"
 
 msgctxt "sport"
 msgid "motor"
-msgstr ""
+msgstr "motorsport"
 
 msgctxt "sport"
 msgid "pelota"
-msgstr ""
+msgstr "pelota"
 
 msgctxt "sport"
 msgid "racquet"
-msgstr ""
+msgstr "ketsjersport"
 
 msgctxt "sport"
 msgid "rugby_league"
-msgstr ""
+msgstr "13-mands-rugby"
 
 msgctxt "sport"
 msgid "rugby_union"
-msgstr ""
+msgstr "15-mands-rugby"
 
 msgctxt "sport"
 msgid "shooting"
-msgstr ""
+msgstr "skydning"
 
 msgctxt "sport"
 msgid "skateboard"
-msgstr ""
+msgstr "skateboard"
 
 msgctxt "sport"
 msgid "skating"
-msgstr ""
+msgstr "skøjteløb"
 
 msgctxt "sport"
 msgid "skiing"
-msgstr ""
+msgstr "skisport"
 
 msgctxt "sport"
 msgid "soccer"
-msgstr ""
+msgstr "fodbold"
 
 msgctxt "sport"
 msgid "swimming"
-msgstr ""
+msgstr "svømning"
 
 msgctxt "sport"
 msgid "table_tennis"
-msgstr ""
+msgstr "bordtennis"
 
 msgctxt "sport"
 msgid "tennis"
-msgstr ""
+msgstr "tennis"
 
 msgid "Coins"
 msgstr "Mønter"
@@ -16491,12 +16522,90 @@ msgstr "køre igennem"
 msgid "Parking Aisle"
 msgstr "Vej mellem parkeringsbåse"
 
+msgid "Escape"
+msgstr "Evakueringsrampe"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Nødspor, ved siden af lange faldende skråninger til lastbiler og andre "
+"køretøjer, til at stoppe sikkert efter bremsesvigt."
+
 msgid "Road (Unknown Type)"
 msgstr "Vej (ukendt type)"
 
 msgid "Construction"
 msgstr "Under udførelse"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Kryds"
 
@@ -16592,47 +16701,9 @@ msgstr "nej"
 msgid "Roundabout"
 msgstr "Rundkørsel"
 
-msgid "motorway"
-msgstr "motorvej"
-
-msgid "motorway_link"
-msgstr "motorvejsforbindelse"
-
-msgid "trunk"
-msgstr "motortrafikvej"
-
-msgid "trunk_link"
-msgstr "motortrafikvejsforbindelse"
-
-msgid "primary"
-msgstr "primær"
-
-msgid "primary_link"
-msgstr "primær-(til/fra)-kørsel"
-
-msgid "secondary"
-msgstr "sekundær"
-
-msgid "tertiary"
-msgstr "tertiær"
-
-msgid "unclassified"
-msgstr "uklassificeret"
-
-msgid "residential"
-msgstr "beboelse"
-
-msgid "living_street"
-msgstr "legegade"
-
-msgid "service"
-msgstr "service"
-
-msgid "bus_guideway"
-msgstr "bus-ledevej"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "konstruktion"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vadested"
@@ -16734,7 +16805,7 @@ msgstr ""
 
 msgctxt "trail_visibility"
 msgid "bad"
-msgstr ""
+msgstr "dårlig"
 
 msgctxt "trail_visibility"
 msgid "horrible"
@@ -16958,16 +17029,18 @@ msgid "Speed Camera"
 msgstr "Fartkamera"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "Trafikspejl"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Navngivet vejkryds"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Bruges i nogle lande til et navngivet vejkryds hvor navn bruges til lokal "
+"orientering."
 
 msgid "Elevator"
 msgstr "Elevator"
@@ -17465,32 +17538,29 @@ msgstr "Sporskifte"
 msgid "Aerialway"
 msgstr "Luftvej"
 
-msgid "Chair Lift"
-msgstr "Stolelift"
+msgid "Cable Car"
+msgstr "Kabelbane"
 
 msgid "Number of people per hour"
 msgstr "Antal personer per time"
 
-msgid "Number of people per chair"
-msgstr "Antal personer per stol"
+msgid "Number of people per car"
+msgstr "Antal personer per vogn"
 
 msgid "Typical journey time in minutes"
 msgstr "Typisk rejsetid i minutter"
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr "Opvarmet?"
 
-msgid "Drag Lift"
-msgstr "Træklift"
+msgid "Chair Lift"
+msgstr "Stolelift"
 
-msgid "Cable Car"
-msgstr "Kabelbane"
+msgid "Number of people per chair"
+msgstr "Antal personer per stol"
 
-msgid "Number of people per car"
-msgstr "Antal personer per vogn"
+msgid "Has bubble?"
+msgstr ""
 
 msgid "Gondola"
 msgstr "Gondollift"
@@ -17504,17 +17574,25 @@ msgstr "Blandet lift"
 msgid "Number of people per gondola/chair"
 msgstr "Antal personer per gondollift/stol"
 
-msgid "T-bar Lift"
-msgstr "T-træklift"
+msgid "Drag Lift"
+msgstr "Træklift"
 
-msgid "J-bar Lift"
-msgstr "J-træklift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Tallerkenlift"
+msgid "t-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Reblift"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Tæppelift"
@@ -17598,6 +17676,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -17628,12 +17709,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -17829,6 +17913,9 @@ msgstr "Værktøj til gør-det-selv reparationer (kan være et cykel fællesskab
 msgid "Bicycles are washed (for a fee)"
 msgstr "Cykler vaskes (for et beløb)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Offentlig transport"
 
@@ -18087,6 +18174,14 @@ msgstr "Forplads"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr "ja"
+
 msgid "Beacon"
 msgstr "Pejlemærke"
 
@@ -18116,7 +18211,7 @@ msgid "Motel"
 msgstr "Motel"
 
 msgid "Guest House/Bed & Breakfast"
-msgstr "Pensionat/Bed & Breakfast"
+msgstr "Pensionat/Bed & Breakfast"
 
 msgid "Chalet"
 msgstr "Feriehytte"
@@ -19073,10 +19168,10 @@ msgid "track"
 msgstr ""
 
 msgid "Nine-pin Bowling"
-msgstr ""
+msgstr "Ni-kegle-bowling"
 
 msgid "Ten-pin Bowling"
-msgstr ""
+msgstr "Ti-kegle-bowling"
 
 msgid "Archery"
 msgstr "Bueskydning"
@@ -19107,13 +19202,13 @@ msgid "track"
 msgstr ""
 
 msgid "Dog Racing"
-msgstr "Hundeløb"
+msgstr "Hundevæddeløb"
 
 msgid "Equestrian"
 msgstr "Ridning"
 
 msgid "Horse Racing"
-msgstr "Galopbane"
+msgstr "Hestevæddeløb"
 
 msgid "Gymnastics"
 msgstr "Gymnastik"
@@ -19227,7 +19322,7 @@ msgid "Canadian Football"
 msgstr "Canadisk fodbold"
 
 msgid "Gaelic Games"
-msgstr ""
+msgstr "Gæliske sportsgrene"
 
 msgid "Hurling"
 msgstr ""
@@ -19242,10 +19337,10 @@ msgid "Rounders"
 msgstr ""
 
 msgid "Rugby League"
-msgstr ""
+msgstr "13-mands-rugby"
 
 msgid "Rugby Union"
-msgstr ""
+msgstr "15-mands-rugby"
 
 msgid "Baseball"
 msgstr "Baseball"
@@ -19263,13 +19358,13 @@ msgid "Golf"
 msgstr "Golf"
 
 msgid "golf_course"
-msgstr "Golfbane"
+msgstr "golfbane"
 
 msgid "Boule"
-msgstr "Petanque"
+msgstr "Kuglespil"
 
 msgid "Lawn Bowling"
-msgstr ""
+msgstr "Plænebowling"
 
 msgid "Cricket"
 msgstr "Cricket"
@@ -19287,7 +19382,7 @@ msgid "Pelota"
 msgstr "Pelota"
 
 msgid "Racquetball"
-msgstr ""
+msgstr "Ketsjersport"
 
 msgid "Table Tennis/Ping-Pong"
 msgstr "Bordtennis"
@@ -19305,10 +19400,10 @@ msgid "Motocross"
 msgstr "Motocross"
 
 msgid "Safety Training"
-msgstr "Sikkerheds-træning"
+msgstr "Sikkerhedstræning"
 
 msgid "Model Aerodrome"
-msgstr "Model flyveplads"
+msgstr "Modelflyvesport"
 
 msgctxt "aerialway"
 msgid "pitch"
@@ -19323,7 +19418,7 @@ msgid "track"
 msgstr ""
 
 msgid "RC Car"
-msgstr "Fjernstyret bil"
+msgstr "Radiostyret bil"
 
 msgid "Raceway"
 msgstr "Motorbane"
@@ -19332,10 +19427,6 @@ msgid "Man Made"
 msgstr "Menneskeskabt"
 
 msgctxt "building"
-msgid "yes"
-msgstr "ja"
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -19356,15 +19447,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -19438,6 +19529,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Indgang"
 
@@ -20935,8 +21030,8 @@ msgstr ""
 msgid "Protected Area"
 msgstr "Beskyttet område"
 
-msgid "Protected Class"
-msgstr "Beskyttelsesklasse"
+msgid "Protect Class"
+msgstr ""
 
 msgid "Title or type of protection"
 msgstr "Titel eller type af beskyttelse"
@@ -20965,15 +21060,21 @@ msgstr "Storby"
 msgid "Town"
 msgstr "By"
 
-msgid "Suburb"
-msgstr "Forstad"
-
 msgid "Village"
 msgstr "Mindre by"
 
 msgid "Hamlet"
 msgstr "Landsby"
 
+msgid "Isolated Dwelling"
+msgstr "Isoleret bygning"
+
+msgid "Suburb"
+msgstr "Forstad"
+
+msgid "Neighbourhood"
+msgstr "Nabolag"
+
 msgid "Farm"
 msgstr ""
 
@@ -20983,12 +21084,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Isoleret bygning"
-
-msgid "Neighbourhood"
-msgstr "Nabolag"
-
 msgid "Locality"
 msgstr "Egn"
 
@@ -21189,7 +21284,7 @@ msgid "Greenhouse Horticulture"
 msgstr "Drivhusområde"
 
 msgid "Plant Nursery"
-msgstr ""
+msgstr "Planteskole"
 
 msgid "Allotments"
 msgstr "Kolonihaver"
@@ -21201,7 +21296,7 @@ msgid "Grass"
 msgstr "Græs"
 
 msgid "Village Green"
-msgstr ""
+msgstr "Område midt i by"
 
 msgid "Common"
 msgstr "Fælles"
@@ -21509,6 +21604,37 @@ msgstr "Billede"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "ydre segment"
 
@@ -21872,17 +21998,14 @@ msgstr "Test"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -21893,14 +22016,14 @@ msgstr "OpenStreetMap GPS Traces"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Black & White)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, no labels)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
@@ -21932,6 +22055,54 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI black-and-white 2.5m"
 
@@ -21975,7 +22146,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21996,6 +22170,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Czech CUZK:KM"
 
@@ -22126,8 +22306,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22211,6 +22391,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italy"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -22427,17 +22613,17 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr ""
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcels"
@@ -22445,6 +22631,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -22712,6 +22901,9 @@ msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22806,6 +22998,9 @@ msgstr "{0} på et punkt. Bør tegnes som et område."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* på et punkt. Bør bruges i en relation"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} på en vej. Bør bruges i en relation"
 
@@ -24126,10 +24321,10 @@ msgid "merge nodes"
 msgstr ""
 
 msgid "How often thinning operation should be applied (Default {0})."
-msgstr ""
+msgstr "Hvor ofte udtyndingshandling bør anvendes (Standard {0})."
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Udtyndingsgennemløb"
 
 msgid "Street Name:"
 msgstr "Vejnavn:"
@@ -26960,7 +27155,7 @@ msgid "Single segments"
 msgstr ""
 
 msgid "Orthogonal shapes"
-msgstr ""
+msgstr "Retvinklede former"
 
 msgid "Import settings"
 msgstr "Importer indstillinger"
@@ -27967,15 +28162,15 @@ msgid ""
 "Warning: unsupported start element ''{0}'' in changeset content at position "
 "({1},{2}). Skipping."
 msgstr ""
-"Advarsel ikkeunderstøttet startelement ''{0}'' i rettesætsindhold på "
+"Advarsel ikke understøttet startelement ''{0}'' i rettesætsindhold på "
 "position ({1},{2}). Springer over."
 
 msgid ""
 "Warning: unsupported end element ''{0}'' in changeset content at position "
 "({1},{2}). Skipping."
 msgstr ""
-"Advarsel ikkeunderstøttet slutelement ''{0}'' i rettesætsindhold på position "
-"({1},{2}). Springer over."
+"Advarsel ikke understøttet slutelement ''{0}'' i rettesætsindhold på "
+"position ({1},{2}). Springer over."
 
 msgid "Road Sign Plugin"
 msgstr ""
@@ -28215,6 +28410,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Gem SDS fil"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Simplificer område"
 
@@ -28275,9 +28485,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
@@ -29512,14 +29719,17 @@ msgid ""
 "There are several ways containing one of the splitting nodes. Select ways "
 "participating in this operation."
 msgstr ""
+"Der er flere veje, som indeholder en af opsplitningsknudepunkterne. Vælg "
+"veje som indgår i denne handling."
 
 msgid "Symmetry"
-msgstr ""
+msgstr "Symmetri"
 
 msgid ""
 "Please select at least two nodes for symmetry axis and something else to "
 "mirror."
 msgstr ""
+"Vælg mindst to knudepunkter for symmetriakse og noget andet til spejling."
 
 msgid "Copy tags from previous selection"
 msgstr "Kopier tags fra forrige valg"
diff --git a/i18n/po/de.po b/i18n/po/de.po
index d56ffe3..1c4c7d1 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-28 14:30+0000\n"
-"Last-Translator: holgermappt <Unknown>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-30 13:43+0000\n"
+"Last-Translator: Klumbumbus <Unknown>\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: 2014-12-29 04:53+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:51+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: de\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-Basepath: /home/simon/src/josm.all/i18n\n"
@@ -143,7 +143,7 @@ msgid "Display the about screen."
 msgstr "Über dieses Programm"
 
 msgid "Java OpenStreetMap Editor"
-msgstr "Java-OpenStreetMap-Editor"
+msgstr "Java-OpenStreetMap-Bearbeitung"
 
 msgid "Version {0}"
 msgstr "Version {0}"
@@ -232,6 +232,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Keine Zielebenen"
 
+msgid "Select"
+msgstr "Auswahl"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Ausgewählte Elemente auf der Karte auf die obige Liste der ausgewählten "
+"Objekte setzen."
+
 msgid "Add imagery layer {0}"
 msgstr "Hintergrund-Ebene {0} hinzufügen"
 
@@ -2254,9 +2263,6 @@ msgstr ""
 "Abspielposition in der Nähe einer GPS-Spur ablegen, um Audio abzuspielen. "
 "Zusätzliches Drücken der Umschalttaste synchronisiert Audio an diesem Punkt."
 
-msgid "Select"
-msgstr "Auswahl"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Objekte auswählen, bewegen, skalieren und rotieren"
 
@@ -6205,12 +6211,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Dialog-Fenster mit den gewählten Objekten aus der obigen Liste öffnen."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Ausgewählte Elemente auf der Karte auf die obige Liste der ausgewählten "
-"Objekte setzen."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "{0} Konflikt wurde entdeckt."
@@ -10057,10 +10057,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Geschwindigkeit: {0} km/h"
 
 msgid ""
 "\n"
@@ -10086,6 +10086,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-Bilder (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Vorschaubilder anzeigen"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Vorschaubilder an Stelle von Symbolen anzeigen."
+
 msgid "Choose visible tracks"
 msgstr "Sichtbare Spuren auswählen"
 
@@ -11783,7 +11789,7 @@ msgid "3. Select image format"
 msgstr "3. Bildformat auswählen"
 
 msgid "4. Verify generated WMS URL"
-msgstr "4. Generierte MWS-URL überprüfen"
+msgstr "4. Generierte WMS-URL überprüfen"
 
 msgid "5. Enter name for this layer"
 msgstr "5. Diese Ebene benennen"
@@ -12334,8 +12340,8 @@ msgstr "Integriert:"
 msgid "Projection bounds (in degrees)"
 msgstr "Projektionsgrenzen (in Grad)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG-Code)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Setzt den SRS-Parameter in der WMS-Anfrage"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -15832,7 +15838,7 @@ msgid ""
 "Analyse a set of GPS points to obtain its centre and direction of spread."
 msgstr ""
 "Einen Satz von GPS-Punkten analysieren, um das Zentrum und "
-"Aubreitungsrichtugen zu bestimmen."
+"Ausbreitungsrichtungen zu bestimmen."
 
 msgid "Allows to filter out unnecessary GPS tracks"
 msgstr "Filtert nicht benötigte GPS-Spuren"
@@ -15850,7 +15856,7 @@ msgid ""
 "Database of imagery offsets: share and aquire imagery offsets with one "
 "button."
 msgstr ""
-"Datebank der Bildversätze: Teilen und übernehmen Sie Bildversätze mit nur "
+"Datenbank der Bildversätze: Teilen und übernehmen Sie Bildversätze mit nur "
 "einer Schaltfläche."
 
 msgid "WMSPlugin-style imagery adjustment mapmode"
@@ -15982,7 +15988,7 @@ msgid "Convert data from Open Data portals to OSM layer"
 msgstr "Konvertiert Daten aus Open-Data-Portalen in eine OSM-Ebene"
 
 msgid "extended options for editing opening_hours"
-msgstr "erweiterte Optionen um Öffnungszeiten zu bearbeiten"
+msgstr "erweiterte Optionen zum Bearbeiten von Öffnungszeiten"
 
 msgid ""
 "Allows opening gpx/osm files that intersect the currently visible screen area"
@@ -16021,8 +16027,8 @@ msgid ""
 "This plugin allows to display any picture as a background in the editor and "
 "align it with the map."
 msgstr ""
-"Dieses Plugin erlaubt es, beliebige Bilder als Hintergrund im Editor "
-"darzustellen und an der Karte auszurichten."
+"Diese Erweiterung erlaubt es, beliebige Bilder als Hintergrund in der "
+"Bearbeitung darzustellen und an der Karte auszurichten."
 
 msgid "The great JGoodies Plastic Look and Feel."
 msgstr "Das großartige Plastic-Design von JGoodies."
@@ -16080,6 +16086,12 @@ msgstr "Bietet Routenführungsmöglichkeiten."
 msgid "Loads data from SDS"
 msgstr "Daten werden von SDS geladen"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Hintergrund-Bildebene für Seekarten"
+
+msgid "Edit features for Sea Charts"
+msgstr "Bearbeitungsfunktionen für Seekarten"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16159,7 +16171,7 @@ msgstr ""
 "Abbiegeeinschränkungen in der OpenStreetMap-Datenbank."
 
 msgid "Allows undeleting object from OSM database"
-msgstr "Erlaubt es Objekte der OSM-Datenbank wiederherzustellen"
+msgstr "Erlaubt es, Objekte der OSM-Datenbank wiederherzustellen"
 
 msgid "Several utilities that make your life easier."
 msgstr "Diverse Werkzeuge, die das Leben einfacher machen."
@@ -16293,7 +16305,7 @@ msgid "Tunnel"
 msgstr "Tunnel"
 
 msgid "Cutting"
-msgstr "Senke"
+msgstr "Einschnitt"
 
 msgid "Embankment"
 msgstr "Straßendamm"
@@ -17103,12 +17115,90 @@ msgstr "Durchfahrtsbedienung"
 msgid "Parking Aisle"
 msgstr "Parkplatzweg"
 
+msgid "Escape"
+msgstr "Notfallspur"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Notfallspur neben längeren Gefällestrecken für Lastwagen und andere "
+"Fahrzeuge, um sicher nach Ausfall der Bremse zu stoppen."
+
 msgid "Road (Unknown Type)"
 msgstr "Unbekannter Straßentyp"
 
 msgid "Construction"
 msgstr "Baustelle"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "Autobahn"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "Autobahnanschluss"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "Schnellstraße"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "Schnellstraßenanschluss"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "Bundesstraße"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "Bundesstraßenanschluss"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "Landesstraße"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "Landesstraßenanschluss"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "Kreisstraße"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "Kreisstraßenanschluss"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "Spurbusstraße"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "Reitweg"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "Verkehrsberuhigter Bereich (Spielstraße)"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "Fußgängerzone"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "Feld- oder Waldweg"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "Ausgewiesener Fußweg"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "Treppe"
+
 msgid "Junction"
 msgstr "Kreuzung"
 
@@ -17204,45 +17294,7 @@ msgstr "nein"
 msgid "Roundabout"
 msgstr "Kreisverkehr"
 
-msgid "motorway"
-msgstr "Autobahn"
-
-msgid "motorway_link"
-msgstr "Autobahnanschluss"
-
-msgid "trunk"
-msgstr "Schnellstraße"
-
-msgid "trunk_link"
-msgstr "Schnellstraßenanschluss"
-
-msgid "primary"
-msgstr "Bundesstraße"
-
-msgid "primary_link"
-msgstr "Bundesstraßenanschluss"
-
-msgid "secondary"
-msgstr "Landesstraße"
-
-msgid "tertiary"
-msgstr "Kreisstraße"
-
-msgid "unclassified"
-msgstr "Verbindungsstraße"
-
-msgid "residential"
-msgstr "Wohngebiet"
-
-msgid "living_street"
-msgstr "Spielstraße"
-
-msgid "service"
-msgstr "Service"
-
-msgid "bus_guideway"
-msgstr "Spurbus"
-
+msgctxt "Highway"
 msgid "construction"
 msgstr "Baustelle"
 
@@ -18061,7 +18113,7 @@ msgid "Traffic lights"
 msgstr "Lichtsignal"
 
 msgid "Barrier"
-msgstr "Barriere"
+msgstr "Schranken"
 
 msgctxt "crossing:barrier"
 msgid "yes"
@@ -18101,32 +18153,29 @@ msgstr "Weiche"
 msgid "Aerialway"
 msgstr "Seilbahn"
 
-msgid "Chair Lift"
-msgstr "Sessellift"
+msgid "Cable Car"
+msgstr "Kabinenbahn"
 
 msgid "Number of people per hour"
 msgstr "Anzahl Personen je Stunde"
 
-msgid "Number of people per chair"
-msgstr "Anzahl Personen je Sessel"
+msgid "Number of people per car"
+msgstr "Anzahl Personen je Fahrzeug"
 
 msgid "Typical journey time in minutes"
 msgstr "Typische Reisezeit in Minuten"
 
-msgid "Has bubble?"
-msgstr "Kabine vorhanden?"
-
 msgid "Has heating?"
 msgstr "Heizung vorhanden?"
 
-msgid "Drag Lift"
-msgstr "Schlepplift"
+msgid "Chair Lift"
+msgstr "Sessellift"
 
-msgid "Cable Car"
-msgstr "Kabinenbahn"
+msgid "Number of people per chair"
+msgstr "Anzahl Personen je Sessel"
 
-msgid "Number of people per car"
-msgstr "Anzahl Personen je Fahrzeug"
+msgid "Has bubble?"
+msgstr "Kuppel vorhanden?"
 
 msgid "Gondola"
 msgstr "Gondelbahn"
@@ -18140,16 +18189,26 @@ msgstr "Gemischter Lift"
 msgid "Number of people per gondola/chair"
 msgstr "Anzahl Personen je Gondel/Sessel"
 
-msgid "T-bar Lift"
-msgstr "T-Schlepplift"
+msgid "Drag Lift"
+msgstr "Schlepplift"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"Schlepplift (allgemeiner Typ - nur dann benutzen, wenn exakter Typ (Werte "
+"siehe unten) unbekannt ist)"
 
-msgid "J-bar Lift"
-msgstr "J-Schlepplift"
+msgid "t-bar"
+msgstr "T-Bügel-Schlepplift"
 
-msgid "Platter Lift"
+msgid "j-bar"
+msgstr "J-Bügel-Schlepplift"
+
+msgid "platter"
 msgstr "Tellerlift"
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr "Seil-Schlepplift"
 
 msgid "Magic Carpet"
@@ -18234,6 +18293,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18264,12 +18326,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18466,6 +18531,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Fahrräder werden gewaschen (gegen eine Gebühr)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Öffentliche Fahrradservicestation"
+
 msgid "Public Transport"
 msgstr "Öffentlicher Verkehr"
 
@@ -18724,6 +18792,14 @@ msgstr "Vorfeld"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "Hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "ja"
+
 msgid "Beacon"
 msgstr "Bake"
 
@@ -19968,10 +20044,6 @@ msgid "Man Made"
 msgstr "Zivilisationsbauten"
 
 msgctxt "building"
-msgid "yes"
-msgstr "ja"
-
-msgctxt "building"
 msgid "roof"
 msgstr "Dach"
 
@@ -19992,16 +20064,16 @@ msgid "school"
 msgstr "Schule"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "Hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "Gewerblich"
 
 msgctxt "building"
-msgid "farm"
-msgstr "Bauernhof"
+msgid "barn"
+msgstr "Scheune"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "unbewohntes Gebäude auf einem Bauernhof"
 
 msgctxt "building"
 msgid "transportation"
@@ -20074,6 +20146,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "freistehend"
 
+msgctxt "building"
+msgid "farm"
+msgstr "Wohngebäude auf einem Bauernhof"
+
 msgid "Entrance"
 msgstr "Eingang"
 
@@ -21573,7 +21649,7 @@ msgstr "Nationalpark"
 msgid "Protected Area"
 msgstr "Schutzgebiet"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Schutzklasse"
 
 msgid "Title or type of protection"
@@ -21603,15 +21679,21 @@ msgstr "Großstadt"
 msgid "Town"
 msgstr "Stadt"
 
-msgid "Suburb"
-msgstr "Stadtteil"
-
 msgid "Village"
 msgstr "Dorf"
 
 msgid "Hamlet"
 msgstr "Weiler"
 
+msgid "Isolated Dwelling"
+msgstr "Abgelegene Wohnstätte"
+
+msgid "Suburb"
+msgstr "Stadtteil"
+
+msgid "Neighbourhood"
+msgstr "Nachbarschaft"
+
 msgid "Farm"
 msgstr "Bauernhof"
 
@@ -21621,12 +21703,6 @@ msgstr "Ein Bauernhof innerhalb einer größeren Siedlung"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(bitte ''Abgelegene Wohnstätte'' für isolierten Bauernhof verwenden)"
 
-msgid "Isolated Dwelling"
-msgstr "Abgelegene Wohnstätte"
-
-msgid "Neighbourhood"
-msgstr "Nachbarschaft"
-
 msgid "Locality"
 msgstr "Unbewohnter Ort"
 
@@ -22159,6 +22235,42 @@ msgstr "Bild"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Kontakt (Schema mit ''contact:*''-Präfixen)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Ein kurzer Text mit zusätzlichen Informationen."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Kann für den Endanwender sichtbar sein (etwa bei Verwendung einer "
+"Suchfunktion oder durch Einblendungen auf einer Karte)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Ähnlich, aber verschiedene Schlagwörter:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Hinweis"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+"Ein wichtiger Hinweis für andere Kartierer (nicht für den Endanwender)."
+
+msgid "Fixme"
+msgstr "Korrekturnotiz (fixme)"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Ein Hinweis für andere Kartierer (nicht für den Endanwender), dass ein "
+"Objekt verbessert werden muss."
+
 msgid "outer segment"
 msgstr "Äußeres Segment"
 
@@ -22522,17 +22634,14 @@ msgstr "Test"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr "Bing Luftbild"
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitäres OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr "Mapbox Satellitenbild"
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22543,14 +22652,14 @@ msgstr "OpenStreetMap GPS-Spuren"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Schwarz & Weiß)"
+msgstr "OpenStreetMap (Mapnik Schwarz&Weiß)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, keine Bezeichnungen)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr "OpenStreetMap (Mapnik, ohne Beschriftungen)"
 
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
@@ -22582,6 +22691,54 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Locator Overlay"
+msgstr "Orientierungs-Overlay"
+
+msgid "QA No Address"
+msgstr "Qualitätssicherung keine Adressen"
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Waymarked Trails: Wanderwege"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Waymarked Trails: Radwege"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Waymarked Trails: Mountainbike-Routen"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Waymarked Trails: Inline-Skating"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Waymarked Trails: Reiten"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Waymarked Trails: Wintersportpisten"
+
+msgid "OSM Inspector: Geometry"
+msgstr "OSM Inspector: Geometry"
+
+msgid "OSM Inspector: Tagging"
+msgstr "OSM Inspector: Tagging"
+
+msgid "OSM Inspector: Places"
+msgstr "OSM Inspector: Places"
+
+msgid "OSM Inspector: Highways"
+msgstr "OSM Inspector: Highways"
+
+msgid "OSM Inspector: Multipolygon"
+msgstr "OSM Inspector: Multipolygon"
+
+msgid "OSM Inspector: Routing"
+msgstr "OSM Inspector: Routing"
+
+msgid "OSM Inspector: Addresses"
+msgstr "OSM Inspector: Addresses"
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr "OSM Inspector: Boundaries (EU)"
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI Schwarzweiß 2.5m"
 
@@ -22624,9 +22781,13 @@ msgstr "VoGIS: DOM (Oberflächenmodell)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"AGIV (Flandern) Luftbilder (deckt auch die Brüsseler Region mit ab) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW(allonie) 2012 Luftbilder"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW(allonie) 2009 Luftbilder"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -22646,6 +22807,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Britisch-Kolumbien Luftbildplan"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Kelowna Straßen Overlay"
+
 msgid "Czech CUZK:KM"
 msgstr "Tschechisches CUZK:KM"
 
@@ -22765,7 +22932,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburg (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburg (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburg (DK5)"
@@ -22776,8 +22943,8 @@ msgstr "Bayern (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr "Erlangen Luftbild (2013 6,25 cm)"
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22861,6 +23028,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italien"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Südtirol Orthofoto 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Südtirol Topokarte"
+
 msgid "USSR - Latvia"
 msgstr "UdSSR - Lettland"
 
@@ -23077,17 +23250,17 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr "USGS Topographische Karten"
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Straßeneinblendung"
+msgid "TIGER 2012 Roads Overlay"
+msgstr "TIGER 2012 Straßen Overlay"
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "Neue und falsch ausgerichtete TIGER Straßen (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr "Neue & falsch ausgerichtete TIGER Straßen (2014)"
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parzellen"
@@ -23095,6 +23268,9 @@ msgstr "MassGIS L3 Parzellen"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr "U.S. Waldwege"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -23362,6 +23538,9 @@ msgstr "OS Stadtpläne, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Stadtpläne, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Absteigende Hausnummern in Adressinterpolation"
 
@@ -23458,7 +23637,7 @@ msgstr ""
 "oder ''both''."
 
 msgid "{0} on a node. Should be used on a way."
-msgstr "{0} auf einem Knotenpunkt. Sollte auf einem Weg verwendet werden."
+msgstr "{0} auf einem Knotenpunkt. Sollte auf einer Linie verwendet werden."
 
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} auf einem Knotenpunkt. Sollte als eine Fläche gezeichnet werden."
@@ -23466,8 +23645,11 @@ msgstr "{0} auf einem Knotenpunkt. Sollte als eine Fläche gezeichnet werden."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* auf einem Punkt. Sollte in einer Relation verwendet werden."
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} auf einer Linie. Sollte auf einem Knotenpunkt verwendet werden."
+
 msgid "{0} on a way. Should be used in a relation"
-msgstr "{0} auf einem Weg. Sollte in einer Relation verwendet werden"
+msgstr "{0} auf einer Linie. Sollte in einer Relation verwendet werden"
 
 msgid "{0} on a node"
 msgstr "{0} auf einem Punkt"
@@ -23491,7 +23673,7 @@ msgid "Overlapping Identical Landuses"
 msgstr "Überlappende Landnutzungen mit gleichem Typ"
 
 msgid "{0} must be connected to a way"
-msgstr "{0} müssen mit einem Weg verbunden sein"
+msgstr "{0} muss mit einer Linie verbunden sein"
 
 msgid "abbreviated street name"
 msgstr "Abgekürzter Straßenname"
@@ -23500,7 +23682,7 @@ msgid "wrong highway tag on a node"
 msgstr "Falsches Straßenmerkmal auf einem Punkt"
 
 msgid "wrong crossing tag on a way"
-msgstr "Falscher Übergangs-Merkmal auf einem Weg"
+msgstr "Falsches Übergangs-Merkmal auf einem Weg"
 
 msgid "Unnamed unclassified highway"
 msgstr "Unbenannte klassenlose Straße"
@@ -24194,7 +24376,7 @@ msgid "Use tag ''addr:street'' or ''addr:place''"
 msgstr "Nutze Schlüssel ''addr:street'' oder ''addr:place''"
 
 msgid "House Number Editor"
-msgstr "Hausnummerneditor"
+msgstr "Hausnummernbearbeitung"
 
 msgid "House number increment:"
 msgstr "Hausnummern-Schrittweite"
@@ -29257,6 +29439,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "SDS-Datei speichern"
 
+msgid "No object selected"
+msgstr "Kein Objekt ausgewählt"
+
+msgid "SeaMap Editor"
+msgstr "SeaMap-Bearbeitung"
+
+msgid "Seamark Inspector"
+msgstr "Schifffahrtszeichen-Inspektor (Seamark Inspector)"
+
+msgid "Select only one object"
+msgstr "Nur ein Objekt auswählen"
+
+msgid "Select a map object"
+msgstr "Ein Kartenobjekt auswählen"
+
 msgid "Simplify Area"
 msgstr "Fläche vereinfachen"
 
@@ -29330,9 +29527,6 @@ msgstr "Distanzfaktor"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Schwellwert zum Vereinen naheliegender Punkte"
 
-msgid "SeaMap Editor"
-msgstr "SeaMap Editor"
-
 msgid "AutoSave LiveData"
 msgstr "Live-Daten automatisch speichern"
 
@@ -29397,7 +29591,7 @@ msgid "Launches the tag editor dialog"
 msgstr "Merkmalseditor aufrufen"
 
 msgid "JOSM Tag Editor Plugin"
-msgstr "JOSM Merkmalseditor-Plugin"
+msgstr "JOSM-Schlagwortbearbeitungserweiterung"
 
 msgid "Abort tag editing and close dialog"
 msgstr "Merkmalsbearbeitung abbrechen und Dialog schließen"
@@ -30113,7 +30307,7 @@ msgid "Remove deleted members and save"
 msgstr "Gelöschte Elemente entfernen und speichern"
 
 msgid "Cancel and return to editor"
-msgstr "Abbrechen und zum Editor zurückkehren"
+msgstr "Abbrechen und zur Bearbeitung zurückkehren"
 
 msgid "Deleted members in turn restriction"
 msgstr "Gelöschte Mitglieder in Abbiegebeschränkung"
diff --git a/i18n/po/de_DE.po b/i18n/po/de_DE.po
index 19a142f..a4d396f 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-07-10 12:32+0000\n"
 "Last-Translator: ralekuja <Unknown>\n"
 "Language-Team: German (Germany) <de_DE at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:39+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:34+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -220,6 +220,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Keine Zielebenen"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Lufbild-Ebene {0} hinzufügen"
 
@@ -2045,9 +2052,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5620,10 +5624,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9057,7 +9057,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9078,6 +9078,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11047,7 +11053,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14230,6 +14236,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15222,12 +15234,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15323,45 +15411,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16196,31 +16246,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16235,16 +16282,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16329,6 +16384,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16359,12 +16417,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16560,6 +16621,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16818,6 +16882,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18061,10 +18133,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18085,15 +18153,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18167,6 +18235,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19664,7 +19736,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19694,28 +19766,28 @@ msgstr ""
 msgid "Town"
 msgstr "Ort"
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr "Dorf"
 
 msgid "Hamlet"
 msgstr "Weiler"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20233,6 +20305,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20596,16 +20699,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20617,13 +20717,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20656,6 +20756,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20699,7 +20847,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20720,6 +20871,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20848,7 +21005,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20931,6 +21088,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21147,16 +21310,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21165,6 +21328,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21432,6 +21598,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21524,6 +21693,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26862,6 +27034,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26922,9 +27109,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/el.po b/i18n/po/el.po
index 5e9d1ea..7c8ed1d 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-10-28 23:48+0000\n"
 "Last-Translator: aitolos <Unknown>\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: 2014-12-29 04:55+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:53+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: el\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -223,6 +223,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Δεν υπάρχουν επίπεδα στόχοι"
 
+msgid "Select"
+msgstr "Επιλογή"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Προσθήκη επιπέδου υπόβαθρου εικόνων {0}"
 
@@ -2182,9 +2189,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Επιλογή"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Επιλογή, μετακίνηση, κλίμακα και περιστροφή αντικειμένων"
 
@@ -5852,10 +5856,6 @@ msgstr ""
 "Άνοιγμα διαλόγου συγχώνευσης για όλα τα επιλεγμένα αντικείμενα στην παραπάνω "
 "λίστα."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Εντοπίστηκε {0} διένεξη"
@@ -9375,10 +9375,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} χμ/ω"
 
 msgid ""
 "\n"
@@ -9398,6 +9396,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Εικόνες JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11396,7 +11400,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14621,6 +14625,12 @@ msgstr "Παρέχει δυνατότητες δρομολόγησης."
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15616,12 +15626,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Δρόμος (Άγνωστος Τύπος)"
 
 msgid "Construction"
 msgstr "Υπό κατασκευή"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Κόμβος"
 
@@ -15717,47 +15803,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Κυκλικός κόμβος"
 
-msgid "motorway"
-msgstr "Αυτοκινητόδρομος"
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr "πρωτεύων"
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr "δευτερεύων"
-
-msgid "tertiary"
-msgstr "τριτεύων"
-
-msgid "unclassified"
-msgstr "αταξινόμητος"
-
-msgid "residential"
-msgstr "Οικιστική"
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "υπό κατασκευή"
+msgstr ""
 
 msgid "Ford"
 msgstr "Κοιτόστρωση"
@@ -16590,31 +16638,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Εναέρια"
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16629,16 +16674,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
+
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16723,6 +16776,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16753,12 +16809,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16954,6 +17013,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Πλύσιμο ποδηλάτων (επί πληρωμή)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Μέσα Μαζικής Μεταφοράς"
 
@@ -17212,6 +17274,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "(ραδιο)Φάρος"
 
@@ -18455,10 +18525,6 @@ msgid "Man Made"
 msgstr "Τεχνητά"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18479,15 +18545,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18561,6 +18627,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Είσοδος"
 
@@ -20058,7 +20128,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20088,15 +20158,21 @@ msgstr "Πόλη"
 msgid "Town"
 msgstr "Κωμόπολη"
 
-msgid "Suburb"
-msgstr "Προάστιο"
-
 msgid "Village"
 msgstr "Χωριό"
 
 msgid "Hamlet"
 msgstr "Οικισμός"
 
+msgid "Isolated Dwelling"
+msgstr ""
+
+msgid "Suburb"
+msgstr "Προάστιο"
+
+msgid "Neighbourhood"
+msgstr "Γειτονιά"
+
 msgid "Farm"
 msgstr ""
 
@@ -20106,12 +20182,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr ""
-
-msgid "Neighbourhood"
-msgstr "Γειτονιά"
-
 msgid "Locality"
 msgstr "Τοπονύμιο/Περιοχή"
 
@@ -20627,6 +20697,37 @@ msgstr "Εικόνα"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "εξωτερικός τομέας"
 
@@ -20990,16 +21091,13 @@ msgstr "Δοκιμή"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21011,13 +21109,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21050,6 +21148,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21093,7 +21239,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21114,6 +21263,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21242,7 +21397,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21325,6 +21480,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21541,16 +21702,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21559,6 +21720,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21826,6 +21990,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21918,6 +22085,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27286,6 +27456,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27346,9 +27531,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/en_AU.po b/i18n/po/en_AU.po
index 0b89311..68b012b 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 14:03+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\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: 2014-12-29 05:36+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:32+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -217,6 +217,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "No target layers"
 
+msgid "Select"
+msgstr "Select"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Set the selected elements on the map to the selected items in the list above."
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2082,9 +2090,6 @@ msgstr ""
 "Drag play head and release near track to play audio from there; "
 "SHIFT+release to synchronise audio at that point."
 
-msgid "Select"
-msgstr "Select"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5745,11 +5750,6 @@ msgstr "Resolve"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Open a merge dialogue of all selected items in the list above."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Set the selected elements on the map to the selected items in the list above."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "There was {0} conflict detected."
@@ -9363,10 +9363,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9386,6 +9384,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG images (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11481,7 +11485,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14846,6 +14850,12 @@ msgstr "Provides routing capabilities."
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15847,12 +15857,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Parking Aisle"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Road (Unknown Type)"
 
 msgid "Construction"
 msgstr "Construction"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Junction"
 
@@ -15948,47 +16034,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Roundabout"
 
-msgid "motorway"
-msgstr "motorway"
-
-msgid "motorway_link"
-msgstr "motorway_link"
-
-msgid "trunk"
-msgstr "trunk"
-
-msgid "trunk_link"
-msgstr "trunk_link"
-
-msgid "primary"
-msgstr "primary"
-
-msgid "primary_link"
-msgstr "primary_link"
-
-msgid "secondary"
-msgstr "secondary"
-
-msgid "tertiary"
-msgstr "tertiary"
-
-msgid "unclassified"
-msgstr "unclassified"
-
-msgid "residential"
-msgstr "residential"
-
-msgid "living_street"
-msgstr "living_street"
-
-msgid "service"
-msgstr "service"
-
-msgid "bus_guideway"
-msgstr "bus_guideway"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "construction"
+msgstr ""
 
 msgid "Ford"
 msgstr "Ford"
@@ -16821,31 +16869,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Aerialway"
 
-msgid "Chair Lift"
-msgstr "Chair Lift"
+msgid "Cable Car"
+msgstr "Cable Car"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Drag Lift"
+msgid "Chair Lift"
+msgstr "Chair Lift"
 
-msgid "Cable Car"
-msgstr "Cable Car"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16860,16 +16905,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Drag Lift"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16954,6 +17007,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16984,12 +17040,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -17185,6 +17244,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Public Transport"
 
@@ -17443,6 +17505,14 @@ msgstr "Apron"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Beacon"
 
@@ -18686,10 +18756,6 @@ msgid "Man Made"
 msgstr "Man Made"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18710,15 +18776,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18792,6 +18858,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Entrance"
 
@@ -20289,7 +20359,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20319,28 +20389,28 @@ msgstr "City"
 msgid "Town"
 msgstr "Town"
 
-msgid "Suburb"
-msgstr "Suburb"
-
 msgid "Village"
 msgstr "Village"
 
 msgid "Hamlet"
 msgstr "Hamlet"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Suburb"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20858,6 +20928,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "outer segment"
 
@@ -21221,16 +21322,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21242,13 +21340,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21281,6 +21379,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21324,7 +21470,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21345,6 +21494,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21473,7 +21628,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21556,6 +21711,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21772,16 +21933,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21790,6 +21951,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22057,6 +22221,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22149,6 +22316,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27558,6 +27728,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27618,9 +27803,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "AutoSave LiveData"
 
diff --git a/i18n/po/en_CA.po b/i18n/po/en_CA.po
index fb3ac39..15ebf40 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2010-09-24 17:25+0000\n"
 "Last-Translator: Johann Beda <Unknown>\n"
 "Language-Team: English (Canada) <en_CA at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:39+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:35+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -217,6 +217,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "No target layers"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2042,9 +2049,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5617,10 +5621,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9054,7 +9054,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9075,6 +9075,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11044,7 +11050,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14224,6 +14230,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15216,12 +15228,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15317,45 +15405,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16190,31 +16240,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16229,16 +16276,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16323,6 +16378,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16353,12 +16411,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16554,6 +16615,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16812,6 +16876,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18055,10 +18127,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18079,15 +18147,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18161,6 +18229,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19658,7 +19730,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19688,28 +19760,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20227,6 +20299,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20590,16 +20693,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20611,13 +20711,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20650,6 +20750,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20693,7 +20841,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20714,6 +20865,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20842,7 +20999,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20925,6 +21082,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21141,16 +21304,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21159,6 +21322,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21426,6 +21592,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21518,6 +21687,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26852,6 +27024,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26912,9 +27099,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/en_GB.po b/i18n/po/en_GB.po
index 8e6f91e..1c8840d 100644
--- a/i18n/po/en_GB.po
+++ b/i18n/po/en_GB.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: JOSM\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-09-20 20:07+0000\n"
 "Last-Translator: Andi Chandler <Unknown>\n"
 "Language-Team: German <josm-dev at openstreetmap.org>\n"
@@ -18,8 +18,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:36+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:31+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: de\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -227,6 +227,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "No target layers"
 
+msgid "Select"
+msgstr "Select"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Set the selected elements on the map to the selected items in the list above."
+
 msgid "Add imagery layer {0}"
 msgstr "Add imagery layer {0}"
 
@@ -2187,9 +2195,6 @@ msgstr ""
 "Drag play head and release near track to play audio from there; "
 "SHIFT+release to synchronise audio at that point."
 
-msgid "Select"
-msgstr "Select"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Select, move, scale and rotate objects"
 
@@ -6007,11 +6012,6 @@ msgstr "Resolve"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Open a merge dialogue of all selected items in the list above."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Set the selected elements on the map to the selected items in the list above."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "There was {0} conflict detected."
@@ -9748,10 +9748,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9777,6 +9775,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG images (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Choose visible tracks"
 
@@ -11939,8 +11943,8 @@ msgstr "Built-in:"
 msgid "Projection bounds (in degrees)"
 msgstr "Projection bounds (in degrees)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -15552,6 +15556,12 @@ msgstr "Provides routing capabilities."
 msgid "Loads data from SDS"
 msgstr "Loads data from SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16569,12 +16579,88 @@ msgstr "drive-through"
 msgid "Parking Aisle"
 msgstr "Parking Aisle"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Road (Unknown Type)"
 
 msgid "Construction"
 msgstr "Construction"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Junction"
 
@@ -16670,47 +16756,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Roundabout"
 
-msgid "motorway"
-msgstr "motorway"
-
-msgid "motorway_link"
-msgstr "motorway_link"
-
-msgid "trunk"
-msgstr "trunk"
-
-msgid "trunk_link"
-msgstr "trunk_link"
-
-msgid "primary"
-msgstr "primary"
-
-msgid "primary_link"
-msgstr "primary_link"
-
-msgid "secondary"
-msgstr "secondary"
-
-msgid "tertiary"
-msgstr "tertiary"
-
-msgid "unclassified"
-msgstr "unclassified"
-
-msgid "residential"
-msgstr "residential"
-
-msgid "living_street"
-msgstr "living_street"
-
-msgid "service"
-msgstr "service"
-
-msgid "bus_guideway"
-msgstr "bus_guideway"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "construction"
+msgstr ""
 
 msgid "Ford"
 msgstr "Ford"
@@ -17560,32 +17608,29 @@ msgstr "Railway switch"
 msgid "Aerialway"
 msgstr "Aerialway"
 
-msgid "Chair Lift"
-msgstr "Chair Lift"
+msgid "Cable Car"
+msgstr "Cable Car"
 
 msgid "Number of people per hour"
 msgstr "Number of people per hour"
 
-msgid "Number of people per chair"
-msgstr "Number of people per chair"
+msgid "Number of people per car"
+msgstr "Number of people per car"
 
 msgid "Typical journey time in minutes"
 msgstr "Typical journey time in minutes"
 
-msgid "Has bubble?"
-msgstr "Has bubble?"
-
 msgid "Has heating?"
 msgstr "Has heating?"
 
-msgid "Drag Lift"
-msgstr "Drag Lift"
+msgid "Chair Lift"
+msgstr "Chair Lift"
 
-msgid "Cable Car"
-msgstr "Cable Car"
+msgid "Number of people per chair"
+msgstr "Number of people per chair"
 
-msgid "Number of people per car"
-msgstr "Number of people per car"
+msgid "Has bubble?"
+msgstr "Has bubble?"
 
 msgid "Gondola"
 msgstr "Gondola"
@@ -17599,17 +17644,25 @@ msgstr "Mixed lift"
 msgid "Number of people per gondola/chair"
 msgstr "Number of people per gondola/chair"
 
-msgid "T-bar Lift"
-msgstr "T-bar lift"
+msgid "Drag Lift"
+msgstr "Drag Lift"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "J-bar Lift"
-msgstr "J-bar lift"
+msgid "t-bar"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Platter lift"
+msgid "j-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Rope tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Magic carpet"
@@ -17693,6 +17746,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -17723,12 +17779,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -17924,6 +17983,9 @@ msgstr "Tools for do-it-yourself repair (may be a bike co-operative)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Bicycles are washed (for a fee)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Public Transport"
 
@@ -18182,6 +18244,14 @@ msgstr "Apron"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr "yes"
+
 msgid "Beacon"
 msgstr "Beacon"
 
@@ -19426,10 +19496,6 @@ msgid "Man Made"
 msgstr "Man Made"
 
 msgctxt "building"
-msgid "yes"
-msgstr "yes"
-
-msgctxt "building"
 msgid "roof"
 msgstr "roof"
 
@@ -19450,15 +19516,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -19532,6 +19598,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Entrance"
 
@@ -21029,7 +21099,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21059,28 +21129,28 @@ msgstr "City"
 msgid "Town"
 msgstr "Town"
 
-msgid "Suburb"
-msgstr "Suburb"
-
 msgid "Village"
 msgstr "Village"
 
 msgid "Hamlet"
 msgstr "Hamlet"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Suburb"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -21600,6 +21670,37 @@ msgstr "Image"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "outer segment"
 
@@ -21963,16 +22064,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21984,13 +22082,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -22023,6 +22121,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -22066,7 +22212,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22087,6 +22236,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -22215,7 +22370,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22298,6 +22453,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22514,16 +22675,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22532,6 +22693,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22799,6 +22963,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Decreasing house numbers in addresses interpolation"
 
@@ -22895,6 +23062,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -28401,6 +28571,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -28461,9 +28646,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "AutoSave LiveData"
 
diff --git a/i18n/po/eo.po b/i18n/po/eo.po
index 62751a3..23195be 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\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: 2014-12-29 04:47+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:46+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: eo\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2038,9 +2045,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5613,10 +5617,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9050,7 +9050,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9071,6 +9071,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11040,7 +11046,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14224,6 +14230,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15216,12 +15228,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15317,45 +15405,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16190,31 +16240,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16229,16 +16276,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16323,6 +16378,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16353,12 +16411,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16554,6 +16615,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16812,6 +16876,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18055,10 +18127,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18079,15 +18147,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18161,6 +18229,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Enirejo"
 
@@ -19658,7 +19730,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19688,28 +19760,28 @@ msgstr ""
 msgid "Town"
 msgstr "Urbeto"
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr "Vilaĝo"
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20227,6 +20299,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20590,16 +20693,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20611,13 +20711,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20650,6 +20750,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20693,7 +20841,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20714,6 +20865,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20842,7 +20999,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20925,6 +21082,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21141,16 +21304,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21159,6 +21322,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21426,6 +21592,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21518,6 +21687,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26852,6 +27024,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26912,9 +27099,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/es.po b/i18n/po/es.po
index 3ec520c..ef490ed 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-11 08:31+0000\n"
-"Last-Translator: Omar Vega <ovruni at gnu.org.pe>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-28 20:03+0000\n"
+"Last-Translator: pertile <leopoldofederico at gmail.com>\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: 2014-12-29 05:25+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:19+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: es\n"
 "X-Language: es_ES\n"
 "X-Source-Language: C\n"
@@ -225,6 +225,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "No hay capas objetivo"
 
+msgid "Select"
+msgstr "Seleccionar"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Selecciona en el mapa los elementos seleccionados en la lista superior."
+
 msgid "Add imagery layer {0}"
 msgstr "Agregar capa de imágenes {0}"
 
@@ -2229,9 +2237,6 @@ msgstr ""
 "reproducir audio desde ese punto; usa MAYUS+soltar para sincronizar el audio "
 "en ese punto."
 
-msgid "Select"
-msgstr "Seleccionar"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Seleccionar, mover, escalar y girar los objetos"
 
@@ -4120,7 +4125,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Busca errores en etiquetas relacionadas a Internet."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " La URL no puede ser convertida a ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4349,19 +4354,22 @@ msgstr "La relación está vacía"
 
 msgid "Role member does not match expression {0} in template {1}"
 msgstr ""
+"El rol del miembro no concuerda con la expresión {0} en la planilla {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
 msgstr ""
+"El tipo de rol de miembro {0} no coincide con la lista aceptada de {1} en la "
+"plantilla {2}"
 
 msgid "<empty>"
 msgstr "<vacío>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Rol {0} desconocido en plantillas {1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "Se encontró rol vacío cuando se esperaba uno de {0}"
 
 msgid "Role {0} missing"
 msgstr "Falta el rol {0}"
@@ -4920,35 +4928,39 @@ msgid "options provided as Java system properties"
 msgstr "opciones proporcionadas como propiedades de sistema Java"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/PATH/TO/JOSM/PREF    "
 
 msgid "Set the preferences directory"
-msgstr ""
+msgstr "Fija el directorio de preferencias"
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/PATH/TO/JOSM/USERDATA"
 
 msgid "Set the user data directory"
-msgstr ""
+msgstr "Fija el directorio de datos del usuario"
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/PATH/TO/JOSM/CACHE   "
 
 msgid "Set the cache directory"
-msgstr ""
+msgstr "Fija el directorio de memoria intermedia"
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/PATH/TO/JOSM/HOMEDIR "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
 "homedir/cache"
 msgstr ""
+"Reubicar los 3 directorios en homedir. El directorio de memoria intermedia "
+"estará en homedir/cache"
 
 msgid ""
 "-Djosm.home has lower precedence, i.e. the specific setting overrides the "
 "general one"
 msgstr ""
+"-Djosm.home tiene precedencia inferior, es decir que los parámetros "
+"específicos pisan el parámetro general"
 
 msgid ""
 "note: For some tasks, JOSM needs a lot of memory. It can be necessary to add "
@@ -5232,7 +5244,7 @@ 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 ""
+msgstr "Por defecto (abierto, cerrado, nuevo)"
 
 msgid "Username"
 msgstr "Nombre de usuario"
@@ -5244,7 +5256,7 @@ msgid "Last change date"
 msgstr "Última fecha de modificación"
 
 msgid "Select note sorting method"
-msgstr ""
+msgstr "Seleccionar el método de ordenamiento de notas"
 
 msgid "Click to cancel the current operation"
 msgstr "Haga clic para cancelar la operación actual"
@@ -5443,10 +5455,10 @@ msgid "Conflict foreground: keep all tags"
 msgstr "Conflicto de primer plano: conserve todas las etiquetas"
 
 msgid "Conflict background: sum all numeric tags"
-msgstr ""
+msgstr "Conflicto de segundo plano: sumar todas las etiquetas numéricas"
 
 msgid "Conflict foreground: sum all numeric tags"
-msgstr ""
+msgstr "Conflicto de primer plano: sumar todas las etiquetas numéricas"
 
 msgid "Conflict background: keep member"
 msgstr "Conflicto de fondo: mantenga el miembro"
@@ -5933,7 +5945,7 @@ msgid "all"
 msgstr "todos"
 
 msgid "sum"
-msgstr ""
+msgstr "suma"
 
 msgid "Please decide which values to keep"
 msgstr "Por favor, decida que valores hay que mantener"
@@ -5944,6 +5956,8 @@ msgstr "El valor ''{0}'' será aplicado a la clave ''{1}''"
 msgid ""
 "All numeric values sumed as ''{0}'' are going to be applied for key ''{1}''"
 msgstr ""
+"Todos los valores numéricos sumados como ''{0}'' van a ser aplicados a la "
+"clave ''{1}''"
 
 msgid "The key ''{0}'' and all its values are going to be removed"
 msgstr "La clave ''{0}'' y todos sus valores serán suprimidos"
@@ -6199,11 +6213,6 @@ msgstr ""
 "Abrir una ventana de diálogo de unión para todos los elementos seleccionados "
 "en la lista superior."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Selecciona en el mapa los elementos seleccionados en la lista superior."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Se ha detectado {0} conflicto."
@@ -10029,7 +10038,7 @@ msgid "Delete File from disk"
 msgstr "Borrar archivo del disco"
 
 msgid "Copy image path"
-msgstr ""
+msgstr "Copiar la ruta de la imagen"
 
 msgid "Next"
 msgstr "Siguiente"
@@ -10061,10 +10070,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Velocidad: {0} km/h"
 
 msgid ""
 "\n"
@@ -10090,6 +10099,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imágenes JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Mostrar miniaturas"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Show miniaturas de imágenes en lugar de íconos."
+
 msgid "Choose visible tracks"
 msgstr "Elegir trazas visibles"
 
@@ -12346,8 +12361,8 @@ msgstr "Incorporado:"
 msgid "Projection bounds (in degrees)"
 msgstr "Límites de proyección (en grados)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (código EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Fija el parámetro SRS=... en la solicitud WMS"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -13888,7 +13903,7 @@ msgstr ""
 "Hay un valor ilegal número(long) para el atributo \"{0}\". Se obtuvo \"{1}\"."
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "{0} bytes han sido leídos"
 
 msgid "Prepare OSM data..."
 msgstr "Preparando datos OSM..."
@@ -14081,7 +14096,7 @@ msgstr ""
 "No se puede iniciar el servidor de control remoto en el puerto {0}: {1}"
 
 msgid "RemoteControl::Accepting connections on {0}:{1}"
-msgstr ""
+msgstr "RemoteControl::Accptando conexiones en {0}:{1}"
 
 msgid "RemoteControl::Server stopped."
 msgstr "ControlRemoto::El servidor fue detenido"
@@ -14093,7 +14108,7 @@ msgid "Unable to initialize Remote Control HTTPS Server"
 msgstr "No se puede inicializar Control Remoto sobre Servidor HTTPS"
 
 msgid "RemoteControl::Accepting secure connections on {0}:{1}"
-msgstr ""
+msgstr "RemoteControl::Aceptando conexiones seguras en {0}:{1}"
 
 msgid "RemoteControl::Server (https) stopped."
 msgstr "ControlRemoto:::Servidor (https) se detuvo."
@@ -16104,6 +16119,12 @@ msgstr "Proporciona capacidades de enrutamiento."
 msgid "Loads data from SDS"
 msgstr "Carga datos desde SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Capa de imágenes aéreas para Cartas Marinas"
+
+msgid "Edit features for Sea Charts"
+msgstr "Editar características para Cartas Marinas"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -17133,12 +17154,91 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Pasillo de aparcamiento"
 
+msgid "Escape"
+msgstr "Vía de detención de emergencia"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Carril de emergencias al costado de descensos pronunciados para que camiones "
+"y otros vehículos puedan detenerse de forma segura tras un fallo en los "
+"frenos."
+
 msgid "Road (Unknown Type)"
 msgstr "Carretera (tipología desconocida)"
 
 msgid "Construction"
 msgstr "En construcción"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "autopista"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "Enlace a autopista"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "Carretera principal"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "Enlace a carretera principal"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "primaria"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "Enlace a carretera primaria"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "secundaria"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "Enlace a carretera secundaria"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "terciaria"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "Enlace a acarretera terciaria"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "vía para autobús guiado"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "camino de herradura dedicado"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "callle residencial"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "peatonal"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "pista"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "acera peatonal dedicada"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "escaleras"
+
 msgid "Junction"
 msgstr "Intersección"
 
@@ -17234,47 +17334,9 @@ msgstr "no"
 msgid "Roundabout"
 msgstr "Rotonda"
 
-msgid "motorway"
-msgstr "Autopista"
-
-msgid "motorway_link"
-msgstr "Acceso a autopista"
-
-msgid "trunk"
-msgstr "Carretera principal"
-
-msgid "trunk_link"
-msgstr "Enlace de carretera principal"
-
-msgid "primary"
-msgstr "vía primaria"
-
-msgid "primary_link"
-msgstr "acceso a vía primaria"
-
-msgid "secondary"
-msgstr "vía secundaria"
-
-msgid "tertiary"
-msgstr "carretera local"
-
-msgid "unclassified"
-msgstr "carretera sin clasificación"
-
-msgid "residential"
-msgstr "calle urbana"
-
-msgid "living_street"
-msgstr "calle residencial"
-
-msgid "service"
-msgstr "vía de servicio"
-
-msgid "bus_guideway"
-msgstr "carril bus guiado"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "en construcción"
+msgstr "construcción"
 
 msgid "Ford"
 msgstr "Vado"
@@ -17539,7 +17601,7 @@ msgid "tiger"
 msgstr "tigre"
 
 msgid "Button operated"
-msgstr ""
+msgstr "Operado por botón"
 
 msgid "Sound signals"
 msgstr "Señales sonoras"
@@ -17614,16 +17676,18 @@ msgid "Speed Camera"
 msgstr "Rádar de tráfico"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "Espejo para tráfico"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Intersección vial con nombre"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Utilizado en algunos países para una intersección vial cuyo nombre sirve "
+"para la orientación en el área local"
 
 msgid "Elevator"
 msgstr "Ascensor"
@@ -18131,32 +18195,29 @@ msgstr "Interruptor de vías"
 msgid "Aerialway"
 msgstr "Remonte"
 
-msgid "Chair Lift"
-msgstr "Telesilla"
+msgid "Cable Car"
+msgstr "Telecabina"
 
 msgid "Number of people per hour"
 msgstr "Número de personas por hora"
 
-msgid "Number of people per chair"
-msgstr "Número de personas por silla"
+msgid "Number of people per car"
+msgstr "Número de personas por coche"
 
 msgid "Typical journey time in minutes"
 msgstr "Tiempo de viaje típico en cuestión de minutos"
 
-msgid "Has bubble?"
-msgstr "¿Tiene cápsula protectora?"
-
 msgid "Has heating?"
 msgstr "¿Está calefactado?"
 
-msgid "Drag Lift"
-msgstr "Telearrastre"
+msgid "Chair Lift"
+msgstr "Telesilla"
 
-msgid "Cable Car"
-msgstr "Telecabina"
+msgid "Number of people per chair"
+msgstr "Número de personas por silla"
 
-msgid "Number of people per car"
-msgstr "Número de personas por coche"
+msgid "Has bubble?"
+msgstr "¿Tiene cápsula protectora?"
 
 msgid "Gondola"
 msgstr "Góndola"
@@ -18170,17 +18231,27 @@ msgstr "Telemix (sillas y cabinas)"
 msgid "Number of people per gondola/chair"
 msgstr "Número de personas por góndola/silla"
 
-msgid "T-bar Lift"
-msgstr "Telesquí T-bar"
+msgid "Drag Lift"
+msgstr "Telearrastre"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"drag_lift (tipo genérico - utilice solamente si el tipo exacto [ver valores "
+"debajo] no se conoce)"
 
-msgid "J-bar Lift"
-msgstr "Telesquí J-bar"
+msgid "t-bar"
+msgstr "Barra T"
 
-msgid "Platter Lift"
-msgstr "Telesquí"
+msgid "j-bar"
+msgstr "Barra J"
 
-msgid "Rope Tow"
-msgstr "Telecuerda"
+msgid "platter"
+msgstr "Plato de elevación"
+
+msgid "rope_tow"
+msgstr "Por cuerda"
 
 msgid "Magic Carpet"
 msgstr "Alfombra mágica"
@@ -18264,6 +18335,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18294,12 +18368,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18497,6 +18574,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Se lavan bicicletas (pagando)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Estación Pública de Reparación de Bicicletas"
+
 msgid "Public Transport"
 msgstr "Transporte público"
 
@@ -18755,6 +18835,14 @@ msgstr "Plataforma de estacionamiento"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "sí"
+
 msgid "Beacon"
 msgstr "Baliza"
 
@@ -19083,7 +19171,7 @@ msgid "Fireplace"
 msgstr "Barbacoa"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Mesa de picnic"
 
 msgid "Public Grill"
 msgstr "Barbacoa pública"
@@ -19693,10 +19781,10 @@ msgid "Count"
 msgstr "Cuenta"
 
 msgid "Advertising Column"
-msgstr ""
+msgstr "Columna para publicidad"
 
 msgid "Billboard"
-msgstr ""
+msgstr "Cartel"
 
 msgid "Sports"
 msgstr "Deportes"
@@ -20001,10 +20089,6 @@ msgid "Man Made"
 msgstr "Hecho por el hombre"
 
 msgctxt "building"
-msgid "yes"
-msgstr "sí"
-
-msgctxt "building"
 msgid "roof"
 msgstr "tejado"
 
@@ -20025,16 +20109,16 @@ msgid "school"
 msgstr "escuela"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "comercial"
 
 msgctxt "building"
-msgid "farm"
-msgstr "granja"
+msgid "barn"
+msgstr "granero"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "auxiliar para campo o granja"
 
 msgctxt "building"
 msgid "transportation"
@@ -20107,6 +20191,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "vivienda unifamiliar"
 
+msgctxt "building"
+msgid "farm"
+msgstr "granja"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -20164,7 +20252,7 @@ msgid "Gasometer"
 msgstr "Gasómetro"
 
 msgid "Bunker Silo"
-msgstr ""
+msgstr "Silo de búnker"
 
 msgid "Pipeline"
 msgstr "Tubería"
@@ -20319,7 +20407,7 @@ msgid "Tide Level"
 msgstr "Nivel de la marea"
 
 msgid "Groundwater"
-msgstr ""
+msgstr "Agua subterránea"
 
 msgid "Traffic"
 msgstr "Tráfico"
@@ -21194,15 +21282,15 @@ msgstr "Cable de energía"
 
 msgctxt "power cable"
 msgid "underground"
-msgstr ""
+msgstr "subterráneo"
 
 msgctxt "power cable"
 msgid "underwater"
-msgstr ""
+msgstr "submarino"
 
 msgctxt "power cable"
 msgid "overground"
-msgstr ""
+msgstr "en superficie"
 
 msgid "Historic Places"
 msgstr "Lugares históricos"
@@ -21606,8 +21694,8 @@ msgstr "Parque Nacional"
 msgid "Protected Area"
 msgstr "Área Protegida"
 
-msgid "Protected Class"
-msgstr "Clase protegida"
+msgid "Protect Class"
+msgstr "Nivel de protección"
 
 msgid "Title or type of protection"
 msgstr "Título o tipo de protección"
@@ -21636,11 +21724,6 @@ msgstr "Ciudad (>100.000 hab.)"
 msgid "Town"
 msgstr "Ciudad (10.000 - 100.000 hab.)"
 
-msgid "Suburb"
-msgstr ""
-"Poblamiento compacto (grandes barrios, suburbios, polígonos de viviendas, "
-"distritos, etc.)"
-
 msgid "Village"
 msgstr "Población (< 10.000 hab.)"
 
@@ -21648,6 +21731,18 @@ msgid "Hamlet"
 msgstr ""
 "Poblamiento laxo (pequeños barrios, aldeas, caseríos, diseminados, etc.)"
 
+msgid "Isolated Dwelling"
+msgstr "Vivienda aislada"
+
+msgid "Suburb"
+msgstr ""
+"Poblamiento compacto (grandes barrios, suburbios, polígonos de viviendas, "
+"distritos, etc.)"
+
+msgid "Neighbourhood"
+msgstr ""
+"Vecindario (área de un lugar habitado, urbanización, colonia, barrio, etc.)"
+
 msgid "Farm"
 msgstr "Granja"
 
@@ -21657,13 +21752,6 @@ msgstr "Una granja dentro de un establecimiento mayor"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(por favor utilice isolated_dwelling para una granja aislada)"
 
-msgid "Isolated Dwelling"
-msgstr "Vivienda aislada"
-
-msgid "Neighbourhood"
-msgstr ""
-"Vecindario (área de un lugar habitado, urbanización, colonia, barrio, etc.)"
-
 msgid "Locality"
 msgstr "Paraje"
 
@@ -22198,6 +22286,42 @@ msgstr "Imagen"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contacto (esquema con el prefijo ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Un texto breve con información adicional"
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Puede ser visible al usuario final (quizás utilizando un sistema de búsqueda "
+"o un mapa con elementos emergentes)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Etiquetas similiares pero diferentes:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+"Una sugerencia importante para otros mapeadores (no para el usuario final)"
+
+msgid "Fixme"
+msgstr "Corrígeme"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Una sugerencia para otros mapeadores (no para el usuario final), de que un "
+"objeto necesita una mejora."
+
 msgid "outer segment"
 msgstr "segmento exterior"
 
@@ -22561,17 +22685,14 @@ msgstr "Prueba"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Equipo Humanitario de OSM)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22582,14 +22703,14 @@ msgstr "Trazas de GPS OpenStreetMap"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Blanco & Negro)"
+msgstr "OpenStreetMap (Mapnik blanco y negro)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik sin etiquetas)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr "OpenStreetMap (Mapnik, sin etiquetas)"
 
 msgid "skobbler heatmap"
 msgstr "mapa de calor de skobbler"
@@ -22621,6 +22742,54 @@ msgstr "Mapa de calor de ciclismo Strava"
 msgid "Strava running heatmap"
 msgstr "Mapa de calor para corredores de Strava"
 
+msgid "Locator Overlay"
+msgstr "Superponer ubicador"
+
+msgid "QA No Address"
+msgstr "QA Sin dirección"
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Pistas de Waymarked: senderismo"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Pistas de Waymarked: ciclismo"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Pistas de Waymarked: ciclismo de montaña"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Pistas de Waymarked: skating"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Pistas de Waymarked: cabalgata"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Pistas de Waymarked: deportes de invierno"
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI blanco y negro 2.5m"
 
@@ -22663,9 +22832,13 @@ msgstr "VoGIS: DOM (modelo de superficie)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"Imagen aérea AGIV(laanderen), cubre también la región de Bruselas (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "Imagen aérea SPW(allonie) 2012"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "Imagen aérea SPW(allonie) 2009"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Sectores Urbanos"
@@ -22685,6 +22858,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Mosaico de Columbia Británica"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Superposición de callejero de Kelowna"
+
 msgid "Czech CUZK:KM"
 msgstr "Chequia CUZK:KM"
 
@@ -22716,13 +22895,13 @@ msgid "Estonia Ortho (Maaamet)"
 msgstr "Estonia Ortofoto (Maaamet)"
 
 msgid "Estonia Hillshade (Maaamet)"
-msgstr ""
+msgstr "Estonia Hillshade (Maaamet)"
 
 msgid "Estonia Cadastre (Maaamet)"
-msgstr ""
+msgstr "Catastral de Estonia (Maaamet)"
 
 msgid "Estonia Forestry (Maaamet)"
-msgstr ""
+msgstr "Bosques de Estonia (Maaamet)"
 
 msgid "Bordeaux - 2012"
 msgstr "Burdeos - 2012"
@@ -22803,7 +22982,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburgo (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburgo (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburgo (DK5)"
@@ -22814,8 +22993,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22860,7 +23039,7 @@ msgid "NRW-Atlas: Topographische Karte 1:10000"
 msgstr "NRW-Atlas: Mapa topográfico 1:10000"
 
 msgid "Metropole Ruhr: Luftbilder (10 cm)"
-msgstr ""
+msgstr "Área metropolitana de Rurh: Luftbilder (10 cm)"
 
 msgid "Drone Imagery (Haiti)"
 msgstr "Imágenes aéreas de drones (Haití)"
@@ -22901,6 +23080,12 @@ msgstr "PCN 2008 - IT Lacio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italia"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Tirol Sur Ortofoto 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Tirol Sur Topomapa"
+
 msgid "USSR - Latvia"
 msgstr "URSS - Letonia"
 
@@ -22920,10 +23105,10 @@ msgid "Luxembourg Inspire Ortho 2013"
 msgstr "Luxemburgo Inspire Ortho 2013"
 
 msgid "Luxembourg Inspire Railway"
-msgstr ""
+msgstr "Ferrocarril Inspire Luxemburgo"
 
 msgid "Luxembourg Inspire Roads"
-msgstr ""
+msgstr "Rutas Inspire de Luxemburgo"
 
 msgid "Niger Delta Oct 2012 Landsat"
 msgstr "Delta del Níger Oct 2012"
@@ -23055,7 +23240,7 @@ msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Cantón Aargau 25cm (AGIS 2011)"
 
 msgid "Kanton Aargau 25cm (AGIS 2014)"
-msgstr ""
+msgstr "Cantón de Aargau 25cm (AGIS 2014)"
 
 msgid "Stadt Uster Orthophoto 2008 10cm"
 msgstr "Stadt Uster Ortofoto 2008 10cm"
@@ -23067,7 +23252,7 @@ msgid "Stadt Zürich Übersichtsplan (Strassen, Gebäude, Hausnummer)"
 msgstr "Stadt Zürich Übersichtsplan (Strassen, Gebäude, Hausnummer)"
 
 msgid "Stadt Zürich Luftbild 2011"
-msgstr ""
+msgstr "Ciudad de Zürich Luftbild 2011"
 
 msgid "Orthofoto Kanton Solothurn RGB (SOGIS 2011/2012/2013)"
 msgstr "Ortofoto Kanton Solothurn RGB (SOGIS 2011/2012/2013)"
@@ -23088,7 +23273,7 @@ msgid "Canton de Fribourg 50cm (2005)"
 msgstr "Cantón de Friburgo 50cm (2005)"
 
 msgid "Stadt Bern 10cm/25cm (2012)"
-msgstr ""
+msgstr "Ciudad de Berna 10cm/25cm (2012)"
 
 msgid "HEIG-VD / Orthophoto Yverdon-les-Bains 25cm (2007)"
 msgstr "HEIG-VD / Orthofoto Yverdon-les-Bains 25cm (2007)"
@@ -23117,16 +23302,16 @@ msgstr "MSR Mapas Topográficos"
 msgid "MSR Maps Urban"
 msgstr "MSR Mapas Urbanos"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Mapas Topográficos Escaneados"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "Imágenes aéreas grandes USGS"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM EEUU TIGER 2012 Superposición de Caminos"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -23135,6 +23320,9 @@ msgstr "MassGIS L3 Parcelas"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Últimas Ortoimágenes"
 
+msgid "U.S. Forest Service roads"
+msgstr "Callejero del servicio de Bosques de EEUU"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ucrania - Ortofotomapas 2012"
 
@@ -23175,232 +23363,235 @@ msgid "NLS - Bartholomew Half Inch, 1897-1907"
 msgstr "NLS - Bartolomé Media Pulgada, 1897-1907"
 
 msgid "OS Town Plans, Aberdeen 1866-1867 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Aberden 1866-1867 (NLS)"
 
 msgid "OS Town Plans, Airdrie 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Airdrie 1858 (NLS)"
 
 msgid "OS Town Plans, Alexandria 1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Alejandría 1859 (NLS)"
 
 msgid "OS Town Plans, Alloa 1861-1862 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Alloa 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Annan 1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Annan 1859 (NLS)"
 
 msgid "OS Town Plans, Arbroath 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Arbroath 1858 (NLS)"
 
 msgid "OS Town Plans, Ayr 1855 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Ayr 1855 (NLS)"
 
 msgid "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Berwick-upon-Tweed 1852 (NLS)"
 
 msgid "OS Town Plans, Brechin 1862 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Brechin 1862 (NLS)"
 
 msgid "OS Town Plans, Burntisland 1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Burntisland 1894 (NLS)"
 
 msgid "OS Town Plans, Campbelton 1865 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Campbelton 1865 (NLS)"
 
 msgid "OS Town Plans, Coatbridge 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Coatbridge 1858 (NLS)"
 
 msgid "OS Town Plans, Cupar 1854 (NLS)"
 msgstr "OS Planos de la Ciudad, Cupar 1854 (NLS)"
 
 msgid "OS Town Plans, Cupar 1893-1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Cupar 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1852 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dalkeith 1852 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dalkeith 1893 (NLS)"
 
 msgid "OS Town Plans, Dumbarton 1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dumbarton 1859 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1850 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dumfries 1850 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dumfries 1893 (NLS)"
 
 msgid "OS Town Plans, Dundee 1857-1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dundee 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Dundee 1870-1872 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dundee 1870-1872 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1854 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dunfermline 1854 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Dunfermline 1894 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1849-1851 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Edimburgo 1849-1851 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1876-1877 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Edimburgo 1876-1877 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1893-1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Edimburgo 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Elgin 1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Elgin 1868 (NLS)"
 
 msgid "OS Town Plans, Falkirk 1858-1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Falkirk 1858-1859 (NLS)"
 
 msgid "OS Town Plans, Forfar 1860-1861 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Forfar 1860-1861 (NLS)"
 
 msgid "OS Town Plans, Forres 1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Forres 1868 (NLS)"
 
 msgid "OS Town Plans, Galashiels 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Galashiels 1858 (NLS)"
 
 msgid "OS Town Plans, Girvan 1857 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Girvan 1857 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1857-1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Glasgow 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1892-1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Glasgow 1892-1894 (NLS)"
 
 msgid "OS Town Plans, Greenock 1857 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Greenock 1857 (NLS)"
 
 msgid "OS Town Plans, Haddington 1853 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Haddington 1853 (NLS)"
 
 msgid "OS Town Plans, Haddington 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Haddington 1893 (NLS)"
 
 msgid "OS Town Plans, Hamilton 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Hamilton 1858 (NLS)"
 
 msgid "OS Town Plans, Hawick 1857-1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Hawick 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Inverness 1867-1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Inverness 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Irvine 1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Irvine 1859 (NLS)"
 
 msgid "OS Town Plans, Jedburgh 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Jedburgh 1858 (NLS)"
 
 msgid "OS Town Plans, Kelso 1857 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kelso 1857 (NLS)"
 
 msgid "OS Town Plans, Kilmarnock 1857-1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kilmarnock 1857-1859 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1855 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirkcaldy 1855 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirkcaldy 1894 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1850 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirkcudbright 1850 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirkcudbright 1893 (NLS)"
 
 msgid "OS Town Plans, Kirkintilloch 1859 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirkintilloch 1859 (NLS)"
 
 msgid "OS Town Plans, Kirriemuir 1861 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Kirriemuir 1861 (NLS)"
 
 msgid "OS Town Plans, Lanark 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Lanark 1858 (NLS)"
 
 msgid "OS Town Plans, Linlithgow 1856 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Linlithgow 1856 (NLS)"
 
 msgid "OS Town Plans, Mayole 1856-1857 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Mayole 1856-1857 (NLS)"
 
 msgid "OS Town Plans, Montrose 1861-1862 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Montrose 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1853 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Musselburgh 1853 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Musselburgh 1893 (NLS)"
 
 msgid "OS Town Plans, Nairn 1867-1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Nairn 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Oban 1867-1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Oban 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Peebles 1856 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Peebles 1856 (NLS)"
 
 msgid "OS Town Plans, Perth 1860 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Perth 1860 (NLS)"
 
 msgid "OS Town Plans, Peterhead 1868 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Peterhead 1868 (NLS)"
 
 msgid "OS Town Plans, Port Glasgow 1856-1857 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Port Glasgow 1856-1857 (NLS)"
 
 msgid "OS Town Plans, Portobello 1893-1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Portobello 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Rothesay 1862-1863 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Rothesay 1862-1863 (NLS)"
 
 msgid "OS Town Plans, Selkirk 1865 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Selkirk 1865 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1854 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, St Andrews 1854 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, St Andrews 1893 (NLS)"
 
 msgid "OS Town Plans, Stirling 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Stirling 1858 (NLS)"
 
 msgid "OS Town Plans, Stonehaven 1864 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Stonehaven 1864 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1847 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Stranraer 1847 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1863-1877 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Stranraer 1863-1877 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1893 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Stranraer 1893 (NLS)"
 
 msgid "OS Town Plans, Strathaven 1858 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Strathaven 1858 (NLS)"
 
 msgid "OS Town Plans, Wick 1872 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Wick 1872 (NLS)"
 
 msgid "OS Town Plans, Wigtown 1848 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Wigtown 1848 (NLS)"
 
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
-msgstr ""
+msgstr "Planos urbanos OS, Wigtown 1894 (NLS)"
+
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
 
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Decrementando números de portal en la interpolación de portales"
@@ -23415,7 +23606,7 @@ msgid "{0} without {1}, {2} or {3}"
 msgstr "{0} sin {1}, {2} o {3}"
 
 msgid "{0} together with {1}"
-msgstr ""
+msgstr "{0} junto con {1}"
 
 msgid "{0} on suspicious object"
 msgstr "{0} en objeto sospechoso"
@@ -23436,10 +23627,10 @@ msgid "{0} should be on the node where {1} and {2} intersect"
 msgstr "{0} debería estar en el nodo donde {1} y {2} se intersectan"
 
 msgid "alternative name without {0}"
-msgstr ""
+msgstr "nombre alternativo sin {0}"
 
 msgid "incomplete usage of {0} on a way without {1}"
-msgstr ""
+msgstr "uso incompleto de {0} en lugar de {1}"
 
 msgid "{0}={1} is deprecated"
 msgstr "{0}={1} está obsoleto"
@@ -23473,36 +23664,46 @@ msgstr ""
 msgid ""
 "{0} is deprecated. Please specify interval by using opening_hours syntax"
 msgstr ""
+"{0} está en desuso. Por favor especifique el intervalo utilizando la "
+"sintaxis de opening_hours"
 
 msgid ""
 "{0} is deprecated. Please delete this object and use a private layer instead"
 msgstr ""
+"{0} está en desuso. Por favor elimine este objeto y utilice una capa privada "
+"en su lugar"
 
 msgid "{0}={1} is unspecific. Please replace ''{1}'' by a specific value."
 msgstr ""
+"{0}={1} no es específico. Por favor reemplace''{1}'' con un valor específico."
 
 msgid "{0} should be replaced with {1}"
-msgstr ""
+msgstr "{0} debería ser reemplazado con {1}"
 
 msgid "{0} = {1}; remove {0}"
-msgstr ""
+msgstr "{0} = {1}; eliminar {0}"
 
 msgid ""
 "{0}={1} is unspecific. Please replace ''{1}'' by ''left'', ''right'' or "
 "''both''."
 msgstr ""
+"{0}={1} no es específico. Por favor reemplace ''{1}'' con ''izquierda'', "
+"''derecha'' o ''ambos''."
 
 msgid "{0} on a node. Should be used on a way."
-msgstr ""
+msgstr "{0} sobre un nodo. Debería ser utilizado sobre una vía."
 
 msgid "{0} on a node. Should be drawn as an area."
-msgstr ""
+msgstr "{0} sobre un nodo. Debería ser dibujado como un área."
 
 msgid "{0}=* on a node. Should be used in a relation"
-msgstr ""
+msgstr "{0}=* sobre un nodo. Debería ser utilizado en una relación"
+
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} sobre una vía. Debería ser utilizado en un nodo."
 
 msgid "{0} on a way. Should be used in a relation"
-msgstr ""
+msgstr "{0} sobre una vía. Debería ser utilizado en una relación"
 
 msgid "{0} on a node"
 msgstr "{0} en un nodo"
@@ -23526,7 +23727,7 @@ msgid "Overlapping Identical Landuses"
 msgstr "Utilizaciones del suelo idénticas superpuestas"
 
 msgid "{0} must be connected to a way"
-msgstr ""
+msgstr "{0} debe estar conectado a una vía"
 
 msgid "abbreviated street name"
 msgstr "nombre de calle abreviado"
@@ -23553,12 +23754,14 @@ msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
 "''{3}'' instead."
 msgstr ""
+"El valor de ''{0}'' debería ser ''{1}'' o ''{2}''. Para veredas utilice "
+"''{3}'' en su lugar."
 
 msgid "{0} with multiple values"
 msgstr "{0} con múltiples valores"
 
 msgid "empty value in semicolon-separated ''{0}''"
-msgstr ""
+msgstr "valor vacío separado por punto y coma ''{0}''"
 
 msgid "numerical key"
 msgstr "tecla numérica"
@@ -23598,7 +23801,7 @@ msgid "{0} must be a numeric value"
 msgstr "{0} debe ser un valor numérico"
 
 msgid "{0} must be a positive integer number"
-msgstr ""
+msgstr "{0} debe ser un número entero positivo"
 
 msgid "relation without type"
 msgstr "relation sin type"
@@ -24912,7 +25115,7 @@ msgstr ""
 "manera podemos encontrar el origen del problema."
 
 msgid "Area detection algorithm settings."
-msgstr ""
+msgstr "Preferencias del algoritmo de detección de áreas."
 
 msgid "Algorithm Settings"
 msgstr "Configuración del Algoritmo"
@@ -24960,10 +25163,10 @@ msgid "merge nodes"
 msgstr "combinar nodos"
 
 msgid "How often thinning operation should be applied (Default {0})."
-msgstr ""
+msgstr "Cuán seguido debería aplicarse la operación (por defecto {0})."
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Iteraciones de afinamiento"
 
 msgid "Street Name:"
 msgstr "Nombre de Calle:"
@@ -28263,6 +28466,8 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Hacer clic y arrastrar la foto, mayús+clic para ubicar la foto, control+clic "
+"para fijar la dirección"
 
 msgid "Please load some photos."
 msgstr "Por favor cargue algunas fotos."
@@ -28942,7 +29147,7 @@ msgid "Reconstruct polygons from relation {0}"
 msgstr "Reconstruir polígonos a partir de la relación {0}"
 
 msgid "Reconstruct route"
-msgstr ""
+msgstr "Reconstruir la ruta"
 
 msgid "Open relation wiki page"
 msgstr "Abrir la página de la wiki relacionada"
@@ -28984,10 +29189,10 @@ msgid "Way without ''inner'' or ''outer'' role found"
 msgstr "Se encontró una vía sin e lrol ''iner'' o ''outer''"
 
 msgid "Node without ''stop'' or ''platform'' role found"
-msgstr ""
+msgstr "Se encontró un nodo sin el rol ''stop'' oo ''platform''"
 
 msgid "Way platform without ''platform'' role found"
-msgstr ""
+msgstr "Se encontró una plataforma vía sin el rol ''platform''."
 
 msgid "Revert changeset fully"
 msgstr "Conjunto de cambios revertido en su totalidad"
@@ -29318,6 +29523,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Guardar archivo SDS"
 
+msgid "No object selected"
+msgstr "No se seleccionaron objetos."
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr "Seamark Inspector"
+
+msgid "Select only one object"
+msgstr "Seleccione únicamente un objeto"
+
+msgid "Select a map object"
+msgstr "Seleccione un objeto del mapa"
+
 msgid "Simplify Area"
 msgstr "Simplificar aŕea"
 
@@ -29392,9 +29612,6 @@ msgstr "Factor de Distancia"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Umbral de Combinación de Nodos Cercanos"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "Autograbar LiveData"
 
@@ -29522,7 +29739,7 @@ msgid "create an associatedStreet relation"
 msgstr "crear una relación de asociación de calle"
 
 msgid "keep outline way"
-msgstr ""
+msgstr "mantener la vía de contorno"
 
 msgid "Street name: "
 msgstr "Nombre de calle: "
@@ -30019,13 +30236,13 @@ msgid "Automatically fixes the issue."
 msgstr "Corrige automáticamente los inconvenientes."
 
 msgid "Selects the offending relation."
-msgstr "Selecciona la relación transfresora"
+msgstr "Selecciona la relación transgresora."
 
 msgid "Add turn"
 msgstr "Añadir giro"
 
 msgid "Delete lane."
-msgstr "Borrar calle."
+msgstr "Borrar carril."
 
 msgid "Delete turn."
 msgstr "Borrar giro."
@@ -30049,22 +30266,21 @@ msgid "Create/Edit turn restriction..."
 msgstr "Crear/Editar restricción de giro..."
 
 msgid "Create or edit a turn restriction."
-msgstr "Crear o editar restricción de giro."
+msgstr "Crear o editar una restricción de giro."
 
 msgid ""
 "In the following table you can edit the <strong>raw tags</strong> of the OSM "
 "relation representing this turn restriction."
 msgstr ""
-"En la siguiente tabla puede editar <strong>manualmente las "
-"etiquetas</strong> de la relación OSM que representa esta restricción de "
-"giro."
+"En la siguiente tabla puede editar las <strong>etiquetas en blanco</strong> "
+"de la relación OSM que representa esta restricción de giro."
 
 msgid ""
 "In the following table you can edit the <strong>raw members</strong> of the "
 "OSM relation representing this turn restriction."
 msgstr ""
-"En la siguiente tabla puede editar <strong>manualmente los miembros</strong> "
-"de la relación OSM que representa esta restricción de giro."
+"En la siguiente tabla puede editar los<strong>miembros en blanco</strong> de "
+"la relación OSM que representa esta restricción de giro."
 
 msgid "Type:"
 msgstr "Tipo:"
@@ -30096,13 +30312,15 @@ msgstr "Limpiar los roles seleccionados o borrar los miembros seleccionados"
 
 msgid "Insert new relation members from object in the clipboard"
 msgstr ""
-"Insertar una nueva relación de miembros desde el objeto en el portapapeles"
+"Insertar  nuevos miembros de la relación desde el objeto en el portapapeles"
 
 msgid "Move the selected relation members down by one position"
-msgstr "Mover los miembros de relación seleccionados una posición abajo"
+msgstr ""
+"Mover los miembros de relación seleccionados una posición hacia abajo"
 
 msgid "Move the selected relation members up by one position"
-msgstr "Mover los miembros de relación seleccionados una posición arriba"
+msgstr ""
+"Mover los miembros de relación seleccionados una posición hacia arriba"
 
 msgid "Edit basic attributes of a turn restriction"
 msgstr "Editar atributos básicos de una restricción de giro"
@@ -30137,7 +30355,7 @@ msgstr[0] ""
 "restricción de giro. Se recomienda resolver esta cuestión primero."
 msgstr[1] ""
 "Aún existen {0} errores o advertencias identificadas no resueltas para esta "
-"restricción de giro. Se recomienda resolver esta cuestiones primero."
+"restricción de giro. Se recomienda resolver primero estas cuestiones."
 
 msgid "Do you want to save anyway?"
 msgstr "¿Desea guardarlo de todos modos?"
@@ -30165,8 +30383,8 @@ msgid_plural ""
 "This turn restriction refers to {0} objects which were deleted outside of "
 "this turn restriction editor:"
 msgstr[0] ""
-"Esta restricción de giro hace referenciaa un objeto que borrado por fuera de "
-"este editor de restricciones de giro:"
+"Esta restricción de giro hace referencia a un objeto que fue borrado fuera "
+"de este editor de restricciones de giro:"
 msgstr[1] ""
 "Esta restricción de giro hace referencia a {0} objetos que fueron borrados "
 "fuera de este editor de restricciones de giro:"
@@ -30175,8 +30393,8 @@ msgid ""
 "Updates to this turn restriction can''t be saved unless deleted members are "
 "removed.<br>How to you want to proceed?"
 msgstr ""
-"No se pueden guardar las actualizaciones a esta restricción de giro a menos "
-"que se eliminen los miembros quitados. <br>¿Cómo desea proceder?"
+"No se pueden guardar las actualizaciones de esta restricción de giro a menos "
+"que se eliminen los miembros borrados. <br>¿Cómo desea proceder?"
 
 msgid "Remove deleted members and save"
 msgstr "Quitar miembros eliminados y guardar"
@@ -30257,7 +30475,7 @@ msgid "No Left Turn"
 msgstr "Prohibido girar a la izquierda"
 
 msgid "No U-Turn"
-msgstr "Prohibido girar en U"
+msgstr "Prohibido dar la vuelta"
 
 msgid "No Straight On"
 msgstr "Prohibido seguir de frente"
@@ -30301,7 +30519,7 @@ msgid "Bicycles"
 msgstr "Bicicletas"
 
 msgid "Mopeds"
-msgstr "Mopeds"
+msgstr "Ciclomotores"
 
 msgid "Use standard exceptions"
 msgstr "Usar excepciones estándar"
@@ -30313,10 +30531,10 @@ msgid "Remove the currently selected vias"
 msgstr "Eliminar las vías actualmente seleccionadas"
 
 msgid "Move the selected vias down by one position"
-msgstr "Mover las vías seleccionadas una posición abajo"
+msgstr "Mover las vías seleccionadas una posición hacia abajo"
 
 msgid "Move the selected vias up by one position"
-msgstr "Mover las vías seleccionadas una posición arriba"
+msgstr "Mover las vías seleccionadas una posición hacia arriba"
 
 msgid "Copy the selected vias to the clipboard"
 msgstr "Copiar las vías seleccionadas al portapapeles"
@@ -30353,9 +30571,9 @@ msgid ""
 "selection only.<br>Deselect to display all turn restrictions in the current "
 "data set.</html>"
 msgstr ""
-"<html>Seleccionar para mostrar las restricciones de giro relacionados con "
-"los objetos de la selección actual. <br> Deseleccionar para mostrar todas "
-"las restricciones del conjunto de datos actual.</html>"
+"<html>Seleccionar para mostrar sólo las restricciones de giro relacionados "
+"con los objetos de la selección actual. <br> Deseleccionar para mostrar "
+"todas las restricciones de giro del conjunto de datos actual.</html>"
 
 msgid "Turn Restrictions"
 msgstr "Restricciones de giro"
@@ -30385,7 +30603,7 @@ msgid "Zoom to the currently selected turn restrictions"
 msgstr "Zoom a las restricciones de giro seleccionadas actualmente"
 
 msgid "An OSM plugin for editing turn restrictions."
-msgstr "Un componente OSM para la edición de restricciones de giro."
+msgstr "Un complemento de OSM para la edición de restricciones de giro."
 
 msgid ""
 "Development of the turn restriction plugin was sponsored by <a "
@@ -30395,7 +30613,7 @@ msgstr ""
 "<a href=\"http://www.skobbler.de\">skobbler GmbH</a>."
 
 msgid "Configure the preferences for the turnrestrictions plugin"
-msgstr "Configurar las preferencias para el componente turnrestrictions"
+msgstr "Configurar las preferencias para el complemento turnrestrictions"
 
 msgid "Sponsor"
 msgstr "Patrocinador"
@@ -30429,7 +30647,7 @@ msgid ""
 "Assuming the default value ''set-a''."
 msgstr ""
 "Advertencia: La preferencia con llave \"{0}\" tiene un valor no soportado "
-"\"{1}\". Asumiendo que el valor predeterminado \"conjunto-a\"."
+"\"{1}\". Asumiendo el valor predeterminado \"grupo-a\"."
 
 msgid ""
 "This turn restriction uses the way <span class=\"object-name\">{0}</span> "
@@ -30446,13 +30664,13 @@ msgid "Delete ''from''"
 msgstr "Borrar \"de\""
 
 msgid "Removes the member with role ''from''"
-msgstr "Elminar el miembro con el rol \"de\""
+msgstr "Elmina el miembro con el rol \"de\""
 
 msgid "Delete ''to''"
 msgstr "Borrar \"a\""
 
 msgid "Removes the member with role ''to''"
-msgstr "Eliminar el miembro con el rol \"a\""
+msgstr "Elimina el miembro con el rol \"a\""
 
 msgid "Fix in editor"
 msgstr "Arreglar en el editor"
@@ -30468,9 +30686,9 @@ msgid ""
 "the tag key <tt>restriction</tt>. It is recommended to use standard values "
 "only. Please select one in the Basic editor."
 msgstr ""
-"Esta restricción de giro usa una restricción no estándar de tipo "
+"Esta restricción de giro usa un tipo de restricción no estándar  "
 "<tt>{0}</tt> para la etiqueta <tt>restriction</tt>.  Es recomendable usar "
-"valores estándares. Por favor seleccione uno en el editor básico."
+"sólo valores estándar. Por favor seleccione uno en el editor Básico."
 
 msgid "Go to Basic Editor and manually choose a turn restriction type"
 msgstr ""
@@ -30507,7 +30725,7 @@ msgid ""
 "type in the Basic Editor."
 msgstr ""
 "En una restricción de giro se debe declarar el tipo de restricción. Por "
-"favor, seleccione una en el Editor Básico."
+"favor, seleccione un tipo en el Editor Básico."
 
 msgid "A way with role <tt>from</tt> is required in a turn restriction."
 msgstr ""
@@ -30551,14 +30769,15 @@ msgid ""
 "turn restriction has {0} ways in this role. Please remove {1} of them."
 msgstr ""
 "Una restricción de giro requiere exactamente una vía con el rol <tt>de</tt>. "
-"Esta restricción de giro tiene {0} vías en su rol. Elimine {1} de ellas."
+"Esta restricción de giro tiene {0} vías en dicho rol. Por favor, elimine {1} "
+"de ellas."
 
 msgid ""
 "A turn restriction requires exactly one way with role <tt>to</tt>. This turn "
 "restriction has {0} ways in this role. Please remove {1} of them."
 msgstr ""
 "Una restricción de giro requiere exactamente una vía con rol <tt>a</tt>. "
-"Esta resricción tiene {0} vías con este rol. Por favor remueva {1} de ellas."
+"Esta resricción tiene {0} vías con este rol. Por favor, elimine {1} de ellas."
 
 msgid "Go to the Advanced Editor and remove the members"
 msgstr "Ir al editor avanzado y quitar los miembros"
@@ -30576,7 +30795,7 @@ msgstr ""
 "estándar"
 
 msgid "The required tag <tt>{0}={1}</tt> is missing."
-msgstr "Hace falta la etiqueta requerida <tt>{0}={1}</tt>."
+msgstr "Falta la etiqueta requerida <tt>{0}={1}</tt>."
 
 msgid "Add missing tag"
 msgstr "Añadir etiqueta faltante"
@@ -30593,7 +30812,7 @@ msgstr ""
 "La vía <span class=\"object-name\">{0}</span> con el rol <tt>desde</tt> y la "
 "vía <span class=\"object-name\">{1}</span> con el rol <tt>hacia</tt> "
 "intersectan en el nodo <span class=\"object-name\">{2}</span>. <p> Ambas "
-"vías deben partirse."
+"vías deben partirse por el nodo de intersección."
 
 msgid ""
 "The way <span class=\"object-name\">{0}</span> with role <tt>{1}</tt> should "
@@ -30615,14 +30834,14 @@ msgid ""
 "as member with role <tt>{1}</tt>."
 msgstr ""
 "Esta restricción de giro usa el nodo <span class=\"object-name\">{0}</span> "
-"como miembro del rol <tt>{1}</tt>."
+"como miembro con el  rol <tt>{1}</tt>."
 
 msgid ""
 "This turn restriction uses the relation <span class=\"object-"
 "name\">{0}</span> as member with role <tt>{1}</tt>."
 msgstr ""
 "Esta restricción de giro usa la relación <span class=\"object-"
-"name\">{0}</span> como miembro del rol <tt>{1}</tt>."
+"name\">{0}</span> como miembro con el rol <tt>{1}</tt>."
 
 msgid "A way is required instead."
 msgstr "Se requiere una vías en su lugar"
@@ -30664,8 +30883,8 @@ msgid ""
 "Enter the type and ID of the objects that should be undeleted, e.g., ''n1 "
 "w2''"
 msgstr ""
-"Ingresar el tipo de ID de los objetos cuya eliminación debería ser deshecha, "
-"por ejemplo, ''n1 w2''"
+"Introduce el tipo y la ID de los objetos borrados para recuperar, por "
+"ejemplo ''n1 w2''"
 
 msgid "Select if the data should be added into a new layer"
 msgstr "Seleccionar si los datos deberían adicionarse a una nueva capa"
@@ -30702,7 +30921,7 @@ msgid "Extract node"
 msgstr "Extraer nodo"
 
 msgid "Extracts node from a way"
-msgstr "Extrae nodo de una vía"
+msgstr "Extrae un nodo de una vía"
 
 msgid ""
 "This tool extracts node from its ways and requires single node to be "
@@ -30778,7 +30997,7 @@ msgid "Copy tags from previous selection"
 msgstr "Copiar etiquetas de la selección anterior"
 
 msgid "Pastes tags of previously selected object(s)"
-msgstr "Pega etiquetas de objeto(s) previamente seleccionados(s)"
+msgstr "Pega etiquetas de objeto(s) previamente seleccionado(s)"
 
 msgid "Add Source Tag"
 msgstr "Añadir etiqueta de fuente"
@@ -30792,7 +31011,7 @@ msgstr "Despegar relación"
 msgid ""
 "Duplicate nodes, ways and relations that are used by multiple relations."
 msgstr ""
-"Nodos duplicados, vías y relaciones que son utilizadas en relaciones "
+"Nodos , vías y relaciones duplicados que son utilizadas en relaciones "
 "múltiples."
 
 msgid "UnGlue Relations"
@@ -30831,7 +31050,7 @@ msgid "Opens specified URL browser"
 msgstr "Abre la URL especificada en el navegador"
 
 msgid "Utilsplugin2 settings"
-msgstr "Configuración de Utilsplugin2"
+msgstr "Ajustes de Utilsplugin2"
 
 msgid "Here you can change some preferences of Utilsplugin2 functions"
 msgstr ""
@@ -30839,7 +31058,7 @@ msgstr ""
 "Utilsplugin2"
 
 msgid "Save to file"
-msgstr "Guardar en archivo"
+msgstr "Guardar en un archivo"
 
 msgid "Load from file"
 msgstr "Cargar desde archivo"
@@ -30866,7 +31085,7 @@ msgid "Custom URL configuration"
 msgstr "Configuración de la URL personalizada"
 
 msgid "Lat Lon tool"
-msgstr "Herramienta Latitud Longitud"
+msgstr "Herramienta de Latitud Longitud"
 
 msgid "Create geometry by entering lat lon coordinates for it."
 msgstr "Crear geometría ingresando coordenadas latitud longitud para ella."
@@ -30899,7 +31118,7 @@ msgstr ""
 "duplicados.<br/>Puede separar la latitud y longitud con un espacio, coma o "
 "punto y coma.<br/>Utilice números positivos, o bien los caracteres N y E "
 "para indicar la dirección cardinal Norte o Este.<br/>Para las direcciones "
-"cardinales Sur y Oeste puede utilizar tanto números negativos como "
+"cardinales Sur y Oeste puede utilizar tanto números negativos como los "
 "caracteres S y W.<br/>El valor de la coordenada puede estar en uno de los "
 "siguientes tres "
 "formatos:<ul><li><i>grado</i><tt>°</tt></li><li><i>grados</i><tt>°</t"
@@ -30948,7 +31167,7 @@ msgid "Delete from history"
 msgstr "Borrar del historial"
 
 msgid "Find primitives with these tags"
-msgstr "Se encontraron primitivas con estas etiquetas"
+msgstr "Encontrar primitivas con esas etiquetas"
 
 msgid "Multitag Background: highlight"
 msgstr "Multietiquetado de fondo: visible"
@@ -30970,14 +31189,14 @@ msgid ""
 "This tool can only replace a node, upgrade a node to a way or a "
 "multipolygon, or replace a way with a way."
 msgstr ""
-"Esta herramiento puede reemplazar únicamente un nodo, convewrtir un nodo en "
+"Esta herramiento puede reemplazar únicamente un nodo, convertir un nodo en "
 "una vía o multipolígono, o reemplazar una vía con una vía."
 
 msgid "Node belongs to way(s), cannot replace."
 msgstr "Los nodos que pertenecen a vía(s) no pueden reemplazarse."
 
 msgid "Replace geometry for node {0}"
-msgstr "Reemplazar geometría para nodo {0}"
+msgstr "Reemplazar la geometría para el nodo {0}"
 
 msgid "Relation is not a multipolygon, cannot be used as a replacement."
 msgstr ""
@@ -31127,8 +31346,8 @@ msgstr "Deshacer selección"
 
 msgid "Reselect last added object or selection form history"
 msgstr ""
-"Vuelve a seleccionar los últimos objetos en ser añadidos o seleccionar desde "
-"el historial"
+"Vuelve a seleccionar el último objeto añadidos o seleccionar desde el "
+"historial"
 
 msgid "Unselect nodes"
 msgstr "Deseleccionar nodos"
@@ -31215,16 +31434,16 @@ msgid "Jump in video for x ms"
 msgstr "Avanzar el vídeo durante x milisegundos"
 
 msgid "Loop length"
-msgstr "Longitud del ciclo"
+msgstr "Longitud del bucle"
 
 msgid "Set the length around a looppoint"
-msgstr "Establecer la longitud alrededor de un punto glorieta"
+msgstr "Establecer la longitud alrededor de un punto de bucle"
 
 msgid "no deinterlacing"
 msgstr "No desentrelazado (deinterlacing)"
 
 msgid "deinterlacing using line doubling"
-msgstr "deinterlacing usando line doubling"
+msgstr "desentrelazando usando duplicado de líneas (line doubling)"
 
 msgid "deinterlacing using linear interpolation"
 msgstr "desentrelazar usando interpolación lineal"
@@ -31234,9 +31453,9 @@ msgid ""
 "correctly installed on your system. Its architecture (32/64 bits) must also "
 "be the same as the JRE that runs JOSM."
 msgstr ""
-"La biblioteca VLC no está iniciada correctamente. Por favor verifique el VLC "
-"{0} está correctamente instalado en su sistema. Su arquitectura (32/64 bits) "
-"debe ser la misma que la del JRE en el que ejecuta JOSM."
+"La biblioteca VLC no está iniciada correctamente. Por favor verifique que "
+"VLC {0} está correctamente instalado en su sistema. Su arquitectura (32/64 "
+"bits) debe ser la misma que la del JRE en el que ejecuta JOSM."
 
 msgid "Jump to"
 msgstr "Saltar a"
@@ -31271,8 +31490,7 @@ msgstr "Mapas Escaneados de Walking Papers"
 msgid ""
 "Display a map that was previously scanned and uploaded to walking-papers.org"
 msgstr ""
-"Mostrar un mapa que estaba anteriormente escaneado y subido a walking-"
-"papers.org"
+"Mostrar un mapa que previamente fue escaneado y subido a walking-papers.org"
 
 msgid ""
 "Enter a walking-papers.org URL or ID (the bit after the ?id= in the URL)"
@@ -31300,9 +31518,9 @@ msgid ""
 "download areas is selected.<br>Select a node on the start or end of a way or "
 "an entire way first.</html>"
 msgstr ""
-"<html>Ningún nodo, ni vía con un punto final fuera de la<br>actual área de "
-"descarga seleccionada. <br> Seleccione un nodo de principio o fin de una vía "
-"o una vía completa primero. </html>"
+"<html>No se ha seleccionado ningún nodo, ni vía con un punto final fuera de "
+"la<br>actual área de descarga. <br> Seleccione primero un nodo de principio "
+"o fin de una vía o una vía completa. </html>"
 
 msgid "<html>Could not find a unique node to start downloading from.</html>"
 msgstr ""
@@ -31329,11 +31547,11 @@ msgstr ""
 "<html>No hay vías conectadas adicionales para descargar.<br>Aunque se "
 "encontró un nodo potencialmente duplicado del nodo actualmente "
 "seleccionado.<br><br>El nodo actualmente seleccionado es \"{0}\"<br>El nodo "
-"potencialmente duplicado es \"{1}\"<br>Mezclar el nodo duplicado con el nodo "
-"actualmente seleccionado y continuar descargando?</html>"
+"potencialmente duplicado es \"{1}\"<br>Fusionar el nodo duplicado con el "
+"nodo actualmente seleccionado y continuar descargando?</html>"
 
 msgid "Merge duplicate node?"
-msgstr "¿Fusionar nodos duplicados?"
+msgstr "¿Fusionar nodo duplicado?"
 
 msgid "<html>No more connected ways to download.</html>"
 msgstr "<html> No existen más vías conectadas que descargar. </html>"
@@ -31384,7 +31602,7 @@ msgid ""
 "coordinate)"
 msgstr ""
 "Doble clic en un ítem para buscar objetos con el mismo nombre de artículo (y "
-"centro de coordenadas)"
+"centrar coordenadas)"
 
 msgid "Available via WIWOSM server"
 msgstr "Disponibel vía servidor WIWOSM"
@@ -31438,7 +31656,7 @@ msgstr ""
 "Establece el idioma predeterminado para los artículos de la Wikipedia"
 
 msgid "Enter the Wikipedia language"
-msgstr "Ingrese el lenguaje de Wikipedia"
+msgstr "Introduzca el idioma de Wikipedia"
 
 msgid ""
 "Adds a ''wikipedia'' tag corresponding to this article to the selected "
diff --git a/i18n/po/et.po b/i18n/po/et.po
index 8ea1b07..b7d1b9d 100644
--- a/i18n/po/et.po
+++ b/i18n/po/et.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-11-24 22:08+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-26 07:58+0000\n"
 "Last-Translator: AivoK <aivo.kuhlberg at hot.ee>\n"
 "Language-Team: Estonian <et at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:48+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:47+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: et\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -68,7 +68,7 @@ msgid "DEBUG: {0}"
 msgstr "DEBUG: {0}"
 
 msgid "Cause: "
-msgstr ""
+msgstr "Põhjus: "
 
 msgid "Executing platform startup hook"
 msgstr "Käivitan platvormi käivitamise haagi"
@@ -219,6 +219,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "Sihtkihte ei ole"
 
+msgid "Select"
+msgstr "Vali"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Pane valitud elemendid kaardil ülal asuvasse valitud objektide nimekirja."
+
 msgid "Add imagery layer {0}"
 msgstr "Lisa  aluskaart {0}"
 
@@ -262,17 +270,19 @@ msgid "Tool: {0}"
 msgstr "Tööriist {0}"
 
 msgid "Not enough nodes in selected ways."
-msgstr ""
+msgstr "Valitud joontel pole piisaval hulgal sõlmi."
 
 msgid "Please select at least four nodes."
 msgstr "Palun vali vähemalt neli sõlme."
 
 msgid "Cannot determine center of selected nodes."
-msgstr ""
+msgstr "Ei suuda kindlaks määrata valitud sõlmede keskpunkti."
 
 msgid ""
 "One or more nodes involved in this action is outside of the downloaded area."
 msgstr ""
+"Üks või rohkem antud tegevuses osalevat sõlme asub väljaspool allalaadimise "
+"ala."
 
 msgid "Align Nodes in Line"
 msgstr "Paiguta sõlmed ühele joonele"
@@ -422,7 +432,7 @@ msgid "Those nodes are not in a circle. Aborting."
 msgstr "Sõlmed ei moodusta ringi. Katkestan."
 
 msgid "Update multipolygon"
-msgstr ""
+msgstr "Liitala uuendamine"
 
 msgid "Create multipolygon"
 msgstr "Liitala loomine"
@@ -478,7 +488,7 @@ msgid "Download parent ways/relations..."
 msgstr "Laadi alla vanemaiks olevad teed ja relatsioonid"
 
 msgid "Download objects referring to one of the selected objects"
-msgstr "Lae all ühele valitud objektidest viitavad objektid"
+msgstr "Laadi alla ühele valitud objektidest viitavad objektid"
 
 msgid "Duplicate"
 msgstr "Tee koopia"
@@ -2097,9 +2107,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Vali"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Vali, liiguta, skaleeri ja pööra objekte"
 
@@ -2569,28 +2576,28 @@ msgid "objects having 5 to 10 tags"
 msgstr "5 kuni 10 sildiga objektid"
 
 msgid "objects with given role in a relation"
-msgstr ""
+msgstr "kindla rolliga objektid relatsioonis"
 
 msgid "closed ways with an area of 100 m²"
-msgstr ""
+msgstr "kinnised jooned pindalaga 100 m²"
 
 msgid "state"
-msgstr ""
+msgstr "olek"
 
 msgid "all modified objects"
-msgstr ""
+msgstr "kõik muudetud objektid"
 
 msgid "all new objects"
-msgstr ""
+msgstr "kõik uued objektid"
 
 msgid "all selected objects"
-msgstr ""
+msgstr "kõik valitud objektid"
 
 msgid "all incomplete objects"
 msgstr "kõik lõpetamata objektid"
 
 msgid "related objects"
-msgstr ""
+msgstr "seotud objektid"
 
 msgid "all children of objects matching the expression"
 msgstr ""
@@ -2605,19 +2612,20 @@ msgid "every n-th member of relation and/or every n-th node of way"
 msgstr ""
 
 msgid "view"
-msgstr ""
+msgstr "vaade"
 
 msgid "objects in current view"
-msgstr ""
+msgstr "aktiivse vaate objektid"
 
 msgid "objects (and all its way nodes / relation members) in current view"
-msgstr ""
+msgstr "aktiivse vaate objektid (ja kõik nende sõlmed / relatsiooni liikmed)"
 
 msgid "objects in downloaded area"
-msgstr ""
+msgstr "objektid allalaadimisalas"
 
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
+"objektid allalaadimisalas (ja kõik nende sõlmed / relatsiooni liikmed)"
 
 msgid "No match found for ''{0}''"
 msgstr ""
@@ -5697,11 +5705,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Ava ülalolevast nimekirjast valitud kõigi objektide ühendamisdialoog."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Pane valitud elemendid kaardil ülal asuvasse valitud objektide nimekirja."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -6409,10 +6412,10 @@ msgid "Display the objects created, updated, and deleted by the changeset"
 msgstr "Kuva objektid, mida muutuskogumiga loodi, uuendati või kustutati"
 
 msgid "Discussion"
-msgstr ""
+msgstr "Arutelu"
 
 msgid "Display the public discussion around this changeset"
-msgstr ""
+msgstr "Kuvab antud muutuskogumi üle käiva avaliku arutelu"
 
 msgid "Changeset Management Dialog"
 msgstr ""
@@ -6487,7 +6490,7 @@ msgid "Closed at"
 msgstr "Suletud"
 
 msgid "Discussions"
-msgstr ""
+msgstr "Arutelud"
 
 msgid "Downloading changeset content"
 msgstr "Laadin alla muutustekogumi sisu"
@@ -6605,10 +6608,10 @@ msgid ""
 msgstr ""
 
 msgid "Update changeset discussion"
-msgstr ""
+msgstr "Värskenda muutuskogumi arutelu"
 
 msgid "Update the changeset discussion from the OSM server"
-msgstr ""
+msgstr "Värskendab OSM serverist antud muutuskogumi arutelu"
 
 msgid "Date"
 msgstr "Kuupäev"
@@ -6899,13 +6902,13 @@ msgid "<different>"
 msgstr "<erinev>"
 
 msgid "Select objects for which to change tags."
-msgstr ""
+msgstr "Vali objektid, mille silte soovid muuta"
 
 msgid "Tags/Memberships"
-msgstr "Silte/Liikmeid"
+msgstr "Sildid/Liikmed"
 
 msgid "Tags for selected objects."
-msgstr ""
+msgstr "Valitud objektide sildid"
 
 msgid "Member Of"
 msgstr "On liikmeks järgnevas"
@@ -8317,7 +8320,7 @@ msgid "Initializing relations to update ..."
 msgstr ""
 
 msgid "Settings"
-msgstr ""
+msgstr "Sätted"
 
 msgid "Decide how to upload the data and which changeset to use"
 msgstr ""
@@ -9209,7 +9212,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9232,6 +9235,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11217,7 +11226,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -13693,49 +13702,58 @@ msgid "reserved"
 msgstr "reserveeritud"
 
 msgid "Outdated Java version"
-msgstr ""
+msgstr "Aegunud Java versioon"
 
 msgid "Update Java"
-msgstr ""
+msgstr "Uuenda Java"
 
 msgid "You are running version {0} of Java."
-msgstr ""
+msgstr "Praegu töötab sul Java versioon {0}."
 
 msgid "April 2015"
-msgstr ""
+msgstr "Aprill 2015"
 
 msgid ""
 "This version is no longer supported by {0} since {1} and is not recommended "
 "for use."
 msgstr ""
+"{0} ei toeta enam seda versiooni alates {1} ja seda ei soovitata enam "
+"kasutada."
 
 msgid ""
 "JOSM will soon stop working with this version; we highly recommend you to "
 "update to Java {0}."
 msgstr ""
+"JOSM lõpetab töötamast selle versiooniga. Soovitatav oleks et sa uuendad "
+"Java versioonile {0}."
 
 msgid "Would you like to update now ?"
-msgstr ""
+msgstr "Kas soovid kohe uuendada?"
 
 msgid ""
 "A previous version of JOSM has installed a custom certificate in order to "
 "provide HTTPS support for Remote Control:"
 msgstr ""
+"JOSMi eelmine versioon on paigaldanud kaugjuhtimise funktsiooni HTTPS toe "
+"jaoks iseloodud sertifikaadi:"
 
 msgid ""
 "It appears it could be an important <b>security risk</b>.<br><br>You are now "
 "going to be prompted by Windows to remove this insecure certificate.<br>For "
 "your own safety, <b>please click Yes</b> in next dialog."
 msgstr ""
+"See paistab olevat oluline <b>turvarisk</b>.<br><br>Järgmisena pakub Windows "
+"välja, et eemaldada see mitteturvaline sertifikaat.<br>Sinu enda turvalisuse "
+"huvides <b>palub klõpsa Jah</b> järgnevas dialoogiaknas."
 
 msgid "Removing insecure certificate from {0} keystore: {1}"
-msgstr ""
+msgstr "Ebaturvalise sertifikaadi kustutamine {0} võtmehoidlast: {1}"
 
 msgid "Unable to remove insecure certificate from keystore: {0}"
-msgstr ""
+msgstr "Ei õnnestu kustutada ebaturvalist sertifikaati võtmehoidlast: {0}"
 
 msgid "JOSM localhost certificate found in {0} keystore: {1}"
-msgstr ""
+msgstr "JOSM localhost sertifikaat leiti {0} võtmehoidlast: {1}"
 
 msgid ""
 "Remote Control is configured to provide HTTPS support.<br>This requires to "
@@ -13745,12 +13763,17 @@ msgid ""
 "next dialog.<br><br>If unsure, you can also click No then disable HTTPS "
 "support in Remote Control preferences."
 msgstr ""
+"Kaugjuhtimine on seadistatud pakkuma HTTPS tuge.<br>Selleks tuleb Windowsi "
+"mandaadihoidlasse lisada JOSM-i poolt loodud sertifikaat.<br><br>Nüüd küsib "
+"Windows sinult kinnitust selle toimigu teostamiseks.<br>HTTPS toe lubamiseks "
+"<b>klõpsa Jah</b> järgmises dialoogiaknas.<br><br> Kui sa pole kindel, siis "
+"võid klõpsata Ei ja seejärel keelata HTTPS tugi kaugjuhtimise sätetes."
 
 msgid "HTTPS support in Remote Control"
-msgstr ""
+msgstr "HTTPS tugi kaugjuhtimisel"
 
 msgid "Adding JOSM localhost certificate to {0} keystore"
-msgstr ""
+msgstr "JOSM localhost sertifikaadi lisamine {0} võtmehoidlasse"
 
 msgid "Silent shortcut conflict: ''{0}'' moved by ''{1}'' to ''{2}''."
 msgstr ""
@@ -13784,21 +13807,21 @@ msgid ""
 msgstr ""
 
 msgid "ms"
-msgstr ""
+msgstr "ms"
 
 msgid "s"
-msgstr ""
+msgstr "sek"
 
 msgid "min"
-msgstr ""
+msgstr "min"
 
 msgid "h"
-msgstr ""
+msgstr "t"
 
 msgid "day"
 msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "päev"
+msgstr[1] "päeva"
 
 msgid ""
 "Preference with key ''{0}'' does not include ''{1}''. Cannot restore window "
@@ -13824,7 +13847,7 @@ msgid "Ignoring malformed geometry: {0}"
 msgstr ""
 
 msgid "Failed to load XML schema."
-msgstr ""
+msgstr "XML-skeemi laadimine ebaõnnestus."
 
 msgid ""
 "Error in search expression on position {0} - right side of or(|) expression "
@@ -13869,10 +13892,10 @@ msgstr ""
 "planet.osm’i"
 
 msgid "Database offline for maintenance"
-msgstr ""
+msgstr "Andmebaas on hetkel hooldamisel ja ühendus puudub"
 
 msgid "You have downloaded too much data. Please try again later."
-msgstr ""
+msgstr "Oled laadinud alla liiga palju andmeid. Palun ürita hiljem uuesti."
 
 msgid ""
 "The maximum bbox size is 0.25, and your request was too large. Either "
@@ -13886,17 +13909,17 @@ msgid "could not get audio input stream from input URL"
 msgstr ""
 
 msgid "Audio Device Unavailable"
-msgstr ""
+msgstr "Heliseadet ei leitud"
 
 msgid "You must make your edits public to upload new data"
-msgstr ""
+msgstr "Uute andmete üleslaadimiseks pead muutma need avalikuks."
 
 msgid "town"
-msgstr ""
+msgstr "linn"
 
 msgctxt "landuse"
 msgid "forest"
-msgstr ""
+msgstr "mets"
 
 msgctxt "landuse"
 msgid "meadow"
@@ -13924,7 +13947,7 @@ msgstr ""
 
 msgctxt "Relation type"
 msgid "bridge"
-msgstr ""
+msgstr "sild"
 
 msgctxt "Relation type"
 msgid "destination_sign"
@@ -13964,11 +13987,11 @@ msgstr ""
 
 msgctxt "Relation type"
 msgid "street"
-msgstr ""
+msgstr "tänav"
 
 msgctxt "Relation type"
 msgid "tunnel"
-msgstr ""
+msgstr "tunnel"
 
 msgctxt "Relation type"
 msgid "waterway"
@@ -14015,7 +14038,7 @@ msgid "suburb"
 msgstr ""
 
 msgid "All Files"
-msgstr ""
+msgstr "Kõik failid"
 
 msgid "Attributes"
 msgstr ""
@@ -14039,10 +14062,10 @@ msgid "Enter path or folder name:"
 msgstr ""
 
 msgid "Error "
-msgstr ""
+msgstr "Viga "
 
 msgid "Error renaming file \"{0}\" to \"{1}\""
-msgstr ""
+msgstr "Viga faili \"{0}\" ümbernimetamisel nimele \"{1}\""
 
 msgid "File name:"
 msgstr "Failinimi:"
@@ -14051,25 +14074,25 @@ msgid "File Name:"
 msgstr "Failinimi:"
 
 msgid "FileChooser help."
-msgstr ""
+msgstr "FileChooser abi."
 
 msgid "Files"
-msgstr ""
+msgstr "Failid"
 
 msgid "Files of type:"
-msgstr ""
+msgstr "Faili liik:"
 
 msgid "Files of Type:"
-msgstr ""
+msgstr "Faili liik:"
 
 msgid "Filter:"
 msgstr "Filter:"
 
 msgid "Folders"
-msgstr ""
+msgstr "Kataloogid"
 
 msgid "Home"
-msgstr ""
+msgstr "Kodu"
 
 msgid "Look in:"
 msgstr "Vaata:"
@@ -14078,16 +14101,16 @@ msgid "Look In:"
 msgstr "Vaata:"
 
 msgid "Modified"
-msgstr ""
+msgstr "Muudetud"
 
 msgid "New Folder"
-msgstr ""
+msgstr "Uus kataloog"
 
 msgid "Open selected file"
-msgstr ""
+msgstr "Ava valitud fail"
 
 msgid "Open selected file."
-msgstr ""
+msgstr "Ava valitud fail."
 
 msgid "Refresh"
 msgstr "Värskenda"
@@ -14105,13 +14128,13 @@ msgid "Save In:"
 msgstr ""
 
 msgid "Save selected file."
-msgstr ""
+msgstr "Salvesta valitud fail."
 
 msgid "Selection:"
-msgstr ""
+msgstr "Valik"
 
 msgid "Size"
-msgstr ""
+msgstr "Suurus"
 
 msgid "Up One Level"
 msgstr "Üks tase üles"
@@ -14120,16 +14143,16 @@ msgid "Update"
 msgstr "Uuenda"
 
 msgid "Update directory listing."
-msgstr ""
+msgstr "Värskenda kataloogide nimekirja."
 
 msgid "Blue:"
-msgstr ""
+msgstr "Sinine:"
 
 msgid "Color Name:"
-msgstr ""
+msgstr "Värvi nimi:"
 
 msgid "Green:"
-msgstr ""
+msgstr "Roheline:"
 
 msgid "Hue:"
 msgstr ""
@@ -14138,7 +14161,7 @@ msgid "GTK Color Chooser"
 msgstr ""
 
 msgid "Red:"
-msgstr ""
+msgstr "Punane:"
 
 msgid "Saturation:"
 msgstr ""
@@ -14196,7 +14219,7 @@ msgid "(Warning: Experimental!) Tool for conflating (merging) data."
 msgstr ""
 
 msgid "Create a grid of ways."
-msgstr ""
+msgstr "Loo teede võrgustik."
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
@@ -14230,10 +14253,10 @@ msgid "Handling of French EPCIs (boundary=local_authority)"
 msgstr ""
 
 msgid "Use external scripts in JOSM"
-msgstr ""
+msgstr "Kasuta JOSMis väliseid skripte"
 
 msgid "Fast drawing ways by mouse"
-msgstr ""
+msgstr "Hiirega kiire joonte joonistamine"
 
 msgid "Finds and fixes invalid street addresses in a comfortable way."
 msgstr "Otsib ja parandab mugavalt vigased tänava aadressid."
@@ -14241,6 +14264,8 @@ msgstr "Otsib ja parandab mugavalt vigased tänava aadressid."
 msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
+"Vestle kasutajatega, kes kaarti läheduses muudavad, teavitus, kui keegi "
+"tuleb lähedale."
 
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
@@ -14359,14 +14384,18 @@ msgid ""
 "Use your system''s password manager to store the API username and password. "
 "(KWallet and gnome-keyring are supported.)"
 msgstr ""
+"Kasuta oma süsteemi paroolihaldurit API kasutajanime ja parooli "
+"salvestamiseks. (toetab KWallet ja gnome-keyring rakendust)"
 
 msgid ""
 "Disallow using JOSM forever (WARNING: this plugin prevents JOSM from loading "
 "and is hard to rid of)"
 msgstr ""
+"Keelab igaveseks JOSMi kasutamise (HOIATUS: see plugin keelab JOSMi "
+"laadimise ja sellest on raske lahti saada)"
 
 msgid "Convert data from Open Data portals to OSM layer"
-msgstr ""
+msgstr "Teisendab Open Data portaalidest pärinevad andmed OSM kihiks"
 
 msgid "extended options for editing opening_hours"
 msgstr "Vahendid sildi opening_hours redigeerimiseks"
@@ -14378,6 +14407,7 @@ msgstr ""
 msgid ""
 "Launches FireFox to display the current visible screen as a nice SVG image."
 msgstr ""
+"Käivitab FireFoxi, et kuvada aktiivset nähtavat ekraani kena SVG pildina."
 
 msgid ""
 "Bring in errors from Osm Inspector and display it on the current JOSM "
@@ -14385,10 +14415,10 @@ msgid ""
 msgstr ""
 
 msgid "Import/export OSM data in PBF format"
-msgstr ""
+msgstr "OSM andmete import/eksport PBF vormingusse"
 
 msgid "Import PDF file and convert to ways."
-msgstr ""
+msgstr "Impordi PDF fail ja teisenda joonteks."
 
 msgid ""
 "Write gps position info to the image file header. Run this feature from the "
@@ -14415,7 +14445,7 @@ msgid "Read and write osmosis poly filter files"
 msgstr ""
 
 msgid "Adds map printing to JOSM"
-msgstr ""
+msgstr "Lisab JOSMi kaartide trükkimise funktsiooni"
 
 msgid "adds projections from Proj4J"
 msgstr ""
@@ -14448,6 +14478,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -14492,7 +14528,7 @@ msgid ""
 msgstr ""
 
 msgid "Plugin to digital sign OSM-Data"
-msgstr ""
+msgstr "Plugin OSM andmete digitaalseks allkirjastamiseks"
 
 msgid "${plugin.description}"
 msgstr ""
@@ -14535,7 +14571,7 @@ msgid "Select a sequence of non-branching connected ways"
 msgstr ""
 
 msgid "Simplifies linking OSM objects to Wikipedia articles"
-msgstr ""
+msgstr "Lihtsustab OSM objektide linkimist Wikipedia aktiklitega"
 
 msgid ""
 "Drive a race car from point A to point B over aerial imagery, leave cacti "
@@ -14640,19 +14676,19 @@ msgid "Embankment"
 msgstr "Teetamm"
 
 msgid "Incline"
-msgstr ""
+msgstr "Kallak"
 
 msgid "10%"
-msgstr ""
+msgstr "10%"
 
 msgid "-10%"
-msgstr ""
+msgstr "-10%"
 
 msgid "10°"
-msgstr ""
+msgstr "10°"
 
 msgid "-10°"
-msgstr ""
+msgstr "-10°"
 
 msgid "Oneway"
 msgstr "Ühesuunaline"
@@ -14710,16 +14746,16 @@ msgid "rail"
 msgstr "raudtee"
 
 msgid "Voltage in Volts (V)"
-msgstr ""
+msgstr "Pinge voltides (V)"
 
 msgid "Frequency in Hertz (Hz)"
-msgstr ""
+msgstr "Sagedus hertsides (HZ)"
 
 msgid "16.67"
-msgstr ""
+msgstr "16.67"
 
 msgid "16.7"
-msgstr ""
+msgstr "16.7"
 
 msgctxt "railway"
 msgid "Tracks"
@@ -14815,7 +14851,7 @@ msgid "Su 10:00+"
 msgstr ""
 
 msgid "Brand"
-msgstr ""
+msgstr "Kaubamärk"
 
 msgid "Internet access"
 msgstr "Internetiühendus"
@@ -14893,7 +14929,7 @@ msgstr ""
 
 msgctxt "sport"
 msgid "baseball"
-msgstr ""
+msgstr "pesapall"
 
 msgctxt "sport"
 msgid "basketball"
@@ -15017,7 +15053,7 @@ msgstr ""
 
 msgctxt "sport"
 msgid "tennis"
-msgstr ""
+msgstr "tennis"
 
 msgid "Coins"
 msgstr "Mündid"
@@ -15172,7 +15208,7 @@ msgid "muslim"
 msgstr "moslem"
 
 msgid "shinto"
-msgstr ""
+msgstr "Šinto"
 
 msgid "sikh"
 msgstr "sikh"
@@ -15247,10 +15283,10 @@ msgid "low"
 msgstr "madal"
 
 msgid "750000;200000"
-msgstr ""
+msgstr "750000;200000"
 
 msgid "110000;20000"
-msgstr ""
+msgstr "110000;20000"
 
 msgid "Branch operator"
 msgstr ""
@@ -15291,43 +15327,43 @@ msgid "Output forms of energy:"
 msgstr ""
 
 msgid "biogas"
-msgstr ""
+msgstr "biogaas"
 
 msgid "2 W"
-msgstr ""
+msgstr "2 W"
 
 msgid "3 kW"
-msgstr ""
+msgstr "3 kW"
 
 msgid "5 MW"
-msgstr ""
+msgstr "5 MW"
 
 msgid "7 GW"
-msgstr ""
+msgstr "7 GW"
 
 msgid "electricity"
-msgstr ""
+msgstr "elekter"
 
 msgid "hot water"
-msgstr ""
+msgstr "kuum vesi"
 
 msgid "hot air"
-msgstr ""
+msgstr "kuum õhk"
 
 msgid "cold water"
-msgstr ""
+msgstr "külm vesi"
 
 msgid "cold air"
-msgstr ""
+msgstr "külm õhk"
 
 msgid "compressed air"
-msgstr ""
+msgstr "suruõhk"
 
 msgid "steam"
-msgstr ""
+msgstr "aur"
 
 msgid "vacuum"
-msgstr ""
+msgstr "vaakum"
 
 msgid "Max. weight (tonnes)"
 msgstr "Suurim mass (tonni)"
@@ -15442,12 +15478,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15543,45 +15655,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Ringristmik"
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -15673,27 +15747,27 @@ msgstr "Nähtavus"
 
 msgctxt "trail_visibility"
 msgid "excellent"
-msgstr ""
+msgstr "suurepärane"
 
 msgctxt "trail_visibility"
 msgid "good"
-msgstr ""
+msgstr "hea"
 
 msgctxt "trail_visibility"
 msgid "intermediate"
-msgstr ""
+msgstr "keskmine"
 
 msgctxt "trail_visibility"
 msgid "bad"
-msgstr ""
+msgstr "halb"
 
 msgctxt "trail_visibility"
 msgid "horrible"
-msgstr ""
+msgstr "kohutav"
 
 msgctxt "trail_visibility"
 msgid "no"
-msgstr ""
+msgstr "ei"
 
 msgid "Ski"
 msgstr ""
@@ -15750,7 +15824,7 @@ msgid "Dedicated Cycleway"
 msgstr ""
 
 msgid "Pedestrians"
-msgstr ""
+msgstr "Jalakäijad"
 
 msgid "Segregated Foot- and Cycleway"
 msgstr ""
@@ -16130,7 +16204,7 @@ msgstr "Allikas"
 msgid ""
 "A point where groundwater naturally flows to the surface of the earth from "
 "underground."
-msgstr ""
+msgstr "Koht kus vesi voolab looduses maa alt maapinnale."
 
 msgid "Waterfall"
 msgstr "Kosk"
@@ -16160,37 +16234,37 @@ msgid "Covered Reservoir"
 msgstr ""
 
 msgid "A body of standing water, such as a lake or pond."
-msgstr ""
+msgstr "Seisva veega veekogu, nagu järv või tiik."
 
 msgid "Water Body"
-msgstr ""
+msgstr "Veekogu"
 
 msgid "canal"
-msgstr ""
+msgstr "kanal"
 
 msgid "lake"
-msgstr ""
+msgstr "järv"
 
 msgid "lagoon"
-msgstr ""
+msgstr "laguun"
 
 msgid "oxbow"
 msgstr ""
 
 msgid "pond"
-msgstr ""
+msgstr "tiik"
 
 msgid "reservoir"
-msgstr ""
+msgstr "reservuaar"
 
 msgid "river"
-msgstr ""
+msgstr "jõgi"
 
 msgid "Salt Water"
-msgstr ""
+msgstr "Soolane vesi"
 
 msgid "Is the water body intermittent (disappears seasonally)?"
-msgstr ""
+msgstr "Kas veekogu on muutuv (sõltuvalt aastaajast)?"
 
 msgid "Coastline"
 msgstr "Rannik"
@@ -16221,7 +16295,7 @@ msgid "reedbed"
 msgstr "roostik"
 
 msgid "saltmarsh"
-msgstr ""
+msgstr "soolaksoo"
 
 msgid "tidalflat"
 msgstr "padumeri"
@@ -16233,7 +16307,7 @@ msgid "Mud"
 msgstr "Muda"
 
 msgid "Large area covered with mud."
-msgstr ""
+msgstr "Lai mudaga kaetud ala."
 
 msgid "Beach"
 msgstr "Rand"
@@ -16242,10 +16316,10 @@ msgid "A flat area of sand, gravel or pebble next to water."
 msgstr ""
 
 msgid "swimming"
-msgstr ""
+msgstr "ujumine"
 
 msgid "surfing"
-msgstr ""
+msgstr "surfimine"
 
 msgid "Bay"
 msgstr "Laht"
@@ -16358,7 +16432,7 @@ msgid "Subway"
 msgstr "Metroo"
 
 msgid "Tram"
-msgstr ""
+msgstr "Tramm"
 
 msgid "Bus Guideway"
 msgstr ""
@@ -16416,31 +16490,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Köisraudteed"
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16455,16 +16526,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16481,7 +16560,7 @@ msgid "Pylon"
 msgstr ""
 
 msgid "Parking"
-msgstr ""
+msgstr "Parkimine"
 
 msgid "Park and Ride"
 msgstr ""
@@ -16490,13 +16569,13 @@ msgid "bus"
 msgstr "buss"
 
 msgid "train"
-msgstr ""
+msgstr "rong"
 
 msgid "tram"
 msgstr "tramm"
 
 msgid "metro"
-msgstr ""
+msgstr "metroo"
 
 msgid "ferry"
 msgstr "praam"
@@ -16532,82 +16611,88 @@ msgid "Fuel"
 msgstr ""
 
 msgid "Agip"
-msgstr ""
+msgstr "Agip"
 
 msgid "Aral"
-msgstr ""
+msgstr "Aral"
 
 msgid "Avia"
-msgstr ""
+msgstr "Avia"
 
 msgid "BP"
-msgstr ""
+msgstr "BP"
 
 msgid "Chevron"
-msgstr ""
+msgstr "Chevron"
 
 msgid "Citgo"
+msgstr "Citgo"
+
+msgid "Eni"
 msgstr ""
 
 msgid "Esso"
-msgstr ""
+msgstr "Esso"
 
 msgid "Exxon"
-msgstr ""
+msgstr "Exxon"
 
 msgid "Gulf"
-msgstr ""
+msgstr "Gulf"
 
 msgid "Mobil"
-msgstr ""
+msgstr "Mobil"
 
 msgid "OMV"
-msgstr ""
+msgstr "OMV"
 
 msgid "Petro-Canada"
-msgstr ""
+msgstr "Petro-Canada"
 
 msgid "Pioneer"
-msgstr ""
+msgstr "Pioneer"
 
 msgid "Q8"
-msgstr ""
+msgstr "Q8"
 
 msgid "Repsol"
-msgstr ""
+msgstr "Repsol"
 
 msgid "Shell"
-msgstr ""
+msgstr "Shell"
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
-msgstr ""
+msgstr "Statoil"
+
+msgid "Sunoco"
+msgstr "Sunoco"
 
 msgid "Tamoil"
-msgstr ""
+msgstr "Tamoil"
 
 msgid "Texaco"
-msgstr ""
+msgstr "Texaco"
 
 msgid "Total"
-msgstr ""
+msgstr "Total"
 
 msgid "Independent"
-msgstr ""
+msgstr "Independent"
 
 msgid "With shop"
-msgstr ""
+msgstr "Koos poega"
 
 msgid "convenience"
-msgstr ""
+msgstr "nurgakauplus"
 
 msgid "kiosk"
-msgstr ""
+msgstr "kiosk"
 
 msgid "Fuel types:"
-msgstr ""
+msgstr "Kütused:"
 
 msgid "Diesel"
 msgstr ""
@@ -16664,10 +16749,10 @@ msgid "Voltage"
 msgstr "Pinge"
 
 msgid "Amperage"
-msgstr ""
+msgstr "Amperaaž"
 
 msgid "Wash"
-msgstr ""
+msgstr "Autopesula"
 
 msgid "Car Dealer"
 msgstr "Automüüja"
@@ -16780,6 +16865,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Ühistransport"
 
@@ -17038,6 +17126,14 @@ msgstr "Perroon"
 msgid "Hangar"
 msgstr "Angaar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Tuletorn"
 
@@ -17447,7 +17543,7 @@ msgid "church"
 msgstr "kirik"
 
 msgid "temple"
-msgstr ""
+msgstr "tempel"
 
 msgctxt "christian"
 msgid "anglican"
@@ -17526,19 +17622,19 @@ msgid "seventh_day_adventist"
 msgstr ""
 
 msgid "Mosque"
-msgstr ""
+msgstr "Mošee"
 
 msgid "mosque"
-msgstr ""
+msgstr "mošee"
 
 msgid "ibadi"
 msgstr ""
 
 msgid "Synagogue"
-msgstr ""
+msgstr "Sünagoog"
 
 msgid "synagogue"
-msgstr ""
+msgstr "sünagoog"
 
 msgctxt "jewish"
 msgid "orthodox"
@@ -17553,7 +17649,7 @@ msgid "reform"
 msgstr ""
 
 msgid "Buddhist Temple"
-msgstr ""
+msgstr "Budistlik tempel"
 
 msgid "theravada"
 msgstr ""
@@ -17565,7 +17661,7 @@ msgid "vajrayana"
 msgstr ""
 
 msgid "Hindu Temple"
-msgstr ""
+msgstr "Hinduistlik tempel"
 
 msgid "vaishnavism"
 msgstr ""
@@ -17580,10 +17676,10 @@ msgid "smartism"
 msgstr ""
 
 msgid "Shinto Shrine"
-msgstr ""
+msgstr "Šinto pühamu"
 
 msgid "Other Place of Worship"
-msgstr ""
+msgstr "Muu pühapaik"
 
 msgid "Public Building"
 msgstr "Ühiskondlik hoone"
@@ -18281,10 +18377,6 @@ msgid "Man Made"
 msgstr "Inimtekkeline"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18305,15 +18397,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18387,6 +18479,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -18551,7 +18647,7 @@ msgid "Disused"
 msgstr ""
 
 msgid "Adit"
-msgstr "stoll"
+msgstr "Stoll"
 
 msgid "Length in meters"
 msgstr "Pikkus meetrites"
@@ -18653,7 +18749,7 @@ msgid "Survey Point"
 msgstr "Geodeetiline punkt"
 
 msgid "Surveillance Camera"
-msgstr ""
+msgstr "Turvakaamera"
 
 msgid "indoor"
 msgstr "ruumides"
@@ -18677,7 +18773,7 @@ msgid "bank"
 msgstr ""
 
 msgid "Camera"
-msgstr ""
+msgstr "Kaamera"
 
 msgctxt "camera:type"
 msgid "fixed"
@@ -19884,7 +19980,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19914,15 +20010,21 @@ msgstr "Suurlinn"
 msgid "Town"
 msgstr "Linn"
 
-msgid "Suburb"
-msgstr "Linnaosa"
-
 msgid "Village"
 msgstr "Küla/Alevik/Alev"
 
 msgid "Hamlet"
 msgstr "Küla"
 
+msgid "Isolated Dwelling"
+msgstr ""
+
+msgid "Suburb"
+msgstr "Linnaosa"
+
+msgid "Neighbourhood"
+msgstr "Piirkond"
+
 msgid "Farm"
 msgstr ""
 
@@ -19932,12 +20034,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr ""
-
-msgid "Neighbourhood"
-msgstr "Piirkond"
-
 msgid "Locality"
 msgstr "Asustamata koht"
 
@@ -20453,6 +20549,37 @@ msgstr "Pilt"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "väline osa"
 
@@ -20816,16 +20943,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20837,13 +20961,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20876,6 +21000,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20919,7 +21091,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20940,6 +21115,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21068,7 +21249,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21151,6 +21332,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21367,16 +21554,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21385,6 +21572,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21652,6 +21842,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21744,6 +21937,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -25168,13 +25364,13 @@ msgid "XAPI query: "
 msgstr ""
 
 msgid "Download from Overpass API ..."
-msgstr ""
+msgstr "Laadi alla Overpass API kaudu ..."
 
 msgid "Download map data from Overpass API server."
-msgstr ""
+msgstr "Laadi alla kaardi andmed Overpass API serverist."
 
 msgid "Overpass query: "
-msgstr ""
+msgstr "Overpass päring: "
 
 msgid "Select OSM mirror URL"
 msgstr ""
@@ -25183,7 +25379,7 @@ msgid "Select OSM mirror URL to download from."
 msgstr ""
 
 msgid "Base URL"
-msgstr ""
+msgstr "Baas-URL"
 
 msgid "Enforce meta data"
 msgstr ""
@@ -25451,10 +25647,10 @@ msgid ""
 msgstr ""
 
 msgid "Overpass API server:"
-msgstr ""
+msgstr "Overpass API server:"
 
 msgid "Overpass API server used to download OSM data"
-msgstr ""
+msgstr "Overpass API server kust OSM andmeid alla laaditakse"
 
 msgid "XAPI server:"
 msgstr ""
@@ -25462,6 +25658,8 @@ msgstr ""
 msgid ""
 "XAPI server used to download OSM data when Overpass API is not available"
 msgstr ""
+"XAPI server mida kasutatakse OSM andmete allalaadimiseks kui Overpass API ei "
+"tööta"
 
 msgid "Download modules"
 msgstr ""
@@ -27100,6 +27298,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27160,9 +27373,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/eu.po b/i18n/po/eu.po
index 1280557..87fccdd 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 13:56+0000\n"
 "Last-Translator: Txopi <txopi at sindominio.net>\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: 2014-12-29 04:38+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:37+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: eu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -220,6 +220,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Helburu geruzarik ez"
 
+msgid "Select"
+msgstr "Hautatu"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2122,9 +2129,6 @@ msgstr ""
 "Arrastatu erreproduzitu gezitxoa eta askatu pistaren ondoan audioa "
 "erreproduzitaeko hortik; Maius+askatu sinkronizatzeko audioa puntu horretan."
 
-msgid "Select"
-msgstr "Hautatu"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5814,10 +5818,6 @@ msgstr "Konpondu"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9259,7 +9259,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9280,6 +9280,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11249,7 +11255,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14455,6 +14461,12 @@ msgstr "Bideratzaile-gaitasunak ematen ditu"
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15470,12 +15482,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Aparkalekuetako-bidea"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Errepidea (mota ezezaguna)"
 
 msgid "Construction"
 msgstr "Eraikuntza"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Elkargunea"
 
@@ -15571,47 +15659,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Errotonda"
 
-msgid "motorway"
-msgstr "Autobidea"
-
-msgid "motorway_link"
-msgstr "Autobidearen lotura"
-
-msgid "trunk"
-msgstr "errepide nagusia"
-
-msgid "trunk_link"
-msgstr "errepide nagusiaren lotura"
-
-msgid "primary"
-msgstr "lehenengo mailakoa"
-
-msgid "primary_link"
-msgstr "lehenengo mailako errepidearen lotura"
-
-msgid "secondary"
-msgstr "bigarren mailakoa"
-
-msgid "tertiary"
-msgstr "hirugarren mailakoa"
-
-msgid "unclassified"
-msgstr "sailkapenik gabeko errepidea"
-
-msgid "residential"
-msgstr "kalea"
-
-msgid "living_street"
-msgstr "bizitegi-kalea"
-
-msgid "service"
-msgstr "zerbitzu-bidea"
-
-msgid "bus_guideway"
-msgstr "gidatutako autobus-bidea"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "eraikitzen"
+msgstr ""
 
 msgid "Ford"
 msgstr "Ibia"
@@ -16444,31 +16494,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Erremonte"
 
-msgid "Chair Lift"
-msgstr "Teleaulkia"
+msgid "Cable Car"
+msgstr "Telekabina"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Teleskia"
+msgid "Chair Lift"
+msgstr "Teleaulkia"
 
-msgid "Cable Car"
-msgstr "Telekabina"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16483,16 +16530,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Teleskia"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16577,6 +16632,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16607,12 +16665,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shel"
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16808,6 +16869,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -17066,6 +17130,14 @@ msgstr "Gelditzeko-plataforma"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Baliza"
 
@@ -18309,10 +18381,6 @@ msgid "Man Made"
 msgstr "Gizakiak eraikia"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18333,15 +18401,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18415,6 +18483,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Sarrera"
 
@@ -19912,7 +19984,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19942,28 +20014,28 @@ msgstr "Hiria (100.000 biztanle baino gehiago)"
 msgid "Town"
 msgstr "Herria (10.000 - 100.000 biztanle)"
 
-msgid "Suburb"
-msgstr "Auzoa"
-
 msgid "Village"
 msgstr "Herria (10.000 biztale baino gutxiago)"
 
 msgid "Hamlet"
 msgstr "Auzoa (mendialdean eta egoten direnak)"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Auzoa"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20481,6 +20553,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "kanpoko segmentua"
 
@@ -20844,16 +20947,13 @@ msgstr "Proba"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20865,13 +20965,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20904,6 +21004,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20947,7 +21095,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20968,6 +21119,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21096,7 +21253,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21179,6 +21336,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21395,16 +21558,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21413,6 +21576,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21680,6 +21846,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21772,6 +21941,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27111,6 +27283,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27171,9 +27358,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/fa.po b/i18n/po/fa.po
index 85165bd..a933860 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-03-18 07:32+0000\n"
 "Last-Translator: Saeed Ghazi Joolaee <Unknown>\n"
 "Language-Team: Persian <fa at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:15+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:12+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: fa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "بدون لایه هدف"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "افزودن لایه تصویری {0}"
 
@@ -2105,9 +2112,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5679,10 +5683,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9121,7 +9121,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9142,6 +9142,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11111,7 +11117,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14291,6 +14297,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15283,12 +15295,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15384,45 +15472,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16257,31 +16307,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16296,16 +16343,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16390,6 +16445,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16420,12 +16478,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16621,6 +16682,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16879,6 +16943,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18122,10 +18194,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18146,15 +18214,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18228,6 +18296,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19725,7 +19797,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19755,28 +19827,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20294,6 +20366,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20657,16 +20760,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20678,13 +20778,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20717,6 +20817,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20760,7 +20908,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20781,6 +20932,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20909,7 +21066,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20992,6 +21149,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21208,16 +21371,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21226,6 +21389,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21493,6 +21659,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21585,6 +21754,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26919,6 +27091,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26979,9 +27166,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/fi.po b/i18n/po/fi.po
index 21c3812..fee7920 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-02-26 18:35+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: 2014-12-29 04:49+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:48+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: fi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -222,6 +222,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Ei kohdetasoja"
 
+msgid "Select"
+msgstr "Valitse"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Asettaa valitut elementit kartalle valittuihin kohteisiin ylläolevalle "
+"listalle."
+
 msgid "Add imagery layer {0}"
 msgstr "Lisää kuvataso {0}"
 
@@ -2191,9 +2200,6 @@ msgstr ""
 "kohdasta. Jos painat vaihtonäppäintä päästöhetkellä, tahdistetaan ääniraita "
 "kyseiseen pisteeseen."
 
-msgid "Select"
-msgstr "Valitse"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Valitse, siirrä, skaalaa ja pyöritä objekteja"
 
@@ -5985,12 +5991,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Avaa yhdistämiskehotteen kaikista valituista kohteista ylläolevalle listalle."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Asettaa valitut elementit kartalle valittuihin kohteisiin ylläolevalle "
-"listalle."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Havaittiin {0} ristiriita."
@@ -9708,10 +9708,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9731,6 +9729,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-kuvat (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Valitse näytettävät jäljet"
 
@@ -11759,7 +11763,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -15036,6 +15040,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16034,12 +16044,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Pysäköintialueen ajoväylä"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Tuntemattoman luokituksen tie"
 
 msgid "Construction"
 msgstr "Rakennettava tie"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Liittymä"
 
@@ -16135,45 +16221,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Kiertoliittymä"
 
-msgid "motorway"
-msgstr "moottoritie"
-
-msgid "motorway_link"
-msgstr "moottoritien_ramppi"
-
-msgid "trunk"
-msgstr "valtatie"
-
-msgid "trunk_link"
-msgstr "valtatien_ramppi"
-
-msgid "primary"
-msgstr "kantatie"
-
-msgid "primary_link"
-msgstr "kantatien_ramppi"
-
-msgid "secondary"
-msgstr "seututie"
-
-msgid "tertiary"
-msgstr "yhdystie"
-
-msgid "unclassified"
-msgstr "tie"
-
-msgid "residential"
-msgstr "asuinkatu"
-
-msgid "living_street"
-msgstr "pihakatu"
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -17008,31 +17056,28 @@ msgstr "Vaihde"
 msgid "Aerialway"
 msgstr "Köysiradat"
 
-msgid "Chair Lift"
-msgstr "Tuolihissi"
+msgid "Cable Car"
+msgstr "Köysirata"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Hiihtohissi"
+msgid "Chair Lift"
+msgstr "Tuolihissi"
 
-msgid "Cable Car"
-msgstr "Köysirata"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -17047,17 +17092,25 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
-msgstr "Kapulahissi (T-malli)"
+msgid "Drag Lift"
+msgstr "Hiihtohissi"
 
-msgid "J-bar Lift"
-msgstr "Kapulahissi (J-malli, 1 hlö)"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
+
+msgid "j-bar"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Sompahissi"
+msgid "platter"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Naruhissi"
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Mattohissi"
@@ -17141,6 +17194,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -17171,12 +17227,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -17372,6 +17431,9 @@ msgstr "Tarjolla työkaluja omatoimiseen korjaamiseen"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Pesee polkupyöriä (maksusta)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Julkinen liikenne"
 
@@ -17630,6 +17692,14 @@ msgstr "Asemataso"
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Loisto"
 
@@ -18873,10 +18943,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18897,15 +18963,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18979,6 +19045,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -20476,7 +20546,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20506,28 +20576,28 @@ msgstr "Kunta"
 msgid "Town"
 msgstr "Kaupunki"
 
-msgid "Suburb"
-msgstr "Kaupunginosa"
-
 msgid "Village"
 msgstr "Kunta"
 
 msgid "Hamlet"
 msgstr "Kylä"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Kaupunginosa"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -21045,6 +21115,37 @@ msgstr "Kuva"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -21409,16 +21510,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21430,13 +21528,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21469,6 +21567,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21512,7 +21658,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21533,6 +21682,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21661,7 +21816,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21744,6 +21899,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21960,16 +22121,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21978,6 +22139,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22245,6 +22409,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22337,6 +22504,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27721,6 +27891,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27781,9 +27966,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/fil.po b/i18n/po/fil.po
index c5d0cac..76e4de4 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-06-19 14:15+0000\n"
 "Last-Translator: Anthony Balico <Unknown>\n"
 "Language-Team: Filipino <fil at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:40+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:36+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: fil\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/fr.po b/i18n/po/fr.po
index e3d539a..7101c82 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-17 05:31+0000\n"
-"Last-Translator: Cybereric <sybereric at yahoo.fr>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-28 14:33+0000\n"
+"Last-Translator: Frédéric Bonifas <fredericbonifas at gmail.com>\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: 2014-12-29 04:50+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:49+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: fr\n"
 "X-Poedit-Bookmarks: 1767,-1,-1,2669,-1,-1,-1,-1,-1,-1\n"
 
@@ -227,6 +227,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Aucun calque de destination"
 
+msgid "Select"
+msgstr "Sélectionner"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Sélectionner un objet"
+
 msgid "Add imagery layer {0}"
 msgstr "Ajouter le calque d’imagerie {0}"
 
@@ -2222,9 +2229,6 @@ msgstr ""
 "Déplacer la tête de lecture et la relâcher près de la trace audio à lire ; "
 "Maj+relâchement pour synchroniser la piste audio sur ce point."
 
-msgid "Select"
-msgstr "Sélectionner"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Sélectionner, déplacer, étendre et faire pivoter des objets"
 
@@ -6140,10 +6144,6 @@ msgstr "Résoudre"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Ouvrir une fenêtre de fusion pour le conflit"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Sélectionner un objet"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "{0} conflit a été détecté."
@@ -9972,10 +9972,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -10001,6 +9999,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "images JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Choisir les traces visibles"
 
@@ -12209,8 +12213,8 @@ msgstr "Intégré:"
 msgid "Projection bounds (in degrees)"
 msgstr "Limites de la projection (en degrés)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (code EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauss–Krüger"
@@ -15950,6 +15954,12 @@ msgstr "Fournit des capacités de calcul d’itinéraire."
 msgid "Loads data from SDS"
 msgstr "Charge des données depuis SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16972,12 +16982,88 @@ msgstr "drive-through"
 msgid "Parking Aisle"
 msgstr "Voie de parking"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Route (type inconnu)"
 
 msgid "Construction"
 msgstr "Route en construction"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Carrefour"
 
@@ -17073,47 +17159,9 @@ msgstr "non autorisé"
 msgid "Roundabout"
 msgstr "Giratoire"
 
-msgid "motorway"
-msgstr "autoroute"
-
-msgid "motorway_link"
-msgstr "bretelle d’accès à une autoroute"
-
-msgid "trunk"
-msgstr "voie rapide"
-
-msgid "trunk_link"
-msgstr "bretelle d’accès à une voie rapide"
-
-msgid "primary"
-msgstr "route primaire"
-
-msgid "primary_link"
-msgstr "bretelle d’accès à une route primaire"
-
-msgid "secondary"
-msgstr "route secondaire"
-
-msgid "tertiary"
-msgstr "route tertiaire"
-
-msgid "unclassified"
-msgstr "route mineure"
-
-msgid "residential"
-msgstr "rue résidentielle"
-
-msgid "living_street"
-msgstr "rue d’’habitations"
-
-msgid "service"
-msgstr "voie d’accès"
-
-msgid "bus_guideway"
-msgstr "voie pour bus guidés"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "route en construction"
+msgstr ""
 
 msgid "Ford"
 msgstr "Gué"
@@ -17968,32 +18016,29 @@ msgstr "Aiguillage"
 msgid "Aerialway"
 msgstr "Remontées mécaniques"
 
-msgid "Chair Lift"
-msgstr "Télésiège"
+msgid "Cable Car"
+msgstr "Téléphérique"
 
 msgid "Number of people per hour"
 msgstr "Nombre de personnes à l’’heure"
 
-msgid "Number of people per chair"
-msgstr "Nombre de personnes par siège"
+msgid "Number of people per car"
+msgstr "Nombre de personnes par cabine"
 
 msgid "Typical journey time in minutes"
 msgstr "Temps moyen du trajet, en minutes"
 
-msgid "Has bubble?"
-msgstr "Avec une bulle ?"
-
 msgid "Has heating?"
 msgstr "Avec chauffage ?"
 
-msgid "Drag Lift"
-msgstr "Téléski"
+msgid "Chair Lift"
+msgstr "Télésiège"
 
-msgid "Cable Car"
-msgstr "Téléphérique"
+msgid "Number of people per chair"
+msgstr "Nombre de personnes par siège"
 
-msgid "Number of people per car"
-msgstr "Nombre de personnes par cabine"
+msgid "Has bubble?"
+msgstr "Avec une bulle ?"
 
 msgid "Gondola"
 msgstr "Télécabine"
@@ -18007,17 +18052,25 @@ msgstr "Téléporté mixte"
 msgid "Number of people per gondola/chair"
 msgstr "Nombre de passagers par cabine ou siège"
 
-msgid "T-bar Lift"
-msgstr "Téléski à archets"
+msgid "Drag Lift"
+msgstr "Téléski"
 
-msgid "J-bar Lift"
-msgstr "Téléski à rondelles"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Téléski"
+msgid "t-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Téléski à câble bas"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Tapis magique"
@@ -18101,6 +18154,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18131,12 +18187,15 @@ msgstr "Repsol YPF"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18333,6 +18392,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Lavage"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transports publics"
 
@@ -18591,6 +18653,14 @@ msgstr "Aire de stationnement"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "oui"
+
 msgid "Beacon"
 msgstr "Balise lumineuse"
 
@@ -19839,10 +19909,6 @@ msgid "Man Made"
 msgstr "Édifices"
 
 msgctxt "building"
-msgid "yes"
-msgstr "oui"
-
-msgctxt "building"
 msgid "roof"
 msgstr "toiture"
 
@@ -19863,16 +19929,16 @@ msgid "school"
 msgstr "Batiment scolaire"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "Batiment commerciale"
 
 msgctxt "building"
-msgid "farm"
-msgstr "Batiment agricole"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19945,6 +20011,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "indépendant"
 
+msgctxt "building"
+msgid "farm"
+msgstr "Batiment agricole"
+
 msgid "Entrance"
 msgstr "Entrée"
 
@@ -21060,8 +21130,10 @@ msgstr "Lieu de bataille"
 msgid "Palaeontological Site"
 msgstr "Site paléontologique"
 
+# Il s'agit d'un monument commémoratif (cf le wiki >>>http://wiki.openstreetmap.org/wiki/FR:Tag:historic%3Dmonument)
+# Si l'adjectif "commémoratif" n'est pas employé alors le risque est grand qu'il y ait une confusion avec un "monument historique" tagué lui avec "heritage=*"
 msgid "Monument"
-msgstr "Monument"
+msgstr "Monument commémoratif"
 
 msgid "Memorial"
 msgstr "Mémorial"
@@ -21447,7 +21519,7 @@ msgstr "Parc National"
 msgid "Protected Area"
 msgstr "Aire protégée"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21477,15 +21549,21 @@ msgstr "Ville de plus de 100 000 habitants"
 msgid "Town"
 msgstr "Ville de 10 000 à 100 000 habitants"
 
-msgid "Suburb"
-msgstr "Banlieue"
-
 msgid "Village"
 msgstr "Village"
 
 msgid "Hamlet"
 msgstr "Hameau"
 
+msgid "Isolated Dwelling"
+msgstr "Habitation isolée"
+
+msgid "Suburb"
+msgstr "Banlieue"
+
+msgid "Neighbourhood"
+msgstr "Voisinage"
+
 msgid "Farm"
 msgstr "Ferme"
 
@@ -21495,12 +21573,6 @@ msgstr "Une ferme à l’intérieur d’un peuplement plus grand"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(prière d’utiliser isolated_dwelling pour une ferme isolée)"
 
-msgid "Isolated Dwelling"
-msgstr "Habitation isolée"
-
-msgid "Neighbourhood"
-msgstr "Voisinage"
-
 msgid "Locality"
 msgstr "Lieu-dit"
 
@@ -22018,6 +22090,37 @@ msgstr "Image"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contact (Schéma avec le préfixe ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "chemin extérieur"
 
@@ -22381,17 +22484,14 @@ msgstr "Essai"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Satellite Yahoo"
-
-msgid "Bing Sat"
-msgstr "Satellite Bing"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "Satellite MapBox"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22402,14 +22502,14 @@ msgstr "Traces GPS OpenStreetMap"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Noir & Blanc)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, sans étiquettes)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "carte de chaleur skobbler"
@@ -22441,6 +22541,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI noir et blanc 2.5 m"
 
@@ -22484,7 +22632,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22505,6 +22656,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Mosaïque de la Colombie Britannique"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "République tchèque CUZK:KM"
 
@@ -22635,8 +22792,8 @@ msgstr "Bavière (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (vue aérienne)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013  vue aérienne (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011  vue aérienne (5,0 cm)"
@@ -22720,6 +22877,12 @@ msgstr "PCN 2008 - Latium +Ombrie IT"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italie"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Lettonie"
 
@@ -22936,16 +23099,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr "MSR Carte urbaine"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Cartes topographiques scannées"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22954,6 +23117,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophoto 2012"
 
@@ -23224,6 +23390,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Décroître les numéros de rue dans l’interpolation des adresses"
 
@@ -23321,6 +23490,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -29038,6 +29210,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Sauvegarde du fichier SDS"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Éditeur de carte maritime"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Simplifier la zone"
 
@@ -29098,9 +29285,6 @@ msgstr "Facteur de distance"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Seuil de fusion des nœuds voisins"
 
-msgid "SeaMap Editor"
-msgstr "Éditeur de carte maritime"
-
 msgid "AutoSave LiveData"
 msgstr "Sauvegarde automatique des données en direct"
 
diff --git a/i18n/po/gl.po b/i18n/po/gl.po
index e704ea8..e3a95aa 100644
--- a/i18n/po/gl.po
+++ b/i18n/po/gl.po
@@ -3,21 +3,21 @@
 # This file is distributed under the same license as the josm package.
 #
 # FIRST AUTHOR <EMAIL at ADDRESS>, 2009, 2010.
-# Adrián Chaves Fernández <adriyetichaves at gmail.com>, 2014.
+# Adrián Chaves Fernández <adriyetichaves at gmail.com>, 2014, 2015.
 msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-08-20 14:37+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-25 09:58+0000\n"
 "Last-Translator: Adrián Chaves Fernández <adriyetichaves at gmail.com>\n"
 "Language-Team: Galician <proxecto at trasno.net>\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: 2014-12-29 04:54+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:52+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: gl\n"
 "X-Poedit-Language: Galician\n"
 
@@ -228,6 +228,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Non hai capas escollidas"
 
+msgid "Select"
+msgstr "Escoller"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Escoller no mapa os elementos escollidoss na lista superior."
+
 msgid "Add imagery layer {0}"
 msgstr "Engadir capa de imaxes {0}"
 
@@ -273,7 +280,7 @@ msgid "Tool: {0}"
 msgstr "Ferramenta: {0}"
 
 msgid "Not enough nodes in selected ways."
-msgstr "Non hai nodos dabondo nos camiños seleccionados."
+msgstr "Non hai nodos dabondo nas vías seleccionadas."
 
 msgid "Please select at least four nodes."
 msgstr "Escolla polo menos catro nodos."
@@ -299,11 +306,11 @@ msgstr "Non é posíbel aliñar un polígono. Interrompeuse a operación."
 
 msgid "Intersection of three or more ways can not be solved. Abort."
 msgstr ""
-"Non pode resolverse a intersección de tres ou máis camiños. Interrompeuse a "
+"Non pode resolverse a intersección de tres ou máis vías. Interrompeuse a "
 "operación."
 
 msgid "Two parallels ways found. Abort."
-msgstr "Atopáronse dous camiños paralelos. Interrompeuse a operación."
+msgstr "Atopáronse dúas vías paralelas. Interrompeuse a operación."
 
 msgid "data"
 msgstr "datos"
@@ -394,8 +401,8 @@ msgid ""
 "Could not combine ways<br>(They could not be merged into a single string of "
 "nodes)"
 msgstr ""
-"Non foi posíbel combinar os camiños.<br> Non foi posíbel combinalos nunha "
-"única cadea de nodos."
+"Non foi posíbel combinar as vías.<br> Non foi posíbel combinalos nunha única "
+"cadea de nodos."
 
 msgid "Combine {0} way"
 msgid_plural "Combine {0} ways"
@@ -561,7 +568,7 @@ msgid ""
 "Display history information about OSM ways, nodes, or relations in web "
 "browser."
 msgstr ""
-"Mostrar información histórica sobre camiños, nodos e relacións de OSM no seu "
+"Mostrar información histórica sobre vías, nodos e relacións de OSM no seu "
 "navegador web."
 
 msgid "New offset"
@@ -607,8 +614,7 @@ msgstr "información detallada"
 msgid ""
 "Display advanced object information about OSM nodes, ways, or relations."
 msgstr ""
-"Mostrar información de obxecto avanzada sobre nodos, camiños e relacións de "
-"OSM."
+"Mostrar información de obxecto avanzada sobre nodos, vías e relacións de OSM."
 
 msgid "Advanced info (web)"
 msgstr "Información detallada (web)"
@@ -617,8 +623,8 @@ msgid ""
 "Display object information about OSM nodes, ways, or relations in web "
 "browser."
 msgstr ""
-"Mostrar información de obxecto sobre nodos, camiños e relacións de OSM no "
-"seu navegador web."
+"Mostrar información de obxecto sobre nodos, vías e relacións de OSM no seu "
+"navegador web."
 
 msgid "Join overlapping Areas"
 msgstr "Unir áreas superpostas"
@@ -661,7 +667,7 @@ msgid "No intersection found. Nothing was changed."
 msgstr "Nada interesante foi atopado. Nada foi cambiado..."
 
 msgid "Move tags from ways to relations"
-msgstr "Mover as etiquetas de camiños a relacións"
+msgstr "Mover as etiquetas de vías a relacións"
 
 msgid "Reverting changes"
 msgstr "desfacendo cambios"
@@ -688,7 +694,7 @@ msgid ""
 "Some of the ways were part of relations that have been modified.<br>Please "
 "verify no errors have been introduced."
 msgstr ""
-"Algúns dos camiños formaban parte de relacións que se modificaron.<br> "
+"Algunhas das vías formaban parte de relacións que se modificaron.<br> "
 "Comprobe que non se introduciron erros."
 
 msgid "Fix tag conflicts"
@@ -705,20 +711,20 @@ msgstr ""
 msgid ""
 "Sorry. Cannot handle way that is outer in multiple multipolygon relations."
 msgstr ""
-"Non é posíbel manexar camiños que son exteriores en varias relacións de "
+"Non é posíbel manexar vías que son exteriores en varias relacións de "
 "multipolígonos."
 
 msgid ""
 "Sorry. Cannot handle way that is both inner and outer in multipolygon "
 "relations."
 msgstr ""
-"Non é posíbel manexar camiños que son exteriores e interiores en relacións "
-"de multipolígonos."
+"Non é posíbel manexar vías que son exteriores e interiores en relacións de "
+"multipolígonos."
 
 msgid ""
 "Sorry. Cannot handle way that is inner in multiple multipolygon relations."
 msgstr ""
-"Non é posíbel manexar camiños que son interiores en varias relacións de "
+"Non é posíbel manexar vías que son interiores en varias relacións de "
 "polígonos múltiples."
 
 msgid "Removed Element from Relations"
@@ -737,12 +743,12 @@ msgid "Include a node into the nearest way segments"
 msgstr "Incluír un nodo nos segmentos de vía máis achegados"
 
 msgid "Move Node onto Way"
-msgstr "Poñer o nodo no camiño"
+msgstr "Poñer o nodo na vía"
 
 msgid "Move the node onto the nearest way segments and include it"
 msgstr ""
-"Mover o nodo sobre o segmento de camiño máis próximo, e convertelo en parte "
-"dese camiño."
+"Mover o nodo sobre o segmento de vía máis próximo, e convertelo en parte "
+"desa vía."
 
 msgid "No Shortcut"
 msgstr "Sen Atallo"
@@ -783,7 +789,7 @@ msgstr ""
 "Non foi posíbel analizar a latitude, lonxitude e/ou o zoom. Comprobeo"
 
 msgid "Unable to parse Lon/Lat"
-msgstr "Non foi posible analizar lon/lat"
+msgstr "Non foi posíbel analizar lon/lat"
 
 msgid "Lasso Mode"
 msgstr "Modo de lazo"
@@ -1104,7 +1110,7 @@ msgid "Paste"
 msgstr "Pegar"
 
 msgid "Paste contents of paste buffer."
-msgstr "Pegar contidos ó buffer de pegado."
+msgstr "Pegar contidos ao buffer de pegado."
 
 msgid "Delete incomplete members?"
 msgstr "Eliminar os membros incompletos?"
@@ -1327,7 +1333,7 @@ msgid ""
 "Show status report with useful information that can be attached to bugs"
 msgstr ""
 "Amosar informe de estado con información de utilidade que poida ser engadida "
-"ós erros"
+"aos erros"
 
 msgid "Help: {0}"
 msgstr "Axda: {0}"
@@ -1453,7 +1459,7 @@ msgid "This node is not glued to anything else."
 msgstr "Este nodo non está pegado a outra cousa."
 
 msgid "None of these nodes are glued to anything else."
-msgstr "Ningún destes nodos estan pegados a outra cousa."
+msgstr "Ningún destes nodos está pegado a outra cousa."
 
 msgid "None of this way''s nodes are glued to anything else."
 msgstr "Ningún dos nodos desta vía están pegados a outra cousa."
@@ -2164,9 +2170,6 @@ msgstr ""
 "Arrastrar o cabezallo de reproducción e soltar preto da pista para "
 "reproducir o son desde alí; MAIÚS+soltar para sincronizar o son nese punto."
 
-msgid "Select"
-msgstr "Escoller"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -2354,7 +2357,7 @@ msgid "Enter the search expression"
 msgstr "Introduce a expresion de búsqueda"
 
 msgid "replace selection"
-msgstr "substituir a selección"
+msgstr "substituír a selección"
 
 msgid "add to selection"
 msgstr "engadir á selección"
@@ -2366,7 +2369,7 @@ msgid "find in selection"
 msgstr "buscar a seleccion"
 
 msgid "case sensitive"
-msgstr "sensible a maiúsculas"
+msgstr "sensíbel a maiúsculas"
 
 msgid "all objects"
 msgstr "todos os obxectos"
@@ -2432,7 +2435,7 @@ msgid ""
 msgstr ""
 
 msgid "Special targets"
-msgstr ""
+msgstr "Elementos especiais"
 
 msgid ""
 "<b>type:</b>... - objects with corresponding type (<b>node</b>, <b>way</b>, "
@@ -2937,7 +2940,7 @@ msgstr[0] ""
 msgstr[1] ""
 
 msgid "Replace \"{0}\" by \"{1}\" for"
-msgstr "Substituir «{0}» con «{1}» para"
+msgstr "Substituír «{0}» con «{1}» para"
 
 msgid "object"
 msgid_plural "objects"
@@ -3376,7 +3379,7 @@ msgstr ""
 "changesetId é {0}"
 
 msgid "A primitive with ID = 0 cannot be invisible."
-msgstr "Unha primitiva con ID = 0 non pode ser invisible."
+msgstr "Unha primitiva con ID = 0 non pode ser invisíbel."
 
 msgid ""
 "Unable to add primitive {0} to the dataset because it is already included"
@@ -3392,7 +3395,7 @@ msgstr ""
 
 msgid "Missing merge target for way with id {0}"
 msgstr ""
-"Non se atopou un obxectivo que combinar coa vía de identificador «{0}»."
+"Non se atopou un elemento que combinar coa vía de identificador «{0}»."
 
 msgid ""
 "Object of type {0} with id {1} was marked to be deleted, but it''s missing "
@@ -3401,15 +3404,15 @@ msgstr ""
 
 msgid "Missing merge target for node with id {0}"
 msgstr ""
-"Non se atopou un obxectivo que combinar co nodo de identificador «{0}»."
+"Non se atopou un elemento que combinar co nodo de identificador «{0}»."
 
 msgid "Missing merge target for relation with id {0}"
 msgstr ""
-"Non se atopou un obxectivo que combinar coa relación de identificador «{0}»."
+"Non se atopou un elemento que combinar coa relación de identificador «{0}»."
 
 msgid "Missing merge target of type {0} with id {1}"
 msgstr ""
-"Non se atopou un obxectivo co que combinar de tipo «{0}» e identificador "
+"Non se atopou un elemento co que combinar de tipo «{0}» e identificador "
 "«{1}»."
 
 msgid "Conflict in ''visible'' attribute for object of type {0} with id {1}"
@@ -3677,7 +3680,7 @@ msgid "validation other"
 msgstr "outra validación"
 
 msgid "Running test {0}"
-msgstr "Executando test {0}"
+msgstr "Executando a proba {0}"
 
 msgid "E-mail address contains non-ascii characters"
 msgstr ""
@@ -3762,7 +3765,7 @@ msgid "Coastlines"
 msgstr ""
 
 msgid "This test checks that coastlines are correct."
-msgstr "Este test comproba que as liñas de costa sexan correctas."
+msgstr "Esta proba comproba que as liñas de costa sexan correctas."
 
 msgid "Unconnected coastline"
 msgstr "Liña de costa desconectada"
@@ -4601,7 +4604,7 @@ msgid "Failed to read MOTD. Exception was: {0}"
 msgstr ""
 
 msgid "Message of the day not available"
-msgstr "Mensaxe do día non dispoñible"
+msgstr "Mensaxe do día non dispoñíbel"
 
 msgid "Click to close the dialog"
 msgstr "Premer para pechar o diálogo"
@@ -4630,7 +4633,7 @@ msgid "Show this help"
 msgstr "Amosar esta axuda"
 
 msgid "Standard unix geometry argument"
-msgstr "Argumento de xeometría unix estandar"
+msgstr "Argumento de xeometría estándar de Unix"
 
 msgid "Download the bounding box"
 msgstr "Descargar a caixa de límites"
@@ -4656,7 +4659,7 @@ msgid "Launch in maximized mode"
 msgstr "Lanzar en modo maximizado"
 
 msgid "Reset the preferences to default"
-msgstr "Restabelecer as preferencias ós valores predeterminados"
+msgstr "Restabelecer as preferencias aos valores predeterminados"
 
 msgid "Changes preferences according to the XML file"
 msgstr ""
@@ -4716,9 +4719,9 @@ msgid ""
 "      Java option to specify the maximum size of allocated memory in "
 "megabytes"
 msgstr ""
-"nota: Para algunhas operacións JOSM precisa moita memoria. Pode ser "
+"Nota: Para algunhas operacións JOSM precisa moita memoria. Pode ser "
 "necesario engadir a seguinte\n"
-"      opción de Java para especificar o maximo tamaño de memoria accesible "
+"      opción de Java para especificar o máximo tamaño de memoria accesíbel "
 "en megabytes"
 
 msgid "examples"
@@ -5276,6 +5279,8 @@ msgid ""
 "The following objects could not be copied to the target object<br>because "
 "they are deleted in the target dataset:"
 msgstr ""
+"Os seguintes obxectos non puideron copiarse no obxecto de destino<br> porque "
+"foron eliminados do grupo de datos de destino:"
 
 msgid "Merging deleted objects failed"
 msgstr ""
@@ -5390,10 +5395,10 @@ msgstr ""
 "elementos combinados."
 
 msgid "Copy all my elements to the target"
-msgstr "Copiar todos os meus elementos ao destino"
+msgstr "Copiar todos os meus elementos ao elemento de destino"
 
 msgid "Copy all their elements to the target"
-msgstr "Copiar todos os seus elementos ao destino"
+msgstr "Copiar todos os seus elementos ao elemento de destino"
 
 msgid "Up"
 msgstr "Arriba"
@@ -5436,8 +5441,8 @@ msgid ""
 "<html>Click <strong>{0}</strong> to finish merging my and their "
 "entries.</html>"
 msgstr ""
-"<html>Prema <strong>{0}</strong> para terminar a fusión das miñas entradas e "
-"das súas</html>"
+"<html>Prema <strong>{0}</strong> para terminar a combinación das miñas "
+"entradas e das súas</html>"
 
 msgid "My version ({0} entry)"
 msgid_plural "My version ({0} entries)"
@@ -5701,7 +5706,7 @@ msgid "Keep"
 msgstr "Manter"
 
 msgid "Keep this relation member for the target object"
-msgstr "Manter esta relación como membro do obxecto obxetivo."
+msgstr "Manter esta relación como membro do obxecto de destino."
 
 msgid "Undecided"
 msgstr "Sen decidir"
@@ -5875,10 +5880,6 @@ msgstr ""
 "Abrir un diálogo de combinación de todos os elementos seleccionados na lista "
 "superior."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Escoller no mapa os elementos escollidoss na lista superior."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -6218,7 +6219,7 @@ msgid "Show/hide"
 msgstr ""
 
 msgid "Toggle visible state of the selected layer."
-msgstr "Cambiar o estado visible da capa seleccionada."
+msgstr "Cambiar o estado visíbel da capa seleccionada."
 
 msgid "Show/hide layer"
 msgstr ""
@@ -6251,7 +6252,7 @@ msgid "Copy {1} of {0}"
 msgstr "Copia {1} de {0}"
 
 msgid "layer is currently visible (click to hide layer)"
-msgstr "a capa é actualmente visible (premer para agochala)"
+msgstr "a capa é actualmente visíbel (premer para agochala)"
 
 msgid "layer is currently hidden (click to show layer)"
 msgstr "a capa está actualmente agochada (premer para amosala)"
@@ -6930,7 +6931,7 @@ msgid ""
 "Cannot build changeset query with time based restrictions. Input is not "
 "valid."
 msgstr ""
-"Non foi posíbel contruir a petición de conxunto de cambios coas restrición "
+"Non foi posíbel construír a petición de conxunto de cambios coas restrición "
 "baseadas no tempo. A entrada non é válida."
 
 msgid ""
@@ -7768,7 +7769,7 @@ msgstr ""
 
 msgid "Download area ok, size probably acceptable to server"
 msgstr ""
-"Área de Descarga correcta, probablemente o tamaño sexa aceptable para o "
+"Área de descarga correcta, probablemente o tamaño sexa aceptábel para o "
 "servidor"
 
 msgid "Click to close the dialog and to abort downloading"
@@ -9414,10 +9415,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9437,6 +9436,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "imaxes JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -9515,7 +9520,7 @@ msgid "Click to cancel"
 msgstr ""
 
 msgid "Download from OSM along this track"
-msgstr "Descargar de OSM ó longo deste camiño"
+msgstr "Descargar de OSM ao longo deste camiño"
 
 msgid "Calculating Download Area"
 msgstr ""
@@ -9572,7 +9577,7 @@ msgid "Audio markers from {0}"
 msgstr "Marcas de son de {0}"
 
 msgid "No GPX track available in layer to associate audio with."
-msgstr "Non hai camiños GPX dispoñibles na capa para asociar ó son."
+msgstr "Non hai camiños GPX dispoñibles na capa para asociar ao son."
 
 msgid ""
 "Some waypoints with timestamps from before the start of the track or after "
@@ -9624,7 +9629,7 @@ msgid "Show Text/Icons"
 msgstr ""
 
 msgid "Toggle visible state of the marker text and icons."
-msgstr "Cambiar o estado visible do texto e iconas da marca."
+msgstr "Cambiar o estado visíbel do texto e iconas da marca."
 
 msgid "Synchronize Audio"
 msgstr "Sincronizar o son"
@@ -9708,10 +9713,10 @@ msgid ""
 msgstr ""
 
 msgid "Access Token Key:"
-msgstr "Clave de Access Token:"
+msgstr "Clave do código de acceso:"
 
 msgid "Access Token Secret:"
-msgstr "Secreto de Access Token:"
+msgstr "Secreto do código de acceso:"
 
 msgid "Save Access Token in preferences"
 msgstr ""
@@ -9734,7 +9739,7 @@ msgid "Request Token URL:"
 msgstr ""
 
 msgid "Access Token URL:"
-msgstr "URL de Access Token:"
+msgstr "URL do código de acceso:"
 
 msgid "Authorize URL:"
 msgstr "Autorizar o URL:"
@@ -9873,7 +9878,7 @@ msgid ""
 msgstr ""
 
 msgid "Access Token"
-msgstr "Access Token"
+msgstr "Código de acceso"
 
 msgid "Advanced OAuth parameters"
 msgstr "Parametros de OAuth avanzados"
@@ -10007,16 +10012,17 @@ msgid "Select to grant JOSM the right to modify notes on your behalf"
 msgstr ""
 
 msgid "Retrieving OAuth Access Token..."
-msgstr "Obtendo Token de Acesso OAuth..."
+msgstr "Obtendo un código de acceso mediante OAuth…"
 
 msgid "<html>Retrieving an OAuth Access Token from ''{0}'' failed.</html>"
-msgstr "<html>Fallo ao obter un Token de Acesso OAuth de ''{0}''.</html>"
+msgstr ""
+"<html>Fallo ao obter un código de acceso mediante OAuth de ''{0}''.</html>"
 
 msgid "Request Failed"
 msgstr "A petición fallou"
 
 msgid "Retrieving OAuth Request Token..."
-msgstr "Obtendo petición para token de acesso OAuth..."
+msgstr "Obtendo un código de petición de OAuth…"
 
 msgid "<html>Retrieving an OAuth Request Token from ''{0}'' failed.</html>"
 msgstr ""
@@ -10025,7 +10031,7 @@ msgid "Display Advanced OAuth Parameters"
 msgstr "Amosar Parámetros de OAuth Avanzados"
 
 msgid "Retrieve Request Token"
-msgstr "Obter token de aceso"
+msgstr "Obter un código de acceso"
 
 msgid ""
 "<html>Please click on <strong>{0}</strong> to retrieve an OAuth Request "
@@ -10033,13 +10039,13 @@ msgid ""
 msgstr ""
 
 msgid "<html>Step 1/3: Retrieve an OAuth Request Token</html>"
-msgstr "<html>Paso 1/3: Obter un Token de petición de OAuth</html>"
+msgstr "<html>Paso 1/3: Obter un código de petición de OAuth</html>"
 
 msgid "<html>Step 2/3: Authorize and retrieve an Access Token</html>"
-msgstr "<html>Paso 2/3: Autorizar e obter un Token de Aceso</html>"
+msgstr "<html>Paso 2/3: Autorizar e obter un código de acceso</html>"
 
 msgid "Request Access Token"
-msgstr "Solicitar Token de Aceso"
+msgstr "Solicitar un código de acceso"
 
 msgid ""
 "<html>JOSM successfully retrieved a Request Token. JOSM is now launching an "
@@ -10073,7 +10079,7 @@ msgid "Click to retrieve an Access Token"
 msgstr ""
 
 msgid "Testing OAuth Access Token"
-msgstr "Testando o Token de Acesso OAuth"
+msgstr "Probando o código de acceso mediante OAuth"
 
 msgid "Retrieving user details with Access Token Key ''{0}'' was rejected."
 msgstr ""
@@ -10098,7 +10104,7 @@ msgid ""
 msgstr ""
 
 msgid "Test failed"
-msgstr "O test fallou"
+msgstr "A proba fallou"
 
 msgid ""
 "<html>The Access Token ''{1}'' is known to the OSM server ''{0}''.<br>The "
@@ -10109,7 +10115,7 @@ msgid ""
 msgstr ""
 
 msgid "Token allows restricted access"
-msgstr "O Token permite aceso restrinxido"
+msgstr "O código permite aceso restrinxido"
 
 msgid ""
 "<html>Failed to retrieve information about the current user from the OSM "
@@ -10256,7 +10262,7 @@ msgid "Toolbar"
 msgstr "Barra de ferramentas"
 
 msgid "Available"
-msgstr "Dispoñible"
+msgstr "Dispoñíbel"
 
 msgid "Action parameters"
 msgstr "Parámetros de acción"
@@ -10594,7 +10600,7 @@ msgid "Highlight target ways and nodes"
 msgstr ""
 
 msgid "Draw rubber-band helper line"
-msgstr "Debuxar liña de axuda flexible"
+msgstr "Debuxar liña de axuda flexíbel"
 
 msgid "Smooth map graphics (antialiasing)"
 msgstr "Gráficos de mapa suaves (filtro antialiasing)"
@@ -10861,7 +10867,7 @@ msgid "Incorrect audio waypoint label pattern: {0}"
 msgstr ""
 
 msgid "Show splash screen at startup"
-msgstr "Mostrar a pantalla de benvida ó iniciar"
+msgstr "Mostrar a pantalla de benvida ao iniciar"
 
 msgid "Show object ID in selection lists"
 msgstr "Amosar a ID do obxecto nas listas de selección"
@@ -11475,7 +11481,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -11752,8 +11758,7 @@ msgstr ""
 
 msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
-msgstr ""
-"Vostede xa ten un Access Token para acceder ao servidor OSM usando OAuth."
+msgstr "Vostede xa ten un código de acceso ao servidor OSM mediante OAuth."
 
 msgid "Save to preferences"
 msgstr ""
@@ -12034,7 +12039,7 @@ msgid "Paste tags from buffer"
 msgstr ""
 
 msgid "Use preset ''{0}'' of group ''{1}''"
-msgstr "Usar ó axuste prestabelecido «{0}» do grupo «{1}»"
+msgstr "Usar o axuste predefinido «{0}» do grupo «{1}»"
 
 msgid "Use preset ''{0}''"
 msgstr "Usar o axuste prestabelecido «{0}»"
@@ -12175,11 +12180,11 @@ msgid ""
 "Adjustable {0} not registered yet. Cannot set participation in synchronized "
 "adjustment."
 msgstr ""
-"O axustable {0} aínda non está rexistrado. Non é posíbel marcar a "
+"O axustábel {0} aínda non está rexistrado. Non é posíbel marcar a "
 "participación en axustes de sincronizados."
 
 msgid "Adjustable {0} not registered yet."
-msgstr "O axustable {0} aínda non está rexistrado."
+msgstr "O axustábel {0} aínda non está rexistrado."
 
 msgid "Some of the key listeners forgot to remove themselves: {0}"
 msgstr ""
@@ -12436,7 +12441,7 @@ msgid ""
 "Note: GPL is not compatible with the OSM license. Do not upload GPL licensed "
 "tracks."
 msgstr ""
-"Nota: GPL non é compatible coa licenza OSM. Non envíe camiños con licenza "
+"Nota: GPL non é compatíbel coa licenza OSM. Non envíe camiños con licenza "
 "GPL."
 
 msgid "GPS track description"
@@ -12612,7 +12617,7 @@ msgid "Unable to initialize OSM API."
 msgstr ""
 
 msgid "This version of JOSM is incompatible with the configured server."
-msgstr "Esta versión de JOSM é incompatible co servidor configurado."
+msgstr "Esta versión de JOSM é incompatíbel co servidor configurado."
 
 msgid ""
 "It supports protocol version 0.6, while the server says it supports {0} to "
@@ -12958,7 +12963,7 @@ msgid "{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"
 msgstr "{0}% ({1}/{2}), {3} restantes. Subindo nodo ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"
-msgstr "{0}% ({1}/{2}), {3} restantes. Subindo vñia ''{4}'' (id: {5})"
+msgstr "{0}% ({1}/{2}), {3} restantes. Subindo vía ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"
 msgstr "{0}% ({1}/{2}), {3} restantes. Subindo relación ''{4}'' (id: {5})"
@@ -14670,12 +14675,13 @@ msgstr ""
 msgid ""
 "Allows opening gpx/osm files that intersect the currently visible screen area"
 msgstr ""
-"Premite abrir ficheiros gpx/osm que intersecan coa area visible actualmente"
+"Permite abrir ficheiros gpx/osm que conteñen parte da área actualmente "
+"visíbel"
 
 msgid ""
 "Launches FireFox to display the current visible screen as a nice SVG image."
 msgstr ""
-"Abre o Firefox e amosa a cartografía visible actualmente como unha bonita "
+"Abre o Firefox e amosa a cartografía visíbel actualmente como unha bonita "
 "imaxe SVG."
 
 msgid ""
@@ -14757,6 +14763,12 @@ msgstr "Fornece capacidades de encamiñamento."
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15528,7 +15540,7 @@ msgid "evangelical"
 msgstr "evanxélico"
 
 msgid "jehovahs_witness"
-msgstr "testigos de Xenoveva"
+msgstr "Testemuñas de Xeová"
 
 msgid "lutheran"
 msgstr "luterano"
@@ -15765,12 +15777,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Corredor de aparcamento"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Rúa (Tipo descoñecido)"
 
 msgid "Construction"
 msgstr "Construcción"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Unión"
 
@@ -15866,47 +15954,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rotonda"
 
-msgid "motorway"
-msgstr "Autopista"
-
-msgid "motorway_link"
-msgstr "Acceso a autopista"
-
-msgid "trunk"
-msgstr "Carretera principal"
-
-msgid "trunk_link"
-msgstr "Enlace a carretera principal"
-
-msgid "primary"
-msgstr "vía primaria"
-
-msgid "primary_link"
-msgstr "acceso a vía primaria"
-
-msgid "secondary"
-msgstr "vía secundaria"
-
-msgid "tertiary"
-msgstr "vía local"
-
-msgid "unclassified"
-msgstr "vía sen clasificación"
-
-msgid "residential"
-msgstr "rúa urbana"
-
-msgid "living_street"
-msgstr "rúa residencial"
-
-msgid "service"
-msgstr "vía de servicio"
-
-msgid "bus_guideway"
-msgstr "carril bus guiado"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "en construcción"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vado"
@@ -15939,7 +15989,7 @@ msgid "MTB Scale"
 msgstr "Escala MTB"
 
 msgid "Path"
-msgstr "Camiño"
+msgstr "Camiño peonil"
 
 msgid "SAC Scale"
 msgstr "Escala SAC"
@@ -16112,7 +16162,7 @@ msgid "Rest Area"
 msgstr "Área de Descanso"
 
 msgid "Drinking Water"
-msgstr "Auga potable"
+msgstr "Auga potábel"
 
 msgid "Traffic Signal"
 msgstr "Semáforo"
@@ -16740,31 +16790,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Remonte"
 
-msgid "Chair Lift"
-msgstr "Telesilla"
+msgid "Cable Car"
+msgstr "Telecabina"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Telearrastre"
+msgid "Chair Lift"
+msgstr "Telesilla"
 
-msgid "Cable Car"
-msgstr "Telecabina"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16779,16 +16826,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Telearrastre"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16873,6 +16928,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16903,12 +16961,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16931,7 +16992,7 @@ msgid "kiosk"
 msgstr "quiosco"
 
 msgid "Fuel types:"
-msgstr "Tipos de combustible:"
+msgstr "Tipos de combustíbel:"
 
 msgid "Diesel"
 msgstr "Diesel"
@@ -17104,6 +17165,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transporte público"
 
@@ -17362,6 +17426,14 @@ msgstr "Apron"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Baliza"
 
@@ -17831,7 +17903,7 @@ msgstr ""
 
 msgctxt "christian"
 msgid "protestant"
-msgstr ""
+msgstr "protestante"
 
 msgctxt "christian"
 msgid "quaker"
@@ -18605,10 +18677,6 @@ msgid "Man Made"
 msgstr "Feito polo home"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18629,15 +18697,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18711,6 +18779,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -20122,7 +20194,7 @@ msgid "bicycle_tube"
 msgstr "tubo_de_bicicleta"
 
 msgid "cigarettes"
-msgstr "Estanco"
+msgstr "estanco"
 
 msgid "condoms"
 msgstr "gomas do pito"
@@ -20208,7 +20280,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20238,28 +20310,28 @@ msgstr "Cidade"
 msgid "Town"
 msgstr "Vila"
 
-msgid "Suburb"
-msgstr "Suburbio"
-
 msgid "Village"
 msgstr "Poboación"
 
 msgid "Hamlet"
 msgstr "Aldea"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Suburbio"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20777,6 +20849,37 @@ msgstr "Imaxe"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "segmento exterior"
 
@@ -21140,16 +21243,13 @@ msgstr "Proba"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21161,13 +21261,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21200,6 +21300,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21243,7 +21391,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21264,6 +21415,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21392,7 +21549,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21475,6 +21632,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21691,16 +21854,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21709,6 +21872,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21976,6 +22142,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22068,6 +22237,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -23485,7 +23657,7 @@ msgid ""
 "Town/city {0} not found or not available\n"
 "or action canceled"
 msgstr ""
-"Cidade/Vila {0} non atopada ou non dispoñible\n"
+"Cidade/Vila {0} non atopada ou non dispoñíbel\n"
 "ou acción cancelada"
 
 msgid "Choose from..."
@@ -25479,7 +25651,7 @@ msgstr ""
 
 msgid "Unable to find via nodes. Please check your selection"
 msgstr ""
-"Non foi posible atopar nodos de vias. Por favor revise a sua selección"
+"Non foi posíbel atopar nodos de vías. Por favor revise a súa selección"
 
 msgid ""
 "XAPI query, e.g., '''' (to download all data), ''[highway=*]'', or "
@@ -26081,7 +26253,7 @@ msgid "Processing module list from site ''{0}''"
 msgstr ""
 
 msgid "Open Visible..."
-msgstr "Abrir Visible..."
+msgstr "Abrir visíbel…"
 
 msgid "Open only files that are visible in current view."
 msgstr "Abrir só ficheiros que sexan visibles na vista actual."
@@ -26104,7 +26276,7 @@ msgid ""
 msgstr ""
 
 msgid "Firefox executable"
-msgstr "Executable de firefox"
+msgstr "Executábel de Firefox"
 
 msgid "OSM Server Files pbf compressed"
 msgstr ""
@@ -26152,7 +26324,7 @@ msgid "Place"
 msgstr "Lugar"
 
 msgid "Show target"
-msgstr "Amosar Obxectivo"
+msgstr "Amosar o elemento de destino"
 
 msgid "Take X and Y from selected node"
 msgstr "Coller X e Y do nodo escollido"
@@ -27430,6 +27602,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor Seamap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27490,9 +27677,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr "Editor Seamap"
-
 msgid "AutoSave LiveData"
 msgstr ""
 
@@ -28472,8 +28656,8 @@ msgid ""
 "the tag key <tt>restriction</tt>. It is recommended to use standard values "
 "only. Please select one in the Basic editor."
 msgstr ""
-"Este xiro usa unha restrición non estándard do tipo <tt>{0}</tt> para a "
-"etiqueta <tt>restrición</tt>. É recomendable usar só valores estándard. Por "
+"Este xiro usa unha restrición non estándar do tipo <tt>{0}</tt> para a "
+"etiqueta <tt>restrición</tt>. É recomendábel usar só valores estándar. Por "
 "favor escolle un no editor básico."
 
 msgid "Go to Basic Editor and manually choose a turn restriction type"
diff --git a/i18n/po/he.po b/i18n/po/he.po
index a6f600c..30c6cdb 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 13:38+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: Hebrew <he at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:57+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:54+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: he\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "אין שכבות יעד"
 
+msgid "Select"
+msgstr "בחר"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "הגדר את הפריטים הנבחרים שעל המפה לפריטים הנבחרים ברשימה שלהלן."
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2044,9 +2051,6 @@ msgstr ""
 "גרור את ראש הנגינה ושחרר ליד הרצועה המבוקשת לניגון שמע ממנה; SHIFT+שחרור "
 "לסנכרון השמע בנקודה זו."
 
-msgid "Select"
-msgstr "בחר"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5636,10 +5640,6 @@ msgstr "פתור"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "פתח את תיבת דו-שיח עבור כל הפריטים הנבחרים ברשימה שלהלן."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "הגדר את הפריטים הנבחרים שעל המפה לפריטים הנבחרים ברשימה שלהלן."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9083,10 +9083,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} קמ\"ש"
 
 msgid ""
 "\n"
@@ -9106,6 +9104,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "תמונות JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11077,7 +11081,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14261,6 +14265,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15253,12 +15263,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "מפרץ חנייה"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "כביש (סוג לא ידוע)"
 
 msgid "Construction"
 msgstr "בנייה"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "צומת"
 
@@ -15354,47 +15440,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "כיכר"
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr "ראשי"
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr "משני"
-
-msgid "tertiary"
-msgstr "שלישוני"
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr "מגורים"
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr "שירות"
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "בנייה"
+msgstr ""
 
 msgid "Ford"
 msgstr "אזור צליחה"
@@ -16227,31 +16275,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16266,16 +16311,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16360,6 +16413,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16390,12 +16446,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16591,6 +16650,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "תחבורה ציבורית"
 
@@ -16849,6 +16911,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18092,10 +18162,6 @@ msgid "Man Made"
 msgstr "מעשה אדם"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18116,15 +18182,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18198,6 +18264,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "כניסה"
 
@@ -19695,7 +19765,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19725,28 +19795,28 @@ msgstr "עיר"
 msgid "Town"
 msgstr "עיירה"
 
-msgid "Suburb"
-msgstr "פרבר"
-
 msgid "Village"
 msgstr "כפר"
 
 msgid "Hamlet"
 msgstr "כפר קטן"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "פרבר"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20264,6 +20334,37 @@ msgstr "תמונה"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20627,16 +20728,13 @@ msgstr "ניסיון"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20648,13 +20746,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20687,6 +20785,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20730,7 +20876,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20751,6 +20900,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20879,7 +21034,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20962,6 +21117,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21178,16 +21339,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21196,6 +21357,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21463,6 +21627,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21555,6 +21722,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26893,6 +27063,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26953,9 +27138,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/hi.po b/i18n/po/hi.po
index 584dbb9..8cc1430 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-11-14 16:28+0000\n"
 "Last-Translator: nipunreddevil <nipunreddevil at gmail.com>\n"
 "Language-Team: Hindi <hi at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:58+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:55+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: hi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/hr.po b/i18n/po/hr.po
index 3028b91..f2dcc7e 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-05 18:14+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: 2014-12-29 05:22+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:17+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: hr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -219,6 +219,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Nema ciljnog sloja"
 
+msgid "Select"
+msgstr "Odaberi"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Dodaj slikovni sloj {0}"
 
@@ -2127,9 +2134,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Odaberi"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Odaberi, pomiči, skaliraj i rotiraj objekte"
 
@@ -5735,10 +5739,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9205,7 +9205,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9226,6 +9226,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11195,7 +11201,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14375,6 +14381,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15367,12 +15379,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Cesta ( nepoznata vrsta)"
 
 msgid "Construction"
 msgstr "Izgradnja"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Križanje"
 
@@ -15468,47 +15556,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Kružni tok (rotor)"
 
-msgid "motorway"
-msgstr "autocesta"
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr "Brza cesta"
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr "cesta 1. reda"
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr "cesta 2. reda"
-
-msgid "tertiary"
-msgstr "cesta 3. reda"
-
-msgid "unclassified"
-msgstr "nerazvrstana cesta"
-
-msgid "residential"
-msgstr "stambena cesta"
-
-msgid "living_street"
-msgstr "stambena zona"
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "izgradnja"
+msgstr ""
 
 msgid "Ford"
 msgstr ""
@@ -16341,31 +16391,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16380,16 +16427,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
+
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16474,6 +16529,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16504,12 +16562,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16705,6 +16766,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16963,6 +17027,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18206,10 +18278,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18230,15 +18298,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18312,6 +18380,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19809,7 +19881,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19839,28 +19911,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20378,6 +20450,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20741,16 +20844,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20762,13 +20862,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20801,6 +20901,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20844,7 +20992,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20865,6 +21016,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20993,7 +21150,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21076,6 +21233,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21292,16 +21455,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21310,6 +21473,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21577,6 +21743,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21669,6 +21838,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27007,6 +27179,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Pojednostavi područje"
 
@@ -27067,9 +27254,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ht.po b/i18n/po/ht.po
index a628d13..b623534 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2010-03-11 21:17+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Haitian; Haitian Creole <ht at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:56+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:54+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/hu.po b/i18n/po/hu.po
index 8d3e243..91c6e9e 100644
--- a/i18n/po/hu.po
+++ b/i18n/po/hu.po
@@ -3,21 +3,21 @@
 # This file is distributed under the same license as the josm package.
 #
 # György Balló <ballogy at freestart.hu>, 2009, 2014.
-# HVGY <szupernova at gmail.com>, 2014.
+# HVGY <szupernova at gmail.com>, 2014, 2015.
 msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-11-24 03:36+0000\n"
-"Last-Translator: HVGY <Unknown>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-28 13:44+0000\n"
+"Last-Translator: Báthory Péter <bathory86p at gmail.com>\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: 2014-12-29 04:59+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:56+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: hu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -227,6 +227,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Nincs célréteg"
 
+msgid "Select"
+msgstr "Kiválaszt"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Kiválasztja a térképen a fenti listában kijelölt elemeket."
+
 msgid "Add imagery layer {0}"
 msgstr "Légifelvétel réteg hozzáadása: {0}"
 
@@ -1597,7 +1604,7 @@ msgid "Updates the objects in the active data layer from the server."
 msgstr "Az aktív adatréteg objektumainak frissítése a szerverről."
 
 msgid "Update modified"
-msgstr "Mósosítások frissítése"
+msgstr "Módosítások frissítése"
 
 msgid ""
 "Updates the currently modified objects from the server (re-downloads data)"
@@ -2217,9 +2224,6 @@ msgstr ""
 "Mozgasd a lejátszófejet a nyomvonal közelébe és engedd el a hang onnantóli "
 "lejátszásához; SHIFT+elengedés szinkronizálja a hangot a ponthoz."
 
-msgid "Select"
-msgstr "Kiválaszt"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Objektumokat kiválaszt, mozgat, átméretez és forgat"
 
@@ -4067,7 +4071,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Internet címkékkel kapcsolatos hibák keresése"
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " Az URL-t nem lehet ASCII-ba konvertálni: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4851,35 +4855,39 @@ msgid "options provided as Java system properties"
 msgstr "Java rendszerbeállítások által nyújtott kapcsolók"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/PATH/TO/JOSM/PREF    "
 
 msgid "Set the preferences directory"
-msgstr ""
+msgstr "Beállítások könyvtár beállítása"
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/PATH/TO/JOSM/USERDATA"
 
 msgid "Set the user data directory"
-msgstr ""
+msgstr "Felhasználói adat könyvtár beállítása"
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/PATH/TO/JOSM/CACHE   "
 
 msgid "Set the cache directory"
-msgstr ""
+msgstr "Gyorsítótár könyvár beállítása"
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/PATH/TO/JOSM/HOMEDIR "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
 "homedir/cache"
 msgstr ""
+"Mindhárom könyvtár áthelyezése a homedir-ba. A gyorsítótár könyvtár a "
+"homedir/cache-ba kerül"
 
 msgid ""
 "-Djosm.home has lower precedence, i.e. the specific setting overrides the "
 "general one"
 msgstr ""
+"Elsőbbségét tekintve a -Djosm.home alacsonyabb szintű, azaz a specifikusabb "
+"beállítás felülírja az általánosabbat"
 
 msgid ""
 "note: For some tasks, JOSM needs a lot of memory. It can be necessary to add "
@@ -5155,19 +5163,19 @@ 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 ""
+msgstr "Alapértelmezett (nyitás, bezárt, új)"
 
 msgid "Username"
 msgstr "Felhasználónév"
 
 msgid "Created date"
-msgstr ""
+msgstr "Készítés dátuma"
 
 msgid "Last change date"
-msgstr ""
+msgstr "Utolsó módosítás dátuma"
 
 msgid "Select note sorting method"
-msgstr ""
+msgstr "Jegyzet rendezési módszer kiválasztása"
 
 msgid "Click to cancel the current operation"
 msgstr "Kattintson ide a jelenlegi művelet megszakításához"
@@ -5362,10 +5370,10 @@ msgid "Conflict foreground: keep all tags"
 msgstr "Ütközés előtér: összes címke megtartása"
 
 msgid "Conflict background: sum all numeric tags"
-msgstr ""
+msgstr "Ütközés háttér: összes numerikus címke összeadása"
 
 msgid "Conflict foreground: sum all numeric tags"
-msgstr ""
+msgstr "Ütközés előtér: összes numerikus címke összeadása"
 
 msgid "Conflict background: keep member"
 msgstr "Ütközés háttér: tag megtartása"
@@ -5830,7 +5838,7 @@ msgid "all"
 msgstr "mind"
 
 msgid "sum"
-msgstr ""
+msgstr "összeg"
 
 msgid "Please decide which values to keep"
 msgstr "Kérlek döntsd el, melyik értékek legyenek megtartva"
@@ -5841,6 +5849,7 @@ msgstr "''{0}'' érték alkalmazva lesz ''{1}'' kulcsra"
 msgid ""
 "All numeric values sumed as ''{0}'' are going to be applied for key ''{1}''"
 msgstr ""
+"Minden számérték összege, azaz ''{0}'' lesz alkalmazva a(z) ''{1}'' kulcshoz"
 
 msgid "The key ''{0}'' and all its values are going to be removed"
 msgstr "''{0}'' kulcs és az összes értéke törölve lesz"
@@ -6084,10 +6093,6 @@ msgstr "Megold"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Egyesítő ablak megnyitása a kijelölt objektumokkal."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Kiválasztja a térképen a fenti listában kijelölt elemeket."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "{0} ütközés észlelve."
@@ -6625,7 +6630,7 @@ msgid "Reopen note with message:"
 msgstr "Jegyzet újranyitása üzenettel:"
 
 msgid "Sort notes"
-msgstr ""
+msgstr "Jegyzetek rendezése"
 
 msgid "Sort"
 msgstr "Rendezés"
@@ -8034,7 +8039,7 @@ msgstr ""
 "Pipáld ki a GPS nyomvonalak letöltéséhez a kijelölt letöltési területről."
 
 msgid "Notes"
-msgstr "Bankjegyek"
+msgstr "Jegyzetek"
 
 msgid "Select to download notes in the selected download area."
 msgstr "Pipáld ki a kijelölt területen lévő jegyzetek letöltéséhez."
@@ -9289,8 +9294,8 @@ msgstr[1] "{0} létrehozandó objektum:"
 
 msgid "{0} object to modify:"
 msgid_plural "{0} objects to modify:"
-msgstr[0] "{0} módosítotandó objektum:"
-msgstr[1] "{0} módosítotandó objektum:"
+msgstr[0] "{0} módosítandó objektum:"
+msgstr[1] "{0} módosítandó objektum:"
 
 msgid "{0} object to delete:"
 msgid_plural "{0} objects to delete:"
@@ -9856,7 +9861,7 @@ msgid "Delete File from disk"
 msgstr "Fájl törlése a lemezről"
 
 msgid "Copy image path"
-msgstr ""
+msgstr "Kép útvonalának másolása"
 
 msgid "Next"
 msgstr "Következő"
@@ -9888,10 +9893,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9917,6 +9920,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG képek (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Látható nyomvonalak kiválasztása"
 
@@ -12115,8 +12124,8 @@ msgstr "Beépített:"
 msgid "Projection bounds (in degrees)"
 msgstr "Vetület határok (fokban)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG kód)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -12599,7 +12608,7 @@ msgstr ""
 "''{1}''"
 
 msgid "Checks for errors on addresses"
-msgstr "A címek hibaellenőrzése"
+msgstr "A lakcímek hibaellenőrzése"
 
 msgid "Tag combinations"
 msgstr "Cimke kombinációk"
@@ -13639,7 +13648,7 @@ 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 ""
+msgstr "{0} bájt volt olvasva"
 
 msgid "Prepare OSM data..."
 msgstr "OSM adatok előkészítése…"
@@ -13832,7 +13841,7 @@ msgid "Cannot start remotecontrol server on port {0}: {1}"
 msgstr "Nem indul el a távvezérlő szerver a(z) {0} porton: {1}"
 
 msgid "RemoteControl::Accepting connections on {0}:{1}"
-msgstr ""
+msgstr "Távirányító::Kapcsolatok fogadása {0}:{1}"
 
 msgid "RemoteControl::Server stopped."
 msgstr "Távirányító::Szerver megállítva."
@@ -13844,7 +13853,7 @@ msgid "Unable to initialize Remote Control HTTPS Server"
 msgstr "Nem sikerül inicializálni a Távirányító HTTPS szervert"
 
 msgid "RemoteControl::Accepting secure connections on {0}:{1}"
-msgstr ""
+msgstr "Távirányító::Biztonságos kapcsolatok fogadása a(z) {0}:{1} porton"
 
 msgid "RemoteControl::Server (https) stopped."
 msgstr "Távirányító::Szerver (https) megállítva."
@@ -15184,7 +15193,7 @@ msgstr "rét"
 
 msgctxt "landuse"
 msgid "farmland"
-msgstr "tanya"
+msgstr "szántóföld"
 
 msgctxt "landuse"
 msgid "residential"
@@ -15504,7 +15513,7 @@ msgstr "Vonalak hálózatát hozza létre."
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
 msgstr ""
-"Létrehozza és kezeli a címmel ellátott pontokat és épületeket a Cseh "
+"Létrehozza és kezeli a lakcímmel ellátott pontokat és épületeket a Cseh "
 "Köztársaságban."
 
 msgid ""
@@ -15549,7 +15558,8 @@ msgid "Fast drawing ways by mouse"
 msgstr "Vonalak gyors rajzolása egérrel"
 
 msgid "Finds and fixes invalid street addresses in a comfortable way."
-msgstr "Megtalálja és javítja a helytelen utca címeket, kényelmesen."
+msgstr ""
+"Megtalálja és javítja a lakcímekben lévő helytelen utcákat, kényelmesen."
 
 msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
@@ -15637,6 +15647,10 @@ msgid ""
 "Provides Java Native Access (JNA) library. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
 msgstr ""
+"A Java Native Access (JNA) könyvtárat teszi elérhetővé más JOSM bővítmények "
+"számára Ez nem jelenti azt, hogy a felhasználónak közvetlenül kell "
+"telepítenie, mivel ez inkább egy működési előfeltétel, függőség más "
+"bővítmények részére."
 
 msgid ""
 "Provides Java Topology Suite (JTS) library and related utilities. Not meant "
@@ -15826,6 +15840,12 @@ msgstr "Útvonal tervezési képességet nyújt"
 msgid "Loads data from SDS"
 msgstr "Adatbetöltés az SDS-ből"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15858,6 +15878,9 @@ msgid ""
 "tagging presets (quick preview of the dialog that will popup). You can start "
 "the jar-file as standalone as well."
 msgstr ""
+"Előre definiált címkehalmaz tesztelőt ad hozzá a súgó menüponthoz, amely így "
+"hathatós segítség lehet ezen címkézési gyűjtemények fejlesztéséhez (a majdan "
+"felugró ablak előnézete). A jar fájl önnmagában is elindítható."
 
 msgid "Make terraced houses out of single blocks."
 msgstr "Szimpla blokkokból készít teraszos házakat."
@@ -16428,7 +16451,7 @@ msgstr "Érmék"
 
 msgctxt "payment"
 msgid "Notes"
-msgstr ""
+msgstr "Jegyzetek"
 
 msgid "Electronic purses and Charge cards"
 msgstr "Elektronikus vásárlás és feltöltőkártya"
@@ -16846,12 +16869,88 @@ msgstr "Áthajtó"
 msgid "Parking Aisle"
 msgstr "parkolóút"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "út (ismeretlen típusú)"
 
 msgid "Construction"
 msgstr "Építés alatt"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Útelágazás"
 
@@ -16947,47 +17046,9 @@ msgstr "nem"
 msgid "Roundabout"
 msgstr "Körforgalom"
 
-msgid "motorway"
-msgstr "autópálya"
-
-msgid "motorway_link"
-msgstr "autópályalehajtó"
-
-msgid "trunk"
-msgstr "autóút"
-
-msgid "trunk_link"
-msgstr "autóútlehajtó"
-
-msgid "primary"
-msgstr "főút"
-
-msgid "primary_link"
-msgstr "főútlehajtó"
-
-msgid "secondary"
-msgstr "összekötőút"
-
-msgid "tertiary"
-msgstr "bekötőút"
-
-msgid "unclassified"
-msgstr "egyéb közút"
-
-msgid "residential"
-msgstr "lakó"
-
-msgid "living_street"
-msgstr "pihenőút"
-
-msgid "service"
-msgstr "szervizút"
-
-msgid "bus_guideway"
-msgstr "buszsín"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "építés alatt"
+msgstr ""
 
 msgid "Ford"
 msgstr "Gázló"
@@ -17072,6 +17133,8 @@ msgid ""
 "single plainly climbing up to second grade. Exposed, demanding terrain, "
 "jagged rocks, few dangerous glacier and snow"
 msgstr ""
+"szimpla, egyszerűen mászható egészen a második nehézségi fokozatig. "
+"Védtelen, megerőltető terep, recés sziklák, néhány veszélyes gleccser és hó"
 
 msgid "T6 - hazardous alpine trail with climbing"
 msgstr "T6 - veszélyes alpesi túraút mászással"
@@ -17080,6 +17143,8 @@ msgid ""
 "climbing up to second grade. Often very exposed, precarious jagged rocks, "
 "glacier with danger to slip and fall"
 msgstr ""
+"mászható egészen a második nehézségi fokozatig. Gyakran teljesen védtelen, "
+"laza recés sziklák, gleccser csúszás és lezuhanás veszélyével"
 
 msgid "Visibility"
 msgstr "Láthatóság"
@@ -17247,7 +17312,7 @@ msgid "tiger"
 msgstr "tigris"
 
 msgid "Button operated"
-msgstr ""
+msgstr "Gombbal működő"
 
 msgid "Sound signals"
 msgstr "Hangjelzések"
@@ -17322,16 +17387,18 @@ msgid "Speed Camera"
 msgstr "Traffipax"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "Közlekedési tükör"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Elnevezett útelágazás"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Néhány országban a névvel rendelkező útkereszteződésekhez használják, ahol a "
+"név a helyi eligazodást szolgálja."
 
 msgid "Elevator"
 msgstr "Felvonó"
@@ -17622,7 +17689,7 @@ msgid "Wetland"
 msgstr "Vizenyős terület"
 
 msgid "Waterlogged area, either permanently or seasonally with vegetation."
-msgstr ""
+msgstr "Állandóan vagy szezonálisan vizenyős terület, növényzettel."
 
 msgid "swamp"
 msgstr "ingovány"
@@ -17655,7 +17722,7 @@ msgid "Beach"
 msgstr "Tengerpart"
 
 msgid "A flat area of sand, gravel or pebble next to water."
-msgstr ""
+msgstr "Vízparti sík terület homokkal, sóderrel vagy kaviccsal fedve."
 
 msgid "swimming"
 msgstr "úszás"
@@ -17679,6 +17746,8 @@ msgid ""
 "A steep rock face exposure, with a significant vertical, or near vertical "
 "(leave the lower face to the right of the way)."
 msgstr ""
+"Meredek, kitett szikla felület jelentős függőleges vagy majdnem függőleges "
+"részekkel (az alacsonyabban lévő felületet kell a vonal jobb oldalára rakni)."
 
 msgid "Shipping"
 msgstr "Hajózás"
@@ -17835,32 +17904,29 @@ msgstr "Vasúti váltó"
 msgid "Aerialway"
 msgstr "Felvonó"
 
-msgid "Chair Lift"
-msgstr "Üléses felvonó"
+msgid "Cable Car"
+msgstr "Nagykabinos"
 
 msgid "Number of people per hour"
 msgstr "utas/óra"
 
-msgid "Number of people per chair"
-msgstr "férőhely ülésenként"
+msgid "Number of people per car"
+msgstr "férőhely kabinonként"
 
 msgid "Typical journey time in minutes"
 msgstr "átlagos menetidő percben"
 
-msgid "Has bubble?"
-msgstr "Védőburkos?"
-
 msgid "Has heating?"
 msgstr "Fűtött?"
 
-msgid "Drag Lift"
-msgstr "Húzólift"
+msgid "Chair Lift"
+msgstr "Üléses felvonó"
 
-msgid "Cable Car"
-msgstr "Nagykabinos"
+msgid "Number of people per chair"
+msgstr "férőhely ülésenként"
 
-msgid "Number of people per car"
-msgstr "férőhely kabinonként"
+msgid "Has bubble?"
+msgstr "Védőburkos?"
 
 msgid "Gondola"
 msgstr "Gondolakabinos"
@@ -17874,17 +17940,25 @@ msgstr "Vegyes felvonó"
 msgid "Number of people per gondola/chair"
 msgstr "férőhely kabinonként/ülésenként"
 
-msgid "T-bar Lift"
-msgstr "Csákányos felvonó"
+msgid "Drag Lift"
+msgstr "Húzólift"
 
-msgid "J-bar Lift"
-msgstr "Tolókaros felvonó"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Tányéros felvonó"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Kapaszkodólift"
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Szállítószalag"
@@ -17968,6 +18042,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -17998,12 +18075,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18199,6 +18279,9 @@ msgstr "Szerszámok \"csináld magad\" szereléshez"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Kerékpármosás"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Tömegközlekedés"
 
@@ -18457,6 +18540,14 @@ msgstr "Repülő parkoló"
 msgid "Hangar"
 msgstr "Hangár"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangár"
+
+msgctxt "building"
+msgid "yes"
+msgstr "igen"
+
 msgid "Beacon"
 msgstr "Jelzőfény"
 
@@ -19398,10 +19489,10 @@ msgid "Count"
 msgstr "Darabszám"
 
 msgid "Advertising Column"
-msgstr ""
+msgstr "Hírdetőoszlop"
 
 msgid "Billboard"
-msgstr ""
+msgstr "Hírdetőtábla"
 
 msgid "Sports"
 msgstr "Sportok"
@@ -19514,7 +19605,7 @@ msgid "Scuba Diving"
 msgstr "Búvárkodás"
 
 msgid "Piste type"
-msgstr "Pálya típusa"
+msgstr "Sípálya típusa"
 
 msgid "downhill"
 msgstr "lesikló"
@@ -19707,10 +19798,6 @@ msgid "Man Made"
 msgstr "Építmények"
 
 msgctxt "building"
-msgid "yes"
-msgstr "igen"
-
-msgctxt "building"
 msgid "roof"
 msgstr "tető"
 
@@ -19731,16 +19818,16 @@ msgid "school"
 msgstr "iskola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangár"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "kereskedelmi"
 
 msgctxt "building"
-msgid "farm"
-msgstr "farm"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19813,6 +19900,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "magában álló"
 
+msgctxt "building"
+msgid "farm"
+msgstr "farm"
+
 msgid "Entrance"
 msgstr "Bejárat"
 
@@ -20025,7 +20116,7 @@ msgid "Tide Level"
 msgstr "Árapály szint"
 
 msgid "Groundwater"
-msgstr ""
+msgstr "Talajvíz"
 
 msgid "Traffic"
 msgstr "Közlekedés"
@@ -20250,7 +20341,7 @@ msgid "gas_turbine"
 msgstr "gázturbina"
 
 msgid "reciprocating_engine"
-msgstr ""
+msgstr "dugattyús motor"
 
 msgid "steam_generator"
 msgstr "Gőz generátor"
@@ -20266,7 +20357,7 @@ msgstr "Mód"
 
 msgctxt "generator method"
 msgid "anaerobic_digestion"
-msgstr ""
+msgstr "anaerob lebontás"
 
 msgctxt "generator method"
 msgid "combustion"
@@ -20280,7 +20371,7 @@ msgid "bioreactor"
 msgstr "bioreaktor"
 
 msgid "anaerobic_digestion / combustion"
-msgstr ""
+msgstr "anaerob lebontás / égetés"
 
 msgid "pyrolysis"
 msgstr "a pirolízis"
@@ -20298,7 +20389,7 @@ msgid "Gas Power Generator"
 msgstr "Gáz generátor"
 
 msgid "combined_cycle"
-msgstr ""
+msgstr "kombinált ciklusú"
 
 msgid "Oil Power Generator"
 msgstr "Olaj generátor"
@@ -20357,7 +20448,7 @@ msgid "European Pressurized Reactor (EPR)"
 msgstr "Európai nyomóvizes reaktor (EPR)"
 
 msgid "Inertial Confinement Fusion (ICF)"
-msgstr ""
+msgstr "Behatárolt inerciális fúzió (ICF)"
 
 msgid "Pressurized water reactor (PWR)"
 msgstr "Nyomóvizes reaktor (PWR)"
@@ -20471,10 +20562,10 @@ msgid "Wave Energy Converter"
 msgstr "Hullámenergia átalakító"
 
 msgid "Osmotic Power Generator"
-msgstr ""
+msgstr "Ozmotikus Feszültség Generátor"
 
 msgid "Geothermal Power Generator"
-msgstr ""
+msgstr "Geotermikus Feszültség Generátor"
 
 msgid "heat_pump"
 msgstr "hőszivattyú"
@@ -20557,7 +20648,7 @@ msgstr "automata"
 
 msgctxt "power"
 msgid "phase_angle_regulator"
-msgstr ""
+msgstr "fázisszöges szabályozó"
 
 msgctxt "power"
 msgid "yes"
@@ -20567,21 +20658,23 @@ msgid "Phases"
 msgstr "Fázisok"
 
 msgid "Power Switchgear"
-msgstr ""
+msgstr "Feszültség kapcsoló berendezés"
 
 msgid ""
 "(Please only use this tag if more detailed mapping using busbars and bays is "
 "impossible!)"
 msgstr ""
+"(Kérlek, csak akkor használd ezt a címkét, ha még részletesebb térképezésre -"
+" összekötősínekket és gyűjtőket használva - nincs lehetőség!)"
 
 msgid "Power Busbar"
-msgstr ""
+msgstr "Feszültség összekötősín"
 
 msgid "Power Bay"
-msgstr ""
+msgstr "Feszültség gyűjtőpont"
 
 msgid "Power Switch"
-msgstr ""
+msgstr "feszültség kapcsoló"
 
 msgid "Power Converter"
 msgstr "Feszültség átalakító"
@@ -20601,7 +20694,7 @@ msgstr "Forrás feszültség konverter (VSC)"
 
 msgctxt "power"
 msgid "back-to-back"
-msgstr ""
+msgstr "visszatáplálás"
 
 msgid "Amount of poles"
 msgstr "Pólusok mennyisége"
@@ -20613,7 +20706,7 @@ msgid "bipole"
 msgstr "kétpólusú"
 
 msgid "Power rating (MVA)"
-msgstr ""
+msgstr "Feszültség kategória (MVA)"
 
 msgid "Power Compensator"
 msgstr "feszültség kiegyenlítő"
@@ -20623,23 +20716,23 @@ msgstr "Kiegyenlítő típusa"
 
 msgctxt "power"
 msgid "shunt_reactor"
-msgstr ""
+msgstr "mellékáramköri folytótekercs"
 
 msgctxt "power"
 msgid "shunt_capacitor"
-msgstr ""
+msgstr "mellékáramköri kondenzátor"
 
 msgctxt "power"
 msgid "static_var"
-msgstr ""
+msgstr "statikus VA reaktor"
 
 msgctxt "power"
 msgid "statcom"
-msgstr ""
+msgstr "Statikus Szinkron Kompenzátor (STATCOM)"
 
 msgctxt "power"
 msgid "synchronous_condenser"
-msgstr ""
+msgstr "szinkron kondenzátor"
 
 msgctxt "power"
 msgid "filter"
@@ -20647,11 +20740,11 @@ msgstr "szűrő"
 
 msgctxt "power"
 msgid "series_reactor"
-msgstr ""
+msgstr "sorozat tekercs"
 
 msgctxt "power"
 msgid "series_capacitor"
-msgstr ""
+msgstr "sorozat kondenzátor"
 
 msgid "Power rating (kvar/Mvar)"
 msgstr "Feszültség kategória (kvar/Mvar)"
@@ -20806,23 +20899,23 @@ msgstr "h-keret"
 
 msgctxt "power"
 msgid "guyed_h-frame"
-msgstr ""
+msgstr "kábeles h keret"
 
 msgctxt "power"
 msgid "portal"
-msgstr ""
+msgstr "portál"
 
 msgctxt "power"
 msgid "portal_two-level"
-msgstr ""
+msgstr "két szintes portál"
 
 msgctxt "power"
 msgid "portal_three-level"
-msgstr ""
+msgstr "három szintes portál"
 
 msgctxt "power"
 msgid "guyed_v-frame"
-msgstr ""
+msgstr "kábeles v keret"
 
 msgctxt "power"
 msgid "bipole"
@@ -20909,7 +21002,7 @@ msgstr "víz alatti"
 
 msgctxt "power cable"
 msgid "overground"
-msgstr ""
+msgstr "felszíni"
 
 msgid "Historic Places"
 msgstr "Történelmi helyek"
@@ -21313,8 +21406,8 @@ msgstr "Nemzeti park"
 msgid "Protected Area"
 msgstr "Védett Terület"
 
-msgid "Protected Class"
-msgstr "Védelmi Osztály"
+msgid "Protect Class"
+msgstr ""
 
 msgid "Title or type of protection"
 msgstr "Felirat vagy a védelem típusa"
@@ -21343,15 +21436,21 @@ msgstr "Nagyváros"
 msgid "Town"
 msgstr "Város"
 
-msgid "Suburb"
-msgstr "Településrész"
-
 msgid "Village"
 msgstr "Nagyközség"
 
 msgid "Hamlet"
 msgstr "Falu"
 
+msgid "Isolated Dwelling"
+msgstr "Különálló házak"
+
+msgid "Suburb"
+msgstr "Településrész"
+
+msgid "Neighbourhood"
+msgstr "Telep"
+
 msgid "Farm"
 msgstr "Tanya"
 
@@ -21359,13 +21458,7 @@ msgid "A farm within a bigger settlement"
 msgstr "Farm egy nagyobb telepen belül"
 
 msgid "(please use isolated_dwelling for an isolated farm)"
-msgstr ""
-
-msgid "Isolated Dwelling"
-msgstr "Különálló házak"
-
-msgid "Neighbourhood"
-msgstr "Telep"
+msgstr "(kérlek használd az isolated_dwelling jelölést a különálló tanyáért)"
 
 msgid "Locality"
 msgstr "Lakosság nélküli hely"
@@ -21466,6 +21559,8 @@ msgid ""
 "Where vegetation is dominated by grasses (Poaceae) and other herbaceous (non-"
 "woody) plants. Excludes cultivated areas and wetlands."
 msgstr ""
+"Ahol a növényzet a fű (Poaceae) vagy fűnemű (nem fás) növények által "
+"dominált. Nem tartoznak ide a megművelt vagy mocsaras területek."
 
 msgid "pampas"
 msgstr "pampa"
@@ -21501,6 +21596,8 @@ msgid ""
 "Bare upper lying uncultivated land principally covered with grass and often "
 "grazed."
 msgstr ""
+"Kopár, magasabb fekvésű műveletlen föld, alapvetően fűvel fedett és gyakran "
+"legelő is."
 
 msgid "Scrub"
 msgstr "Cserjés"
@@ -21508,6 +21605,8 @@ msgstr "Cserjés"
 msgid ""
 "Bare lower lying uncultivated land with bushes but little or no tree cover."
 msgstr ""
+"Kopár, alacsonyabb fekvésű műveletlen föld cserjékkel, de kevés fával vagy "
+"éppen fa nélkül."
 
 msgid "Heath"
 msgstr "Hangafüves rét"
@@ -21517,6 +21616,9 @@ msgid ""
 "free-draining infertile, acidic soils, and is characterised by open, low-"
 "growing woody vegetation."
 msgstr ""
+"Kopár, alacsonyabb fekvésű műveletlen föld, a benne  előforduló cserjés "
+"foltokkal, főleg szabadon kiszáradó, terméketlen, savas termőtalaj amit "
+"alacsony növésű, fás növényzet jellemez."
 
 msgid "Sand"
 msgstr "Homok"
@@ -21531,6 +21633,8 @@ msgid ""
 "For areas of solid visible rock that is sparsely vegetated or not vegetated "
 "at all."
 msgstr ""
+"Masszív, látható sziklafelületek környékére ami csak gyéren borított "
+"növényzettel vagy egyáltalán nem is."
 
 msgid "Stone"
 msgstr "Kő"
@@ -21884,6 +21988,37 @@ msgstr "Kép"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Kapcsolat („contact:*” előtagú séma)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "külső szakasz"
 
@@ -22059,7 +22194,7 @@ msgid "natural"
 msgstr "természet"
 
 msgid "Piste Route"
-msgstr ""
+msgstr "Sí útvonal"
 
 msgid "link segment"
 msgstr ""
@@ -22119,7 +22254,7 @@ msgid "ways being part of street"
 msgstr "az utca részeit képző vonalak"
 
 msgid "addresses belonging to the street"
-msgstr "az utcához tartozó címek"
+msgstr "az utcához tartozó lakcímek"
 
 msgid "houses belonging to the street"
 msgstr "az utcához tartozó házak"
@@ -22128,7 +22263,7 @@ msgid "anything related to the street"
 msgstr "az utcához tartozó egyéb dolgok"
 
 msgid "Destination Sign"
-msgstr "Úticél Jelzés"
+msgstr "Úti cél Jelzés"
 
 msgid "Destination written on sign (w/o distance)"
 msgstr "A táblán jelzett célpont (táv nélkül)"
@@ -22247,17 +22382,14 @@ msgstr "Próba"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitárius OpenStreetMap Csapat)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Műhold"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Nyílt Légifelvétel"
@@ -22268,14 +22400,14 @@ msgstr "OpenStreetMap GPS Nyomvonalak"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik fekete-fehér)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, feliratok nélkül)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "skobbler hőtérkép"
@@ -22307,6 +22439,54 @@ msgstr "Strava kerékpáros hőtérkép"
 msgid "Strava running heatmap"
 msgstr "Strava futó hőtérkép"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI fekete-fehér 2.5m"
 
@@ -22350,7 +22530,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22371,6 +22554,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Czech CUZK:KM"
 
@@ -22402,13 +22591,13 @@ msgid "Estonia Ortho (Maaamet)"
 msgstr "Estonia Ortofotó (Maaamet)"
 
 msgid "Estonia Hillshade (Maaamet)"
-msgstr ""
+msgstr "Estonia színes domborzat (Maaamet)"
 
 msgid "Estonia Cadastre (Maaamet)"
-msgstr ""
+msgstr "Estonia Kataszteri (Maaamet)"
 
 msgid "Estonia Forestry (Maaamet)"
-msgstr ""
+msgstr "Estonia Forestry (Maaamet)"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -22501,8 +22690,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22545,7 +22734,7 @@ msgid "NRW-Atlas: Topographische Karte 1:10000"
 msgstr "NRW-Atlas: Topographische Karte 1:10000"
 
 msgid "Metropole Ruhr: Luftbilder (10 cm)"
-msgstr ""
+msgstr "Metropole Ruhr: Luftbilder (10 cm)"
 
 msgid "Drone Imagery (Haiti)"
 msgstr "Drón ábrázolás (Haiti)"
@@ -22586,6 +22775,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italy"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -22740,7 +22935,7 @@ msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
 
 msgid "Kanton Aargau 25cm (AGIS 2014)"
-msgstr ""
+msgstr "Kanton Aargau 25cm (AGIS 2014)"
 
 msgid "Stadt Uster Orthophoto 2008 10cm"
 msgstr "Stadt Uster Orthophoto 2008 10cm"
@@ -22802,16 +22997,16 @@ msgstr "MSR Topográfiai Térképek"
 msgid "MSR Maps Urban"
 msgstr "MSR Városi Térképek"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Szkennelt Topográfiai Térképek"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Út lefedettség"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22820,6 +23015,9 @@ msgstr "MassGIS L3 Parcellák"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Ortofotó"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Ortofotó térkép 2012"
 
@@ -23087,6 +23285,9 @@ msgstr "Angol (OS) városrendezési tervek, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "Angol (OS) városrendezési tervek, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Házszám csökkentése a lakcím interpolációban"
 
@@ -23100,7 +23301,7 @@ msgid "{0} without {1}, {2} or {3}"
 msgstr "{0} {1}, {2} vagy {3} nélkül"
 
 msgid "{0} together with {1}"
-msgstr ""
+msgstr "{0} együtt {1}-el"
 
 msgid "{0} on suspicious object"
 msgstr "{0} gyanús objektumon"
@@ -23121,10 +23322,10 @@ msgid "{0} should be on the node where {1} and {2} intersect"
 msgstr "{0} azon a ponton kellene legyen ahol {1} és {2} kereszteződnek"
 
 msgid "alternative name without {0}"
-msgstr ""
+msgstr "alternatív név, {0} nélkül"
 
 msgid "incomplete usage of {0} on a way without {1}"
-msgstr ""
+msgstr "a(z) {0} bejezetlen használata egy vonalon {1} nélkül"
 
 msgid "{0}={1} is deprecated"
 msgstr "{0}={1} elavult"
@@ -23148,6 +23349,8 @@ msgid ""
 "{0}={1} is unspecific. Instead of ''{1}'' please give more information about "
 "what exactly should be fixed."
 msgstr ""
+"{0}={1} értelmetlen. Kérlek, a(z) ''{1}'' helyett inkább azt az információt "
+"add meg, hogy pontosan mit kellene még kijavítani!"
 
 msgid "{0}={1} is deprecated. Please use instead a multipolygon."
 msgstr "{0}={1} elavult. Használj helyette multipolygont."
@@ -23155,10 +23358,14 @@ msgstr "{0}={1} elavult. Használj helyette multipolygont."
 msgid ""
 "{0} is deprecated. Please specify interval by using opening_hours syntax"
 msgstr ""
+"A(z) {0} kivezetésre került. Kérlek, az intervallumot az opening_hours címke "
+"szintaxisa szerint add meg"
 
 msgid ""
 "{0} is deprecated. Please delete this object and use a private layer instead"
 msgstr ""
+"A(z) {0} kivezetésre került. Kérlek, töröld ezt az objektumot és használj "
+"helyette privát réteget"
 
 msgid "{0}={1} is unspecific. Please replace ''{1}'' by a specific value."
 msgstr ""
@@ -23168,7 +23375,7 @@ msgid "{0} should be replaced with {1}"
 msgstr "a(z) {0}-t {1}-el kellene cserélni"
 
 msgid "{0} = {1}; remove {0}"
-msgstr ""
+msgstr "{0} = {1}; {0} eltávolítása"
 
 msgid ""
 "{0}={1} is unspecific. Please replace ''{1}'' by ''left'', ''right'' or "
@@ -23178,14 +23385,17 @@ msgstr ""
 "''right'' vagy ''both''."
 
 msgid "{0} on a node. Should be used on a way."
-msgstr ""
+msgstr "{0} egy ponton. Vonalon kellene használni."
 
 msgid "{0} on a node. Should be drawn as an area."
-msgstr ""
+msgstr "{0} egy ponton. Területként kellene megrajzolni."
 
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* egy ponton van. Egy kapcsolatban kellene használni"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} egy vonalon van. Egy kapcsolatban kellene használni"
 
@@ -23211,7 +23421,7 @@ msgid "Overlapping Identical Landuses"
 msgstr "Különböző területhasználatok átfednek"
 
 msgid "{0} must be connected to a way"
-msgstr ""
+msgstr "{0}-nek muszály egy vonalhoz kapcsolódnia"
 
 msgid "abbreviated street name"
 msgstr "rövidített utca név"
@@ -23238,6 +23448,8 @@ msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
 "''{3}'' instead."
 msgstr ""
+"A(z) ''{0}'' értékének vagy ''{1}''-nak vagy ''{2}''-nak kellene lennie. "
+"Járdákhoz ''{3}''  használandó inkább."
 
 msgid "{0} with multiple values"
 msgstr "{0}, töbszörös értékekkel"
@@ -23408,6 +23620,8 @@ msgid ""
 "No command has been found. Would you like to download and install default "
 "commands now?"
 msgstr ""
+"Parancs nem található. Szeretnéd most letölteni és telepíteni az "
+"alapértelmezett parancsokat?"
 
 msgid "No command found"
 msgstr "Parancs nem található"
@@ -23449,10 +23663,10 @@ msgid "Missing definition of new object with id {0}."
 msgstr "Hiányzó definíció a(z) {0} azonosítójú új objektumhoz."
 
 msgid "Missing mandatory attribute ''{0}'' on <member> of relation {1}."
-msgstr ""
+msgstr "Hiányzó ''{0}'' kötelező leíró a(z) {1} kapcsolat <member> tagján."
 
 msgid "Illegal value for attribute ''uid''. Got ''{0}''."
-msgstr ""
+msgstr "Helytelen érték a(z) ''uid'' jellemzőhöz. Kapott: ''{0}''."
 
 msgid "nodes"
 msgstr "pontok"
@@ -23476,6 +23690,8 @@ msgid ""
 "Forms a grid of ways in base to two existing that have various nodes and one "
 "in common"
 msgstr ""
+"A vonalak hálózatát formálja meg két már létező alapján, mely vonalaknak "
+"vannak különféle saját pontjak, illetve egy közös is"
 
 msgid "Select two ways with a node in common"
 msgstr "Válassz ki két vonalat egy közös ponttal"
@@ -23641,7 +23857,7 @@ msgid "(No elevation data)"
 msgstr "(Nincs magassági adat)"
 
 msgid "Can not save preferences"
-msgstr ""
+msgstr "Nem lehet menteni a beállításokat"
 
 msgid "Epsilon multiplier"
 msgstr ""
@@ -23665,7 +23881,7 @@ msgid "Simplify with initial epsilon"
 msgstr ""
 
 msgid "Save as is"
-msgstr ""
+msgstr "Mentés mint..."
 
 msgid "Snap to nodes"
 msgstr ""
@@ -23686,13 +23902,13 @@ msgid "Try copying tags from properties table"
 msgstr ""
 
 msgid "Save settings"
-msgstr ""
+msgstr "Beállítások mentése"
 
 msgid "Can not read settings"
-msgstr ""
+msgstr "A beállítások nem olvashatóak"
 
 msgid "Q=Options, Enter=save, Ctrl-Enter=save with tags, Up/Down=tune"
-msgstr ""
+msgstr "Q=opciók, Enter=mentés, Ctrl-Enter=mentés címkékkel, Up/Down=hang"
 
 msgid ""
 "Click or Click&drag to continue, Ctrl-Click to add fixed node, Shift-Click "
@@ -23726,37 +23942,37 @@ msgid "Line information"
 msgstr "Vonal információ"
 
 msgid "Cannot place node outside of the world."
-msgstr ""
+msgstr "Nem lehet pontot helyezni a világon kívülre."
 
 msgid "Draw the way by mouse"
-msgstr ""
+msgstr "Vonal rajzolása egérrel"
 
 msgid "min distance={0} px ({1} m)"
-msgstr ""
+msgstr "minimum távolság={0} px ({1} m)"
 
 msgid "Convert way to FastDraw line"
 msgstr ""
 
 msgid "Eps={0}, {1} points, {2} p/km"
-msgstr ""
+msgstr "Eps={0}, {1} pont, {2} p/km"
 
 msgid "Fix addresses"
-msgstr "lakcímek javítása"
+msgstr "Lakcímek javítása"
 
 msgid "Show dialog with incomplete addresses"
-msgstr ""
+msgstr "Hiányos lakcímek mutatása dialógusban"
 
 msgid "Include objects used for guesses"
 msgstr ""
 
 msgid "Fix street addresses"
-msgstr ""
+msgstr "Utca lakcímek javítása"
 
 msgid "Find and fix addresses without (valid) streets."
-msgstr ""
+msgstr "Érvényes utcanév nélküli lakcímek megtalálása és javítása."
 
 msgid "Address Edit"
-msgstr "Cím szerkesztés"
+msgstr "Lakcím szerkesztés"
 
 msgid "Searching"
 msgstr "Keresés"
@@ -23765,46 +23981,46 @@ msgid "Guess values for "
 msgstr "Vélt értékek "
 
 msgid "Address has no street"
-msgstr "A címhez nincs utca"
+msgstr "A lakcímhez nincs utca"
 
 msgid "Address has no valid street"
-msgstr "A címhez nincs helyes utca"
+msgstr "A lakcímhez nincs helyes utca"
 
 msgid "Address has no post code"
-msgstr "A címhez nincs irányítószám"
+msgstr "A lakcímhez nincs irányítószám"
 
 msgid "Address has no city"
-msgstr "A címhez nincs település"
+msgstr "A lakcímhez nincs település"
 
 msgid "Address has no country"
-msgstr "A címhez nincs ország"
+msgstr "A lakcímhez nincs ország"
 
 msgid "Assign to"
 msgstr "Hozzárendelés"
 
 msgid "Remove all address tags"
-msgstr "Minden címelem eltávolítása"
+msgstr "Minden lakcímelem eltávolítása"
 
 msgid "No name"
 msgstr "Nincs név"
 
 msgid "Unresolved Addresses"
-msgstr "Megoldatlan címek"
+msgstr "Megoldatlan lakcímek"
 
 msgid "Select and close"
 msgstr "Kiválaszt és bezár"
 
 msgid "Fix unresolved addresses"
-msgstr "Megoldatlan címek javítása"
+msgstr "Megoldatlan lakcímek javítása"
 
 msgid "Complete Addresses"
-msgstr "Teljes címek"
+msgstr "Befejezett lakcímek"
 
 msgid "Incomplete Addresses"
-msgstr "Befejezetlen címek"
+msgstr "Befejezetlen lakcímek"
 
 msgid "Selected Addresses"
-msgstr "Kiválasztott címek"
+msgstr "Kiválasztott lakcímek"
 
 msgid "Selected Street"
 msgstr "Kiválasztott utca"
@@ -23816,7 +24032,7 @@ msgid "Segments"
 msgstr "Szelvények"
 
 msgid "Show incomplete addresses"
-msgstr "Befejezetlen címek mutatása"
+msgstr "Befejezetlen lakcímek mutatása"
 
 msgid "items"
 msgstr "elemek"
@@ -23841,33 +24057,35 @@ msgid "Applied guessed values for "
 msgstr ""
 
 msgid "Assign address to street"
-msgstr ""
+msgstr "Lakcím hozzárendelése az utcához"
 
 msgid "Assign the selected address(es) to the selected street."
-msgstr ""
+msgstr "A kiválasztott lakcím(ek) hozzárendelése a kiválasztott utcához."
 
 msgid "Set street name"
 msgstr "Utcanév megadás"
 
 msgid "Convert ALL streets."
-msgstr ""
+msgstr "MINDEN utca konvertálása."
 
 msgid ""
 "Create relation between street and related addresses for ALL streets in the "
 "current layer."
 msgstr ""
+"Az ÖSSZES utca és a hozzájuk tartozó lakcímek közötti kapcsolatok "
+"létrehozása az aktuális rétegben."
 
 msgid "Convert to relation."
-msgstr ""
+msgstr "Kapcsolattá konvertálás."
 
 msgid "Create relation between street and related addresses."
-msgstr ""
+msgstr "Kapcsolat létrehozása az utca és a hozzá tartozó lakcímek közt."
 
 msgid "Create address relation for "
-msgstr ""
+msgstr "Lakcím kapcsolat készítése a "
 
 msgid "Guess"
-msgstr ""
+msgstr "Tippelt"
 
 msgid ""
 "Tries to guess address data by picking the name of the closest object with "
@@ -23875,25 +24093,25 @@ msgid ""
 msgstr ""
 
 msgid "Guessing address values"
-msgstr ""
+msgstr "Lakcím értékek megtippelése"
 
 msgid "Removes address related tags from the object."
-msgstr ""
+msgstr "Lakcímmel kapcsolatos címkék eltávolítása az objektumból."
 
 msgid "Remove address tags"
-msgstr ""
+msgstr "Lakcím címkék eltávolítása"
 
 msgid "Marks selected addresses in the map"
-msgstr ""
+msgstr "Kiválasztott lakcímek megjelölése a térképen"
 
 msgid "Select incomplete addresses"
-msgstr ""
+msgstr "Hiányos lakcímek kijelölése"
 
 msgid "Selects all addresses with incomplete data."
-msgstr ""
+msgstr "Minden hiányos lakcím kijelölése."
 
 msgid "Use tag ''addr:street'' or ''addr:place''"
-msgstr ""
+msgstr "Használd az ''addr:street'' vagy ''addr:place'' címkét"
 
 msgid "House Number Editor"
 msgstr "Házszámszerkesztő"
@@ -23939,43 +24157,44 @@ msgid "Error while creating image layer: "
 msgstr "Hiba a kép réteg létrehozásakor: "
 
 msgid "NanoLog"
-msgstr ""
+msgstr "NanoLog"
 
 msgid "NanoLog of {0} entries"
-msgstr ""
+msgstr "A(z) {0} NanoLog bejegyzései"
 
 msgid "NanoLog of {0} lines, {1} of them with coordinates."
-msgstr ""
+msgstr "{0} sornyi NanoLog, ezek közül {1} koordinátákkal."
 
 msgid "Correlate with GPX..."
-msgstr ""
+msgstr "GPX-hez viszonyítás..."
 
 msgid "Put on GPX..."
-msgstr ""
+msgstr "GPX-re helyezés..."
 
 msgid "Correlate entries with GPS trace"
-msgstr ""
+msgstr "Elemek GPS útvonalhoz viszonyítása"
 
 msgid "Save layer..."
 msgstr "Réteg mentése..."
 
 msgid "Save NanoLog layer"
-msgstr ""
+msgstr "NanoLog réteg mentése"
 
 msgid "Open NanoLog panel"
-msgstr ""
+msgstr "NanoLog ablak megnyitása"
 
 msgid "Open NanoLog file..."
-msgstr ""
+msgstr "NanoLog fájl megnyitása..."
 
 msgid "Could not read NanoLog file:"
-msgstr ""
+msgstr "A NanoLog fájl nem olvasható:"
 
 msgid "Edit opening hours"
-msgstr ""
+msgstr "Nyitvatartási idő szerkesztése"
 
 msgid "Edit time-tag of selected element in a graphical interface"
 msgstr ""
+"A kiválasztott elem idő címkéjének szerkesztése egy grafikus felületen"
 
 msgid "edit existing tag"
 msgstr "létező címke szerkesztése"
@@ -23984,7 +24203,7 @@ msgid "edit new tag"
 msgstr "új címke szerkesztése"
 
 msgid "Display clock in 12h mode."
-msgstr ""
+msgstr "Óra megjelenítése 12 órás formátumban."
 
 msgid "Choose key"
 msgstr "Kulcs választás"
@@ -23993,31 +24212,31 @@ msgid "apply {0}"
 msgstr "{0} alkalmazása"
 
 msgid "There is something wrong in the value near:"
-msgstr ""
+msgstr "Valamilyen hiba van az értékben, itt valahol:"
 
 msgid "Info: {0}"
 msgstr "Információ: {0}"
 
 msgid "Correct the value manually and than press Enter."
-msgstr ""
+msgstr "Javítsd az értéket kézzel, majd nyomd meg az Enter-t."
 
 msgid "Error in timeformat"
-msgstr ""
+msgstr "Hiba az idő formátumban"
 
 msgid "open end"
-msgstr ""
+msgstr "nyitás zárás"
 
 msgid "Import Osm Inspector Bugs..."
-msgstr ""
+msgstr "OSM Inspector hibák beolvasása..."
 
 msgid "OsmInspector"
-msgstr ""
+msgstr "OsmInspector"
 
 msgid "Open OsmInspector"
-msgstr ""
+msgstr "OsmInspector megnyitása"
 
 msgid "OsmBugInfo"
-msgstr ""
+msgstr "OsmBugInfo"
 
 msgid "Open a OSM Inspector selection list window."
 msgstr ""
@@ -24071,7 +24290,7 @@ msgid "Relation: {0}"
 msgstr "Kapcsolat: {0}"
 
 msgid "Associate with street using:"
-msgstr ""
+msgstr "Összerendelés az utcával, ez alapján:"
 
 msgid "Numbering Scheme:"
 msgstr "Számozási rend:"
@@ -24089,7 +24308,7 @@ msgid "Accuracy:"
 msgstr "Pontosság:"
 
 msgid "Convert way to individual house numbers."
-msgstr ""
+msgstr "Vonal konvertálása egyéni házszámokká."
 
 msgid "Will associate {0} additional house number nodes"
 msgstr ""
@@ -24107,7 +24326,7 @@ msgid "Country:"
 msgstr "Ország:"
 
 msgid "Full Address:"
-msgstr "Teljes cím:"
+msgstr "Teljes lakcím:"
 
 msgid "Optional Information:"
 msgstr "Opcionális információk:"
@@ -24393,7 +24612,7 @@ msgid "Browser not supported."
 msgstr "A böngésző nem támogatott."
 
 msgid "Building address"
-msgstr "Épület címe"
+msgstr "Épület lakcíme"
 
 msgid "empty"
 msgstr "üres"
@@ -24467,7 +24686,7 @@ msgid "Area detection algorithm settings."
 msgstr ""
 
 msgid "Algorithm Settings"
-msgstr ""
+msgstr "Algoritmus beállítások"
 
 msgid ""
 "The color threshold defines how far the color can be of the original color "
@@ -24537,7 +24756,7 @@ msgid "Set buildings size"
 msgstr "Épületek méretének beállítása"
 
 msgid "Use Address dialog"
-msgstr "Kérdezze meg a címet"
+msgstr "Kérdezze meg a lakcímet"
 
 msgid "Auto-select building"
 msgstr "Épület automatikus kiválasztása"
@@ -24570,10 +24789,10 @@ msgid "on polygon"
 msgstr "poligonon"
 
 msgid "Add address"
-msgstr "Cím hozzáadása"
+msgstr "Lakcím hozzáadása"
 
 msgid "Helping tool for tag address"
-msgstr "Címek címkézését segítő eszköz"
+msgstr "Lakcímek címkézését segítő eszköz"
 
 msgid "CadastreFR - Buildings"
 msgstr "CadastreFR - Épületek"
@@ -24582,7 +24801,7 @@ msgid "Next no"
 msgstr ""
 
 msgid "Enter addresses"
-msgstr "Címek megadása"
+msgstr "Lakcímek megadása"
 
 msgid ""
 "Location \"{0}\" found in cache.\n"
@@ -24719,7 +24938,7 @@ msgid "parcel number"
 msgstr "parcella szám"
 
 msgid "address"
-msgstr "cím"
+msgstr "lakcím"
 
 msgid "locality"
 msgstr "helyszín"
@@ -24814,13 +25033,13 @@ msgid "Layers:"
 msgstr "Rétegek:"
 
 msgid "Sea, rivers, swimming pools."
-msgstr ""
+msgstr "Tenger, folyók, úszómedencék."
 
 msgid "Buildings, covers, underground constructions."
-msgstr ""
+msgstr "Épületek, tetők, földalatti építkezések."
 
 msgid "Symbols like cristian cross."
-msgstr ""
+msgstr "Szimbólumok, mint például a Krisztusi Kereszt."
 
 msgid "Parcels."
 msgstr ""
@@ -24829,7 +25048,7 @@ msgid "Parcels numbers, street names."
 msgstr ""
 
 msgid "Address, houses numbers."
-msgstr ""
+msgstr "Lakcím, házszámok."
 
 msgid "Locality, hamlet, place."
 msgstr ""
@@ -24983,7 +25202,7 @@ msgid "Add a new municipality layer"
 msgstr ""
 
 msgid "Commune"
-msgstr ""
+msgstr "Közösség"
 
 msgid ""
 "<html>Enter the town,village or city name.<br>Use the syntax and punctuation "
@@ -25015,7 +25234,7 @@ msgid "Get a new cookie (session timeout)"
 msgstr ""
 
 msgid "Save image as..."
-msgstr ""
+msgstr "Kép mentés mint..."
 
 msgid "PNG files (*.png)"
 msgstr "PNG fájlok (*.png)"
@@ -25127,7 +25346,7 @@ msgid "Cache Lambert Zone Error"
 msgstr "Gyorsítótár Lambert Zóna Hiba"
 
 msgid "canvec tile helper"
-msgstr ""
+msgstr "CanVec csempe segítő"
 
 msgid "Use"
 msgstr "Használ"
@@ -25276,7 +25495,7 @@ msgid "Invalid reference or subject"
 msgstr ""
 
 msgid "Address"
-msgstr "Cím"
+msgstr "Lakcím"
 
 msgid "Split area"
 msgstr ""
@@ -25354,7 +25573,7 @@ msgid "No GPX data layer found."
 msgstr ""
 
 msgid "External tool error"
-msgstr ""
+msgstr "Külső eszköz hiba"
 
 msgid "Error executing the script:"
 msgstr "Hiba a szkript futtatásakor:"
@@ -26720,7 +26939,7 @@ msgid "JOSM/OAuth/OSM API/Secret"
 msgstr "JOSM/OAuth/OSM API/Titok"
 
 msgid "Native Password Manager Plugin"
-msgstr ""
+msgstr "Eredeti Jelszó Menedzser bővítmény"
 
 msgid "The username and password is protected by {0}."
 msgstr "Felhasználónév és jelszó a(z) {0} által védett."
@@ -26767,7 +26986,7 @@ msgid "The native password manager plugin detected {0} on your system."
 msgstr "The native password manager plugin detected {0} on your system."
 
 msgid "Days without mapping: {0}."
-msgstr ""
+msgstr "Napok térképezés nélkül: {0}."
 
 msgid ""
 "(To miserably continue mapping, edit out no_more_mapping\n"
@@ -27761,13 +27980,13 @@ msgid "Data not available."
 msgstr ""
 
 msgid "Add new address point"
-msgstr ""
+msgstr "Új lakcím pont hozzáadása"
 
 msgid "Tags copied to clipboard."
 msgstr ""
 
 msgid "New address point added."
-msgstr ""
+msgstr "Új lakcím pont hozzáadva."
 
 msgid "Download Osmosis poly"
 msgstr "Osmosis poligon letöltése"
@@ -27999,49 +28218,49 @@ msgid "Route Patterns"
 msgstr "Útvonal Minták"
 
 msgid "Overview"
-msgstr ""
+msgstr "Áttekintő"
 
 msgid "Itinerary"
-msgstr ""
+msgstr "Útiterv"
 
 msgid "Stops"
-msgstr ""
+msgstr "Megállók"
 
 msgid "Meta"
-msgstr ""
+msgstr "Meta"
 
 msgid "Existing route patterns:"
-msgstr ""
+msgstr "Létező útvonal minták:"
 
 msgid "Reflect"
-msgstr ""
+msgstr "Tükrözés"
 
 msgid "Required tags:"
-msgstr ""
+msgstr "Szükséges címkék:"
 
 msgid "Common tags:"
-msgstr ""
+msgstr "Közös címkék:"
 
 msgid "Additional tags:"
-msgstr ""
+msgstr "További címkék:"
 
 msgid "Add a new Tag"
 msgstr "Új címke hozzáadása"
 
 msgid "Name/Id"
-msgstr ""
+msgstr "Név/Azon."
 
 msgid "Ref"
-msgstr ""
+msgstr "Referencia"
 
 msgid "Stops are possible on the"
 msgstr ""
 
 msgid "right hand side"
-msgstr "Jobb oldali"
+msgstr "jobb oldali"
 
 msgid "left hand side"
-msgstr ""
+msgstr "bal oldali"
 
 msgid "Maximum distance from route"
 msgstr ""
@@ -28512,7 +28731,7 @@ msgid "SDS"
 msgstr "SDS"
 
 msgid "Information about SDS."
-msgstr ""
+msgstr "Információk az SDS-ről."
 
 msgid "About SDS..."
 msgstr "SDS névjegy..."
@@ -28579,16 +28798,32 @@ msgstr "Mentés..."
 
 msgid "Save the current separate data store information to a file."
 msgstr ""
+"Az aktuális SDS (különálló adattároló) információk mentése egy fájlba."
 
 msgid "Save SDS file"
+msgstr "SDS fájl mentése"
+
+msgid "No object selected"
 msgstr ""
 
-msgid "Simplify Area"
+msgid "SeaMap Editor"
 msgstr ""
 
-msgid "Delete unnecessary nodes from an area."
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
 msgstr ""
 
+msgid "Simplify Area"
+msgstr "Terület egyszerűsítése"
+
+msgid "Delete unnecessary nodes from an area."
+msgstr "Szükségtelen pontok törlése egy területről."
+
 msgid "Yes, delete nodes"
 msgstr "Igen, törlöm a pontokat"
 
@@ -28643,9 +28878,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
@@ -28698,6 +28930,8 @@ msgid ""
 "Launch your default software for sending an email to the selected contact "
 "address"
 msgstr ""
+"Alapértelmezett szoftver futtatása a kiválasztott kapcsolati címre való e-"
+"mail küldéshez"
 
 msgid "Edit tags"
 msgstr "Címkék szerkesztése"
@@ -28907,7 +29141,7 @@ msgid "Delete parameter \"{0}\"?"
 msgstr ""
 
 msgid "Add new"
-msgstr ""
+msgstr "Hozzáadás"
 
 msgid "Add predefined"
 msgstr ""
@@ -28919,7 +29153,7 @@ msgid "Modify list of parameter for server request."
 msgstr ""
 
 msgid "Parameter:"
-msgstr ""
+msgstr "Paraméter:"
 
 msgid ""
 "Tracer2Server isn''t running. Please start the Server.\n"
@@ -28985,7 +29219,7 @@ msgid "UID"
 msgstr "UID"
 
 msgid "KeyID"
-msgstr ""
+msgstr "KulcsID"
 
 msgid "OSM-Info"
 msgstr "OSM-Infó"
@@ -29041,7 +29275,7 @@ msgid "GnuPG"
 msgstr "GnuPG"
 
 msgid "Dialog"
-msgstr ""
+msgstr "Ablak"
 
 msgid "Signed key value pair was: {0}={1}"
 msgstr ""
@@ -30031,7 +30265,7 @@ msgid "Here you can change some preferences of Utilsplugin2 functions"
 msgstr ""
 
 msgid "Save to file"
-msgstr ""
+msgstr "Fájlba mentés"
 
 msgid "Load from file"
 msgstr "Betöltés fájlból"
diff --git a/i18n/po/hy.po b/i18n/po/hy.po
index 9780f63..71738aa 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-04-13 21:51+0000\n"
 "Last-Translator: Gev777 <Unknown>\n"
 "Language-Team: Armenian <hy at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:35+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:34+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: hy\n"
 
 msgid "Cancel"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ia.po b/i18n/po/ia.po
index fc427b7..2441028 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-08-29 01:02+0000\n"
 "Last-Translator: Emilio Sepulveda <Unknown>\n"
 "Language-Team: Interlingua <ia at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:01+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:58+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/id.po b/i18n/po/id.po
index 94a2caa..9fef01e 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-10-16 10:41+0000\n"
 "Last-Translator: Trisno Pamuji <tri.snowman 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: 2014-12-29 05:02+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:58+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: id\n"
 "X-Language: id_ID\n"
 
@@ -219,6 +219,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Tidak ada layer target"
 
+msgid "Select"
+msgstr "Pilih"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"mengatur elemen yang dipilih pada peta untuk item yang dipilih dari daftar "
+"diatas"
+
 msgid "Add imagery layer {0}"
 msgstr "Menambahkan Layer Citra {0}"
 
@@ -2179,9 +2188,6 @@ msgstr ""
 "Geser play head dan lepaskan dekat trek untuk menjalankan suaranya; "
 "SHIFT+lepaskan untuk mensinkronisasikan suara pada titik tersebut."
 
-msgid "Select"
-msgstr "Pilih"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Pilih, pindahkan, atur perbesaran dan putar objek"
 
@@ -5952,12 +5958,6 @@ msgstr "Selesaikan"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Buka gabungan dialog dari semua item yang dipilih pada daftar diatas"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"mengatur elemen yang dipilih pada peta untuk item yang dipilih dari daftar "
-"diatas"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Terdapat {0} konflik ditemukan."
@@ -9647,10 +9647,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/jam"
 
 msgid ""
 "\n"
@@ -9676,6 +9674,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG images (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Pilih jalur yang terlihat"
 
@@ -11857,7 +11861,7 @@ msgstr "membangun"
 msgid "Projection bounds (in degrees)"
 msgstr "Batas proyeksi (didalam derajat)"
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -15365,6 +15369,12 @@ msgstr "menyediakan kemampuan untuk membuat rute"
 msgid "Loads data from SDS"
 msgstr "memuat data dari SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16382,12 +16392,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Tempat Parkir"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Jalan (Tipe tidak dikenal)"
 
 msgid "Construction"
 msgstr "Konstruksi"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Pertemuan"
 
@@ -16483,47 +16569,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Bundaran"
 
-msgid "motorway"
-msgstr "Jalan Tol"
-
-msgid "motorway_link"
-msgstr "Penghubung_Jalan Tol"
-
-msgid "trunk"
-msgstr "Cabang"
-
-msgid "trunk_link"
-msgstr "hubungan_cabang"
-
-msgid "primary"
-msgstr "Primer"
-
-msgid "primary_link"
-msgstr "perhubungan_primer"
-
-msgid "secondary"
-msgstr "Sekunder"
-
-msgid "tertiary"
-msgstr "Tersier"
-
-msgid "unclassified"
-msgstr "Tidak dapat dikelaskan"
-
-msgid "residential"
-msgstr "Permukiman"
-
-msgid "living_street"
-msgstr "jalan_permukiman"
-
-msgid "service"
-msgstr "Pelayanan"
-
-msgid "bus_guideway"
-msgstr "panduan_jalur bus"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "konstruksi"
+msgstr ""
 
 msgid "Ford"
 msgstr "Ford"
@@ -17365,32 +17413,29 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Jalur Aerial"
 
-msgid "Chair Lift"
-msgstr "Angkat Kursi"
+msgid "Cable Car"
+msgstr "Mobil Kabel"
 
 msgid "Number of people per hour"
 msgstr "Nomor orang per jam"
 
-msgid "Number of people per chair"
-msgstr "Nomor orang per kursi"
+msgid "Number of people per car"
+msgstr "Momor orang per kereta"
 
 msgid "Typical journey time in minutes"
 msgstr "Waktu perjalanan umumnya dalam menit"
 
-msgid "Has bubble?"
-msgstr "Apakah memiliki gelembung?"
-
 msgid "Has heating?"
 msgstr "Apakah pemanas?"
 
-msgid "Drag Lift"
-msgstr "Drag Lift"
+msgid "Chair Lift"
+msgstr "Angkat Kursi"
 
-msgid "Cable Car"
-msgstr "Mobil Kabel"
+msgid "Number of people per chair"
+msgstr "Nomor orang per kursi"
 
-msgid "Number of people per car"
-msgstr "Momor orang per kereta"
+msgid "Has bubble?"
+msgstr "Apakah memiliki gelembung?"
 
 msgid "Gondola"
 msgstr "Gondola"
@@ -17404,17 +17449,25 @@ msgstr "Mixed Lift"
 msgid "Number of people per gondola/chair"
 msgstr "Nomor orang per gondola/kursi"
 
-msgid "T-bar Lift"
-msgstr "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Drag Lift"
 
-msgid "J-bar Lift"
-msgstr "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Platter Lift"
+msgid "t-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Tali Derek"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Magic Carpet"
@@ -17498,6 +17551,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -17528,12 +17584,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -17729,6 +17788,9 @@ msgstr "Alat untuk melakukan perbaikan sendiri (mungkin koperasi sepeda)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Sepeda dicuci (untuk biaya)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transportasi Publik"
 
@@ -17987,6 +18049,14 @@ msgstr "Tepi"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Beacon"
 
@@ -19230,10 +19300,6 @@ msgid "Man Made"
 msgstr "Buatan Manusia"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -19254,15 +19320,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -19336,6 +19402,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Pintu Masuk"
 
@@ -20833,7 +20903,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20863,15 +20933,21 @@ msgstr "City"
 msgid "Town"
 msgstr "Town"
 
-msgid "Suburb"
-msgstr "pinggiran kota"
-
 msgid "Village"
 msgstr "desa"
 
 msgid "Hamlet"
 msgstr "dusun"
 
+msgid "Isolated Dwelling"
+msgstr "Tertinggal/terisolasi"
+
+msgid "Suburb"
+msgstr "pinggiran kota"
+
+msgid "Neighbourhood"
+msgstr "lingkungan"
+
 msgid "Farm"
 msgstr ""
 
@@ -20881,12 +20957,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Tertinggal/terisolasi"
-
-msgid "Neighbourhood"
-msgstr "lingkungan"
-
 msgid "Locality"
 msgstr "Lokalitas"
 
@@ -21402,6 +21472,37 @@ msgstr "Gambar"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "segmen terluar"
 
@@ -21767,16 +21868,13 @@ msgstr "Tes"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21788,13 +21886,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21827,6 +21925,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21870,7 +22016,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21891,6 +22040,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -22019,7 +22174,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22102,6 +22257,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22318,16 +22479,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22336,6 +22497,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22603,6 +22767,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22695,6 +22862,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -28374,6 +28544,21 @@ msgstr "Siman informasi penyimpanan data terpisah saat ini kedalam berkas"
 msgid "Save SDS file"
 msgstr "Simpan file SDS"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Sederhanakan area"
 
@@ -28447,9 +28632,6 @@ msgstr "Faktor jarak"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Menggabungkan ambang batas Node/titik terdekat"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "AutoSave LiveData"
 
diff --git a/i18n/po/is.po b/i18n/po/is.po
index 31c1fd1..f6bc02f 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 13:49+0000\n"
 "Last-Translator: Pjetur G. Hjaltason <pjetur at pjetur.net>\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: 2014-12-29 05:00+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:57+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: is\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr "Val"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Henda hlutum út úr vallistanum sem eru ekki valdir á honum."
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2050,9 +2057,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Val"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5632,10 +5636,6 @@ msgstr "Leysa"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Henda hlutum út úr vallistanum sem eru ekki valdir á honum."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9086,7 +9086,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9107,6 +9107,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG myndir (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11086,7 +11092,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14273,6 +14279,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15265,12 +15277,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Bílastæðavegur"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Vegur (óþekkt flokkun)"
 
 msgid "Construction"
 msgstr "Í byggingu"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Hringtorg"
 
@@ -15366,47 +15454,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Hringtorg"
 
-msgid "motorway"
-msgstr "hraðbraut"
-
-msgid "motorway_link"
-msgstr "tengibraut á hraðbraut"
-
-msgid "trunk"
-msgstr "stofnvegur"
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr "óflokkaður"
-
-msgid "residential"
-msgstr "íbúðargata"
-
-msgid "living_street"
-msgstr "vistgata"
-
-msgid "service"
-msgstr "þjónustuvegur"
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "byggingarsvæði"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vað"
@@ -16239,31 +16289,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Skíðalyfta"
 
-msgid "Chair Lift"
-msgstr "Stólalyfta"
+msgid "Cable Car"
+msgstr "Kláfur"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Toglyfta"
+msgid "Chair Lift"
+msgstr "Stólalyfta"
 
-msgid "Cable Car"
-msgstr "Kláfur"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16278,16 +16325,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Toglyfta"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16372,6 +16427,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16402,12 +16460,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16603,6 +16664,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Almenningssamgöngur"
 
@@ -16861,6 +16925,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18104,10 +18176,6 @@ msgid "Man Made"
 msgstr "Mannvirki"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18128,15 +18196,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18210,6 +18278,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Inngangur"
 
@@ -19707,7 +19779,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19737,28 +19809,28 @@ msgstr "Borg"
 msgid "Town"
 msgstr "Bær"
 
-msgid "Suburb"
-msgstr "Hverfi"
-
 msgid "Village"
 msgstr "Þorp"
 
 msgid "Hamlet"
 msgstr "Smáþorp"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Hverfi"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20276,6 +20348,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20639,16 +20742,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20660,13 +20760,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20699,6 +20799,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20742,7 +20890,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20763,6 +20914,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20891,7 +21048,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20974,6 +21131,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21190,16 +21353,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21208,6 +21371,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21475,6 +21641,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21567,6 +21736,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26901,6 +27073,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26961,9 +27148,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/it.po b/i18n/po/it.po
index 49f0846..56c189b 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-11-24 21:33+0000\n"
-"Last-Translator: Don-vip <Unknown>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-28 00:06+0000\n"
+"Last-Translator: Silvio Brera <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: 2014-12-29 05:04+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:59+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: it\n"
 "X-Language: it_IT\n"
 "X-Source-Language: en\n"
@@ -227,6 +227,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "Nessun livello di riferimento"
 
+msgid "Select"
+msgstr "Seleziona"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Seleziona sulla mappa gli elementi selezionati nella lista qui sopra."
+
 msgid "Add imagery layer {0}"
 msgstr "Aggiungi livello di immagini aeree {0}"
 
@@ -424,7 +432,7 @@ msgid "Create Circle"
 msgstr "Crea cerchio"
 
 msgid "Create a circle from three selected nodes."
-msgstr "Crea un cerchio a partire da tre nodi selezionati"
+msgstr "Crea un cerchio a partire da tre nodi selezionati."
 
 msgid ""
 "Please select exactly two or three nodes or one way with exactly two or "
@@ -2256,9 +2264,6 @@ msgstr ""
 "rilasciare il tasto del mouse per sincronizzare l''audio in corrispondenza "
 "di quel punto."
 
-msgid "Select"
-msgstr "Seleziona"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Seleziona, sposta, scala e ruota oggetti"
 
@@ -4160,7 +4165,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Verificare per errori legati alle etichette internet."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " L''URL non può essere convertito in ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4390,19 +4395,22 @@ msgstr "Relazione vuota"
 
 msgid "Role member does not match expression {0} in template {1}"
 msgstr ""
+"Il membro Ruolo non corrisponde all''espressione {0} nel template {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
 msgstr ""
+"Il tipo di membro {0} non corrisponde alla lista di quelli accettati {1} nel "
+"template {2}"
 
 msgid "<empty>"
 msgstr "<vuoto>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Ruolo {0} sconosciuto nel template{1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "Tipo di ruolo vuoto, mentre era atteso uno di {0}"
 
 msgid "Role {0} missing"
 msgstr "Ruolo {0} mancante"
@@ -4967,35 +4975,39 @@ msgid "options provided as Java system properties"
 msgstr "opzioni fornite come proprietà di sistema Java"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/PERCORSO/DI/JOSM/PREFERENZE    "
 
 msgid "Set the preferences directory"
-msgstr ""
+msgstr "Imposta la cartella delle preferenze"
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/PERCORSO/DI/JOSM/DATIUTENTE"
 
 msgid "Set the user data directory"
-msgstr ""
+msgstr "Imposta la cartella dei dati utente"
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/PERCORSO/DI/JOSM/CACHE   "
 
 msgid "Set the cache directory"
-msgstr ""
+msgstr "Imposta la cartella della cache"
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/PERCORSO/DI/JOSM/CARTELLAHOME "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
 "homedir/cache"
 msgstr ""
+"Riposiziona tutte e tre le cartelle in CARTELLAHOME. La cartella Cache sarà "
+"in CARTELLAHOME/CACHE"
 
 msgid ""
 "-Djosm.home has lower precedence, i.e. the specific setting overrides the "
 "general one"
 msgstr ""
+"-Djosm.home ha priorità bassa, es. le impostazioni specifiche hanno la "
+"priorità su quelle generali"
 
 msgid ""
 "note: For some tasks, JOSM needs a lot of memory. It can be necessary to add "
@@ -5277,19 +5289,19 @@ 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 ""
+msgstr "Predefinito (opri, chiudi, nuovo)"
 
 msgid "Username"
 msgstr "Nome utente"
 
 msgid "Created date"
-msgstr ""
+msgstr "Data di creazione"
 
 msgid "Last change date"
-msgstr ""
+msgstr "Data ultima modifica"
 
 msgid "Select note sorting method"
-msgstr ""
+msgstr "Selezionare metodo di ordinamento delle note"
 
 msgid "Click to cancel the current operation"
 msgstr "Clicca per annullare l''operazione corrente"
@@ -5487,10 +5499,10 @@ msgid "Conflict foreground: keep all tags"
 msgstr "Primo piano conflitto: mantieni tutte le etichette"
 
 msgid "Conflict background: sum all numeric tags"
-msgstr ""
+msgstr "Conglitto background: somma tutti i tag numerici"
 
 msgid "Conflict foreground: sum all numeric tags"
-msgstr ""
+msgstr "Conglitto in primo piano: somma tutti i tag numerici"
 
 msgid "Conflict background: keep member"
 msgstr "Sfondo conflitto: mantieni membro"
@@ -5977,18 +5989,19 @@ msgid "all"
 msgstr "tutti"
 
 msgid "sum"
-msgstr ""
+msgstr "somma"
 
 msgid "Please decide which values to keep"
 msgstr "Decidere quali valori mantenere"
 
 msgid "Value ''{0}'' is going to be applied for key ''{1}''"
-msgstr ""
-"Si è in procinto di applicare il valore ''''{0}'''' alla chiave ''''{1}''''"
+msgstr "Si è in procinto di applicare il valore ''{0}'' alla chiave ''{1}''"
 
 msgid ""
 "All numeric values sumed as ''{0}'' are going to be applied for key ''{1}''"
 msgstr ""
+"Tutti i valori numerici sommati come ''{0}'' saranno applicati alla chiave "
+"''{1}''"
 
 msgid "The key ''{0}'' and all its values are going to be removed"
 msgstr ""
@@ -6250,11 +6263,6 @@ msgstr ""
 "Apre una finestra per unire tutti gli elementi selezionati nella lista qui "
 "sopra."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Seleziona sulla mappa gli elementi selezionati nella lista qui sopra."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "È stato individuato {0} conflitto."
@@ -6797,7 +6805,7 @@ msgid "Reopen note with message:"
 msgstr "Riapri nota con un messaggio"
 
 msgid "Sort notes"
-msgstr ""
+msgstr "Ordina note"
 
 msgid "Sort"
 msgstr "Ordina"
@@ -10117,7 +10125,7 @@ msgid "Delete File from disk"
 msgstr "Elimina il file dal disco"
 
 msgid "Copy image path"
-msgstr ""
+msgstr "Copia percorso immagine"
 
 msgid "Next"
 msgstr "Successivo"
@@ -10149,10 +10157,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Velocità: {0} km/h"
 
 msgid ""
 "\n"
@@ -10178,6 +10186,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Immagini JPEG (*.jpeg)"
 
+msgid "Show thumbnails"
+msgstr "Mostra le miniature"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Mostra le miniature al posto delle icone."
+
 msgid "Choose visible tracks"
 msgstr "Scegli i tracciati visibili"
 
@@ -12466,8 +12480,8 @@ msgstr "Interna:"
 msgid "Projection bounds (in degrees)"
 msgstr "Confini della proiezione (in gradi)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (codice EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Imposta il parametro SRS=... nelle richieste WMS"
 
 msgid "Gauß-Krüger"
 msgstr "Gauss-Krüger"
@@ -14036,7 +14050,7 @@ msgstr ""
 "Valore lungo non valido per l''attributo ''''{0}''''. Ottenuto ''''{1}''''."
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "{0} byte sono stati letti"
 
 msgid "Prepare OSM data..."
 msgstr "Preparazione dati OSM..."
@@ -14231,7 +14245,7 @@ msgstr ""
 "Impossibile avviare il server del controllo remoto sulla porta {0}: {1}"
 
 msgid "RemoteControl::Accepting connections on {0}:{1}"
-msgstr ""
+msgstr "Controllo remoto::Connessione accettata su {0}:{1}"
 
 msgid "RemoteControl::Server stopped."
 msgstr "Controllo remoto::Server fermato."
@@ -14244,7 +14258,7 @@ msgid "Unable to initialize Remote Control HTTPS Server"
 msgstr "Impossibile inizializzare il server HTTPS del Controllo Remoto"
 
 msgid "RemoteControl::Accepting secure connections on {0}:{1}"
-msgstr ""
+msgstr "Controllo remoto::Connessione sicura accettata su {0}:{1}"
 
 msgid "RemoteControl::Server (https) stopped."
 msgstr "Controllo remoto::Server (https) arrestato."
@@ -15952,6 +15966,8 @@ msgid ""
 "Allows to import various file formats into JOSM directly. Currently "
 "supported: TangoGPS, Garmin Trainings Center TCX."
 msgstr ""
+"Permetti importazione vari formati di file direttamente in JOSM. Attualmente "
+"supportati: TangoGPS, Garmin Trainings Center TCX."
 
 msgid "Download your GPX tracks from openstreetmap.org"
 msgstr "Scarica i tracciati GPX personali da openstreetmap.org"
@@ -16077,6 +16093,8 @@ msgid ""
 "Provides Java Native Access (JNA) library. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
 msgstr ""
+"Fornisce libreria Java Native Access (JNA). Non inteso per essere installato "
+"direttamente dagli utenti, ma piuttosto come una dipendenza per altri plugin."
 
 msgid ""
 "Provides Java Topology Suite (JTS) library and related utilities. Not meant "
@@ -16268,6 +16286,12 @@ msgstr "Fornisce funzioni di navigazione"
 msgid "Loads data from SDS"
 msgstr "Carica i dati da SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Livello immagine per carte nautiche"
+
+msgid "Edit features for Sea Charts"
+msgstr "Modifica caratteristiche delle carte nautiche"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16877,7 +16901,7 @@ msgstr "Monete"
 
 msgctxt "payment"
 msgid "Notes"
-msgstr ""
+msgstr "Note"
 
 msgid "Electronic purses and Charge cards"
 msgstr "Portafogli elettronici e carte di debito"
@@ -16905,19 +16929,19 @@ msgstr "Mag-Set 09:30-12:30,14:15-19:30"
 
 msgctxt "parking"
 msgid "multi-storey"
-msgstr ""
+msgstr "multipiano"
 
 msgctxt "parking"
 msgid "surface"
-msgstr ""
+msgstr "superficie"
 
 msgctxt "parking"
 msgid "underground"
-msgstr ""
+msgstr "sotterraneo"
 
 msgctxt "parking"
 msgid "rooftop"
-msgstr ""
+msgstr "sul tetto"
 
 msgid "Reference number"
 msgstr "Numero di riferimento"
@@ -17295,12 +17319,90 @@ msgstr "attraversamento in auto (drive-through)"
 msgid "Parking Aisle"
 msgstr "Corsia interna a parcheggio"
 
+msgid "Escape"
+msgstr "Via di fuga"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Corsia di emergenza accanto ad una lunga discesa, per camion e altri veicoli "
+"per fermarsi in modo sicuro in seguito ad un guasto ai freni."
+
 msgid "Road (Unknown Type)"
 msgstr "Strada (tipo sconosciuto)"
 
 msgid "Construction"
 msgstr "In costruzione"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "autostrada"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "rampa autostradale"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "tronco stradale"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "tronco di collegamento"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "primaria"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "svincolo primario"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "secondaria"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "collegamento di secondary"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "terziaria"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "svincolo terziario"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "butobus a guida vincolata"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "ippovia"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "strada-residenziale"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "pedonale"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "strada sterrata"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "sentiero per pedoni"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "scalinata"
+
 msgid "Junction"
 msgstr "Svincolo"
 
@@ -17396,45 +17498,7 @@ msgstr "non permesso"
 msgid "Roundabout"
 msgstr "Rotatoria"
 
-msgid "motorway"
-msgstr "autostrada"
-
-msgid "motorway_link"
-msgstr "svincolo autostradale"
-
-msgid "trunk"
-msgstr "superstrada"
-
-msgid "trunk_link"
-msgstr "svincolo superstrada"
-
-msgid "primary"
-msgstr "primaria"
-
-msgid "primary_link"
-msgstr "svincolo primario"
-
-msgid "secondary"
-msgstr "secondaria"
-
-msgid "tertiary"
-msgstr "terziaria"
-
-msgid "unclassified"
-msgstr "non classificata"
-
-msgid "residential"
-msgstr "residenziale"
-
-msgid "living_street"
-msgstr "living_street"
-
-msgid "service"
-msgstr "strada di servizio"
-
-msgid "bus_guideway"
-msgstr "bus_guideway"
-
+msgctxt "Highway"
 msgid "construction"
 msgstr "in costruzione"
 
@@ -17703,7 +17767,7 @@ msgid "tiger"
 msgstr "tiger"
 
 msgid "Button operated"
-msgstr ""
+msgstr "comandato da pulsante"
 
 msgid "Sound signals"
 msgstr "Segnali sonori"
@@ -17778,16 +17842,18 @@ msgid "Speed Camera"
 msgstr "Autovelox"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "specchio per il traffico"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Incrocio con nome"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Usato in alcuni paesi in cui il nome dell''incrocio serve per orientarsi "
+"localmente."
 
 msgid "Elevator"
 msgstr "Ascensore"
@@ -18294,32 +18360,29 @@ msgstr "Scambio ferroviario"
 msgid "Aerialway"
 msgstr "Impianto di risalita"
 
-msgid "Chair Lift"
-msgstr "Seggiovia"
+msgid "Cable Car"
+msgstr "Funivia"
 
 msgid "Number of people per hour"
 msgstr "Numero di persone per ora"
 
-msgid "Number of people per chair"
-msgstr "Numero di persone per seggiolini"
+msgid "Number of people per car"
+msgstr "Numero di persone per veicolo"
 
 msgid "Typical journey time in minutes"
 msgstr "Tempo medio di percorrenza in minuti"
 
-msgid "Has bubble?"
-msgstr "Con capotta?"
-
 msgid "Has heating?"
 msgstr "Riscaldata?"
 
-msgid "Drag Lift"
-msgstr "Ski-lift"
+msgid "Chair Lift"
+msgstr "Seggiovia"
 
-msgid "Cable Car"
-msgstr "Funivia"
+msgid "Number of people per chair"
+msgstr "Numero di persone per seggiolini"
 
-msgid "Number of people per car"
-msgstr "Numero di persone per veicolo"
+msgid "Has bubble?"
+msgstr "Con capotta?"
 
 msgid "Gondola"
 msgstr "Cabinovia/Ovovia"
@@ -18333,17 +18396,27 @@ msgstr "Impianto misto"
 msgid "Number of people per gondola/chair"
 msgstr "Numero di persone per cabina/seggiolini"
 
-msgid "T-bar Lift"
-msgstr "Sciovia ad ancora (T-bar)"
+msgid "Drag Lift"
+msgstr "Ski-lift"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"skillift (tipologia generica -da usare solo se non si conosce quello "
+"preciso, vedere lista seguente)"
+
+msgid "t-bar"
+msgstr "barra a T"
 
-msgid "J-bar Lift"
-msgstr "Sciovia (J-bar)"
+msgid "j-bar"
+msgstr "barra a J"
 
-msgid "Platter Lift"
-msgstr "Sciovia a piattello"
+msgid "platter"
+msgstr "piattello"
 
-msgid "Rope Tow"
-msgstr "Manovia"
+msgid "rope_tow"
+msgstr "fune di traino"
 
 msgid "Magic Carpet"
 msgstr "Tappeto mobile"
@@ -18427,6 +18500,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18457,12 +18533,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18658,6 +18737,9 @@ msgstr "Strumenti per la riparazione fai-da-te (può essere una ciclofficina)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Lavaggio biciclette (a pagamento)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Stazione pubbblica di riparazione biciclette"
+
 msgid "Public Transport"
 msgstr "Trasporto pubblico"
 
@@ -18916,6 +18998,14 @@ msgstr "Parcheggio aeromobili"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "Capannone"
+
+msgctxt "building"
+msgid "yes"
+msgstr "sì"
+
 msgid "Beacon"
 msgstr "Torre radio"
 
@@ -19244,7 +19334,7 @@ msgid "Fireplace"
 msgstr "Caminetto"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Tavolo per picnic"
 
 msgid "Public Grill"
 msgstr "Griglia pubblica"
@@ -19852,10 +19942,10 @@ msgid "Count"
 msgstr "Numero di idranti"
 
 msgid "Advertising Column"
-msgstr ""
+msgstr "Colonna pubblicitaria"
 
 msgid "Billboard"
-msgstr ""
+msgstr "Cartellone"
 
 msgid "Sports"
 msgstr "Sport"
@@ -20160,10 +20250,6 @@ msgid "Man Made"
 msgstr "Artificiale"
 
 msgctxt "building"
-msgid "yes"
-msgstr "sì"
-
-msgctxt "building"
 msgid "roof"
 msgstr "tetto"
 
@@ -20184,16 +20270,16 @@ msgid "school"
 msgstr "scuola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "Capannone"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "commerciale"
 
 msgctxt "building"
-msgid "farm"
-msgstr "agricolo"
+msgid "barn"
+msgstr "bambini"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -20266,6 +20352,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "distaccato"
 
+msgctxt "building"
+msgid "farm"
+msgstr "agricolo"
+
 msgid "Entrance"
 msgstr "Ingresso"
 
@@ -20478,7 +20568,7 @@ msgid "Tide Level"
 msgstr "Livello di marea"
 
 msgid "Groundwater"
-msgstr ""
+msgstr "Acque sotterranee"
 
 msgid "Traffic"
 msgstr "Traffico"
@@ -21354,15 +21444,15 @@ msgstr "Cavo elettrico"
 
 msgctxt "power cable"
 msgid "underground"
-msgstr ""
+msgstr "interrato"
 
 msgctxt "power cable"
 msgid "underwater"
-msgstr ""
+msgstr "subacqueo"
 
 msgctxt "power cable"
 msgid "overground"
-msgstr ""
+msgstr "sopra il suolo"
 
 msgid "Historic Places"
 msgstr "Luoghi storici"
@@ -21766,7 +21856,7 @@ msgstr "Perco nazionale"
 msgid "Protected Area"
 msgstr "Area protetta"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Classe protetta"
 
 msgid "Title or type of protection"
@@ -21796,15 +21886,21 @@ msgstr "Città"
 msgid "Town"
 msgstr "Paese"
 
-msgid "Suburb"
-msgstr "Quartiere"
-
 msgid "Village"
 msgstr "Frazione"
 
 msgid "Hamlet"
 msgstr "Borgo"
 
+msgid "Isolated Dwelling"
+msgstr "Insediamento rurale isolato"
+
+msgid "Suburb"
+msgstr "Quartiere"
+
+msgid "Neighbourhood"
+msgstr "Zona"
+
 msgid "Farm"
 msgstr "Fattoria"
 
@@ -21814,12 +21910,6 @@ msgstr "Una fattoria all''interno di un insediamento più grande"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(utilizzare isolated_dwelling per una fattoria isolata)"
 
-msgid "Isolated Dwelling"
-msgstr "Insediamento rurale isolato"
-
-msgid "Neighbourhood"
-msgstr "Zona"
-
 msgid "Locality"
 msgstr "Località (luogo con nome, non popolato)"
 
@@ -22348,6 +22438,42 @@ msgstr "Immagine"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contatto (Schema con ''contatto:*'' Prefisso)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Un breve testo con informazioni aggiuntive."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Potrebbe essere visibile per l''utente finale (forse con un sistema di "
+"ricerca o una mappa con pop-up)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Etichette simili ma diverse:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+"Segnalazione importante per altri mappatori (non per l''utente finale)."
+
+msgid "Fixme"
+msgstr "Correggi"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Segnalazione per altri mappatori (non per l''utente finale) che un oggetto "
+"necessita di miglioramenti."
+
 msgid "outer segment"
 msgstr "segmento esterno"
 
@@ -22711,17 +22837,14 @@ msgstr "Test"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (gruppo OSM a scopo umanitario)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22732,15 +22855,15 @@ msgstr "Tracce GPS OpenStreetMap"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik bianco-nero)"
+msgstr "OpenStreetMap (Mapnik Bianco & Nero)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, senza etichette)"
 
-msgid "skobbler"
-msgstr "skobbler"
-
 msgid "skobbler heatmap"
 msgstr "Heatmap di Skobbler(c)"
 
@@ -22771,6 +22894,54 @@ msgstr "Mappa per il ciclismo di Strava (c)"
 msgid "Strava running heatmap"
 msgstr "Mappa per la corsa di Strava (c)"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI bianco-nero 2.5m"
 
@@ -22813,9 +22984,13 @@ msgstr "VoGIS: DOM (modello superficie)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"Immagini aeree AGIV(laanderen) (copre la regione di Bruxelles) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "Immagini aeree SPW(allonie) 2012"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "Immagini aeree SPW(allonie) 2009"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mappa dei Settori Urbani"
@@ -22835,6 +23010,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Mosaico British Columbia"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Kelowna strade in sovraimpressione"
+
 msgid "Czech CUZK:KM"
 msgstr "Rep. Ceca CUZK:KM"
 
@@ -22866,13 +23047,13 @@ msgid "Estonia Ortho (Maaamet)"
 msgstr "Estonia Ortho (Maaamet)"
 
 msgid "Estonia Hillshade (Maaamet)"
-msgstr ""
+msgstr "Estonia Hillshade (Maaamet)"
 
 msgid "Estonia Cadastre (Maaamet)"
-msgstr ""
+msgstr "Estonia Cadastre (Maaamet)"
 
 msgid "Estonia Forestry (Maaamet)"
-msgstr ""
+msgstr "Estonia Forestry (Maaamet)"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -22953,7 +23134,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Amburgo (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Amburgo (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Amburgo (DK5)"
@@ -22964,8 +23145,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -23008,7 +23189,7 @@ msgid "NRW-Atlas: Topographische Karte 1:10000"
 msgstr "NRW-Atlas: Topographische Karte 1:10000"
 
 msgid "Metropole Ruhr: Luftbilder (10 cm)"
-msgstr ""
+msgstr "Metropole Ruhr: Antenne (10 cm)"
 
 msgid "Drone Imagery (Haiti)"
 msgstr "Drone Imagery (Haiti)"
@@ -23049,6 +23230,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italia"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Alto Adige Ortofoto 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Topomap Alto Adige"
+
 msgid "USSR - Latvia"
 msgstr "USSR - Lettonia"
 
@@ -23203,7 +23390,7 @@ msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
 
 msgid "Kanton Aargau 25cm (AGIS 2014)"
-msgstr ""
+msgstr "Kanton Aargau 25cm (AGIS 2014)"
 
 msgid "Stadt Uster Orthophoto 2008 10cm"
 msgstr "Stadt Uster Orthophoto 2008 10cm"
@@ -23265,16 +23452,16 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -23283,6 +23470,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr "U.S. Forest Service strade"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -23323,232 +23513,235 @@ msgid "NLS - Bartholomew Half Inch, 1897-1907"
 msgstr "NLS - Bartholomew Half Inch, 1897-1907"
 
 msgid "OS Town Plans, Aberdeen 1866-1867 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Aberdeen 1866-1867 (NLS)"
 
 msgid "OS Town Plans, Airdrie 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Airdrie 1858 (NLS)"
 
 msgid "OS Town Plans, Alexandria 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Alexandria 1859 (NLS)"
 
 msgid "OS Town Plans, Alloa 1861-1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Alloa 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Annan 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Annan 1859 (NLS)"
 
 msgid "OS Town Plans, Arbroath 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Arbroath 1858 (NLS)"
 
 msgid "OS Town Plans, Ayr 1855 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Ayr 1855 (NLS)"
 
 msgid "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)"
 
 msgid "OS Town Plans, Brechin 1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Brechin 1862 (NLS)"
 
 msgid "OS Town Plans, Burntisland 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Burntisland 1894 (NLS)"
 
 msgid "OS Town Plans, Campbelton 1865 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Campbelton 1865 (NLS)"
 
 msgid "OS Town Plans, Coatbridge 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Coatbridge 1858 (NLS)"
 
 msgid "OS Town Plans, Cupar 1854 (NLS)"
 msgstr "OS Town Plans, Cupar 1854 (NLS)"
 
 msgid "OS Town Plans, Cupar 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Cupar 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1852 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dalkeith 1852 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dalkeith 1893 (NLS)"
 
 msgid "OS Town Plans, Dumbarton 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dumbarton 1859 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1850 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dumfries 1850 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dumfries 1893 (NLS)"
 
 msgid "OS Town Plans, Dundee 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dundee 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Dundee 1870-1872 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dundee 1870-1872 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1854 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dunfermline 1854 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Dunfermline 1894 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1849-1851 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Edinburgh 1849-1851 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1876-1877 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Edinburgh 1876-1877 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Edinburgh 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Elgin 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Elgin 1868 (NLS)"
 
 msgid "OS Town Plans, Falkirk 1858-1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Falkirk 1858-1859 (NLS)"
 
 msgid "OS Town Plans, Forfar 1860-1861 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Forfar 1860-1861 (NLS)"
 
 msgid "OS Town Plans, Forres 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Forres 1868 (NLS)"
 
 msgid "OS Town Plans, Galashiels 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Galashiels 1858 (NLS)"
 
 msgid "OS Town Plans, Girvan 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Girvan 1857 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Glasgow 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1892-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Glasgow 1892-1894 (NLS)"
 
 msgid "OS Town Plans, Greenock 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Greenock 1857 (NLS)"
 
 msgid "OS Town Plans, Haddington 1853 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Haddington 1853 (NLS)"
 
 msgid "OS Town Plans, Haddington 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Haddington 1893 (NLS)"
 
 msgid "OS Town Plans, Hamilton 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Hamilton 1858 (NLS)"
 
 msgid "OS Town Plans, Hawick 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Hawick 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Inverness 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Inverness 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Irvine 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Irvine 1859 (NLS)"
 
 msgid "OS Town Plans, Jedburgh 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Jedburgh 1858 (NLS)"
 
 msgid "OS Town Plans, Kelso 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kelso 1857 (NLS)"
 
 msgid "OS Town Plans, Kilmarnock 1857-1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kilmarnock 1857-1859 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1855 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirkcaldy 1855 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirkcaldy 1894 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1850 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirkcudbright 1850 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirkcudbright 1893 (NLS)"
 
 msgid "OS Town Plans, Kirkintilloch 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirkintilloch 1859 (NLS)"
 
 msgid "OS Town Plans, Kirriemuir 1861 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Kirriemuir 1861 (NLS)"
 
 msgid "OS Town Plans, Lanark 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Lanark 1858 (NLS)"
 
 msgid "OS Town Plans, Linlithgow 1856 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Linlithgow 1856 (NLS)"
 
 msgid "OS Town Plans, Mayole 1856-1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Mayole 1856-1857 (NLS)"
 
 msgid "OS Town Plans, Montrose 1861-1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Montrose 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1853 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Musselburgh 1853 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Musselburgh 1893 (NLS)"
 
 msgid "OS Town Plans, Nairn 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Nairn 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Oban 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Oban 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Peebles 1856 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Peebles 1856 (NLS)"
 
 msgid "OS Town Plans, Perth 1860 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Perth 1860 (NLS)"
 
 msgid "OS Town Plans, Peterhead 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Peterhead 1868 (NLS)"
 
 msgid "OS Town Plans, Port Glasgow 1856-1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Port Glasgow 1856-1857 (NLS)"
 
 msgid "OS Town Plans, Portobello 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Portobello 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Rothesay 1862-1863 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Rothesay 1862-1863 (NLS)"
 
 msgid "OS Town Plans, Selkirk 1865 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Selkirk 1865 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1854 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, St Andrews 1854 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, St Andrews 1893 (NLS)"
 
 msgid "OS Town Plans, Stirling 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Stirling 1858 (NLS)"
 
 msgid "OS Town Plans, Stonehaven 1864 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Stonehaven 1864 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1847 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Stranraer 1847 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1863-1877 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Stranraer 1863-1877 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Stranraer 1893 (NLS)"
 
 msgid "OS Town Plans, Strathaven 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Strathaven 1858 (NLS)"
 
 msgid "OS Town Plans, Wick 1872 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Wick 1872 (NLS)"
 
 msgid "OS Town Plans, Wigtown 1848 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans, Wigtown 1894 (NLS)"
+
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
 
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Decremento numeri civici in interpolazione indirizzi"
@@ -23563,7 +23756,7 @@ msgid "{0} without {1}, {2} or {3}"
 msgstr "{0} senza {1}, {2} o {3}"
 
 msgid "{0} together with {1}"
-msgstr ""
+msgstr "{0} insieme a {1}"
 
 msgid "{0} on suspicious object"
 msgstr "{0} su oggetto sospetto"
@@ -23584,10 +23777,10 @@ msgid "{0} should be on the node where {1} and {2} intersect"
 msgstr "{0} dovrebbe essere sul nodo dove {1} e {2} si incontrano"
 
 msgid "alternative name without {0}"
-msgstr ""
+msgstr "nome alternativo senza {0}"
 
 msgid "incomplete usage of {0} on a way without {1}"
-msgstr ""
+msgstr "uso di {0} incompleto con un tracciato senza {1}"
 
 msgid "{0}={1} is deprecated"
 msgstr "{0}={1} è deprecato"
@@ -23635,7 +23828,7 @@ msgid "{0} should be replaced with {1}"
 msgstr "{0} dovrebbe essere sostituito da {1}"
 
 msgid "{0} = {1}; remove {0}"
-msgstr ""
+msgstr "{0} = {1}; rimuovere {0}"
 
 msgid ""
 "{0}={1} is unspecific. Please replace ''{1}'' by ''left'', ''right'' or "
@@ -23645,14 +23838,17 @@ msgstr ""
 "''entrambi''."
 
 msgid "{0} on a node. Should be used on a way."
-msgstr ""
+msgstr "{0} in un nodo. Dovrebbe essere usato in un tracciato."
 
 msgid "{0} on a node. Should be drawn as an area."
-msgstr ""
+msgstr "{0} in un nodo. Dovrebbe essere disegnata come un''area."
 
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* in un nodo. Dovrebbe essere utilizzato in una relazione"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} su un percorso. Dovrebbe essere usato in una relazione"
 
@@ -23678,7 +23874,7 @@ msgid "Overlapping Identical Landuses"
 msgstr "Utilizzi del terreno identici sovrapposti"
 
 msgid "{0} must be connected to a way"
-msgstr ""
+msgstr "{0} dovrebbe essere collegato ad un tracciato"
 
 msgid "abbreviated street name"
 msgstr "nome abbreviato della strada"
@@ -23705,12 +23901,14 @@ msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
 "''{3}'' instead."
 msgstr ""
+"Il valore di ''{0}'' dovrebbe essere ''{1}'' o ''{2}''. Per i marciapiedi "
+"invece utilizzare ''{3}''."
 
 msgid "{0} with multiple values"
 msgstr "{0} con valori multipli"
 
 msgid "empty value in semicolon-separated ''{0}''"
-msgstr ""
+msgstr "valore vuoto in elenco separato da virgola '' {0} ''"
 
 msgid "numerical key"
 msgstr "tasto numerico"
@@ -23752,7 +23950,7 @@ msgid "{0} must be a numeric value"
 msgstr "{0} deve essere un valore numerico"
 
 msgid "{0} must be a positive integer number"
-msgstr ""
+msgstr "{0} deve essere un numero intero positivo"
 
 msgid "relation without type"
 msgstr "relazione senza tipo"
@@ -25118,9 +25316,11 @@ msgstr "unione nodi"
 
 msgid "How often thinning operation should be applied (Default {0})."
 msgstr ""
+"Quanto spesso deve essere applicata l''operazione di assottigliamento "
+"(Predefinito {0})."
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Iterazioni di assottigliamento"
 
 msgid "Street Name:"
 msgstr "Nome della strada:"
@@ -28430,6 +28630,7 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Click+drag foto, shift+click posiziona foto, control+click imposta direzione."
 
 msgid "Please load some photos."
 msgstr "Si prega di caricare alcune foto."
@@ -29113,7 +29314,7 @@ msgid "Reconstruct polygons from relation {0}"
 msgstr "Ricostruisci poligoni dalla relazione {0}"
 
 msgid "Reconstruct route"
-msgstr ""
+msgstr "Ricostruisci itinerario (route)"
 
 msgid "Open relation wiki page"
 msgstr "Apri la pagina di aiuto sulle relazioni"
@@ -29155,10 +29356,10 @@ msgid "Way without ''inner'' or ''outer'' role found"
 msgstr "Trovato percorso senza il ruolo ''inner'' o ''outer''"
 
 msgid "Node without ''stop'' or ''platform'' role found"
-msgstr ""
+msgstr "Trovato nodo senza ruolo ''stop'' o ''platform''"
 
 msgid "Way platform without ''platform'' role found"
-msgstr ""
+msgstr "Trovato tracciato senza ruolo ''stop'' o ''platform''"
 
 msgid "Revert changeset fully"
 msgstr "Ripristinare completamente il gruppo di modifiche"
@@ -29495,6 +29696,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Salva file SDS"
 
+msgid "No object selected"
+msgstr "Nessun oggetto selezionato"
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr "Seamark Inspector"
+
+msgid "Select only one object"
+msgstr "Selezionare un solo oggetto"
+
+msgid "Select a map object"
+msgstr "Selezionare un oggetto mappa"
+
 msgid "Simplify Area"
 msgstr "Semplifica Area"
 
@@ -29570,9 +29786,6 @@ msgstr "Fattore di distanza"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Limite di unione di nodi limitrofi"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "Salvataggio automatico LiveData"
 
@@ -29701,7 +29914,7 @@ msgid "create an associatedStreet relation"
 msgstr "crea una relazione strada associata (associated street)"
 
 msgid "keep outline way"
-msgstr ""
+msgstr "tenere il tracciato esterno"
 
 msgid "Street name: "
 msgstr "Nome della strada: "
diff --git a/i18n/po/ja.po b/i18n/po/ja.po
index 7945d59..016d107 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-04 18:08+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-13 14:22+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: 2014-12-29 05:05+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:00+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "X-Poedit-Country: JAPAN\n"
 "Language: ja\n"
 "X-Poedit-Language: Japanese\n"
@@ -219,6 +219,13 @@ msgstr "<html>統合元のレイヤー<br>''{0}''<br>を統合できる先のレ
 msgid "No target layers"
 msgstr "対象のレイヤーがありません。"
 
+msgid "Select"
+msgstr "選択"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "地図上の選択した要素を、上記リストの選択したアイテムに設定します。"
+
 msgid "Add imagery layer {0}"
 msgstr "画像レイヤー {0} を追加"
 
@@ -2054,9 +2061,6 @@ msgid ""
 msgstr ""
 "再生ヘッドをドラッグして、音声の再生を開始したい辺りの位置で離してください。Shiftを押しながら離すと、その位置に音声を同期させることができます。"
 
-msgid "Select"
-msgstr "選択"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "オブジェクトの選択、移動、拡大縮小と回転"
 
@@ -3768,7 +3772,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "インターネットに関するタグのエラーをチェックします。"
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " URLをASCIIに変換できません: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
@@ -4526,25 +4530,25 @@ msgid "options provided as Java system properties"
 msgstr "Javaシステムのプロパティとして提供されるオプション"
 
 msgid "/PATH/TO/JOSM/PREF    "
-msgstr ""
+msgstr "/PATH/TO/JOSM/PREF    "
 
 msgid "Set the preferences directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/USERDATA"
-msgstr ""
+msgstr "/PATH/TO/JOSM/USERDATA"
 
 msgid "Set the user data directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/CACHE   "
-msgstr ""
+msgstr "/PATH/TO/JOSM/CACHE   "
 
 msgid "Set the cache directory"
 msgstr ""
 
 msgid "/PATH/TO/JOSM/HOMEDIR "
-msgstr ""
+msgstr "/PATH/TO/JOSM/HOMEDIR "
 
 msgid ""
 "Relocate all 3 directories to homedir. Cache directory will be in "
@@ -5670,10 +5674,6 @@ msgstr "解決"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "上記リストの全てのアイテムを結合するダイアログを開く"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "地図上の選択した要素を、上記リストの選択したアイテムに設定します。"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "検出された競合が{0}件あります"
@@ -9204,10 +9204,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0}km/h"
+"速度: {0} km/h"
 
 msgid ""
 "\n"
@@ -9233,6 +9233,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEGイメージ(*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "サムネイルを表示"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "アイコンの代わりに画像のサムネイルを表示します。"
+
 msgid "Choose visible tracks"
 msgstr "表示するトラックを選択"
 
@@ -11269,8 +11275,8 @@ msgstr "内蔵:"
 msgid "Projection bounds (in degrees)"
 msgstr "投影範囲(角度)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -12662,7 +12668,7 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "属性 ''{0}'' に不正な長い値。入力値: ''{1}''"
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "{0}バイトを読み込み"
 
 msgid "Prepare OSM data..."
 msgstr "OSMデータを準備します..."
@@ -14566,6 +14572,12 @@ msgstr "ルーティング能力の提供"
 msgid "Loads data from SDS"
 msgstr "SDSからのデータのロード"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15151,7 +15163,7 @@ msgstr "硬貨"
 
 msgctxt "payment"
 msgid "Notes"
-msgstr ""
+msgstr "メモ"
 
 msgid "Electronic purses and Charge cards"
 msgstr "電子マネー"
@@ -15569,12 +15581,88 @@ msgstr "ドライブスルー"
 msgid "Parking Aisle"
 msgstr "駐車場内通路"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "道路(区分不明)"
 
 msgid "Construction"
 msgstr "工事中道路"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "自動車専用道路"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "自動車専用道路の連絡路"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "国道"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "国道の連絡路"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "主要地方道"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "主要地方道の連絡路"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "一般都道府県道"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "一般都道府県道の連絡路"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "一般道(2車線以上)"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "一般道の連絡路"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "ガイドウェイバス"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "馬道"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "生活道路"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "歩行者天国"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "農道・林道"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "歩道"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "階段"
+
 msgid "Junction"
 msgstr "接続道路"
 
@@ -15670,47 +15758,9 @@ msgstr "禁止"
 msgid "Roundabout"
 msgstr "ロータリー交差点"
 
-msgid "motorway"
-msgstr "自動車専用道路"
-
-msgid "motorway_link"
-msgstr "自動車専用道路の連絡路"
-
-msgid "trunk"
-msgstr "国道"
-
-msgid "trunk_link"
-msgstr "国道の連絡路"
-
-msgid "primary"
-msgstr "主要地方道"
-
-msgid "primary_link"
-msgstr "主要地方道の連絡路"
-
-msgid "secondary"
-msgstr "一般都道府県道"
-
-msgid "tertiary"
-msgstr "一般道(2車線以上)"
-
-msgid "unclassified"
-msgstr "一般道(2車線未満)"
-
-msgid "residential"
-msgstr "住宅地"
-
-msgid "living_street"
-msgstr "生活道路"
-
-msgid "service"
-msgstr "敷地内道路"
-
-msgid "bus_guideway"
-msgstr "ガイドウェイバス"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "工事中"
+msgstr "建設中"
 
 msgid "Ford"
 msgstr "浅瀬(洗い越し)"
@@ -16036,11 +16086,11 @@ msgid "Speed Camera"
 msgstr "スピードカメラ(オービス)"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "交通ミラー"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "名前付き交差点"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
@@ -16545,32 +16595,29 @@ msgstr "分岐器"
 msgid "Aerialway"
 msgstr "索道"
 
-msgid "Chair Lift"
-msgstr "チェアリフト"
+msgid "Cable Car"
+msgstr "交走式ロープウェイ"
 
 msgid "Number of people per hour"
 msgstr "1時間あたりの運搬人数"
 
-msgid "Number of people per chair"
-msgstr "座席の定員"
+msgid "Number of people per car"
+msgstr "車両あたり定員"
 
 msgid "Typical journey time in minutes"
 msgstr "標準所用時間(分)"
 
-msgid "Has bubble?"
-msgstr "覆い付き"
-
 msgid "Has heating?"
 msgstr "暖房付き"
 
-msgid "Drag Lift"
-msgstr "牽引リフト"
+msgid "Chair Lift"
+msgstr "チェアリフト"
 
-msgid "Cable Car"
-msgstr "交走式ロープウェイ"
+msgid "Number of people per chair"
+msgstr "座席の定員"
 
-msgid "Number of people per car"
-msgstr "車両あたり定員"
+msgid "Has bubble?"
+msgstr "覆い付き"
 
 msgid "Gondola"
 msgstr "ゴンドラ"
@@ -16584,17 +16631,25 @@ msgstr "混合リフト"
 msgid "Number of people per gondola/chair"
 msgstr "ゴンドラ/椅子あたり定員"
 
-msgid "T-bar Lift"
-msgstr "Tバーリフト"
+msgid "Drag Lift"
+msgstr "牽引リフト"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr "Tバー"
 
-msgid "J-bar Lift"
-msgstr "Jバーリフト"
+msgid "j-bar"
+msgstr "Jバー"
 
-msgid "Platter Lift"
-msgstr "プラッターリフト"
+msgid "platter"
+msgstr "プラッター"
 
-msgid "Rope Tow"
-msgstr "ロープタウ"
+msgid "rope_tow"
+msgstr "ロープトゥ"
 
 msgid "Magic Carpet"
 msgstr "マジックカーペット"
@@ -16678,6 +16733,9 @@ msgstr "シェブロン"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "エッソ"
 
@@ -16708,12 +16766,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "シェル石油"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16909,6 +16970,9 @@ msgstr "DIY修理のための道具(自転車の協同組合かもしれない)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "自転車の洗浄(有料)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "公共自転車修理場所"
+
 msgid "Public Transport"
 msgstr "公共交通"
 
@@ -17167,6 +17231,14 @@ msgstr "エプロン"
 msgid "Hangar"
 msgstr "格納庫"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "格納庫"
+
+msgctxt "building"
+msgid "yes"
+msgstr "あり"
+
 msgid "Beacon"
 msgstr "ビーコン"
 
@@ -17494,7 +17566,7 @@ msgid "Fireplace"
 msgstr "野外炉"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "ピクニックテーブル"
 
 msgid "Public Grill"
 msgstr "バーベキュー場"
@@ -18105,7 +18177,7 @@ msgid "Advertising Column"
 msgstr ""
 
 msgid "Billboard"
-msgstr ""
+msgstr "ビルボード"
 
 msgid "Sports"
 msgstr "スポーツ"
@@ -18410,10 +18482,6 @@ msgid "Man Made"
 msgstr "人工物"
 
 msgctxt "building"
-msgid "yes"
-msgstr "あり"
-
-msgctxt "building"
 msgid "roof"
 msgstr "屋根"
 
@@ -18434,16 +18502,16 @@ msgid "school"
 msgstr "学校"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "格納庫"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "オフィスビル"
 
 msgctxt "building"
-msgid "farm"
-msgstr "農業用"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -18516,6 +18584,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "一戸建て"
 
+msgctxt "building"
+msgid "farm"
+msgstr "農業用"
+
 msgid "Entrance"
 msgstr "出入口"
 
@@ -20013,8 +20085,8 @@ msgstr "国立公園"
 msgid "Protected Area"
 msgstr "保護区域"
 
-msgid "Protected Class"
-msgstr "保護クラス"
+msgid "Protect Class"
+msgstr ""
 
 msgid "Title or type of protection"
 msgstr "保護の種類"
@@ -20043,15 +20115,21 @@ msgstr "市区"
 msgid "Town"
 msgstr "町"
 
-msgid "Suburb"
-msgstr "大字・地区"
-
 msgid "Village"
 msgstr "村"
 
 msgid "Hamlet"
 msgstr "集落"
 
+msgid "Isolated Dwelling"
+msgstr "一軒家"
+
+msgid "Suburb"
+msgstr "大字・地区"
+
+msgid "Neighbourhood"
+msgstr "小字"
+
 msgid "Farm"
 msgstr "農場"
 
@@ -20061,12 +20139,6 @@ msgstr "大きい居住地の中にある農場"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(独立した農場にはisolated_dwellingを使用してください)"
 
-msgid "Isolated Dwelling"
-msgstr "一軒家"
-
-msgid "Neighbourhood"
-msgstr "小字"
-
 msgid "Locality"
 msgstr "地形名"
 
@@ -20583,6 +20655,37 @@ msgstr "画像"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "連絡先(''contact:*''接頭辞のついたスキーマ)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "外側の区間"
 
@@ -20946,17 +21049,14 @@ msgstr "テスト"
 msgid "Landsat"
 msgstr "ランドサット"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo衛星画像"
-
-msgid "Bing Sat"
-msgstr "Bing衛星画像"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satellite"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -20967,14 +21067,14 @@ msgstr "OpenStreetMap GPS トレース"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik白黒)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, ラベルなし)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
@@ -21006,6 +21106,54 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI black-and-white 2.5m"
 
@@ -21048,9 +21196,13 @@ msgstr "VoGIS: DOM (Surface model)"
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
+"AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW(allonie) 2012 aerial imagery"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW(allonie) 2009 aerial imagery"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -21070,6 +21222,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Czech CUZK:KM"
 
@@ -21101,13 +21259,13 @@ msgid "Estonia Ortho (Maaamet)"
 msgstr "Estonia Ortho (Maaamet)"
 
 msgid "Estonia Hillshade (Maaamet)"
-msgstr ""
+msgstr "Estonia Hillshade (Maaamet)"
 
 msgid "Estonia Cadastre (Maaamet)"
-msgstr ""
+msgstr "Estonia Cadastre (Maaamet)"
 
 msgid "Estonia Forestry (Maaamet)"
-msgstr ""
+msgstr "Estonia Forestry (Maaamet)"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -21189,7 +21347,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburg (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburg (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburg (DK5)"
@@ -21200,8 +21358,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21285,6 +21443,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Italy"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -21439,7 +21603,7 @@ msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
 
 msgid "Kanton Aargau 25cm (AGIS 2014)"
-msgstr ""
+msgstr "Kanton Aargau 25cm (AGIS 2014)"
 
 msgid "Stadt Uster Orthophoto 2008 10cm"
 msgstr "Stadt Uster Orthophoto 2008 10cm"
@@ -21501,16 +21665,16 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21519,6 +21683,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -21786,6 +21953,9 @@ msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "住所の補完で住居番号が減少している"
 
@@ -21878,6 +22048,9 @@ msgstr "{0}がノードに設定されています。エリアとして描画す
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=*がノードに設定されています。リレーションに設定するべきです"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0}はウェイ上にあります。リレーションの中で使用してください"
 
@@ -21972,7 +22145,7 @@ msgid "{0} must be a numeric value"
 msgstr "{0}は数値でなければなりません"
 
 msgid "{0} must be a positive integer number"
-msgstr ""
+msgstr "{0}は正の整数でなければなりません"
 
 msgid "relation without type"
 msgstr "種別がないリレーション"
@@ -27402,6 +27575,21 @@ msgstr "現在のSDS情報をファイルに保存"
 msgid "Save SDS file"
 msgstr "SDSファイルを保存"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "SeaMapエディタ"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "エリアを簡素化"
 
@@ -27468,9 +27656,6 @@ msgstr "距離の係数"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "近接するノードを結合する閾値"
 
-msgid "SeaMap Editor"
-msgstr "SeaMapエディタ"
-
 msgid "AutoSave LiveData"
 msgstr "LiveDataの自動保存"
 
diff --git a/i18n/po/ka.po b/i18n/po/ka.po
index 3bbf304..9f599ee 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-12-16 00:14+0000\n"
 "Last-Translator: datogogishvili <Unknown>\n"
 "Language-Team: Georgian <ka at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:51+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:50+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ka\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -217,6 +217,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "არაა სამიზნე ფენები"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2041,9 +2048,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5616,10 +5620,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9053,7 +9053,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9074,6 +9074,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11043,7 +11049,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14223,6 +14229,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15215,12 +15227,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15316,45 +15404,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16189,31 +16239,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16228,16 +16275,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16322,6 +16377,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16352,12 +16410,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16553,6 +16614,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16811,6 +16875,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18054,10 +18126,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18078,15 +18146,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18160,6 +18228,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19657,7 +19729,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19687,28 +19759,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20226,6 +20298,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20589,16 +20692,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20610,13 +20710,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20649,6 +20749,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20692,7 +20840,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20713,6 +20864,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20841,7 +20998,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20924,6 +21081,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21140,16 +21303,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21158,6 +21321,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21425,6 +21591,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21517,6 +21686,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26851,6 +27023,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26911,9 +27098,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/km.po b/i18n/po/km.po
index 31b2313..4a8beb7 100644
--- a/i18n/po/km.po
+++ b/i18n/po/km.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-29 04:24+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-27 10:25+0000\n"
 "Last-Translator: Sophea Sok <sksophea at gmail.com>\n"
 "Language-Team: Khmer <km at li.org>\n"
 "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: 2014-12-29 05:06+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:02+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -143,7 +143,7 @@ msgid "Version {0}"
 msgstr "កំណែ {0}"
 
 msgid "Last change at {0}"
-msgstr "បំលាស់ប្តូរចុងក្រោយ {0}"
+msgstr "ផ្លាស់ប្តូរចុងក្រោយ {0}"
 
 msgid "Java Version {0}"
 msgstr "កំណែ Java {0}"
@@ -152,10 +152,10 @@ msgid "Homepage"
 msgstr "គេហ​ទំព័រ"
 
 msgid "Bug Reports"
-msgstr "របាយការ កំហុស"
+msgstr "របាយការណ៍​កំហុស"
 
 msgid "Info"
-msgstr "ពត៌មាន"
+msgstr "ព័ត៌មាន"
 
 msgid "Readme"
 msgstr "អានខ្ញុំ"
@@ -222,6 +222,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "គ្មាន​​ស្រទាប់​គោលដៅ"
 
+msgid "Select"
+msgstr "ជ្រើសរើស"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"កំណត់​ធាតុ​ដែល​បាន​ជ្រើស​នៅ​លើ​ផែនទី "
+"ទៅ​ធាតុ​ដែល​បាន​ជ្រើស​នៅ​ក្នុង​បញ្ជី​ខាងលើ។"
+
 msgid "Add imagery layer {0}"
 msgstr "បន្ថែម​ស្រទាប់​រូបភាព {0}"
 
@@ -306,7 +315,7 @@ msgid "selection"
 msgstr "ការជ្រើសយក"
 
 msgid "conflict"
-msgstr "ជំលោះ"
+msgstr "ប៉ះទង្គិច"
 
 msgid "download"
 msgstr "ទាញយក"
@@ -324,7 +333,7 @@ msgid "Nothing selected to zoom to."
 msgstr "មិនមានអ្វី​ត្រូវបាន​ជ្រើសរើស​ដើម្បី​ពង្រីកចូលទៅ​។"
 
 msgid "Information"
-msgstr "ពត៌មាន"
+msgstr "ព័ត៌មាន"
 
 msgid "Zoom to {0}"
 msgstr "ពង្រីកចូលទៅ {0}"
@@ -832,23 +841,23 @@ msgid "Ignore this hint and merge anyway"
 msgstr "មិន​អើពើ​ការ​ជូនដំណឹង​នេះ ហើយ​បញ្ចូល​គ្នា"
 
 msgid "Merge Nodes"
-msgstr "បញ្ចូល​ថ្នាំង​ចូលគ្នា"
+msgstr "បញ្ចូល​តំណ​ចូលគ្នា"
 
 msgid "Merge nodes into the oldest one."
-msgstr "បញ្ចូល​គ្នា​ទៅ​ក្នុង​ថ្នាំង​ចាស់​បំផុត​មួយ"
+msgstr "បញ្ចូល​គ្នា​ទៅ​ក្នុង​តំណ​ចាស់​បំផុត​មួយ"
 
 msgid ""
 "Please select at least two nodes to merge or one node that is close to "
 "another node."
 msgstr ""
-"សូម​ជ្រើស​ថ្នាំង​យ៉ាង​ហោច​ពីរ​ដើម្បី​បញ្ចូល​គ្នា "
-"ឬ​ថ្នាំង​មួយ​ដែល​នៅ​ក្បែរ​ថ្នាំង​ផ្សេងទៀត។"
+"សូម​ជ្រើស​តំណ​យ៉ាង​ហោច​ពីរ​ដើម្បី​បញ្ចូល​គ្នា "
+"ឬ​តំណ​មួយ​ដែល​នៅ​ក្បែរ​តំណ​ផ្សេងទៀត។"
 
 msgid "Abort Merging"
 msgstr "បោះបង់​ការ​បញ្ចូល​គ្នា"
 
 msgid "Click to abort merging nodes"
-msgstr "ចុច​ដើម្បី​បោះបង់​ការ​បញ្ចូល​ថ្នាំង​ចូលគ្នា"
+msgstr "ចុច​ដើម្បី​បោះបង់​ការ​បញ្ចូល​តំណ​ចូលគ្នា"
 
 msgid ""
 "Cannot merge nodes: Would have to delete way {0} which is still used by {1}"
@@ -857,7 +866,7 @@ msgstr ""
 
 msgid "Merge {0} node"
 msgid_plural "Merge {0} nodes"
-msgstr[0] "បញ្ចូល​គ្នា {0} ថ្នាំង"
+msgstr[0] "បញ្ចូល​គ្នា {0} តំណ"
 
 msgid "Merge selection"
 msgstr "ជម្រើស​បញ្ចូល​គ្នា"
@@ -884,7 +893,7 @@ msgid "Mirror"
 msgstr "កញ្ចក់"
 
 msgid "Mirror selected nodes and ways."
-msgstr "ផ្លូវ និង​តំណ​ដែល​បាន​ជ្រើស​ឆ្លុះ។"
+msgstr "ឆ្លុះ​ផ្លូវ និង​តំណ​ដែល​បាន​ជ្រើស។"
 
 msgid "Please select at least one node or way."
 msgstr "សូម​ជ្រើស​ផ្លូវ ឬ​តំណ​យ៉ាង​ហោច​មួយ។"
@@ -1043,8 +1052,8 @@ msgid ""
 "Orthogonalize Shape / Undo<br>Please select nodes that were moved by the "
 "previous Orthogonalize Shape action!"
 msgstr ""
-"រូបរាង​កាត់​ជា​មុំកែង/មិនធ្វើវិញ<br>សូម​ជ្រើស​ថ្នាំង​ដែល​បាន​ផ្លាស់ទី​ដោយ​សកម"
-"្មភាព​រូបរាង Orthogonalize ពីមុន!"
+"រូបរាង​កាត់​ជា​មុំកែង/មិនធ្វើវិញ<br>សូម​ជ្រើស​តំណ​ដែល​បាន​ផ្លាស់ទី​ដោយ​សកម្មភ"
+"ាព​រូបរាង Orthogonalize ពីមុន!"
 
 msgid ""
 "<html>You are using the EPSG:4326 projection which might lead<br>to "
@@ -1669,14 +1678,14 @@ msgid "Updating ignored errors ..."
 msgstr "កំពុង​ធ្វើ​បច្ចុប្បន្នភាព មិន​អើពើ​កំហុស..."
 
 msgid "Viewport Following"
-msgstr "មើល​ច្រក​ដែល​តាម"
+msgstr "Viewport Following"
 
 msgid "Enable/disable automatic moving of the map view to last placed node"
 msgstr ""
 "បិទ/បើក​ការ​ផ្លាស់ទី​ទិដ្ឋភាព​ផែនទី​ស្វ័យប្រវត្តិ​ទៅកាន់​តំណ​ចុងក្រោយ"
 
 msgid "Toggle Viewport Following"
-msgstr "បិទ/បើក​ច្រក​ដែល​តាម"
+msgstr "បិទ/បើក Viewport Following"
 
 msgid "Wireframe View"
 msgstr "ទិដ្ឋភាព​ស៊ុម​ខ្សែ"
@@ -1760,7 +1769,7 @@ msgid "Play/Pause"
 msgstr "ចាក់/ផ្អាក"
 
 msgid "Play/pause audio."
-msgstr "ចាក់​/ផ្អាក សំលេង"
+msgstr "ចាក់/ផ្អាក​អូឌីយ៉ូ"
 
 msgctxt "audio"
 msgid "Previous Marker"
@@ -2171,9 +2180,6 @@ msgstr ""
 "អូស​ក្បាល​ចាក់ រួច​ប្រលែង​នៅ​ជិត​បទ​ដើម្បី​ចាក់​អូឌីយ៉ូ​ចេញពី​នោះ; "
 "SHIFT+release ដើម្បី​ធ្វើ​សមកាលកម្ម​នៅ​ចំណុច​នោះ។"
 
-msgid "Select"
-msgstr "ជ្រើសរើស"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "ជ្រើស ផ្លាស់ទី ធ្វើ​មាត្រដ្ឋាន និង​បង្វិល​វត្ថុ"
 
@@ -2999,7 +3005,7 @@ msgid "At least one object to delete required, got empty collection"
 msgstr "បាន​ទាមទារ​វត្ថុ​យ៉ាង​ហោច​មួយ​ដើម្បី​លុប ទទួល​បាន​សម្រាំង​ទទេ"
 
 msgid "Delete node {0}"
-msgstr "លុប​ថ្នាំង {0}"
+msgstr "លុប​តំណ {0}"
 
 msgid "Delete way {0}"
 msgstr "លុប​ផ្លូវ {0}"
@@ -3591,7 +3597,7 @@ msgstr "កម្មវិធី​បង្ហាញ​ផែនទី​រច
 
 msgid "Renders the map using style rules in a set of style sheets."
 msgstr ""
-"បង្ហាញ​ផែនទី​ដោយ​ប្រើ​ក្បួន​រចនាប័ទ្ម​នៅ​ក្នុង​សំណុំ​នៃ​សន្លឹក​រចនាប័ទ្ម។"
+"បង្ហាញ​ផែនទី​ដោយ​ប្រើ​បន្ទាត់​រចនាប័ទ្ម​នៅ​ក្នុង​សំណុំ​នៃ​សន្លឹក​រចនាប័ទ្ម។"
 
 msgid "inactive"
 msgstr "អសកម្ម"
@@ -4216,20 +4222,22 @@ msgid "Relation is empty"
 msgstr "ទំនាក់ទំនង​គឺ​ទទេ"
 
 msgid "Role member does not match expression {0} in template {1}"
-msgstr ""
+msgstr "តួនាទី​សមាជិក​មិន​ផ្គូផ្គង​ជាមួយ​កន្សោម {0} នៅ​ក្នុង​ពុម្ព {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
 msgstr ""
+"ប្រភេទ​តួនាទី​សមាជិក {0} មិន​ផ្គូផ្គង​ជាមួយ​បញ្ជី​ព្រម​ទទួល {1} "
+"នៅ​ក្នុង​ពុម្ព {2}"
 
 msgid "<empty>"
 msgstr "<ទទេ>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "មិន​ស្គាល់​តួនាទី {0} នៅ​ក្នុង​ពុម្ព {1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "បាន​រក​ឃើញ​តួនាទី​ទទេ ពេល​ទាមទារ​មួយ​ក្នុង​ចំណោម {0}"
 
 msgid "Role {0} missing"
 msgstr "បាត់​បញ្ជី {0}"
@@ -4245,8 +4253,7 @@ msgstr "ផ្លូវ​ដែល​ប្រសព្វ​ខ្លួន​
 
 msgid ""
 "This test checks for ways that contain some of their nodes more than once."
-msgstr ""
-"ការ​សាកល្បង​នេះ​គឺ​សម្រាប់​ផ្លូវ​ដែល​មាន​ថ្នាំង​របស់​វា​ច្រើន​ជាង​មួយ។"
+msgstr "ការ​សាកល្បង​នេះ​គឺ​សម្រាប់​ផ្លូវ​ដែល​មាន​តំណ​របស់​វា​ច្រើន​ជាង​មួយ។"
 
 msgid "Similarly named ways"
 msgstr "ផ្លូវ​ដែល​មាន​ឈ្មោះ​ស្រដៀងគ្នា"
@@ -4340,7 +4347,8 @@ msgstr "ប្រើ​កម្មវិធី​ពិនិត្យ​លក
 
 msgid "Validate property values and tags using complex rules."
 msgstr ""
-"ធ្វើឲ្យ​តម្លៃ និង​ស្លាក​លក្ខណសម្បត្តិ​មាន​សុពលភាព​ដោយ​ប្រើ​ក្បួន​ស្មុគស្មាញ។"
+"ធ្វើឲ្យ​តម្លៃ "
+"និង​ស្លាក​លក្ខណសម្បត្តិ​មាន​សុពលភាព​ដោយ​ប្រើ​បន្ទាត់​ស្មុគស្មាញ។"
 
 msgid "TagChecker source"
 msgstr "ប្រភព​កម្មវិធី​ពិនិត្យ​ស្លាក"
@@ -4662,7 +4670,7 @@ msgid "Not Found"
 msgstr "រក​មិន​ឃើញ"
 
 msgid "Conflict"
-msgstr "ជំលោះ"
+msgstr "ប៉ះទង្គិច"
 
 msgid "Authentication Failed"
 msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទៀងផ្ទាត់"
@@ -4711,7 +4719,7 @@ msgid "Imagery offset"
 msgstr "អុហ្វសិត​រូបភាព"
 
 msgid "Imagery"
-msgstr "រុបភាព"
+msgstr "រូបភាព"
 
 msgctxt "layer"
 msgid "Offset"
@@ -4985,7 +4993,7 @@ msgid "Click to open the imagery tab in the preferences"
 msgstr "ចុច​ដើម្បី​បើក​ផ្ទាំង​រូបភាព​នៅ​ក្នុង​ចំណូលចិត្ត"
 
 msgid "Audio"
-msgstr "សំលេង"
+msgstr "អូឌីយ៉ូ"
 
 msgid "Do not hide toolbar"
 msgstr "កុំ​លាក់​របារ​ឧបករណ៍"
@@ -6028,12 +6036,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "បើក​ប្រអប់​បញ្ចូល​គ្នានៃ​ធាតុ​ដែល​បាន​ជ្រើស​ទាំងអស់​នៅ​ក្នុង​បញ្ជី​ខាងលើ។"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"កំណត់​ធាតុ​ដែល​បាន​ជ្រើស​នៅ​លើ​ផែនទី "
-"ទៅ​ធាតុ​ដែល​បាន​ជ្រើស​នៅ​ក្នុង​បញ្ជី​ខាងលើ។"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "បាន​រក​ឃើញ​ការ​ប៉ះទង្គិច {0} ។"
@@ -8594,12 +8596,14 @@ msgid ""
 "Warning: depending on the authentication method the proxy server uses the "
 "password may be transferred unencrypted."
 msgstr ""
+"ព្រមាន៖ ដោយ​ផ្អែក​លើ​វិធីសាស្ត្រ​ផ្ទៀងផ្ទាត់ "
+"ម៉ាស៊ីន​មេ​ប្រូកស៊ី​ប្រើ​ពាក្យសម្ងាត់​ដែល​អាច​បញ្ជូន​ដោយ​មិន​ដាក់​លេខ​កូដ។"
 
 msgid "Authenticate"
-msgstr ""
+msgstr "ផ្ទៀងផ្ទាត់"
 
 msgid "Authenticate with the supplied username and password"
-msgstr ""
+msgstr "ផ្ទៀងផ្ទាត់​ជាមួយ​ឈ្មោះ​អ្នកប្រើ និង​ពាក្យសម្ងាត់​ដែល​បាន​ផ្ដល់"
 
 msgid "Cancel authentication"
 msgstr "បោះបង់​ការ​ផ្ទៀងផ្ទាត់"
@@ -9375,7 +9379,7 @@ msgid "The document contains no data."
 msgstr "ឯកសារ​មិន​មាន​ទិន្នន័យ។"
 
 msgid "Conflicts"
-msgstr "ជំលោះ"
+msgstr "ប៉ះទង្គិច"
 
 msgid "Reject Conflicts and Save"
 msgstr "បដិសេធ​ការ​ប៉ះទង្គិច រួច​រក្សាទុក"
@@ -9815,10 +9819,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"ល្បឿន៖ {0} km/h"
 
 msgid ""
 "\n"
@@ -9844,6 +9848,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "រូបភាព JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "បង្ហាញ​រូបភាព​តូចៗ"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "បង្ហាញ​រូបភាព​តូចៗ​ជំនួស​រូបតំណាង។"
+
 msgid "Choose visible tracks"
 msgstr "ជ្រើស​ដាន​ដែល​មើលឃើញ"
 
@@ -9968,7 +9978,7 @@ msgid "gps point"
 msgstr "ចំណុច​ជីភីអេស"
 
 msgid "Import Audio"
-msgstr "នាំចូល​សំឡេង"
+msgstr "នាំចូល​អូឌីយ៉ូ"
 
 msgid ""
 "<html>The data in the GPX layer ''{0}'' has been downloaded from the "
@@ -10048,53 +10058,60 @@ msgid "Toggle visible state of the marker text and icons."
 msgstr "បិទ/បើក​ភាព​មើលឃើញ​នៃ​អត្ថបទ និង​រូបតំណាង​កម្មវិធី​ចំណាំ។"
 
 msgid "Synchronize Audio"
-msgstr ""
+msgstr "ធ្វើ​សមកាលកម្ម​សំឡេង"
 
 msgid ""
 "You need to pause audio at the moment when you hear your synchronization cue."
-msgstr ""
+msgstr "អ្នក​ត្រូវ​ផ្អាក​សំឡេង​ភ្លាម ពេល​អ្នក​ឮ​សំឡេង​សមកាកលកម្ម។"
 
 msgid "Audio synchronized at point {0}."
-msgstr ""
+msgstr "បាន​ធ្វើ​សមកាលកម្ម​នៅ​ចំណុច {0} ។"
 
 msgid "Unable to synchronize in layer being played."
-msgstr ""
+msgstr "មិន​អាច​ធ្វើ​សមកាលម្ម​នៅ​ក្នុង​ស្រទាប់​ដែល​បាន​ចាប់ផ្ដើម។"
 
 msgid "Make Audio Marker at Play Head"
-msgstr ""
+msgstr "បង្កើត​កម្មវិធី​សំឡេង​នៅ​ក្បាល​ចាក់"
 
 msgid ""
 "You need to have paused audio at the point on the track where you want the "
 "marker."
-msgstr ""
+msgstr "អ្នក​ចាំបាច់​ត្រូវ​ផ្អាក​សំឡេង​នៅ​ចំណុច​លើ​ដាន​ដែល​អ្នក​ចង់​ចំណាំ។"
 
 msgid ""
 "You need to drag the play head near to the GPX track whose associated sound "
 "track you were playing (after the first marker)."
 msgstr ""
+"អ្នក​ត្រូវ​អូស​ក្បាល​ចាក់​ទៅ​ជិត​ដាន GPX "
+"ដែល​មាន​ដាន​សំឡេង​ពាក់ព័ន្ធ​ជាមួយ​អ្វី​ដែល​អ្នក​កំពុង​ចាក់ "
+"(បន្ទាប់ពី​កម្មវិធី​ចំណាំ​ទីមួយ)។"
 
 msgid ""
 "You need to SHIFT-drag the play head onto an audio marker or onto the track "
 "point where you want to synchronize."
 msgstr ""
+"អ្នក​ត្រូវ​ចុច SHIFT រួច​អូស​ក្បាល​ចាក់​ទៅ​លើ​កម្មវិធី​ចំណាំ​សំឡេង "
+"ឬ​ទៅ​លើ​ចំណុច​ដាន​ដែល​អ្នក​ចង់​ធ្វើ​សមកាលកម្ម។"
 
 msgid "Unable to create new audio marker."
-msgstr ""
+msgstr "មិន​អាច​បង្កើត​កម្មវិធី​ចំណា​សំឡេង​ថ្មី។"
 
 msgid "There was an error while trying to display the URL for this marker"
-msgstr ""
+msgstr "មាន​កំហុស​ពេល​ព្យាយាម​បង្ហាញ URL សម្រាប់​កម្មវិធី​ចំណាំ​នេះ"
 
 msgid "(URL was: "
-msgstr ""
+msgstr "(URL គឺ៖ "
 
 msgid "Select the map painting styles"
-msgstr ""
+msgstr "ជ្រើស​រចនាប័ទ្ម​គំនូរ​ផែនទី"
 
 msgid "Failed to load Mappaint styles from ''{0}''. Exception was: {1}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​រចនាប័ទ្ម​គំនូរ​ផែនទី​ពី ''{0}'' ។ "
+"ករណី​លើកលែង​គឺ៖ {1}"
 
 msgid "loading style ''{0}''..."
-msgstr ""
+msgstr "កំពុង​ផ្ទុក​រចនាប័ទ្ម ''{0}''..."
 
 msgid ""
 "There was an error when loading this style. Select ''Info'' from the right "
@@ -10103,80 +10120,92 @@ msgid_plural ""
 "There were {0} errors when loading this style. Select ''Info'' from the "
 "right click menu for details."
 msgstr[0] ""
-msgstr[1] ""
+"មាន​កំហុស {0} ពេល​ផ្ទុក​រចនាប័ទ្ម​នេះ។ ជ្រើស ''ព័ត៌មាន'' "
+"ពី​ការ​ចុច​កណ្ដុរស្ដាំ​លើ​ម៉ឺនុយ​សម្រាប់​ព័ត៌មាន​លម្អិត។"
 
 msgid "Failed to parse Mappaint styles from ''{0}''. Error was: {1}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ញែក​រចនាប័ទ្ម​គំនូរ​ផែនទី​ពី ''{0}'' ។ កំហុស​គឺ៖ {1}"
 
 msgid ""
 "Detected deprecated ''{0}'' in ''{1}'' which will be removed shortly. Use "
 "''{2}'' instead."
 msgstr ""
+"បាន​រក​ឃើញ​ការ​បដិសេធ ''{0}'' នៅ​ក្នុង ''{1}'' "
+"ដែល​នឹង​ត្រូវ​លុបចេញ​ក្នុង​ពេល​ឆាប់ៗ។ ប្រើ ''{2}'' ជំនួស។"
 
 msgid "Illegal dash pattern, values must be positive"
-msgstr ""
+msgstr "លំនាំ​សញ្ញា​ដក​មិន​ត្រឹមត្រូវ តម្លៃ​ត្រូវតែ​វិជ្ជមាន"
 
 msgid "Illegal dash pattern, at least one value must be > 0"
-msgstr ""
+msgstr "លំនាំ​សញ្ញា​ដក​មិន​ត្រឹមត្រូវ ត្រូវតែ​មាន​តម្លៃ​យ៉ាង​ហោច​មួយ > 0"
 
 msgid ""
 "Failed to parse Mappaint styles from ''{0}''. Error was: [{1}:{2}] {3}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ញែក​រចនាប័ទ្ម​គំនូរ​ផែនទី​ពី ''{0}'' ។ កំហុស​គឺ៖ "
+"[{1}:{2}] {3}"
 
 msgid "Access Token Key:"
-msgstr ""
+msgstr "ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ៖"
 
 msgid "Access Token Secret:"
-msgstr ""
+msgstr "ពាក្យសម្ងាត់​ថូខឹន​ចូល​ដំណើរការ៖"
 
 msgid "Save Access Token in preferences"
-msgstr ""
+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>"
 msgstr ""
+"<html>ជ្រើស​ដើម្បី​រក្សាទុក​ថូខឹន​ចូល​ដំណើរការ​នៅ​ក្នុង​ចំណូលចិត្ត JOSM "
+"។<br>មិន​ជ្រើស​ដើម្បី​ប្រើ​ថូខឹន​ចូល​ដំណើរការ​នៅ​ក្នុង​សម័យ JOSM "
+"តែប៉ុណ្ណោះ។</html>"
 
 msgid "Use default settings"
-msgstr ""
+msgstr "ប្រើ​ការ​កំណត់​លំនាំដើម"
 
 msgid "Consumer Key:"
-msgstr ""
+msgstr "ពាក្យគន្លឹះ​អ្នកប្រើ៖"
 
 msgid "Consumer Secret:"
-msgstr ""
+msgstr "ពាក្យសម្ងាត់​អ្នកប្រើ៖"
 
 msgid "Request Token URL:"
-msgstr ""
+msgstr "URL ថូខឹន​សំណើ៖"
 
 msgid "Access Token URL:"
-msgstr ""
+msgstr "URL ថូខឹន​ចូល​ដំណើរការ៖"
 
 msgid "Authorize URL:"
-msgstr ""
+msgstr "URL អនុញ្ញាត៖"
 
 msgid "Click to reset the OAuth settings to default values"
-msgstr ""
+msgstr "ចុច​ដើម្បី​កំណត់ OAuth ឡើងវិញ​ទៅ​តម្លៃ​លំនាំដើម"
 
 msgid "Click to abort resetting to the OAuth default values"
-msgstr ""
+msgstr "ចុច​ដើម្បី​បោះបង់​ការ​កំណត់ OAuth ឡើងវិញ​ទៅ​តម្លៃ​លំនាំដើម"
 
 msgid ""
 "<html>JOSM is about to reset the OAuth settings to default values.<br>The "
 "current custom settings are not saved.</html>"
 msgstr ""
+"<html>JOSM ហៀបនឹង​កំណត់ OAuth "
+"ឡើងវិញ​ទៅ​តម្លៃ​លំនាំដើម។<br>ការ​កំណត់​ផ្ទាល់ខ្លួន​លំនាំដើម​មិន​ត្រូវ​បាន​រក្"
+"សាទុក។</html>"
 
 msgid "Overwrite custom OAuth settings?"
-msgstr ""
+msgstr "សរសេរ​ជាន់​លើ​ការ​កំណត់ OAuth ផ្ទាល់ខ្លួន?"
 
 msgid "Fully automatic"
-msgstr ""
+msgstr "ស្វ័យប្រវត្តិ​ទាំងស្រុង"
 
 msgid "Semi-automatic"
-msgstr ""
+msgstr "ពាក់កណ្ដាល​ស្វ័យប្រវត្តិ"
 
 msgid "Manual"
-msgstr ""
+msgstr "​ដោយ​ដៃ"
 
 msgid ""
 "<html>Run a fully automatic procedure to get an access token from the OSM "
@@ -10184,6 +10213,11 @@ msgid ""
 "fully<br>automatically authorizes the user and retrieves an Access "
 "Token.</html>"
 msgstr ""
+"<html>ដំណើរការ​បែបបទ​ស្វ័យប្រវត្តិ​ទាំងស្រុង​ដើម្បី​ទទួល​បាន​ថូខឹន​ចូល​ដំណើរក"
+"ារ​ពី​តំបន់បណ្ដាញ OSM ។<br>JOSM ចូល​ដំណើរការ​តំបន់បណ្ដាញ OSM "
+"ក្នុង​នាម​ជា​អ្នកប្រើ JOSM "
+"ហើយ<br>បាន​ផ្ដល់​ការ​អនុញ្ញាត​ស្វ័យប្រវត្តិ​ពេញលេញ​ដល់​អ្នកប្រើ "
+"និង​ថូខឹន​ចូល​ដំណើរការ។</html>"
 
 msgid ""
 "<html>Run a semi-automatic procedure to get an access token from the OSM "
@@ -10192,11 +10226,19 @@ msgid ""
 "external browser<br>to authenticate itself and to accept the request token "
 "submitted by JOSM.</html>"
 msgstr ""
+"<html>ដំណើរការ​បែបបទ​ពាក់កណ្ដាល​ស្វ័យប្រវត្តិ​ដើម្បី​ទទួល​បាន​ថូខឹន​ចូល​ដំណើរ"
+"ការ​ពី​តំបន់បណ្ដាញ OSM ។<br>JOSM ដាក់​ស្នើ​សំណើ OAuth "
+"ស្តង់ដារ​ដើម្បី​ទទួល​បាន​ថូខឹន​សំណើ និង<br>ថូខឹន​ចូល​ដំណើរការ។ "
+"វា​បញ្ជូន​អ្នកប្រើ​ទៅ​តំបន់បណ្ដាញ OSM "
+"នៅ​ក្នុង​កម្មវិធី​អ៊ីនធឺណិត​ខាងក្រៅ<br>ដើម្បី​អនុញ្ញាត​ខ្លួន​វា "
+"និង​ដើម្បី​ព្រម​ទទួល​ថូខឹន​សំណើ​ដែល​ដែល​ដាក់​ស្នើ​ដោយ JOSM ។</html>"
 
 msgid ""
 "<html>Enter an Access Token manually if it was generated and retrieved "
 "outside<br>of JOSM.</html>"
 msgstr ""
+"<html>បញ្ចូល​ថូខឹន​ចូល​ដំណើរការ​ដោយ​ដៃ បើ​វា​ត្រូវ​បាន​បង្កើត "
+"និង​ទៅ​យក​ពី​ខាងក្រៅ<br>នៃ JOSM ។</html>"
 
 msgid ""
 "Please enter your OSM user name and password. The password will "
@@ -10204,71 +10246,87 @@ msgid ""
 "will be submitted to the OSM server <strong>only once</strong>. Subsequent "
 "data upload requests don''t use your password any more."
 msgstr ""
+"សូម​បញ្ចូល​ឈ្មោះ​អ្នកប្រើ និង​ពាក្យសម្ងាត់ OSM របស់​អ្នក។ ពាក្យសម្ងាត់​នឹង "
+"<strong>មិន</strong> ត្រូវ​បាន​រក្សាទុក​ក្នុង​អត្ថបទ​នៃ​ចំណូលចិត្ត JOSM ឡើយ "
+"ហើយ​វា​នឹង​ត្រូវ​បាន​ដាក់​ស្នើ​ទៅ​ម៉ាស៊ីន​មេ OSM "
+"<strong>តែម្ដង​ប៉ុណ្ណោះ</strong>។ "
+"សំណើ​ផ្ទុក​ទិន្នន័យ​ឡើង​លើក​ក្រោយ​គឺ​មិន​ប្រើ​ពាក្យសម្ងាត់​របស់​អ្នក​ទៀត​ឡើយ។"
 
 msgid "Username: "
-msgstr ""
+msgstr "ឈ្មោះ​អ្នកប្រើ៖ "
 
 msgid "Password: "
-msgstr ""
+msgstr "ពាក្យសម្ងាត់៖ "
 
 msgid ""
 "<strong>Warning:</strong> JOSM does login <strong>once</strong> using a "
 "secure connection."
 msgstr ""
+"<strong>ព្រមាន៖</strong> JOSM បាន​ចូល <strong>ដោយ</strong> "
+"ការ​តភ្ជាប់​សុវត្ថិភាព។"
 
 msgid "Granted rights"
-msgstr ""
+msgstr "បាន​ផ្ដល់​សិទ្ធិ"
 
 msgid "Advanced OAuth properties"
-msgstr ""
+msgstr "លក្ខណសម្បត្តិ OAuth កម្រិត​ខ្ពស់"
 
 msgid "Accept Access Token"
-msgstr ""
+msgstr "ព្រម​ទទួល​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid ""
 "<html>You have successfully retrieved an OAuth Access Token from the OSM "
 "website. Click on <strong>{0}</strong> to accept the token. JOSM will use it "
 "in subsequent requests to gain access to the OSM API.</html>"
 msgstr ""
+"<html>អ្នក​បា​នទៅ​យក​ថូខឹន​ចូល​ដំណើរការ OAuth ដោយ​ជោគជ័យ​ពី​តំបន់បណ្ដាញ OSM "
+"។ ចុច <strong>{0}</strong> ដើម្បី​ព្រម​ទទួល​ថូខឹន។ JOSM "
+"នឹង​ប្រើ​វា​នៅ​ក្នុង​សំណើ​លើក​ក្រោយ​ដើម្បី​សិទ្ធិ​ចូល​ប្រើ OSM API ។</html>"
 
 msgid "Authorize now"
-msgstr ""
+msgstr "អនុញ្ញាត​ឥឡូវ"
 
 msgid "Click to redirect you to the authorization form on the JOSM web site"
-msgstr ""
+msgstr "ចុច​ដើម្បី​ប្ដូរ​ទិស​អ្នក​ទៅ​ការ​អនុញ្ញាត​ពី​តំបន់បណ្ដាញ JOSM"
 
 msgid "Back"
 msgstr "ថយក្រោយ"
 
 msgid "Run the automatic authorization steps again"
-msgstr ""
+msgstr "ដំណើរការ​ជំហាន​អនុញ្ញាត​ស្វ័យប្រវត្តិ​ម្ដងទៀត"
 
 msgid "Test Access Token"
-msgstr ""
+msgstr "សាកល្បង​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Please enter your OSM user name"
-msgstr ""
+msgstr "សូម​បញ្ចូល​ឈ្មោះ​អ្នកប្រើ OSM"
 
 msgid "The user name cannot be empty. Please enter your OSM user name"
 msgstr ""
+"ឈ្មោះ​អ្នកប្រើ​មិន​អាច​ទទេ​បាន​ឡើយ។ សូម​បញ្ចូល​ឈ្មោះ​អ្នកប្រើ OSM របស់​អ្នក"
 
 msgid "Please enter your OSM password"
-msgstr ""
+msgstr "សូម​បញ្ចូល​ពាក្យសម្ងាត់ OSM"
 
 msgid "The password cannot be empty. Please enter your OSM password"
 msgstr ""
+"ពាក្យសម្ងាត់​មិន​អាច​ទទេ​បាន​ឡើយ។ សូម​បញ្ចូល​ពាក្យសម្ងាត់ OSM របស់​អ្នក"
 
 msgid "Authorize JOSM to access the OSM API"
-msgstr ""
+msgstr "អនុញ្ញាត JOSM ឲ្យ​ចូល​ប្រើ OSM API"
 
 msgid ""
 "<html>The automatic process for retrieving an OAuth Access Token<br>from the "
 "OSM server failed.<br><br>Please try again or choose another kind of "
 "authorization process,<br>i.e. semi-automatic or manual authorization.</html>"
 msgstr ""
+"<html>ការ​ដំណើរការ​ស្វ័យប្រវត្តិ​សម្រាប់​ការ​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ "
+"OAuth<br>ពី​ម៉ាស៊ីន​មេ OSM បាន​បរាជ័យ។<br><br>សូម​ព្យាយាម​ម្ដងទៀត "
+"ឬ​ជ្រើស​ប្រភេទ​អនុញ្ញាត​ផ្សេង<br>ឧ. ពាក់កណ្ដាល​ស្វ័យប្រវត្តិ "
+"ឬ​ការ​អនុញ្ញាត​ដោយ​ដៃ។</html>"
 
 msgid "OAuth authorization failed"
-msgstr ""
+msgstr "ការ​អនុញ្ញាត OAuth បាន​បរាជ័យ"
 
 msgid ""
 "<html>The automatic process for retrieving an OAuth Access Token<br>from the "
@@ -10276,176 +10334,207 @@ msgid ""
 "from the OAuth Authorize Endpoint URL ''{0}''.<br><br>Please check your "
 "advanced setting and try again.</html>"
 msgstr ""
+"<html>ការ​ដំណើរការ​ស្វ័យប្រវត្តិ​សម្រាប់​ការ​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ "
+"OAuth<br>ពី​ម៉ាស៊ីន​មេ OSM បាន​បរាជ័យ​ព្រោះ JOSM មិន​អាច​បង្កើត<br>URL "
+"ចូល​ដំណើរការ​ត្រឹមត្រូវ​ពី OAuth Authorize Endpoint URL ''{0}'' "
+"។<br><br>សូម​ពិនិត្យ​ការ​កំណត់​កម្រិត​ខ្ពស់​របស់​អ្នក "
+"រួច​ព្យាយាម​ម្ដងទៀត។</html>"
 
 msgid ""
 "<html>The automatic process for retrieving an OAuth Access Token<br>from the "
 "OSM server failed. JOSM failed to log into {0}<br>for user "
 "{1}.<br><br>Please check username and password and try again.</html>"
 msgstr ""
+"<html><html>ការ​ដំណើរការ​ស្វ័យប្រវត្តិ​សម្រាប់​ការ​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ "
+"OAuth<br>ពី​ម៉ាស៊ីន​មេ OSM បាន​បរាជ័យ។ JOSM បាន​បរាជ័យ​ក្នុង​ការ​ចូល "
+"{0}<br>សម្រាប់​អ្នកប្រើ {1}។<br><br>សូម​ពិនិត្យ​ឈ្មោះ​អ្នកប្រើ "
+"និង​ពាក្យសម្ងាត់ រួច​ព្យាយាម​ម្ដងទៀត។</html>"
 
 msgid ""
 "Please enter an OAuth Access Token which is authorized to access the OSM "
 "server ''{0}''."
 msgstr ""
+"សូម​បញ្ចូល​ថូខឹន​ចូល​ដំណើរការ OAuth "
+"ដែល​បាន​អនុញ្ញាត​ឲ្យ​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ''{0}''។"
 
 msgid "Access Token"
-msgstr ""
+msgstr "ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Advanced OAuth parameters"
-msgstr ""
+msgstr "ប៉ារ៉ាម៉ែត្រ OAuth កម្រិត​ខ្ពស់"
 
 msgid "Enter the OAuth Access Token"
-msgstr ""
+msgstr "បញ្ចូល​ថូខឹន​ចូល​ដំណើរការ OAuth"
 
 msgid "Enter advanced OAuth properties"
-msgstr ""
+msgstr "បញ្ចូល​លក្ខណសម្បត្តិ OAuth កម្រិត​ខ្ពស់"
 
 msgid ""
 "<html><body>Please enter an OAuth Access Token which is authorized to access "
 "the OSM server ''{0}''.</body></html>"
 msgstr ""
+"<html><body>សូម​បញ្ចូល​ថូខឹន​ចូល​ដំណើរការ OAuth "
+"ដែល​បាន​អនុញ្ញាត​ឲ្យ​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ''{0}'' ។</body></html>"
 
 msgid "Please enter an Access Token Key"
-msgstr ""
+msgstr "សូម​បញ្ចូល​ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid ""
 "The Access Token Key must not be empty. Please enter an Access Token Key"
 msgstr ""
+"ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ​មិន​ត្រូវ​ទទេ​ឡើយ។ "
+"សូម​បញ្ចូល​ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Please enter an Access Token Secret"
-msgstr ""
+msgstr "សូម​បញ្ចូល​ពាក្យសម្ងាត់​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid ""
 "The Access Token Secret must not be empty. Please enter an Access Token "
 "Secret"
 msgstr ""
+"ពាក្យសម្ងាត់​ថូខឹន​ចូល​ដំណើរការ​មិន​ត្រូវ​ទទេ​ឡើយ។ "
+"សូម​បញ្ចូល​ពាក្យសម្ងាត់​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Click to test the Access Token"
-msgstr ""
+msgstr "ចុច​ដើម្បី​សាកល្បង​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid ""
 "With OAuth you grant JOSM the right to upload map data and GPS tracks on "
 "your behalf (<a href=\"{0}\">more info...</a>)."
 msgstr ""
+"ជាមួយ OAuth អ្នក​អាច​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM "
+"ដើម្បី​ផ្ទុក​ឡើង​នូវ​ទិន្នន័យ​ផែនទី និង​ដាន​ជីភីអេស​ក្នុង​នាម​អ្នក (<a "
+"href=\"{0}\">ព័ត៌មាន​បន្ថែម...</a>)."
 
 msgid "Please select an authorization procedure: "
-msgstr ""
+msgstr "សូម​ជ្រើស​បែបបទ​អនុញ្ញាត៖ "
 
 msgid "Get an Access Token for ''{0}''"
-msgstr ""
+msgstr "យក​ថូខឹន​ចូល​ដំណើរការ​សម្រាប់ ''{0}''"
 
 msgid "Close the dialog and cancel authorization"
-msgstr ""
+msgstr "បិទ​ប្រអប់ រួច​បោះបង់​ការ​អនុញ្ញាត"
 
 msgid "Close the dialog and accept the Access Token"
-msgstr ""
+msgstr "បិទ​ប្រអប់ និង​ព្រម​ទទួល​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Failed to cancel running OAuth operation"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​បោះបង់​ដំណើរការ OAuth"
 
 msgid "Retrieving OAuth Request Token from ''{0}''"
-msgstr ""
+msgstr "ទៅ​យក​ថូខឹន​សំណើ OAuth ពី ''{0}''"
 
 msgid "Retrieving OAuth Access Token from ''{0}''"
-msgstr ""
+msgstr "ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ OAuth ពី ''{0}''"
 
 msgid "OSM website did not return a session cookie in response to ''{0}'',"
 msgstr ""
+"តំបន់បណ្ដាញ OSM មិន​បាន​ត្រឡប់​ខូគី​សម័យ​នៅ​ក្នុង​ចម្លើយតប​ទៅ ''{0}'',"
 
 msgid ""
 "Failed to authenticate user ''{0}'' with password ''***'' as OAuth user"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទៀងផ្ទាត់​អ្នកប្រើ ''{0}'' ជាមួយ​ពាក្យសម្ងាត់ ''***'' "
+"ជា​អ្នកប្រើ OAuth"
 
 msgid "Failed to authorize OAuth request  ''{0}''"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​អនុញ្ញាត​សំណើ OAuth ''{0}''"
 
 msgid "Authorizing OAuth Request token ''{0}'' at the OSM website ..."
-msgstr ""
+msgstr "កំពុង​អនុញ្ញាត​ថូខឹន​សំណើ OAuth ''{0}'' នៅ​លើ​តំបន់បណ្ដាញ OSM ..."
 
 msgid "Initializing a session at the OSM website..."
-msgstr ""
+msgstr "កំពុង​ចាប់ផ្ដើម​សម័យ​នៅ​លើ​តំបន់បណ្ដាញ OSM ..."
 
 msgid "Authenticating the session for user ''{0}''..."
-msgstr ""
+msgstr "កំពុង​ផ្ទៀងផ្ទាត់​សម័យ​សម្រាប់​អ្នកប្រើ ''{0}''..."
 
 msgid "Authorizing request token ''{0}''..."
-msgstr ""
+msgstr "កំពុង​អនុញ្ញាត​ថូខឹន​សំណើ ''{0}''..."
 
 msgid "Logging out session ''{0}''..."
-msgstr ""
+msgstr "កំពុង​ចេញ​សម័យ ''{0}''..."
 
 msgid "Allow to upload map data"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​ផ្ទុក​ទិន្នន័យ​ឡើង"
 
 msgid "Select to grant JOSM the right to upload map data on your behalf"
-msgstr ""
+msgstr "ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM ផ្ទុក​ទិន្នន័យ​ឡើង​ក្នុង​នាម​អ្នក"
 
 msgid "Allow to upload GPS traces"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​ផ្ទុក​ដាន​ជីភីអេស​ឡើង"
 
 msgid "Select to grant JOSM the right to upload GPS traces on your behalf"
 msgstr ""
+"ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM ផ្ទុក​ដាន​ជីភីអេស​ឡើង​ក្នុង​នាម​អ្នក"
 
 msgid "Allow to download your private GPS traces"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​ទាញ​យក​ដាន​ជីភីអេស​ឯកជន​របស់​អ្នក"
 
 msgid ""
 "Select to grant JOSM the right to download your private GPS traces into JOSM "
 "layers"
 msgstr ""
+"ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM "
+"ទាញ​យក​ដាន​ជីភីអេស​ឯកជន​របស់​អ្នក​ទៅ​ក្នុង​ស្រទាប់ JOSM"
 
 msgid "Allow to read your preferences"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​អាន​ចំណូលចិត្ត​របស់​អ្នក"
 
 msgid "Select to grant JOSM the right to read your server preferences"
 msgstr ""
+"ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM អាន​ចំណូលចិត្ត​ម៉ាស៊ីន​មេ​របស់​អ្នក"
 
 msgid "Allow to write your preferences"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​សរសេរ​ចំណូលចិត្ត​របស់​អ្នក"
 
 msgid "Select to grant JOSM the right to write your server preferences"
 msgstr ""
+"ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM សរសេរ​ចំណូលចិត្ត​ម៉ាស៊ីន​មេ​របស់​អ្នក"
 
 msgid "Allow modifications of notes"
-msgstr ""
+msgstr "អនុញ្ញាត​ការ​កែ​តំណ"
 
 msgid "Select to grant JOSM the right to modify notes on your behalf"
-msgstr ""
+msgstr "ជ្រើស​ដើម្បី​ផ្ដល់​សិទ្ធិ​ឲ្យ JOSM កែ​តំណ​ក្នុង​នាម​អ្នក"
 
 msgid "Retrieving OAuth Access Token..."
-msgstr ""
+msgstr "កំពុង​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ OAuth ..."
 
 msgid "<html>Retrieving an OAuth Access Token from ''{0}'' failed.</html>"
 msgstr ""
+"<html>ការ​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ OAuth ពី ''{0}'' បាន​បរាជ័យ។</html>"
 
 msgid "Request Failed"
-msgstr ""
+msgstr "សំណើ​បាន​បរាជ័យ"
 
 msgid "Retrieving OAuth Request Token..."
-msgstr ""
+msgstr "កំពុង​ទៅ​យក​ថូខឹន​សំណើ OAuth..."
 
 msgid "<html>Retrieving an OAuth Request Token from ''{0}'' failed.</html>"
-msgstr ""
+msgstr "<html>ការ​ទៅ​យក​ថូខឹន​សំណើ OAuth ពី ''{0}'' បាន​បរាជ័យ។</html>"
 
 msgid "Display Advanced OAuth Parameters"
-msgstr ""
+msgstr "បង្ហាញ​ប៉ារ៉ាម៉ែត្រ OAuth កម្រិត​ខ្ពស់"
 
 msgid "Retrieve Request Token"
-msgstr ""
+msgstr "ទៅ​យក​ថូខឹន​សំណើ"
 
 msgid ""
 "<html>Please click on <strong>{0}</strong> to retrieve an OAuth Request "
 "Token from ''{1}''.</html>"
 msgstr ""
+"<html>សូម​ចុច <strong>{0}</strong> ដើម្បី​ទៅ​យក​ថូខឹន​សំណើ OAuth ពី ''{1}'' "
+"។</html>"
 
 msgid "<html>Step 1/3: Retrieve an OAuth Request Token</html>"
-msgstr ""
+msgstr "<html>ជំហាន ១/៣៖ ទៅ​យក​ថូខឹន​សំណើ OAuth</html>"
 
 msgid "<html>Step 2/3: Authorize and retrieve an Access Token</html>"
-msgstr ""
+msgstr "<html>ជំហាន ២/៣៖ អនុញ្ញាត និង​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ</html>"
 
 msgid "Request Access Token"
-msgstr ""
+msgstr "សំណើ​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid ""
 "<html>JOSM successfully retrieved a Request Token. JOSM is now launching an "
@@ -10456,45 +10545,67 @@ msgid ""
 "copy the following authorize URL and paste it into the address field of your "
 "browser.</html>"
 msgstr ""
+"<html>JOSM បាន​ទៅ​យក​ថូខឹន​សំណើ​ដោយ​ជោគជ័យ។ JOSM "
+"ឥឡូវ​កំពុង​ចាប់ផ្ដើម​ទំព័រ​ការ​អនុញ្ញាត​នៅ​ក្នុង​កម្មវិធី​អ៊ីនធឺណិត​ខាងក្រៅ។ "
+"សូម​ចូល​ដោយ​ប្រើ​ឈ្មោះ​អ្នកប្រើ និង​ពាក្យសម្ងាត់ OSM របស់​អ្នក "
+"រួច​ធ្វើតាម​សេចក្ដីណែនាំ​ដើម្បី​អនុញ្ញាត​ថូខឹន​សំណើ។ "
+"បន្ទាប់មក​ត្រឡប់​ទៅ​ប្រអប់​នេះ​វិញ រួច​ចុច "
+"<strong>{0}</strong><br><br>ប្រសិនបើ​កម្មវិធី​អ៊ីនធឺណិត​ខាងក្រៅ​បរាជ័យ "
+"អ្នក​អាច​ចម្លង URL អនុញ្ញាត​ខាងក្រោម "
+"រួច​បិទភ្ជាប់​វា​​នៅ​ក្នុង​វាល​អាសយដ្ឋាន​នៃ​កម្មវិធី​អ៊ីនធឺណិត​របស់​អ្នក។</ht"
+"ml>"
 
 msgid "Go back to step 1/3"
-msgstr ""
+msgstr "ត្រឡប់​ទៅ​ជំហាន ១/៣"
 
 msgid "<html>Step 3/3: Successfully retrieved an Access Token</html>"
-msgstr ""
+msgstr "<html>ជំហាន ៣/៣៖ បាន​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ​ដោយ​ជោគជ័យ</html>"
 
 msgid ""
 "<html>JOSM has successfully retrieved an Access Token. You can now accept "
 "this token. JOSM will use it in the future for authentication and "
 "authorization to the OSM server.<br><br>The access token is: </html>"
 msgstr ""
+"<html>JOSM បាន​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ​ដោយ​ជោគជ័យ។ "
+"ឥឡូវ​អ្នក​អាច​ព្រម​ទទួល​ថូខឹន​នេះ។ JOSM "
+"នឹង​ប្រើ​វា​នៅ​ពេល​អនាគត​សម្រាប់​ការ​ផ្ទៀងផ្ទាត់ "
+"និង​ការ​អនុញ្ញាត​ទៅកាន់​ម៉ាស៊ីន​មេ OSM ។<br><br>ថូខឹន​ចូល​ដំណើរការ​គឺ៖ "
+"</html>"
 
 msgid "Click to retrieve a Request Token"
-msgstr ""
+msgstr "ចុច​ដើម្បី​ទៅ​យក​ថូខឹន​សំណើ"
 
 msgid "Retrieve Access Token"
-msgstr ""
+msgstr "ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Click to retrieve an Access Token"
-msgstr ""
+msgstr "ចុច​ដើម្បី​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ"
 
 msgid "Testing OAuth Access Token"
-msgstr ""
+msgstr "សាកល្បង​ថូខឹន​ចូល​ដំណើរការ OAuth"
 
 msgid "Retrieving user details with Access Token Key ''{0}'' was rejected."
 msgstr ""
+"ការ​ទៅ​យក​ព័ត៌មាន​លម្អិត​អ្នក​ប្រើ​ដែល​មាន​ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ "
+"''{0}'' ត្រូវ​បាន​បដិសេធ។"
 
 msgid "Retrieving user details with Access Token Key ''{0}'' was forbidden."
 msgstr ""
+"ការ​ទៅ​យក​ព័ត៌មាន​លម្អិត​អ្នកប្រើ​ដែល​មាន​ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ "
+"''{0}'' ត្រូវ​បាន​ហាមឃាត់។"
 
 msgid ""
 "<html>Successfully used the Access Token ''{0}'' to<br>access the OSM server "
 "at ''{1}''.<br>You are accessing the OSM server as user ''{2}'' with id "
 "''{3}''.</html>"
 msgstr ""
+"<html>បាន​ប្រើ​ថូខឹន​ចូល​ដំណើរការ ''{0}'' "
+"ដោយ​ជោគជ័យ​ដើម្បី<br>ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM នៅ ''{1}'' "
+"។<br>អ្នក​កំពុង​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ក្នុង​នាម​អ្នកប្រើ ''{2}'' "
+"ជាមួយ​លេខ​សម្គាល់ ''{3}'' ។</html>"
 
 msgid "Success"
-msgstr ""
+msgstr "ជោគជ័យ"
 
 msgid ""
 "<html>Failed to access the OSM server ''{0}''<br>with the Access Token "
@@ -10502,9 +10613,14 @@ msgid ""
 "not<br>be able to access any protected resource on this server using this "
 "token.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM "
+"''{0}''<br>ជាមួយ​ថូខឹន​ចូល​ដំណើរការ ''{1}'' "
+"។<br>ម៉ាស៊ីន​មេ​បាន​បដិសេធ​ថូខឹន​ចូល​ដំណើរការ​ថា​មិន​បាន​អនុញ្ញាត។ "
+"អ្នក​នឹង​មិន<br>ចូល​ដំណើរការ​ធនធាន​ដែល​បាន​ការពារ​នៅ​លើ​ម៉ាស៊ីន​មេ "
+"ដោយ​ប្រើ​ថូខឹន​នេះ​បាន​ឡើយ។</html>"
 
 msgid "Test failed"
-msgstr ""
+msgstr "ការ​សាកល្បង​បាន​បរាជ័យ"
 
 msgid ""
 "<html>The Access Token ''{1}'' is known to the OSM server ''{0}''.<br>The "
@@ -10513,9 +10629,14 @@ msgid ""
 "nevertheless use it<br>to upload data, upload GPS traces, and/or access "
 "other protected resources.</html>"
 msgstr ""
+"<html>ថូខឹន​ចូល​ដំណើរការ ''{1}'' ត្រូវ​បាន​ស្គាល់​ដោយ​ម៉ាស៊ីន​មេ OSM ''{0}'' "
+"។<br>ការ​សាកល្បង​ដើម្បី​ទៅ​យក​ព័ត៌មាន​លម្អិត​អ្នកប្រើ​សម្រាប់​ថូខឹន​នេះ​បាន​ប"
+"រាជ័យ។<br>ផ្អែក​លើ​សិទ្ធិ​ដែល​បាន​ផ្ដល់​ឲ្យ​ថូខឹន​នេះ "
+"អ្នក​នៅតែ​អាច​ប្រើ​វា<br>ដើម្បី​ផ្ទុក​ទិន្នន័យ​ឡើង ផ្ទុក​ដាន​ជីភីអេស​ឡើង "
+"និង/ឬ​ចូល​ដំណើរការ​ធនធាន​ដែល​បាន​ការពារ​ផ្សេងទៀត។</html>"
 
 msgid "Token allows restricted access"
-msgstr ""
+msgstr "Token allows restricted access"
 
 msgid ""
 "<html>Failed to retrieve information about the current user from the OSM "
@@ -10523,404 +10644,444 @@ msgid ""
 "Access Token, but<br>rather a problem with the server configuration. "
 "Carefully check the server<br>URL and your Internet connection.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ទៅ​យក​ព័ត៌មាន​អ្នកប្រើ​បច្ចុប្បន្ន​ពី​ម៉ាស៊ីន​មេ "
+"OSM ''{0}'' "
+"។<br>វា​មិនមែន​ជា​បញ្ហា​របស់ថូខឹន​ចូល​ដំណើរការ​ដែល​បាន​សាកល្បង​ទេ ប៉ុន្តែ<br>"
+"វា​អាច​ជា​បញ្ហា​ជាមួយ​ការ​កំណត់​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​មេ។ សូម​ពិនិត្យ URL "
+"និង​ការ​តភ្ជាប់<br>ម៉ាស៊ីន​មេ​ដោយ​ប្រុងប្រយ័ត្ន។</html>"
 
 msgid ""
 "<html>Failed to sign the request for the OSM server ''{0}'' with the token "
 "''{1}''.<br>The token ist probably invalid.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ចុះហត្ថលេខា​សំណើ​សម្រាប់​ម៉ាស៊ីន​មេ OSM ''{0}'' "
+"ជាមួយ​ថូខឹន ''{1}'' ។<br>ថូខឹន​គឺ​មិន​ត្រឹមត្រូវ។</html>"
 
 msgid ""
 "<html>The test failed because the server responded with an internal "
 "error.<br>JOSM could not decide whether the token is valid. Please try again "
 "later.</html>"
 msgstr ""
+"<html>ការ​សាកល្បង​បាន​បរាជ័យ​ព្រោះ​ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​ជាមួយ​កំហុស​ខាងក្នុ"
+"ង។<br>JOSM មិន​អាច​សម្រេច​ថា​តើ​ថូខឹន​ត្រឹមត្រូវ ឬ​យ៉ាងណា​នោះ​ទេ។ "
+"សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។</html>"
 
 msgid "Retrieving user info..."
-msgstr ""
+msgstr "កំពុង​ទៅ​យក​ព័ត៌មាន​អ្នកប្រើ..."
 
 msgid "Expert mode"
-msgstr ""
+msgstr "របៀប​​អ្នក​​​ជំនាញ"
 
 msgid "Close the preferences dialog and discard preference updates"
-msgstr ""
+msgstr "បិទ​ប្រអប់​ចំណូលចិត្ត រួច​បោះបង់​ការ​ធ្វើ​បច្ចុប្បន្នភាព​ចំណូលចិត្ត"
 
 msgid "Save the preferences and close the dialog"
-msgstr ""
+msgstr "រក្សាទុក​ចំណូលចិត្ត រួច​បិទ​ប្រអប់"
 
 msgid "Download plugins"
-msgstr ""
+msgstr "ទាញ​យក​កម្មវិធី​ជំនួយ"
 
 msgid "You have to restart JOSM for some settings to take effect."
 msgstr ""
+"អ្នក​ត្រូវ​ចាប់ផ្ដើម JOSM "
+"ឡើងវិញ​ដើម្បីឲ្យ​ការ​កំណត់​មួយ​ចំនួន​មាន​ប្រសិទ្ធភាព។"
 
 msgid "Would you like to restart now?"
-msgstr ""
+msgstr "តើ​អ្នក​ចង់​ចាប់ផ្ដើម​ឥឡូវ​ឬ?"
 
 msgid "Icon paths:"
-msgstr ""
+msgstr "ផ្លូវ​រូបតំណាង៖"
 
 msgid "Short Description:"
-msgstr ""
+msgstr "សេចក្ដី​ពណ៌នា​ខ្លី៖"
 
 msgid "Author:"
-msgstr ""
+msgstr "អ្នកនិពន្ធ៖"
 
 msgid "Webpage:"
-msgstr ""
+msgstr "ទំព័រ​បណ្ដាញ៖"
 
 msgid "Description:"
-msgstr ""
+msgstr "សេចក្ដី​ពណ៌នា៖"
 
 msgid "Version:"
-msgstr ""
+msgstr "កំណែ៖"
 
 msgid "Minimum JOSM Version:"
-msgstr ""
+msgstr "កំណែ JOSM អប្បបរមា៖"
 
 msgid "by {0}"
-msgstr ""
+msgstr "ដោយ {0}"
 
 msgid "Name (optional):"
-msgstr ""
+msgstr "ឈ្មោះ (ជា​ជម្រើស)៖"
 
 msgid "URL / File:"
-msgstr ""
+msgstr "URL / ឯកសារ៖"
 
 msgid "active"
-msgstr ""
+msgstr "សកម្ម"
 
 msgid "Map paint style file (*.xml, *.mapcss, *.zip)"
-msgstr ""
+msgstr "ឯកសារ​គំនូរ​ផែនទី (*.xml, *.mapcss, *.zip)"
 
 msgid "Preset definition file (*.xml, *.zip)"
-msgstr ""
+msgstr "ឯកសារ​និយមន័យ​កំណត់​ស្រាប់ (*.xml, *.zip)"
 
 msgid "Tag checker rule (*.validator.mapcss, *.zip)"
-msgstr ""
+msgstr "បន្ទាត់​កម្មវិធី​ពិនិត្យ​ស្លាក (*.validator.mapcss, *.zip)"
 
 msgid "Edit source entry:"
-msgstr ""
+msgstr "កែ​ធាតុ​ប្រភព៖"
 
 msgid "Entry ''{0}'' requires JOSM Version {1}. (Currently running: {2})"
 msgstr ""
+"ធាតុ ''{0}'' ទាមទារ JOSM កំណែ {1} ។ (បច្ចុប្បន្ន​កំពុង​ដំណើរការ៖ {2})"
 
 msgid "Continue anyway"
-msgstr ""
+msgstr "ទោះ​យ៉ាងណា​ក៏​បន្ត"
 
 msgid "Ignore warning and install style anyway"
-msgstr ""
+msgstr "មិន​អើពើ​ការ​ព្រមាន រួច​ដំឡើង​រចនាប័ទ្ម"
 
 msgid "Some entries have unmet dependencies:"
-msgstr ""
+msgstr "ធាតុ​ខ្លះ​មាន​ភាព​អាស្រ័យ​មិន​ត្រឹមត្រូវ"
 
 msgid "Reset"
-msgstr ""
+msgstr "កំណត់​ឡើងវិញ"
 
 msgid "Reset to default"
-msgstr ""
+msgstr "កំណត់​ឡើងវិញ​ទៅ​លំនាំដើម"
 
 msgid "Add a new icon path"
-msgstr ""
+msgstr "បន្ថែម​ផ្លូវ​រូបតំណាង​ថ្មី"
 
 msgid "Remove the selected icon paths"
-msgstr ""
+msgstr "លុប​ផ្លូវ​រូបតំណាង​ដែល​បាន​ជ្រើស"
 
 msgid "Edit the selected icon path"
-msgstr ""
+msgstr "កែ​ផ្លូវ​រូបតំណាង​ដែល​បាន​ជ្រើស"
 
 msgid "Tooltip"
-msgstr ""
+msgstr "ព័ត៌មាន​ជំនួយ"
 
 msgid "Icon"
-msgstr ""
+msgstr "រូបតំណាង"
 
 msgid "Remove from toolbar"
-msgstr ""
+msgstr "លុប​ចេញពី​របារ​ឧបករណ៍"
 
 msgid "Configure toolbar"
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​របារ​ឧបករណ៍"
 
 msgid "Edit shortcut"
-msgstr ""
+msgstr "កែសម្រួល​ផ្លូវកាត់"
 
 msgid "Do not hide toolbar and menu"
-msgstr ""
+msgstr "កុំ​លាក់​របារ​ឧបករណ៍ និង​ម៉ឺនុយ"
 
 msgid "Actions"
-msgstr ""
+msgstr "សកម្មភាព"
 
 msgid "Toolbar customization"
-msgstr ""
+msgstr "ការ​ប្ដូរ​របារ​ឧបករណ៍​តាម​តម្រូវ​ការ"
 
 msgid "Customize the elements on the toolbar."
-msgstr ""
+msgstr "ប្ដូរ​ធាតុ​នៅ​លើ​របារ​ឧបករណ៍​តាម​តម្រូវ​ការ។"
 
 msgid "Separator"
-msgstr ""
+msgstr "សញ្ញា​បំបែក"
 
 msgid "Toolbar"
-msgstr ""
+msgstr "របារ​ឧបករណ៍"
 
 msgid "Available"
-msgstr ""
+msgstr "មាន"
 
 msgid "Action parameters"
-msgstr ""
+msgstr "ប៉ារ៉ាម៉ែត្រ​សកម្មភាព"
 
 msgid "Parameter name"
-msgstr ""
+msgstr "ឈ្មោះ​ប៉ារ៉ាម៉ែត្រ"
 
 msgid "Parameter value"
-msgstr ""
+msgstr "តម្លៃ​ប៉ារ៉ាម៉ែត្រ"
 
 msgid "Toolbar action without name: {0}"
-msgstr ""
+msgstr "របារ​ឧបករណ៍​សកម្មភាព​ដែល​គ្មាន​ឈ្មោះ៖ {0}"
 
 msgid "Strange toolbar value: {0}"
-msgstr ""
+msgstr "តម្លៃ​របារ​ឧបករណ៍​មិន​ស្គាល់៖ {0}"
 
 msgid "Toolbar action {0} overwritten: {1} gets {2}"
-msgstr ""
+msgstr "របារ​ឧបករណ៍​សកម្មភាព {0} បាន​សរសេរ​ជាន់​លើ៖ {1} ទទួល {2}"
 
 msgid "Registered toolbar action without name: {0}"
-msgstr ""
+msgstr "បាន​ចុះឈ្មោះ​របារ​ឧបករណ៍​សកម្មភាព​ដោយ​គ្មាន​ឈ្មោះ៖ {0}"
 
 msgid "Registered toolbar action {0} overwritten: {1} gets {2}"
-msgstr ""
+msgstr "បាន​ចុះឈ្មោះ​របារ​ឧបករណ៍ {0} សរសេរ​ជាន់​លើ៖ {1} ទទួល {2}"
 
 msgid "Toolbar: {0}"
-msgstr ""
+msgstr "របារ​ឧបករណ៍៖ {0}"
 
 msgid "Advanced Preferences"
 msgstr "ចំណូល​ចិត្ត​កម្រិត​ខ្ពស់"
 
 msgid "Setting Preference entries directly. Use with caution!"
-msgstr ""
+msgstr "ការ​កំណត់​ចំណូលចិត្ត​ធាតុ​ដោយ​ផ្ទាល់។ ប្រើ​ដោយ​ប្រុងប្រយ័ត្ន!"
 
 msgid "Search: "
 msgstr "ស្វែងរក៖ "
 
 msgid "Read from file"
-msgstr ""
+msgstr "អាន​ពី​ឯកសារ"
 
 msgid "Export selected items"
-msgstr ""
+msgstr "នាំចេញ​ធាតុ​ដែល​បាន​ជ្រើស"
 
 msgid "JOSM custom settings files (*.xml)"
-msgstr ""
+msgstr "ឯកសារ​ការ​កំណត់ JOSM ផ្ទាល់ខ្លួន (*.xml)"
 
 msgid "Please select some preference keys not marked as default"
 msgstr ""
+"សូម​ជ្រើស​ពាក្យ​គន្លឹះ​ចំណូលចិត្ត​មួយ​ចំនួន​ដែល​មិន​បាន​សម្គាល់​ជា​លំនាំដើម"
 
 msgid "Export preferences keys to JOSM customization file"
-msgstr ""
+msgstr "នាំចេញ​ពាក្យ​គន្លឹះ​ចំណូលចិត្ត​ទៅ​ឯកសារ​ប្ដូរ​តាម​តម្រូវ​ការ JOSM"
 
 msgid "What to do with preference lists when this file is to be imported?"
 msgstr ""
+"តើ​ត្រូវ​ធ្វើ​អ្វី​ជាមួយ​បញ្ជី​ចំណូលចិត្ត ពេល​ឯកសារ​នេះ​ត្រូវ​បាន​នាំចូល?"
 
 msgid "Append preferences from file to existing values"
-msgstr ""
+msgstr "បន្ថែម​ចំណូលចិត្ត​ពី​ឯកសារ​ទៅ​តម្លៃ​ដែល​មាន​ស្រាប់"
 
 msgid "Replace existing values"
-msgstr ""
+msgstr "ជំនួស​តម្លៃ​ដែល​មាន​ស្រាប់"
 
 msgid "Open JOSM customization file"
-msgstr ""
+msgstr "បើក​ឯកសារ​ប្ដូរ​តាម​តម្រូវការ JOSM"
 
 msgid "Import log"
-msgstr ""
+msgstr "នាំចូល​កំណត់ហេតុ"
 
 msgid ""
 "<html>Here is file import summary. <br/>You can reject preferences changes "
 "by pressing \"Cancel\" in preferences dialog <br/>To activate some changes "
 "JOSM restart may be needed.</html>"
 msgstr ""
+"<html>នេះ​ជា​ឯកសារ​នាំចូល​សង្ខេប។ "
+"<br/>អ្នក​អាច​បដិសេធ​ការ​ប្ដូរ​ចំណូលចិត្ត​បាន​ដោយ​ចុច \"បោះបង់\" "
+"នៅ​ក្នុង​ប្រអប់​ចំណូលចិត្ត <br/>ដើម្បី​ធ្វើឲ្យ​ការ​ផ្លាស់ប្ដូរ​សកម្ម "
+"ចាំបាច់​ត្រូវ​ចាប់ផ្ដើម JOSM ឡើងវិញ។</html>"
 
 msgid "shortcut"
-msgstr ""
+msgstr "ផ្លូវកាត់"
 
 msgid "color"
-msgstr ""
+msgstr "ពណ៌"
 
 msgid "toolbar"
-msgstr ""
+msgstr "របារ​ឧបករណ៍"
 
 msgid "imagery"
-msgstr ""
+msgstr "រូបភាព"
 
 msgid "Reset preferences"
-msgstr ""
+msgstr "កំណត់​ចំណូលចិត្ត​ឡើងវិញ"
 
 msgid ""
 "You are about to clear all preferences to their default values<br />All your "
 "settings will be deleted: plugins, imagery, filters, toolbar buttons, "
 "keyboard, etc. <br />Are you sure you want to continue?"
 msgstr ""
+"អ្នក​ហៀបនឹង​សម្អាត​ចំណូលចិត្ត​ទាំងអស់​ទៅ​តម្លៃ​លំនាំដើម។<br "
+"/>ការ​កំណត់​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប៖ កម្មវិធី​ជំនួយ រូបភាព "
+"តម្រង​ប៊ូតុង​របារ​ឧបករណ៍ ក្ដារចុច។ល។ <br />តើ​អ្នក​ពិតជា​ចង់​បន្ត​មែន​ឬ?"
 
 msgid "Load profile"
-msgstr ""
+msgstr "ផ្ទុក​ឯកសារ"
 
 msgid "Save {0} profile"
-msgstr ""
+msgstr "រក្សាទុក​ប្រវត្តិរូប {0}"
 
 msgid "All the preferences of this group are default, nothing to save"
 msgstr ""
+"ចំណូលចិត្ត​ទាំងអស់​របស់​ក្រុម​នេះ​គឺ​លំនាំដើម មិន​មាន​អ្វី​ត្រូវ​រក្សាទុក​ទេ"
 
 msgid "Choose profile file"
-msgstr ""
+msgstr "ជ្រើស​ឯកសារ​ប្រវត្តិរូប"
 
 msgid "Change list setting"
-msgstr ""
+msgstr "ប្ដូរ​ការ​កំណត់​បញ្ជី"
 
 msgid "Key: {0}"
-msgstr ""
+msgstr "ពាក្យ​គន្លឹះ៖ {0}"
 
 msgid "Change list of lists setting"
-msgstr ""
+msgstr "ប្ដូរ​បញ្ជី​នៃ​ការ​កំណត់"
 
 msgid "add entry"
-msgstr ""
+msgstr "បន្ថែម​ធាតុ"
 
 msgid "Remove the selected entry"
-msgstr ""
+msgstr "លុប​ធាតុ​ដែល​បាន​ជ្រើស"
 
 msgid "Change list of maps setting"
-msgstr ""
+msgstr "ប្ដូរ​បញ្ជី​ការ​កំណត់​ផែនទី"
 
 msgid "Entry {0}"
-msgstr ""
+msgstr "ធាតុ {0}"
 
 msgid "Please select the row to edit."
-msgstr ""
+msgstr "សូម​ជ្រើស​ជួរដេក​ដើម្បី​កែសម្រួល។"
 
 msgid "Select Setting Type:"
-msgstr ""
+msgstr "ជ្រើស​ប្រភេទ​ការ​កំណត់៖"
 
 msgid "Simple"
-msgstr ""
+msgstr "​សាមញ្ញ"
 
 msgid "List"
-msgstr ""
+msgstr "បញ្ជី"
 
 msgid "List of lists"
-msgstr ""
+msgstr "បញ្ជី​នៃ​បញ្ជី"
 
 msgid "List of maps"
-msgstr ""
+msgstr "បញ្ជី​ផែនទី"
 
 msgid "Add setting"
-msgstr ""
+msgstr "បន្ថែម​ការ​កំណត់"
 
 msgid "Please select the row to delete."
-msgstr ""
+msgstr "សូម​ជ្រើស​ជួរដេក​ដើម្បី​លុប។"
 
 msgid "Advanced Background: Changed"
-msgstr ""
+msgstr "ផ្ទៃ​ខាងក្រោយ​កម្រិត​ខ្ពស់៖ បាន​ប្ដូរ"
 
 msgid "Advanced Background: NonDefault"
-msgstr ""
+msgstr "ផ្ទៃ​ខាងក្រោយ​កម្រិត​ខ្ពស់៖ មិនមែន​លំនាំដើម"
 
 msgid "Current value is default."
-msgstr ""
+msgstr "តម្លៃ​បច្ចុប្បន្ន​គឺ​លំនាំដើម។"
 
 msgid "Default value is ''{0}''."
-msgstr ""
+msgstr "តម្លៃ​លំនាំដើម​គឺ ''{0}'' ។"
 
 msgid "Default value currently unknown (setting has not been used yet)."
 msgstr ""
+"បច្ចុប្បន្ន​មិន​ស្គាល់​តម្លៃ​លំនាំដើម (មិនទាន់​ប្រើ​ការ​កំណត់​នៅឡើយ)។"
 
 msgid "Change string setting"
-msgstr ""
+msgstr "ប្ដូរ​ការ​កំណត់​ឃ្លា"
 
 msgid "Value: "
-msgstr ""
+msgstr "តម្លៃ៖ "
 
 msgid "Audio Settings"
-msgstr ""
+msgstr "ការ​កំណត់​អូឌីយ់ូ"
 
 msgid "Settings for the audio player and audio markers."
 msgstr ""
+"ការ​កំណត់​សម្រាប់​កម្មវិធី​ចាក់​អូឌីយ៉ូ និង​កម្មវិធី​សម្គាល់​អូឌីយ៉ូ។"
 
 msgid "Display the Audio menu."
-msgstr ""
+msgstr "បង្ហាញ​ម៉ឺនុយ​អូឌីយ៉ូ។"
 
 msgid "Label audio (and image and web) markers."
-msgstr ""
+msgstr "ដាក់​ស្លាក​កម្មវិធី​សម្គាល់​អូឌីយ៉ូ (រូបភាព និង​បណ្ដាញ)។"
 
 msgid "Display live audio trace."
-msgstr ""
+msgstr "បង្ហាញ​ដាន​អូឌីយ៉ូ​បន្ត​ផ្ទាល់។"
 
 msgid "Explicit waypoints with valid timestamps."
-msgstr ""
+msgstr "Waypoints ច្បាស់លាស់​ជាមួយ​ត្រា​ពេលវេលា​ត្រឹមត្រូវ។"
 
 msgid "Explicit waypoints with time estimated from track position."
-msgstr ""
+msgstr "Waypoints ជាមួយ​ពេលវេលា​ប៉ាន់ស្មាន​ពី​ទីតាំង​ដាន។"
 
 msgid "Named trackpoints."
-msgstr ""
+msgstr "Trackpoints ដែល​បាន​ដាក់ឈ្មោះ។"
 
 msgid "Modified times (time stamps) of audio files."
-msgstr ""
+msgstr "បាន​ប្ដូរ​ពេលវេលា​ឯកសារ​អូឌីយ៉ូ (ត្រា​ពេលវេលា)។"
 
 msgid "Start of track (will always do this if no other markers available)."
 msgstr ""
+"ការ​ចាប់ផ្ដើម​ដាន (តែងតែ​ធ្វើ​វា​ជានិច្ច "
+"បើ​មិន​មាន​កម្មវិធី​សម្គាល់​ផ្សេងទៀត)។"
 
 msgid "Show or hide the audio menu entry on the main menu bar."
-msgstr ""
+msgstr "បង្ហាញ ឬ​លាក់​ធាតុ​ម៉ឺនុយ​អូឌីយ៉ូ​នៅ​លើ​របារ​ម៉ឺនុយ​មេ។"
 
 msgid ""
 "Display a moving icon representing the point on the synchronized track where "
 "the audio currently playing was recorded."
 msgstr ""
+"ការ​បង្ហាញ​រូបតំណាង​ផ្លាស់ទី​គឺ​បង្ហាញ​ចំណុច​នៅ​លើ​ដាន​សមកាលកម្ម "
+"ដែល​បាន​ថត​អូឌីយ៉ូ​កំពុង​ចាក់​បច្ចុប្បន្ន។"
 
 msgid ""
 "Put text labels against audio (and image and web) markers as well as their "
 "button icons."
 msgstr ""
+"ដាក់​ស្លាក​អត្ថបទ​ទល់នឹង​កម្មវិធី​សម្គាល់​អូឌីយ៉ូ (រូបភាព និង​បណ្ដាញ) "
+"ក៏​ដូចជា​រូបតំណាង​ប៊ូតុង​របស់​វា។"
 
 msgid "When importing audio, make markers from..."
-msgstr ""
+msgstr "ពេល​នាំចូល​អូឌីយ៉ូ បង្កើត​កម្មវិធី​សម្គាល់​ពី..."
 
 msgid "When importing audio, apply it to any waypoints in the GPX layer."
 msgstr ""
+"ពេល​នាំចូល​អូឌីយ៉ូ អនុវត្ត​វា​ទៅ waypoints ណាមួយ​នៅ​ក្នុង​ស្រទាប់ GPX ។"
 
 msgid ""
 "Automatically create audio markers from trackpoints (rather than explicit "
 "waypoints) with names or descriptions."
 msgstr ""
+"បង្កើត​កម្មវិធី​សម្គាល់​អីឌីយ៉ូ​ដោយ​ស្វ័យប្រវត្តិ​ចេញពី trackpoints "
+"ដែល​មាន​ឈ្មោះ ឬ​សេចក្ដី​ពណ៌នា (ជាជាង waypoints ច្បាស់លាស់) ។"
 
 msgid ""
 "Create audio markers at the position on the track corresponding to the "
 "modified time of each audio WAV file imported."
 msgstr ""
+"បង្កើត​កម្មវិធី​សម្គាល់​អូឌីយ៉ូ​នៅ​ទីតាំង​លើ​ដាន​ដែល​ត្រូវគ្នា​ទៅ​នឹង​ពេលវេលា"
+"​ដែល​បាន​ប្ដូរ​នៃ​ឯកសារ​អូឌីយ៉ូ WAV បាន​នាំចូល។"
 
 msgid ""
 "The number of seconds to jump forward or back when the relevant button is "
 "pressed"
 msgstr ""
+"ចំនួន​វិនាទី​ដែល​ត្រូវ​លោត​ទៅមុខ ឬ​ថយក្រោយ ពេល​បាន​ចុច​ប៊ូតុង​ពាក់ព័ន្ធ"
 
 msgid "Forward/back time (seconds)"
-msgstr ""
+msgstr "រយៈពេល​ទៅមុខ/ថយក្រោយ (វិនាទី)"
 
 msgid "The amount by which the speed is multiplied for fast forwarding"
-msgstr ""
+msgstr "ចំនួន​ល្បឿន​ដែល​ត្រូវ​បាន​គុណ​សម្រាប់​ការ​ទៅមុខ​លឿន"
 
 msgid "Fast forward multiplier"
-msgstr ""
+msgstr "កម្មវិធី​គុណ​ទៅ​មុខ​លឿន"
 
 msgid ""
 "Playback starts this number of seconds before (or after, if negative) the "
 "audio track position requested"
 msgstr ""
+"ចាក់​សារ​ថ្មី​ចាប់ផ្ដើម​ចំនួន​វិនាទី​នេះ​មុន (ឬ​បន្ទាប់ បើ​អវិជ្ជមាន) "
+"ទីតាំង​បទ​អូឌីយ៉ូ​ដែល​បាន​ស្នើ"
 
 msgid "Lead-in time (seconds)"
-msgstr ""
+msgstr "រយៈពេល​ចាប់ផ្ដើម (វិនាទី)"
 
 msgid "The ratio of voice recorder elapsed time to true elapsed time"
 msgstr ""
+"សមាមាត្រ​ពេលវេលា​កន្លង​ទៅ​នៃ​កម្មវិធី​ថត​សំឡេង​ទៅ​ពេលវេលា​កន្លង​ទៅ​ពិត"
 
 msgid "Voice recorder calibration"
-msgstr ""
+msgstr "ការ​ក្រិត​តាម​ខ្នាត​កម្មវិធី​ថត​សំឡេង"
 
 msgid "Color"
 msgstr "ពណ៌"
@@ -10929,180 +11090,190 @@ msgid "Choose"
 msgstr "ជ្រើស"
 
 msgid "Choose a color for {0}"
-msgstr ""
+msgstr "ជ្រើស​ពណ៌​សម្រាប់ {0}"
 
 msgid "Set to default"
-msgstr ""
+msgstr "កំណត់​ទៅ​លំនាំដើម"
 
 msgid "Set all to default"
-msgstr ""
+msgstr "កំណត់​ទាំងអស់​ទៅ​លំនាំដើម"
 
 msgid "Colors used by different objects in JOSM."
-msgstr ""
+msgstr "ពណ៌​ដែល​បាន​ប្រើ​ដោយ​វត្ថុ​ផ្សេងគ្នា​នៅ​ក្នុង JOSM ។"
 
 msgid "Colors"
 msgstr "ពណ៌"
 
 msgid "Display Settings"
-msgstr ""
+msgstr "កំណត់​ការ​បង្ហាញ"
 
 msgid ""
 "Various settings that influence the visual representation of the whole "
 "program."
-msgstr ""
+msgstr "ការ​កំណត់​ផ្សេងៗ​ដែល​ប៉ះពាល់​ដល់​ការ​បង្ហាញ​នៃ​កម្មវិធី​ទាំងមូល។"
 
 msgid "Draw Direction Arrows"
-msgstr ""
+msgstr "គូរ​សញ្ញា​ព្រួញ​ទិសដៅ"
 
 msgid "Only on the head of a way."
-msgstr ""
+msgstr "តែ​នៅ​លើ​ក្បាល​ផ្លូវ​ប៉ុណ្ណោះ។"
 
 msgid "Draw oneway arrows."
-msgstr ""
+msgstr "គូរ​ព្រួញ​ផ្លូវ​មួយ​ទិស។"
 
 msgid "Draw segment order numbers"
-msgstr ""
+msgstr "គូរ​លេខ​លំដាប់​កំណាត់"
 
 msgid "Draw boundaries of downloaded data"
-msgstr ""
+msgstr "គូរ​ព្រំដែន​ទិន្នន័យ​ដែល​បាន​ទាញ​យក"
 
 msgid "Draw virtual nodes in select mode"
-msgstr ""
+msgstr "គូរ​តំណ​និម្មិត​ក្នុង​របៀប​ជម្រើស"
 
 msgid "Draw inactive layers in other color"
-msgstr ""
+msgstr "គូរ​ស្រទាប់​មិន​សកម្ម​ក្នុង​ពណ៌​ផ្សេង"
 
 msgid "Display discardable keys"
-msgstr ""
+msgstr "បង្ហាញ​ពាក្យ​គន្លឹះ​ដែល​អាច​បោះបង់​បាន"
 
 msgid "Highlight target ways and nodes"
-msgstr ""
+msgstr "រំលេច​ផ្លូវ និង​តំណ​គោលដៅ"
 
 msgid "Draw rubber-band helper line"
-msgstr ""
+msgstr "គូរ​បន្ទាត់​ជំនួយ​កៅស៊ូ​កង"
 
 msgid "Smooth map graphics (antialiasing)"
-msgstr ""
+msgstr "ក្រាហ្វិក​ផែនទី​រលូន (ប្រឆាំង​ភាព​រឆេតរឆូត)"
 
 msgid "Smooth map graphics in wireframe mode (antialiasing)"
-msgstr ""
+msgstr "ក្រាហ្វិក​ផែនទី​រលូន​ក្នុង​របៀប​ស៊ុម​ភ្លើង (ប្រឆាំង​ភាព​រឆេតរឆូត)"
 
 msgid "Draw only outlines of areas"
-msgstr ""
+msgstr "គូរ​តែ​គ្រោង​នៃ​ផ្ទៃ​ប៉ុណ្ណោះ"
 
 msgid "GPS Points"
-msgstr ""
+msgstr "ចំណុច​ជីភីអេស"
 
 msgid "Draw direction hints for way segments."
-msgstr ""
+msgstr "គូរ​ព័ត៌មាន​ជំនួយ​ទិស​សម្រាប់​កំណាត់​ផ្លូវ។"
 
 msgid "Draw arrows in the direction of oneways and other directed features."
 msgstr ""
+"គូរ​សញ្ញា​ព្រួញ​នៅ​ក្នុង​ទិស​នៃ​ផ្លូវ "
+"និង​លក្ខណ​ពិសេស​ដែល​បាន​កំណត់​ទិស​ផ្សេងទៀត។"
 
 msgid "Draw the order numbers of all segments within their way."
-msgstr ""
+msgstr "គូរ​លេខ​លំដាប់​នៃ​កំណាត់​ទាំងអស់​ជាមួយ​ផ្លូវ​របស់​វា។"
 
 msgid "Draw the boundaries of data loaded from the server."
-msgstr ""
+msgstr "គូរ​ព្រំដែន​ទិន្នន័យ​ដែល​បាន​ផ្ទុក​ពី​ម៉ាស៊ីន​មេ។"
 
 msgid "Draw virtual nodes in select mode for easy way modification."
-msgstr ""
+msgstr "គូរ​តំណ​និម្មិត​នៅ​ក្នុង​របៀប​ជ្រើស​សម្រាប់​ការ​កែ​ផ្លូវ​ងាយស្រួល។"
 
 msgid "Draw the inactive data layers in a different color."
-msgstr ""
+msgstr "គូរ​ស្រទាប់​ទិន្នន័យ​មិន​សកម្ម​ក្នុង​ពណ៌​ផ្សេង។"
 
 msgid ""
 "Apply antialiasing to the map view resulting in a smoother appearance."
 msgstr ""
+"អនុវត្ត​ការ​ប្រឆាំង​ភាព​រឆេតរឆូត​ទៅ​ទិដ្ឋភាព​ផែនទី "
+"ដើម្បី​បាន​លទ្ធផល​បង្ហាញ​រលូន​ជាង។"
 
 msgid ""
 "Apply antialiasing to the map view in wireframe mode resulting in a smoother "
 "appearance."
 msgstr ""
+"អនុវត្ត​ការ​ប្រឆាំង​ភាព​រឆេតរឆូត​ទៅ​ទិដ្ឋភាព​ផែនទី​ក្នុង​របៀប​ស៊ុម​ភ្លើង "
+"ដើម្បី​បាន​លទ្ធផល​បង្ហាញ​រលូន​ជាង។"
 
 msgid "Hightlight target nodes and ways while drawing or selecting"
-msgstr ""
+msgstr "រំលេច​តំណ និង​ផ្លូវ​គោលដៅ ពេល​គូរ ឬ​ជ្រើស"
 
 msgid ""
 "This option suppresses the filling of areas, overriding anything specified "
 "in the selected style."
 msgstr ""
+"ជម្រើស​នេះ​ទប់ស្កាត់​ការ​រៀបចំ​ឯកសារ​តំបន់ "
+"និង​បដិសេធ​អ្វី​ដែល​បាន​បញ្ជាក់​នៅ​ក្នុង​រចនាប័ទ្ម​ដែល​បាន​ជ្រើស។"
 
 msgid ""
 "Display keys which have been deemed uninteresting to the point that they can "
 "be silently removed."
 msgstr ""
+"បង្ហាញ​ពាក្យ​គន្លឹះ​ដែល​គិត​ថា​មិន​ចាប់អារម្មណ៍​ជាមួយ​ចំណុច​ដែល​ពួកគេ​បាន​លុប"
+"ចេញ។"
 
 msgid "Options that affect drawing performance"
-msgstr ""
+msgstr "ជម្រើស​ដែល​ប៉ះពាល់​ដល់​ដំណើរការ​គូរ"
 
 msgid "Segment drawing options"
-msgstr ""
+msgstr "ជម្រើស​គូរ​កំណាត់"
 
 msgid "Select and draw mode options"
-msgstr ""
+msgstr "ជម្រើស​របៀប​គូរ និង​ជ្រើស"
 
 msgid "Other options"
-msgstr ""
+msgstr "ជម្រើស​ផ្សេងទៀត"
 
 msgid "OSM Data"
-msgstr ""
+msgstr "ទិន្នន័យ OSM"
 
 msgid "Auto"
-msgstr ""
+msgstr "ស្វ័យប្រវត្តិ"
 
 msgctxt "gpx_field"
 msgid "Name"
-msgstr ""
+msgstr "ឈ្មោះ"
 
 msgctxt "gpx_field"
 msgid "Desc(ription)"
-msgstr ""
+msgstr "សេចក្ដី​ពណ៌នា"
 
 msgid "Everything"
-msgstr ""
+msgstr "គ្រប់យ៉ាង"
 
 msgid "Name or offset"
-msgstr ""
+msgstr "ឈ្មោះ ឬ​អុហ្វសិត"
 
 msgid "None"
 msgstr "គ្មាន"
 
 msgid "Custom"
-msgstr ""
+msgstr "ផ្ទាល់ខ្លួន"
 
 msgid "Use global settings"
-msgstr ""
+msgstr "ប្រើ​ការ​កំណត់​សកល"
 
 msgid "All"
 msgstr "ទាំង​អស់"
 
 msgid "Local files"
-msgstr ""
+msgstr "ឯកសារ​មូលដ្ឋាន"
 
 msgid "Force lines if no segments imported"
-msgstr ""
+msgstr "បង្ខំ​បន្ទាត់ បើ​មិន​មាន​កំណាត់​បាន​នាំចូល"
 
 msgid "Draw large GPS points"
-msgstr ""
+msgstr "គូរ​ចំណុច​ជីភីអេស​ធំ"
 
 msgid "Draw a circle from HDOP value"
-msgstr ""
+msgstr "គូរ​រង្វង់​ពី​តម្លៃ HDOP"
 
 msgid "Velocity (red = slow, green = fast)"
 msgstr "ល្បឿន (ក្រហម ​= យឺត, បៃតង​ = លឿន​)"
 
 msgid "Direction (red = west, yellow = north, green = east, blue = south)"
-msgstr ""
+msgstr "ទិស (ក្រហម = លិច, លឿង = ជើង, បៃតង = កើត, ខៀវ = ត្បូង)"
 
 msgid "Dilution of Position (red = high, green = low, if available)"
-msgstr ""
+msgstr "ការ​លាយ​បន្សាប​នៃ​ទីតាំង (ក្រហម = ខ្ពស់, បៃតង = ទាប ប្រសិនបើ​មាន)"
 
 msgid "Track date"
-msgstr ""
+msgstr "កាលបរិច្ឆេទ​ដាន"
 
 msgid "Single Color (can be customized for named layers)"
-msgstr ""
+msgstr "ពណ៌​ទោល (អាច​ប្ដូរ​តាម​តម្រូវ​ការ​សម្រាប់​ស្រទាប់​ដែល​បាន​ដាក់ឈ្មោះ)"
 
 msgid "Car"
 msgstr "រថយន្ត"
@@ -11114,1673 +11285,1872 @@ msgid "Foot"
 msgstr "ថ្មើជើង"
 
 msgid "Create markers when reading GPX"
-msgstr ""
+msgstr "បង្កើត​កម្មវិធី​ចំណាំ​ពេល​អាន GPX"
 
 msgid "Fast drawing (looks uglier)"
-msgstr ""
+msgstr "គូរ​រហ័ស (មិន​ស្អាត)"
 
 msgid "Dynamic color range based on data limits"
-msgstr ""
+msgstr "ជួរ​ពណ៌​ប្រែប្រួល​ផ្អែក​លើ​ព្រំដែន​ទិន្នន័យ"
 
 msgid "Smooth GPX graphics (antialiasing)"
-msgstr ""
+msgstr "ក្រាហ្វិក GPX រលូន (ប្រឆាំង​ភាព​រឆេតរឆូត)"
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
 "layer."
 msgstr ""
+"បង្កើត​ស្រទាប់​កម្មវិធី​ចំណាំ​ដោយ​ស្វ័យប្រវត្តិ​ចេញពី waypoints ណាមួយ "
+"ពេល​បើកស្រទាប់ GPX ។"
 
 msgid "Draw lines between raw GPS points"
-msgstr ""
+msgstr "គូរ​បន្ទាត់​រវាង​ចំណុច​ជីភីអេស​ដើម"
 
 msgid ""
 "Maximum length (in meters) to draw lines for local files. Set to ''-1'' to "
 "draw all lines."
 msgstr ""
+"ប្រវែង​អតិបរមា (គិតជា​ម៉ែត្រ) ដើម្បី​គូរ​បន្ទាត់​សម្រាប់​ឯកសារ​មូលដ្ឋាន។ "
+"កំណត់​ទៅ ''-1'' ដើម្បី​គូរ​បន្ទាត់​ទាំងអស់។"
 
 msgid "Maximum length for local files (meters)"
-msgstr ""
+msgstr "ប្រវែង​អតិបរមា​សម្រាប់​ឯកសារ​មូលដ្ឋាន (គិតជា​ម៉ែត្រ)"
 
 msgid ""
 "Maximum length (in meters) to draw lines. Set to ''-1'' to draw all lines."
 msgstr ""
+"ប្រវែង​អតិបរមា (គិតជា​ម៉ែត្រ) ដើម្បី​គូរ​បន្ទាត់។ កំណត់​ទៅ ''-1'' "
+"ដើម្បី​គូរ​បន្ទាត់​ទាំងអស់។"
 
 msgid "Maximum length (meters)"
-msgstr ""
+msgstr "ប្រវែង​អតិបរមា (គិតជា​ម៉ែត្រ)"
 
 msgid ""
 "Force drawing of lines if the imported data contain no line information."
 msgstr ""
+"បង្ខំ​គំនូរ​បន្ទាត់ បើ​ទិន្នន័យ​ដែល​បាន​នាំចូល​មិន​មាន​ព័ត៌មាន​បន្ទាត់"
 
 msgid "Draw direction arrows for lines, connecting GPS points."
-msgstr ""
+msgstr "គូរ​សញ្ញា​ព្រួញ​ទិសដៅ​សម្រាប់​បន្ទាត់ តភ្ជាប់​ចំណុច​ជីភីអេស។"
 
 msgid ""
 "Draw the direction arrows using table lookups instead of complex math."
 msgstr ""
+"គូរ​សញ្ញា​ព្រួញ​ទិសដៅ​ដោយ​ប្រើ​តារាង​រកមើល​ជំនួស​ឲ្យគណិតវិទ្យា​កុំផ្លិច។"
 
 msgid ""
 "Do not draw arrows if they are not at least this distance away from the last "
 "one."
 msgstr ""
+"កុំ​គូរ​សញ្ញា​ព្រួញ "
+"បើ​ពួកវា​មិន​នៅ​ក្នុង​ចម្ងាយ​តិច​បំផុត​ពី​ចំណុច​មួយ​ចុងក្រោយ។"
 
 msgid "Minimum distance (pixels)"
-msgstr ""
+msgstr "ចម្ងាយ​អប្បបរមា (ភីកសែល)"
 
 msgid "Draw a circle from HDOP value."
-msgstr ""
+msgstr "គូរ​រង្វង់​ពី​តម្លៃ HDOP ។"
 
 msgid "Draw larger dots for the GPS points."
-msgstr ""
+msgstr "គូរ​ចំណុច​ធំ​សម្រាប់​ចំណុច​ជីភីអេស។"
 
 msgid "Width of drawn GPX line (0 for default)"
-msgstr ""
+msgstr "ទទឹង​បន្ទាត់ GPX ដែល​បាន​គូរ (0 សម្រាប់​លំនាំដើម)"
 
 msgid "Drawing width of GPX lines"
-msgstr ""
+msgstr "គូរ​ទទឹង​បន្ទាត់ GPX"
 
 msgid ""
 "Apply antialiasing to the GPX lines resulting in a smoother appearance."
 msgstr ""
+"អនុវត្ត​ការ​ប្រឆាំង​ភាព​រឆេតរឆូត​ទៅ​បន្ទាត់ GPX "
+"ដើម្បី​បាន​លទ្ធផល​បង្ហាញ​រលូន​ជាង។"
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
 "Layer Manager."
 msgstr ""
+"ចំណុច និង​កំណាត់​ដាន​ទាំងអស់​នឹង​មាន​ពណ៌​ដូចគ្នា។ "
+"អាច​ប្ដូរ​តាម​តម្រូវ​ការ​បាន​នៅ​ក្នុង​កម្មវិធី​គ្រប់គ្រង​ស្រទាប់។"
 
 msgid "Colors points and track segments by velocity."
-msgstr ""
+msgstr "កំណត់​ពណ៌​កំណាត់​ដាន និង​ចំណុច​តាម​ល្បឿន។"
 
 msgid "Colors points and track segments by direction."
-msgstr ""
+msgstr "កំណត់​ពណ៌​កំណាត់​ដាន និង​ចំណុច​តាម​ទិស។"
 
 msgid ""
 "Colors points and track segments by dilution of position (HDOP). Your "
 "capture device needs to log that information."
 msgstr ""
+"កំណត់​ពណ៌​កំណាត់​ដាន និង​ចំណុច​តាម​ការ​លាយ​បន្សាប​នៃ​ទីតាំង (HDOP) ។ "
+"ឧបករណ៍​ចាប់​យក​របស់​អ្នក​ត្រូវការ​ចូល​ដោយ​ប្រើ​ព័ត៌មាន​នោះ។"
 
 msgid "Colors points and track segments by its timestamp."
-msgstr ""
+msgstr "កំណត់​ពណ៌​កំណាត់​ដាន និង​ចំណុច​តាម​ត្រា​ពេលវេលា​របស់​វា។"
 
 msgid "Allows to tune the track coloring for different average speeds."
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​កែតម្រូវ​ពណ៌​ដាន​សម្រាប់​ល្បឿន​មធ្យម​ខុសគ្នា។"
 
 msgid "Track and Point Coloring"
-msgstr ""
+msgstr "ការ​ដាក់​ពណ៌​ចំណុច និង​ដាន"
 
 msgid "Colors points and track segments by data limits."
-msgstr ""
+msgstr "ដាក់​ពណ៌​កំណាត់​ដាន និង​ចំណុច​តាម​ព្រំដែន​ទិន្នន័យ។"
 
 msgid "Waypoint labelling"
-msgstr ""
+msgstr "ការ​ដាក់​ស្លាក Waypoint"
 
 msgid "Audio waypoint labelling"
-msgstr ""
+msgstr "ការ​ដាក់​ស្លាក​អីឌីយ៉ូ waypoint"
 
 msgid "Incorrect waypoint label pattern: {0}"
-msgstr ""
+msgstr "លំនាំ​ស្លាក waypoint មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "Incorrect pattern"
-msgstr ""
+msgstr "លំនាំ​មិន​ត្រឹមត្រូវ"
 
 msgid "Incorrect audio waypoint label pattern: {0}"
-msgstr ""
+msgstr "លំនាំ​ស្លាក waypoint មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "Show splash screen at startup"
-msgstr ""
+msgstr "បង្ហាញ​អេក្រង់​សាច​ពេល​ចាប់ផ្ដើម"
 
 msgid "Show object ID in selection lists"
-msgstr ""
+msgstr "បង្ហាញ​លេខ​សម្គាល់​វត្ថុ​នៅ​ក្នុង​បញ្ជី​ជម្រើស"
 
 msgid "Show localized name in selection lists"
-msgstr ""
+msgstr "បង្ហាញ​ឈ្មោះ​ដែល​បា​បកប្រែ​នៅ​ក្នុង​បញ្ជី​ជម្រើស"
 
 msgid "Modeless working (Potlatch style)"
-msgstr ""
+msgstr "ការងារ​គ្មាន​ម៉ូដែល (រចនាប័ទ្ម Potlatch)"
 
 msgid "Dynamic buttons in side menus"
-msgstr ""
+msgstr "ប៊ូតុង​ប្រែប្រួល​នៅ​ក្នុង​ម៉ឺនុយ​ចំហៀង"
 
 msgid "Display ISO dates"
-msgstr ""
+msgstr "បង្ហាញ​កាលបរិច្ឆេទ ISO"
 
 msgid "Use native file choosers (nicer, but do not support file filters)"
 msgstr ""
+"ប្រើ​កម្មវិធី​ជ្រើស​ឯកសារ​ដើម (ល្អ​ជាង ប៉ុន្តែ​មិន​គាំទ្រ​តម្រង​ឯកសារ)"
 
 msgid "Show localized name in selection lists, if available"
-msgstr ""
+msgstr "បង្ហាញ​ឈ្មោះ​ដែល​បាន​បកប្រែ​នៅ​ក្នុង​បញ្ជី​ជម្រើស ប្រសិនបើ​មាន"
 
 msgid "Do not require to switch modes (potlatch style workflow)"
-msgstr ""
+msgstr "កុំ​ទាមទារ​ឲ្យ​ប្ដូរ​របៀប (លំហូរ​ការងារ​រចនាប័ទ្ម potlatch)"
 
 msgid ""
 "Display buttons in right side menus only when mouse is inside the element"
-msgstr ""
+msgstr "បង្ហាញ​ប៊ូតុង​តែ​នៅ​ផ្នែក​ខាងស្ដាំ​ប៉ុណ្ណោះ ពេល​កណ្ដុរ​នៅ​ក្នុង​ធាតុ"
 
 msgid "ISO 8601"
-msgstr ""
+msgstr "ISO 8601"
 
 msgid ""
 "Format dates according to {0}. Today''s date will be displayed as {1} "
 "instead of {2}"
 msgstr ""
+"ធ្វើ​ទ្រង់ទ្រាយ​កាលបរិច្ឆេទ​អាស្រ័យ​លើ {0} ។ "
+"កាលបរិច្ឆេទ​ថ្ងៃនេះ​នឹង​​ត្រូវ​បង្ហាញ​ជា {1} ជំនួស​ឲ្យ {2}"
 
 msgid ""
 "Use file choosers that behave more like native ones. They look nicer but do "
 "not support some features like file filters"
 msgstr ""
+"ប្រើ​កម្មវិធី​ជ្រើស​ឯកសារ​ដែល​មាន​ដំណើរការ​ដូច​កម្មវិធី​ដើម។ វា​ល្អ​ជាង "
+"ប៉ុន្តែ​មិន​គាំទ្រ​លក្ខណ​មួយ​ចំនួន​ដូចជា​តម្រង​ឯកសារ"
 
 msgid "Look and Feel"
-msgstr ""
+msgstr "រូបរាង និង​មុខងារ"
 
 msgid "Language"
-msgstr ""
+msgstr "ភាសា"
 
 msgid "Default (Auto determined)"
-msgstr ""
+msgstr "លំនាំដើម (កំណត់​ស្វ័យប្រវត្តិ)"
 
 msgid "Add Imagery URL"
-msgstr ""
+msgstr "បន្ថែម URL រូបភាព"
 
 msgid "1. Enter URL"
-msgstr ""
+msgstr "១. បញ្ចូល URL"
 
 msgid ""
 "{0} is replaced by tile zoom level, also supported:<br>offsets to the zoom "
 "level: {1} or {2}<br>reversed zoom level: {3}"
 msgstr ""
+"{0} ត្រូវ​បាន​ជំនួស​ដោយ​កម្រិត​ពង្រីក​ក្រឡា "
+"គាំទ្រ​ផង​ដែរ៖<br>អុហ្វសិត​ទៅ​កម្រិត​ពង្រីក៖ {1} ឬ "
+"{2}<br>កម្រិត​ពង្រីក​បញ្ច្រាស៖ {3}"
 
 msgid "{0} is replaced by X-coordinate of the tile"
-msgstr ""
+msgstr "{0} ត្រូវ​បាន​ជំនួស​ដោយ​កូអរដោណេ X របស់​ក្រឡា"
 
 msgid "{0} is replaced by Y-coordinate of the tile"
-msgstr ""
+msgstr "{0} ត្រូវ​បាន​ជំនួស​ដោយ​កូអរដោណេ Y របស់​ក្រឡា"
 
 msgid "{0} is replaced by {1} (Yahoo style Y coordinate)"
-msgstr ""
+msgstr "{0} ត្រូវ​បាន​ជំនួស​ដោយ {1} (រចនាប័ទ្ម Yahoo កូអរដោណេ Y)"
 
 msgid ""
 "{0} is replaced by {1} (OSGeo Tile Map Service Specification style Y "
 "coordinate)"
 msgstr ""
+"{0} ត្រូវ​បាន​ជំនួស​ដោយ {1} (រចនាប័ទ្ម OSGeo Tile Map Service Specification "
+"កូអរដោណេ Y)"
 
 msgid ""
 "{0} is replaced by a random selection from the given comma separated list, "
 "e.g. {1}"
 msgstr ""
+"{0} "
+"ត្រូវ​បាន​ជំនួស​ដោយ​ជម្រើស​ចៃដន្យ​ពី​បញ្ជី​បំបែក​ដោយ​សញ្ញា​ក្បៀស​ដែល​បាន​ផ្ដល"
+"់ ឧ. {1}"
 
 msgid "2. Enter maximum zoom (optional)"
-msgstr ""
+msgstr "២. បញ្ចូល​កម្រិត​ពង្រីក​អតិបរមា (ជា​ជម្រើស)"
 
 msgid "3. Verify generated TMS URL"
-msgstr ""
+msgstr "៣. បញ្ជាក់ TMS URL ដែល​បាន​បង្កើត"
 
 msgid "4. Enter name for this layer"
-msgstr ""
+msgstr "៤. បញ្ចូល​ឈ្មោះ​ស្រទាប់"
 
 msgid "Store WMS endpoint only, select layers at usage"
-msgstr ""
+msgstr "ទុក​តែ​ចំណុច​ចុង​របស់ WMS ប៉ុណ្ណោះ ជ្រើស​ស្រទាប់​នៅ​ពេល​ប្រើ"
 
 msgid "Show bounds"
-msgstr ""
+msgstr "បង្ហាញ​ព្រំដែន"
 
 msgid "1. Enter service URL"
-msgstr ""
+msgstr "១. បញ្ចូល​សេវា URL"
 
 msgid "Get layers"
-msgstr ""
+msgstr "យក​ស្រទាប់"
 
 msgid "2. Select layers"
-msgstr ""
+msgstr "២. ជ្រើស​ស្រទាប់"
 
 msgid "3. Select image format"
-msgstr ""
+msgstr "៣. ជ្រើស​ទ្រង់ទ្រាយ​រូបភាព"
 
 msgid "4. Verify generated WMS URL"
-msgstr ""
+msgstr "៤. បញ្ជាក់ WMS URL ដែល​បាន​បង្កើត"
 
 msgid "5. Enter name for this layer"
-msgstr ""
+msgstr "៥. បញ្ចូល​ឈ្មោះ​ស្រទាប់"
 
 msgid "Show Bounds"
-msgstr ""
+msgstr "បង្ហាញ​ព្រំដែន"
 
 msgid "No bounding box was found for this layer."
-msgstr ""
+msgstr "រក​មិន​ឃើញ​ប្រអប់​ព្រំដែន​សម្រាប់​ស្រទាប់​នេះ។"
 
 msgid "imagery fade"
-msgstr ""
+msgstr "រូបភាព​បន្ថយ"
 
 msgid "Fade Color: "
-msgstr ""
+msgstr "បន្ថយ​ពណ៌៖ "
 
 msgid "Fade amount: "
-msgstr ""
+msgstr "បន្ថយ​ចំនួន៖ "
 
 msgid "Soft"
-msgstr ""
+msgstr "ទន់"
 
 msgid "Strong"
-msgstr ""
+msgstr "ខ្លាំង"
 
 msgid "Sharpen (requires layer re-add): "
-msgstr ""
+msgstr "ធ្វើឲ្យ​ច្បាស់ (ទាមទារ​បន្ថែម​ស្រទាប់​ឡើងវិញ)៖ "
 
 msgid "Imagery Preferences"
-msgstr ""
+msgstr "ចំណូលចិត្ត​រូបភាព"
 
 msgid "Modify list of imagery layers displayed in the Imagery menu"
-msgstr ""
+msgstr "កែ​បញ្ជី​ស្រទាប់​រូបភាព​ដែល​បាន​បង្ហាញ​នៅ​ក្នុង​ម៉ឺនុយ​រូបភាព"
 
 msgid "Common Settings"
-msgstr ""
+msgstr "ការ​កំណត់​ធម្មតា"
 
 msgid "WMS Settings"
-msgstr ""
+msgstr "ការ​កំណត់ WMS"
 
 msgid "TMS Settings"
-msgstr ""
+msgstr "ការ​កំណត់ TMS"
 
 msgid "Imagery providers"
-msgstr ""
+msgstr "កម្មវិធី​ផ្ដល់​រូបភាព"
 
 msgid "Offset bookmarks"
-msgstr ""
+msgstr "ចំណាំ​អុហ្វសិត"
 
 msgid "Imagery Background: Default"
-msgstr ""
+msgstr "ផ្ទៃ​ខាងក្រោយ​រូបភាព៖ លំនាំដើម"
 
 msgid "Available default entries:"
-msgstr ""
+msgstr "ធាតុ​លំនាំដើម​ដែល​មាន៖"
 
 msgid "Selected entries:"
-msgstr ""
+msgstr "ធាតុ​ដែល​បាន​ជ្រើស៖"
 
 msgid "Add a new {0} entry by entering the URL"
-msgstr ""
+msgstr "បន្ថែម​ធាតុ​ថ្មី {0} ដោយ​ការ​បញ្ចូល URL"
 
 msgid "Remove entry"
-msgstr ""
+msgstr "លុប​ធាតុ"
 
 msgid "copy selected defaults"
-msgstr ""
+msgstr "ចម្លង​លំនាំដើម​ដែល​បាន​ជ្រើស"
 
 msgid "Please select at least one row to copy."
-msgstr ""
+msgstr "សូម​ជ្រើស​ជួរដេក​យ៉ាង​ហោច​មួយ​ដើម្បី​ចម្លង។"
 
 msgid "reload defaults"
-msgstr ""
+msgstr "ផ្ទុក​លំនាំដើម​ឡើងវិញ"
 
 msgid "Menu Name"
-msgstr ""
+msgstr "ឈ្មោះ​ម៉ឺនុយ"
 
 msgid "Imagery URL"
-msgstr ""
+msgstr "URL រូបភាព"
 
 msgid "Menu Name (Default)"
-msgstr ""
+msgstr "ឈ្មោះ​ម៉ឺនុយ (លំនាំដើម)"
 
 msgid "Imagery URL (Default)"
-msgstr ""
+msgstr "URL រូបភាព (លំនាំដើម)"
 
 msgid "EULA license URL not available: {0}"
-msgstr ""
+msgstr "មិន​មាន URL អាជ្ញាប័ណ្ណ EULA ៖ {0}"
 
 msgid "Malformed URL for the EULA licence: {0}"
-msgstr ""
+msgstr "URL មិន​ត្រឹមត្រូវ​សម្រាប់​អាជ្ញាប័ណ្ណ EULA ៖ {0}"
 
 msgid "Projection"
-msgstr ""
+msgstr "ចំណោល"
 
 msgid "Layer"
-msgstr ""
+msgstr "ស្រទាប់"
 
 msgid "Easting"
-msgstr ""
+msgstr "ខាងកើត"
 
 msgid "Northing"
-msgstr ""
+msgstr "ខាងជើង"
 
 msgid "Auto zoom by default: "
-msgstr ""
+msgstr "ពង្រីក​ស្វ័យប្រវត្តិ​ដោយ​លំនាំដើម៖ "
 
 msgid "Autoload tiles by default: "
-msgstr ""
+msgstr "រៀប​ក្រឡា​ស្វ័យប្រវត្តិ​ដោយ​លំនាំដើម៖ "
 
 msgid "Min. zoom level: "
-msgstr ""
+msgstr "កម្រិត​ពង្រីក​អប្បបរមា៖ "
 
 msgid "Max. zoom level: "
-msgstr ""
+msgstr "កម្រិត​ពង្រីក​អតិបរមា៖ "
 
 msgid "Add to slippymap chooser: "
-msgstr ""
+msgstr "បន្ថែម​ទៅ​កម្មវិធី​ជ្រើស​ផែនទី​រហ័ស៖ "
 
 msgid "Tile cache directory: "
-msgstr ""
+msgstr "ថត​ឃ្លាំង​ក្រឡា៖ "
 
 msgid ""
 "That layer does not support any of JOSM''s projections,\n"
 "so you can not use it. This message will not show again."
 msgstr ""
+"ស្រទាប់​មិន​គាំទ្រ​ចំណោល JOSM, ដូច្នេះ​អ្នក​មិន​អាច\n"
+"ប្រើ​វា​បាន​ទេ។ សារ​នេះ​នឹង​មិន​បង្ហាញ​ម្ដងទៀត​ទេ។"
 
 msgid "Downloader:"
-msgstr ""
+msgstr "កម្មវិធី​ទាញ​យក៖"
 
 msgid "Simultaneous connections:"
-msgstr ""
+msgstr "ការ​តភ្ជាប់​ដំណាលគ្នា៖"
 
 msgid "Overlap tiles"
-msgstr ""
+msgstr "ក្រឡា​ជាន់គ្នា"
 
 msgid "% of east:"
-msgstr ""
+msgstr "% នៃ​ខាងកើត៖"
 
 msgid "% of north:"
-msgstr ""
+msgstr "% ខាងជើង៖"
 
 msgid "Auto save enabled"
-msgstr ""
+msgstr "បាប​បើក​ការ​រក្សាទុក​ស្វ័យប្រវត្តិ"
 
 msgid "Auto save interval (seconds)"
-msgstr ""
+msgstr "ចន្លោះ​ពេល​រក្សាទុក​ស្វ័យប្រវត្តិ (វិនាទី)"
 
 msgid "Default value: {0}"
-msgstr ""
+msgstr "តម្លៃ​លំនាំដើម៖ {0}"
 
 msgid "Auto saved files per layer"
-msgstr ""
+msgstr "ឯកសារ​ដែល​បាន​រក្សាទុក​ក្នុង​មួយ​ស្រទាប់"
 
 msgid ""
 "<i>(Autosave stores the changed data layers in periodic intervals. The "
 "backups are saved in JOSM''s preference folder. In case of a crash, JOSM "
 "tries to recover the unsaved changes on next start.)</i>"
 msgstr ""
+"<i>(ការ​រក្សាទុក​ស្វ័យប្រវត្តិ​គឺ​ផ្ទុក​ទិន្នន័យ​ដែល​បាន​ផ្លាស់ប្ដូរ​នៅ​ក្នុង"
+"​ចន្លោះ​ពេល​ណាមួយ។ ការ​បម្រុងទុក​ត្រូវ​បាន​រក្សាទុក​ក្នុង​ថត​ចំណូលចិត្ត JOSM "
+"។ ក្នុង​ករណី​គាំង JOSM "
+"នឹង​ព្យាយាម​សង្គ្រោះ​ការ​ផ្លាស់ប្ដូរ​ដែល​មិន​បាន​រក្សាទុក "
+"នៅ​ពេល​ចាប់ផ្ដើម​លើក​ក្រោយ។)</i>"
 
 msgid "Keep backup files when saving data layers"
-msgstr ""
+msgstr "រក្សាឯកសារ​បម្រុងទុក ពេល​រក្សាទុក​ស្រទាប់​ទិន្នន័យ"
 
 msgid "When saving, keep backup files ending with a ~"
-msgstr ""
+msgstr "ពេល​រក្សាទុក ក៏​រក្សា​ឯកសារ​បម្រុងទុក​ដែល​បញ្ចប់​ដោយ​សញ្ញា ~"
 
 msgid ""
 "<i>(JOSM can keep a backup file when saving data layers. It appends ''~'' to "
 "the file name and saves it in the same folder.)</i>"
 msgstr ""
+"<i>(JOSM អាច​រក្សា​ឯកសារ​បម្រុងទុក ពេល​រក្សាទុក​ស្រទាប់​ទិន្នន័យ។ "
+"វា​បន្ថែម​សញ្ញា ''~'' ឲ្យ​ឈ្មោះ​ឯកសារ "
+"ហើយ​រក្សាទុក​វា​នៅ​ក្នុង​ថត​ដូចគ្នា។)</i>"
 
 msgid "Notification at each save"
-msgstr ""
+msgstr "ការ​ជូនដំណឹង​នៅ​ពេល​រក្សាទុក​នីមួយៗ"
 
 msgid "When saving, display a small notification"
-msgstr ""
+msgstr "ពេល​រក្សាទុក បង្ហាញ​ការ​ជូនដំណឹង​តូច"
 
 msgid "File backup"
-msgstr ""
+msgstr "ការ​បម្រុងទុក​ឯកសារ"
 
 msgid "Configure whether to create backup files"
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​ថា​តើ​ត្រូវ​បង្កើត​ឯកសារ​បម្រុងទុក​ដែរ​ឬទេ"
 
 msgid "Enable built-in icon defaults"
-msgstr ""
+msgstr "បើក​រូបតំណាង​មាន​ស្រាប់​លំនាំដើម"
 
 msgid "Available styles:"
-msgstr ""
+msgstr "រចនាប័ទ្ម​ដែល​មាន៖"
 
 msgid "Active styles:"
-msgstr ""
+msgstr "រចនាប័ទ្ម​សកម្ម៖"
 
 msgid "Add a new style by entering filename or URL"
-msgstr ""
+msgstr "បន្ថែម​រចនាប័ទ្ម​ថ្មី​ដោយ​ការ​បញ្ចូល​ឈ្មោះ​ឯកសារ ឬ URL"
 
 msgid "New style entry:"
-msgstr ""
+msgstr "ធាតុ​រចនាប័ទ្ម​ថ្មី៖"
 
 msgid "Remove the selected styles from the list of active styles"
-msgstr ""
+msgstr "លុប​រចនាប័ទ្ម​ដែល​បាន​ជ្រើស ចេញពី​បញ្ជី​រចនាប័ទ្ម​សកម្ម"
 
 msgid "Edit the filename or URL for the selected active style"
-msgstr ""
+msgstr "កែ​ឈ្មោះ​ឯកសារ ឬ URL សម្រាប់​ស្រទាប់​សកម្ម​ដែល​បាន​ជ្រើស"
 
 msgid "Add the selected available styles to the list of active styles"
 msgstr ""
+"បន្ថែម​រចនាប័ទ្ម​ដែល​បាន​ជ្រើស ហើយ​អាច​ប្រើ​បាន​ទៅ​បញ្ជី​រចនាប័ទ្ម​សកម្ម"
 
 msgid "Reloads the list of available styles from ''{0}''"
-msgstr ""
+msgstr "ផ្ទុក​ឡើងវិញ​នូវ​បញ្ជី​រចនាប័ទ្ម​ដែល​មាន​ចេញពី ''{0}''"
 
 msgid "Loading style sources from ''{0}''"
-msgstr ""
+msgstr "ការ​ផ្ទុក​ប្រភព​រចនាប័ទ្ម​ពី ''{0}''"
 
 msgid ""
 "<html>Failed to load the list of style sources "
 "from<br>''{0}''.<br><br>Details (untranslated):<br>{1}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ផ្ទុក​បញ្ជី​ប្រភព​រចនាប័ទ្ម​ពី<br>''{0}'' "
+"។<br><br>ព័ត៌មាន​លម្អិត (មិន​បាន​បកប្រែ)៖<br>{1}</html>"
 
 msgid "Warning: illegal format of entry in style list ''{0}''. Got ''{1}''"
 msgstr ""
+"ព្រមាន៖ ទ្រង់ទ្រាយ​មិន​ត្រឹមត្រូវ​នៃ​ធាតុ​នៅ​ក្នុង​បញ្ជី​រចនាប័ទ្ម ''{0}'' ។ "
+"បាន​ទទួល ''{1}''"
 
 msgid "JOSM default (XML; old version)"
-msgstr ""
+msgstr "JOSM លំនាំដើម (XML; កំណែ​ចាស់)"
 
 msgid "JOSM default (MapCSS)"
-msgstr ""
+msgstr "JOSM លំនាំដើម (MapCSS)"
 
 msgid ""
 "Internal style to be used as base for runtime switchable overlay styles"
 msgstr ""
+"រចនាប័ទ្ម​ខាងក្នុង​ដែល​ត្រូវ​ប្រើ​ជា​មូលដ្ឋាន​សម្រាប់​ពេលវេលា​ដំណើរការ​ឧបករណ៍"
+"​ត្រួតគ្នា​ដែល​អាច​ប្ដូរ​បាន"
 
 msgid "Potlatch 2"
-msgstr ""
+msgstr "Potlatch 2"
 
 msgid "the main Potlatch 2 style"
-msgstr ""
+msgstr "រចនាប័ទ្ម Potlatch 2 ចម្បង"
 
 msgid "Map Settings"
-msgstr ""
+msgstr "ការ​កំណត់​ផែនទី"
 
 msgid "Settings for the map projection and data interpretation."
-msgstr ""
+msgstr "ការ​កំណត់​សម្រាប់​ចំណោល​ផែនទី និង​បំណកស្រាយ​ទិន្នន័យ។"
 
 msgid "Could not read tagging preset source: {0}"
-msgstr ""
+msgstr "មិន​អាច​អាន​ការ​ដាក់​ស្លាក​ប្រភព​កំណត់​ស្រេច៖ {0}"
 
 msgid ""
 "Could not read tagging preset source: {0}\n"
 "Do you want to keep it?"
 msgstr ""
+"មិន​អាច​អាន​ការ​ដាក់​ស្លាក​ប្រភព​កំណត់​ស្រេច៖ {0}\n"
+"តើ​អ្នក​ចង់​រក្សាទុក​វា​ឬ?"
 
 msgid "Could not read tagging preset source {0}"
-msgstr ""
+msgstr "មិន​អាច​អាន​ការ​ដាក់​ស្លាក​ប្រភព​កំណត់​ស្រេច {0}"
 
 msgid ""
 "<html>Tagging preset source {0} can be loaded but it contains errors. Do you "
 "really want to use it?<br><br><table width=600>Error is: [{1}:{2}] "
 "{3}</table></html>"
 msgstr ""
+"<html>ការ​ដាក់​ស្លាក​ប្រភព​កំណត់​ស្រេច {0} អាច​ផ្ទុក​ឡើង​បាន "
+"ប៉ុន្តែ​វា​មាន​កំហុស។ តើ​អ្នក​ពិតជា​ចង់​ប្រើ​វា​មែន​ឬ?<br><br><table "
+"width=600>កំហុស​គឺ៖ [{1}:{2}] {3}</table></html>"
 
 msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=400>Error is: [{1}:{2}] {3}</table></html>"
 msgstr ""
+"<html>មិន​អាច​ញែក​ការ​ដាក់​ប្រភព​កំណត់​ស្រេច៖ {0} ។ "
+"តើ​អ្នក​ពិតជា​ចង់​ប្រើ​វា​មែន​ឬ?<br><br><table width=400>កំហុស​គឺ៖ [{1}:{2}] "
+"{3}</table></html>"
 
 msgid ""
 "<html>Tagging preset source {0} can be loaded but it contains errors. Do you "
 "really want to use it?<br><br><table width=600>Error is: {1}</table></html>"
 msgstr ""
+"<html>ការ​ដាក់​ស្លាក​ប្រភព​កំណត់​ស្រេច {0} អាច​ផ្ទុក​ឡើង​បាន "
+"ប៉ុន្តែ​វា​មាន​កំហុស។ តើ​អ្នក​ពិតជា​ចង់​ប្រើ​វា​មែន​ឬ?<br><br><table "
+"width=600>កំហុស​គឺ៖ {1}</table></html>"
 
 msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=600>Error is: {1}</table></html>"
 msgstr ""
+"<html>មិន​អាច​ញែក​ការ​ដាក់​ប្រភព​កំណត់​ស្រេច៖ {0} ។ "
+"តើ​អ្នក​ពិតជា​ចង់​ប្រើ​វា​មែន​ឬ?<br><br><table width=600>កំហុស​គឺ៖ "
+"{1}</table></html>"
 
 msgid "Sort presets menu"
-msgstr ""
+msgstr "តម្រៀប​ម៉ឺនុយ​កំណត់​ស្រេច"
 
 msgid "Tagging Presets"
-msgstr ""
+msgstr "ដាក់​ស្លាក​ការ​កំណត់​ស្រេច"
 
 msgid "Available presets:"
-msgstr ""
+msgstr "ការ​កំណត់​ស្រេច​ដែល​មាន៖"
 
 msgid "Active presets:"
-msgstr ""
+msgstr "ការ​កំណត់​ស្រេច​សកម្ម៖"
 
 msgid "Add a new preset by entering filename or URL"
-msgstr ""
+msgstr "បន្ថែម​ការ​កំណត់​ស្រេច​ថ្មី​ដោយ​ការ​បញ្ចូល​ឈ្មោះ​ឯកសារ ឬ URL"
 
 msgid "New preset entry:"
-msgstr ""
+msgstr "ធាតុ​ការ​កំណត់​ស្រេច​ថ្មី៖"
 
 msgid "Remove the selected presets from the list of active presets"
-msgstr ""
+msgstr "លុប​ការ​កំណត់​ស្រេច​ដែល​បាន​ជ្រើស ចេញពី​បញ្ជី​ការ​កំណត់​ស្រេច​សកម្ម"
 
 msgid "Edit the filename or URL for the selected active preset"
-msgstr ""
+msgstr "កែ​ឈ្មោះ​ឯកសារ ឬ URL សម្រាប់​ការ​កំណត់​​ស្រេច​សកម្ម​ដែល​បាន​ជ្រើស"
 
 msgid "Add the selected available presets to the list of active presets"
-msgstr ""
+msgstr "បន្ថែម​ការ​កំណត់​ស្រេច​ដែល​បាន​ជ្រើស​ទៅ​បញ្ជី​ការ​កំណត់​ស្រេច​សកម្ម"
 
 msgid "Reloads the list of available presets from ''{0}''"
-msgstr ""
+msgstr "ផ្ទុក​បញ្ជី​ការ​កំណត់​ស្រេច​ដែល​មាន​ឡើងវិញ​ពី ''{0}''"
 
 msgid "Loading preset sources from ''{0}''"
-msgstr ""
+msgstr "ការ​ផ្ទុក​ប្រភព​កំណត់​ស្រេច​ពី ''{0}''"
 
 msgid ""
 "<html>Failed to load the list of preset sources "
 "from<br>''{0}''.<br><br>Details (untranslated):<br>{1}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​បញ្ជី​ប្រភព​កំណត់​ស្រេច​ពី<br>''{0}'' "
+"។<br><br>ព័ត៌មាន​លម្អិត (មិន​បាន​បកប្រែ)៖<br>{1}</html>"
 
 msgid "Warning: illegal format of entry in preset list ''{0}''. Got ''{1}''"
 msgstr ""
+"ព្រមាន៖ ទ្រង់ទ្រាយ​មិន​ត្រឹមត្រូវ​នៃ​ធាតុ​នៅ​ក្នុង​បញ្ជី​កំណត់​ស្រេច ''{0}'' "
+"។ បាន​ទទួល ''{1}''"
 
 msgid "Internal Preset"
-msgstr ""
+msgstr "ការ​កំណត់​ស្រេច​ខាងក្នុង"
 
 msgid "The default preset for JOSM"
-msgstr ""
+msgstr "ការ​កំណត់​ស្រេច​លំនាំដើម​សម្រាប់ JOSM"
 
 msgid "Plugin bundled with JOSM"
-msgstr ""
+msgstr "កញ្ចប់​កម្មវិធី​ជំនួយ​ជាមួយ JOSM"
 
 msgid ""
 "Please click on <strong>Download list</strong> to download and display a "
 "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] ""
+msgstr[0] "កម្មវិធី​ជំនួយ {0} នៅ​បាន​ទាមទារ​ដោយ​កម្មវិធី​ជំនួយ {1} ទាំងនេះ៖"
 
 msgid "{0}: Version {1} (local: {2})"
-msgstr ""
+msgstr "{0}: កំណែ {1} (មូលដ្ឋាន៖ {2})"
 
 msgid " (requires: {0})"
-msgstr ""
+msgstr " (ទាមទារ៖ {0})"
 
 msgid "Configure available plugins."
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​ជំនួយ​ដែល​មាន។"
 
 msgid ""
 "The following plugin has been downloaded <strong>successfully</strong>:"
 msgid_plural ""
 "The following {0} plugins have been downloaded <strong>successfully</strong>:"
 msgstr[0] ""
-msgstr[1] ""
+"បាន​ទាញ​យក​កម្មវិធី​ជំនួយ {0} ដូច​ខាងក្រោម <strong>ដោយ​ជោគជ័យ</strong>៖"
 
 msgid "Downloading the following plugin has <strong>failed</strong>:"
 msgid_plural ""
 "Downloading the following {0} plugins has <strong>failed</strong>:"
 msgstr[0] ""
-msgstr[1] ""
+"ការ​ទាញ​យក​កម្មវិធី​ជំនួយ {0} ដូច​ខាងក្រោម <strong>បាន​បរាជ័យ</strong>៖"
 
 msgid "Please restart JOSM to activate the downloaded plugins."
 msgstr ""
+"សូម​ចាប់ផ្ដើម JOSM ឡើងវិញ​ដើម្បី​ធ្វើឲ្យ​កម្មវិធី​ជំនួយ​ដែល​បាន​ទាញ​យក​សកម្ម។"
 
 msgid "Update plugins"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ"
 
 msgid "Search:"
-msgstr ""
+msgstr "ស្វែងរក៖"
 
 msgid "Enter a search expression"
-msgstr ""
+msgstr "បញ្ចូល​កន្សោម​ស្វែងរក"
 
 msgid "Plugin update policy"
-msgstr ""
+msgstr "គោលនយោបាយ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ"
 
 msgid "Accept the new plugin sites and close the dialog"
-msgstr ""
+msgstr "ព្រម​ទទួល​តំបន់បណ្ដាញ​កម្មវិធី​ជំនួយ​ថ្មី រួច​បិទ​ប្រអប់"
 
 msgid "Configure Plugin Sites"
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​តំបន់បណ្ដាញ​កម្មវិធី​ជំនួយ"
 
 msgid "Download list"
-msgstr ""
+msgstr "ទាញ​យក​បញ្ជី"
 
 msgid "Download the list of available plugins"
-msgstr ""
+msgstr "ទាញ​យក​បញ្ជី​កម្មវិធី​ជំនួយ​ដែល​មាន"
 
 msgid "Update the selected plugins"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​ដែល​បាន​ជ្រើស"
 
 msgid ""
 "All installed plugins are up to date. JOSM does not have to download newer "
 "versions."
 msgstr ""
+"កម្មវិធី​ជំនួយ​ដែល​បាន​ដំឡើង​ទាំងអស់​គឺ​ទាន់សម័យ។ JOSM "
+"មិន​ចាំបាច់​ទាញ​យក​កំណែ​ថ្មី​ជាង​ទេ។"
 
 msgid "Plugins up to date"
-msgstr ""
+msgstr "កម្មវិធី​ជំនួយ​ទាន់​សម័យ"
 
 msgid "Configure sites..."
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​តំបន់បណ្ដាញ..."
 
 msgid "Configure the list of sites where plugins are downloaded from"
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​តំបន់បណ្ដាញ​ដែល​កម្មវិធី​ជំនួយ​ត្រូវ​ទាញ​យក​ពី​វា"
 
 msgid "Add JOSM Plugin description URL."
-msgstr ""
+msgstr "បន្ថែម URL សេចក្ដី​ពណ៌នា​កម្មវិធី​ជំនួយ JOSM ។"
 
 msgid "Enter URL"
-msgstr ""
+msgstr "បញ្ចូល URL"
 
 msgid "Please select an entry."
-msgstr ""
+msgstr "សូម​ជ្រើស​ធាតុ។"
 
 msgid "Edit JOSM Plugin description URL."
-msgstr ""
+msgstr "កែ URL សេចក្ដី​ពណ៌នា​កម្មវិធី​ជំនួយ JOSM ។"
 
 msgid "JOSM Plugin description URL"
-msgstr ""
+msgstr "URL សេចក្ដី​ពណ៌នា​កម្មវិធី​ជំនួយ JOSM"
 
 msgid "Ask before updating"
-msgstr ""
+msgstr "សួរ​មុន​ពេល​ធ្វើ​បច្ចុប្បន្នភាព"
 
 msgid "Always update without asking"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​ជានិច្ច​ដោយ​មិន​សួរ"
 
 msgid "Never update"
-msgstr ""
+msgstr "កុំ​ធ្វើ​បច្ចុប្បន្នភាព"
 
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins at "
 "startup after an update of JOSM itself."
 msgstr ""
+"សូម​សម្រេច​ថា​តើ JOSM "
+"គួរ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​សកម្ម​ដោយ​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់ផ្ដ"
+"ើម ឬ​បន្ទាប់ពី​ការ​ធ្វើ​បច្ចុប្បន្នភាព JOSM ខ្លួន​វា។"
 
 msgid "Update interval (in days):"
-msgstr ""
+msgstr "ចន្លោះ​ពេល​ធ្វើ​បច្ចុប្បន្នភាព (គិតជា​ថ្ងៃ)៖"
 
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
 msgstr ""
+"សូម​សម្រេច​ថា​តើ JOSM "
+"គួរ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​សកម្ម​ដោយ​ស្វ័យប្រវត្តិ​បន្ទាប់ពី​រយៈព"
+"េល​ជាក់លាក់​ណាមួយ។"
 
 msgid "By Code (EPSG)"
-msgstr ""
+msgstr "តាមរយៈ​កូដ (EPSG)"
 
 msgid "Invalid projection configuration: {0}"
-msgstr ""
+msgstr "ការ​កំណត់​រចនាសម្ព័ន្ធ​ចំណោល​មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "Projection configuration is valid."
-msgstr ""
+msgstr "ការ​កំណត់​រចនាសម្ព័ន្ធ​ចំណោល​ត្រឹមត្រូវ។"
 
 msgid "Validate"
-msgstr ""
+msgstr "ធ្វើឲ្យ​មាន​សុពលភាព"
 
 msgid "Parameter information..."
-msgstr ""
+msgstr "ព័ត៌មាន​ប៉ារ៉ាម៉ែត្រ..."
 
 msgid "Parameter information"
-msgstr ""
+msgstr "ព័ត៌មាន​ប៉ារ៉ាម៉ែត្រ"
 
 msgid "Projection name"
-msgstr ""
+msgstr "ឈ្មោះ​ចំណោល"
 
 msgid "Supported values:"
-msgstr ""
+msgstr "តម្លៃ​គាំទ្រ៖"
 
 msgid "Projection parameters"
-msgstr ""
+msgstr "ប៉ារ៉ាម៉ែត្រ​ចំណោល"
 
 msgid "False easting and false northing"
-msgstr ""
+msgstr "ដំណើរ​ទៅ​ខាងកើត និង​ខាងជើង​បាន​បរាជ័យ"
 
 msgid "Central meridian"
-msgstr ""
+msgstr "ខ្សែ​វណ្ឌ​កណ្ដាល"
 
 msgid "Scaling factor"
-msgstr ""
+msgstr "កត្តា​ធ្វើ​មាត្រដ្ឋាន"
 
 msgid "Ellipsoid name"
-msgstr ""
+msgstr "ឈ្មោះ Ellipsoid"
 
 msgid "Ellipsoid parameters"
-msgstr ""
+msgstr "ប៉ារ៉ាម៉ែត្រ Ellipsoid"
 
 msgid "Datum name"
-msgstr ""
+msgstr "ឈ្មោះ Datum"
 
 msgid "3 or 7 term datum transform parameters"
-msgstr ""
+msgstr "ប៉ារ៉ាម៉ែត្រ​ប្លែង ៣ ឬ ៧ ពាក្យ datum"
 
 msgid "NTv2 grid file"
-msgstr ""
+msgstr "ឯកសារ​ក្រឡាចត្រង្គ NTv2"
 
 msgid "Built-in:"
-msgstr ""
+msgstr "ជាប់​មក​ស្រាប់"
 
 msgid "Projection bounds (in degrees)"
-msgstr ""
+msgstr "ព្រំដែន​ចំណោល (គិតជា​ដឺក្រេ)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr ""
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "កំណត់ SRS=... ប៉ារ៉ាម៉ែត្រ​នៅ​ក្នុង​សំណើ WMS"
 
 msgid "Gauß-Krüger"
-msgstr ""
+msgstr "Gauß-Krüger"
 
 msgid "GK Zone"
-msgstr ""
+msgstr "តំបន់ GK"
 
 msgid "Gauß-Krüger Zone {0}"
-msgstr ""
+msgstr "តំបន់ Gauß-Krüger {0}"
 
 msgid "{0} ({1} to {2} degrees)"
-msgstr ""
+msgstr "{0} ({1} ទៅ {2} ដឺក្រេ)"
 
 msgid "Lambert CC9 Zone (France)"
-msgstr ""
+msgstr "តំបន់ Lambert CC9 (បារាំង)"
 
 msgid "Lambert CC Zone"
-msgstr ""
+msgstr "តំបន់ Lambert CC"
 
 msgid "{0} (Corsica)"
-msgstr ""
+msgstr "{0} (Corsica)"
 
 msgid "Lambert 4 Zones (France)"
-msgstr ""
+msgstr "តំបន់ Lambert 4 (បារាំង)"
 
 msgid "WGS84 Geographic"
-msgstr ""
+msgstr "WGS84 Geographic"
 
 msgid "Belgian Lambert 1972"
-msgstr ""
+msgstr "Belgian Lambert 1972"
 
 msgid "Belgian Lambert 2008"
-msgstr ""
+msgstr "Belgian Lambert 2008"
 
 msgid "Lambert Zone (Estonia)"
-msgstr ""
+msgstr "Lambert Zone (អេស្តូនី)"
 
 msgid "Lambert 93 (France)"
-msgstr ""
+msgstr "Lambert 93 (បារាំង)"
 
 msgid "LKS-92 (Latvia TM)"
-msgstr ""
+msgstr "LKS-92 (Latvia TM)"
 
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
-msgstr ""
+msgstr "SWEREF99 13 30 / EPSG:3008 (ស៊ុយអែត)"
 
 msgid "Projection method"
-msgstr ""
+msgstr "វិធីសាស្ត្រ​ចំណោល"
 
 msgid "Projection code"
-msgstr ""
+msgstr "កូដ​ចំណោល"
 
 msgid "Display coordinates as"
-msgstr ""
+msgstr "បង្ហាញ​កូអរដោណេ​ជា"
 
 msgid "System of measurement"
-msgstr ""
+msgstr "ប្រព័ន្ធ​រង្វាស់"
 
 msgid "Map Projection"
-msgstr ""
+msgstr "ចំណោល​ផែនទី"
 
 msgid "The projection {0} could not be activated. Using Mercator"
-msgstr ""
+msgstr "មិន​អាច​ធ្វើឲ្យ​ចំណោល {0} សកម្ម​បាន​ទេ។ ប្រើ Mercator"
 
 msgid "PUWG 1992 (Poland)"
-msgstr ""
+msgstr "PUWG 1992 (ប៉ូឡូញ)"
 
 msgid "PUWG 2000 Zone {0} (Poland)"
-msgstr ""
+msgstr "PUWG 2000 Zone {0} (ប៉ូឡូញ)"
 
 msgid "PUWG (Poland)"
-msgstr ""
+msgstr "PUWG (ប៉ូឡូញ)"
 
 msgid "PUWG Zone"
-msgstr ""
+msgstr "PUWG Zone"
 
 msgid "Swiss Grid (Switzerland)"
-msgstr ""
+msgstr "Swiss Grid (ស្វីស)"
 
 msgid "<i>CH1903 / LV03 (without local corrections)</i>"
-msgstr ""
+msgstr "<i>CH1903 / LV03 (ដោយ​គ្មាន​ការ​កែតម្រូវ​មូលដ្ឋាន)</i>"
 
 msgid "Guadeloupe Fort-Marigot 1949"
-msgstr ""
+msgstr "Guadeloupe Fort-Marigot 1949"
 
 msgid "Guadeloupe Ste-Anne 1948"
-msgstr ""
+msgstr "Guadeloupe Ste-Anne 1948"
 
 msgid "Martinique Fort Desaix 1952"
-msgstr ""
+msgstr "Martinique Fort Desaix 1952"
 
 msgid "Reunion RGR92"
-msgstr ""
+msgstr "Reunion RGR92"
 
 msgid "Guyane RGFG95"
-msgstr ""
+msgstr "Guyane RGFG95"
 
 msgid "UTM France (DOM)"
-msgstr ""
+msgstr "UTM France (DOM)"
 
 msgid "UTM Geodesic system"
-msgstr ""
+msgstr "ប្រព័ន្ធ UTM Geodesic"
 
 msgid "UTM"
-msgstr ""
+msgstr "UTM"
 
 msgid "UTM Zone"
-msgstr ""
+msgstr "តំបន់ UTM"
 
 msgid "North"
-msgstr ""
+msgstr "ខាងជើង"
 
 msgid "South"
-msgstr ""
+msgstr "ខាងត្បូង"
 
 msgid "Hemisphere"
-msgstr ""
+msgstr "អឌ្ឍគោល"
 
 msgid "Remote Control"
-msgstr ""
+msgstr "ការ​បញ្ជា​ពី​ចម្ងាយ"
 
 msgid "Settings for the remote control feature."
-msgstr ""
+msgstr "ការ​កំណត់​សម្រាប់​លក្ខណៈ​ការ​បញ្ជា​ពី​ចម្ងាយ។"
 
 msgid "Download objects to new layer"
-msgstr ""
+msgstr "ទាញ​យក​វត្ថុ​ទី​ស្រទាប់​ថ្មី"
 
 msgid "Confirm all Remote Control actions manually"
-msgstr ""
+msgstr "បញ្ជាក់​សកម្មភាព​ការ​បញ្ជា​ពី​ចម្ងាយ​ដោយ​ដៃ"
 
 msgid ""
 "Allows JOSM to be controlled from other applications, e.g. from a web "
 "browser."
 msgstr ""
+"អនុញ្ញាត​ឲ្យ JOSM គ្រប់គ្រង​ពី​កម្មវិធី​ផ្សេង ឧ. ពី​កម្មវិធី​អ៊ីនធឺណិត។"
 
 msgid ""
 "JOSM will always listen at <b>port {0}</b> (http) and <b>port {1}</b> "
 "(https) on localhost.<br>These ports are not configurable because they are "
 "referenced by external applications talking to JOSM."
 msgstr ""
+"JOSM នឹង​ស្ដាប់​ជានិច្ច​នៅ <b>ច្រក {0}</b> (http) និង <b>ច្រក {1}</b> "
+"(https) នៅ​លើ​ម៉ាស៊ីន​មូលដ្ឋាន។<br>ច្រក​ទាំងនេះ​មិន​អាច​កំណត់​រចនាសម្ព័ន្ធ​បា"
+"ន​ទេ ព្រោះ​ពួកវា​ត្រូវ​បាន​យោង​ដោយ​ការ​ជជែក​កម្មវិធី​ខាងក្រៅ​ទៅ JOSM ។"
 
 msgid "Enable remote control"
-msgstr ""
+msgstr "បើក​ការ​បញ្ជា​ពី​ចម្ងាយ"
 
 msgid "Enable HTTPS support"
-msgstr ""
+msgstr "បើក​ការ​គាំទ្រ HTTPS"
 
 msgid "Install..."
-msgstr ""
+msgstr "ដំឡើង..."
 
 msgid "Uninstall..."
-msgstr ""
+msgstr "លុប..."
 
 msgid "Install JOSM localhost certificate to system/browser root keystores"
 msgstr ""
+"ដំឡើង​វិញ្ញាបនបត្រ​ម៉ាស៊ីន​មូលដ្ឋាន JOSM ទៅ​ប្រព័ន្ធ/browser root keystores"
 
 msgid ""
 "Uninstall JOSM localhost certificate from system/browser root keystores"
 msgstr ""
+"លុប​វិញ្ញាបនបត្រ​ម៉ាស៊ីន​មូលដ្ឋាន JOSM ពី​ប្រព័ន្ធ/browser root keystores"
 
 msgid "Certificate:"
-msgstr ""
+msgstr "វិញ្ញាបនបត្រ៖"
 
 msgid "Certificate has been successfully installed."
-msgstr ""
+msgstr "បាន​ដំឡើង​វិញ្ញាបនបត្រ​ដោយ​ជោគជ័យ។"
 
 msgid "Certificate is already installed. Nothing to do."
-msgstr ""
+msgstr "បាន​ដំឡើង​វិញ្ញាបនបត្រ​រួចរាល់។ គ្មាន​អ្វី​ត្រូវ​ធ្វើ​ទេ។"
 
 msgid "Removing certificate {0} from root keystore."
-msgstr ""
+msgstr "លុប​វិញ្ញាបនបត្រ {0} ចេញពី root keystore ។"
 
 msgid "Certificate has been successfully uninstalled."
-msgstr ""
+msgstr "បាន​លុប​វិញ្ញាបនបត្រ​ដោយ​ជោគជ័យ។"
 
 msgid "Certificate is not installed. Nothing to do."
-msgstr ""
+msgstr "មិន​បាន​ដំឡើង​វិញ្ញាបនបត្រ។ គ្មាន​អ្វី​ត្រូវ​ធ្វើ​ទេ។"
 
 msgid "Permitted actions:"
-msgstr ""
+msgstr "សកម្មភាព​ដែល​បាន​អនុញ្ញាត៖"
 
 msgid "Testing OSM API URL ''{0}''"
-msgstr ""
+msgstr "សាកល្បង OSM API URL ''{0}''"
 
 msgid ""
 "<html>''{0}'' is not a valid OSM API URL.<br>Please check the spelling and "
 "validate again.</html>"
 msgstr ""
+"<html>''{0}'' មិនមែន​ជា OSM API URL ត្រឹមត្រូវ។<br>សូម​ពិនិត្យ​ការ​ប្រកប "
+"រួច​ធ្វើ​សុពលកម្ម​ម្ដងទៀត។</html>"
 
 msgid "Invalid API URL"
-msgstr ""
+msgstr "API URL មិន​ត្រឹមត្រូវ"
 
 msgid ""
 "<html>Failed to build URL ''{0}'' for validating the OSM API "
 "server.<br>Please check the spelling of ''{1}'' and validate again.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​បង្កើយ URL ''{0}'' "
+"សម្រាប់​ការ​ធ្វើ​សុពលកម្ម​ម៉ាស៊ីន​មេ OSM API ។<br>សូម​ពិនិត្យ​ការ​ប្រកប។ "
+"''{1}'' រួច​ធ្វើ​សុពលកម្ម​ម្ដងទៀត។</html>"
 
 msgid ""
 "<html>Failed to connect to the URL ''{0}''.<br>Please check the spelling of "
 "''{1}'' and your Internet connection and validate again.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ភ្ជាប់​ទៅ URL ''{0}'' ។<br>សូម​ពិនិត្យ​ការ​ប្រកប "
+"''{1}'' និង​ការ​តភ្ជាប់​អ៊ីនធឺណិត រួច​ធ្វើ​សុពលកម្ម​ម្ដងទៀត។</html>"
 
 msgid "Connection to API failed"
-msgstr ""
+msgstr "ការ​តភ្ជាប់​ទៅ API បាន​បរាជ័យ"
 
 msgid ""
 "<html>Failed to retrieve a list of changesets from the OSM API server "
 "at<br>''{1}''. The server responded with the return code {0} instead of "
 "200.<br>Please check the spelling of ''{1}'' and validate again.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ទៅ​យក​បញ្ជី​សំណុំ​ផ្លាស់ប្ដូរ​ពី​ម៉ាស៊ីន​មេ OSM "
+"API នៅ<br>''{1}'' ។ ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​ជាមួយ​កូដ​ត្រឡប់ {0} ជំនួស​ឲ្យ "
+"២០០។<br>សូម​ពិនិត្យ​ការ​ប្រកប ''{1}'' រួច​ធ្វើ​សុពលកម្ម​ម្ដងទៀត។</html>"
 
 msgid ""
 "<html>The OSM API server at ''{0}'' did not return a valid response.<br>It "
 "is likely that ''{0}'' is not an OSM API server.<br>Please check the "
 "spelling of ''{0}'' and validate again.</html>"
 msgstr ""
+"<html>ម៉ាស៊ីន​មេ OSM API នៅ ''{0}'' "
+"មិន​បាន​ត្រឡប់​ចម្លើយ​តប​ត្រឹមត្រូវ។<br>វា​ហាក់បីដូចជា ''{0}'' "
+"មិនមែន​ជា​ម៉ាស៊ីន​មេ OSM API ។<br>សូំ​ពិនិត្យ​ការ​ប្រកប​នៃ ''{0}'' "
+"រួច​ធ្វើ​សុពលកម្ម​ម្ដងទៀត។</html>"
 
 msgid "Authentication"
-msgstr ""
+msgstr "ការ​ផ្ទៀងផ្ទាត់"
 
 msgid "Configure your identity and how to authenticate at the OSM server"
-msgstr ""
+msgstr "កំណត់​អត្តសញ្ញាណ​របស់​អ្នក និង​របៀប​ផ្ទៀងផ្ទាត់​នៅ​ម៉ាស៊ីន​មេ OSM"
 
 msgid "Use Basic Authentication"
-msgstr ""
+msgstr "ប្រើ​ការ​ផ្ទៀងផ្ទាត់​មូលដ្ឋាន"
 
 msgid ""
 "Select to use HTTP basic authentication with your OSM username and password"
 msgstr ""
+"ជ្រើស​ដើម្បី​ប្រើ​ការ​ផ្ទៀងផ្ទាត់​មូលដ្ឋាន HTTP ដោយ​ប្រើ​ឈ្មោះ​អ្នកប្រើ "
+"និង​ពាក្យសម្ងាត់​របស់​អ្នក"
 
 msgid "Use OAuth"
-msgstr ""
+msgstr "ប្រើ OAuth"
 
 msgid "Select to use OAuth as authentication mechanism"
-msgstr ""
+msgstr "ជ្រើស​ដើម្បី​ប្រើ OAuth ជា​យន្តការ​ផ្ទៀងផ្ទាត់"
 
 msgid ""
 "Unsupported value in preference ''{0}'', got ''{1}''. Using authentication "
 "method ''Basic Authentication''."
 msgstr ""
+"មិន​គាំទ្រ​តម្លៃ​ក្នុង​ចំណូលចិត្ត ''{0}'', បាន​ទទួល ''{1}'' ។ "
+"ប្រើ​វិធីសាស្ត្រ​ផ្ទៀងផ្ទាត់ ''ការ​ផ្ទៀងផ្ទាត់​មូលដ្ឋាន'' ។"
 
 msgid "OSM username:"
-msgstr ""
+msgstr "ឈ្មោះ​អ្នកប្រើ OSM ៖"
 
 msgid "OSM password:"
-msgstr ""
+msgstr "ពាក្យសម្ងាត់ OSM ៖"
 
 msgid "Failed to retrieve OSM credentials from credential manager."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ទៅ​យក​ព័ត៌មាន​សម្ងាត់ OSM "
+"ពី​កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់។"
 
 msgid "Current credential manager is of type ''{0}''"
-msgstr ""
+msgstr "កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់​បច្ចុប្បន្ន​គឺជា​ប្រភេទ ''{0}''"
 
 msgid "Failed to save OSM credentials to credential manager."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​រក្សាទុក​ព័ត៌មាន​សម្ងាត់ OSM "
+"ទៅ​កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់។"
 
 msgid "Periodically check for new messages"
-msgstr ""
+msgstr "ពិនិត្យមើល​សារ​ថ្មី​យូរៗម្ដង"
 
 msgid "Check interval (minutes):"
-msgstr ""
+msgstr "ចន្លោះ​ពេល​ពិនិត្យមើល (នាទី)៖"
 
 msgid "Failed to retrieve OAuth Access Token from credential manager"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ទៅ​យក​ថូខឹន​ចូល​ដំណើរការ OAuth "
+"ពី​កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់"
 
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​រក្សាទុក​ថូខឹន​ចូល​ដំណើរការ OAuth "
+"ទៅ​កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់"
 
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
 msgstr ""
+"អ្នក​មិន​មាន​ថូខឹន​ចូល​ដំណើរការ​ដើម្បី​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ "
+"OAuth នៅឡើយ​ទេ។ សូម​ផ្ដល់​សិទ្ធិ​ជាមុន។"
 
 msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
+"អ្នក​មាន​ថូខឹន​ចូល​ដំណើរការ​ដើម្បី​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ "
+"OAuth រួចហើយ។"
 
 msgid "Save to preferences"
-msgstr ""
+msgstr "រក្សាទុក​ទៅ​ចំណូលចិត្ត"
 
 msgid "Click to step through the OAuth authorization process"
-msgstr ""
+msgstr "ចុច​ដើម្បី​បញ្ចប់​ដំណើរការ​ផ្ទៀងផ្ទាត់ OAuth"
 
 msgid "New Access Token"
-msgstr ""
+msgstr "ថូខឹន​ចូល​ដំណើរការ​ថ្មី"
 
 msgid ""
 "Click to step through the OAuth authorization process and generate a new "
 "Access Token"
 msgstr ""
+"ចុច​ដើម្បី​បញ្ចប់​ដំណើរការ​ផ្ទៀងផ្ទាត់ OAuth "
+"រួច​បង្កើត​ថូខឹន​ចូល​ដំណើរការ​ថ្មី"
 
 msgid "Click test access to the OSM server with the current access token"
 msgstr ""
+"ចុច​ចូល​ដំណើរការ​សាកល្បង​ទៅ​ម៉ាស៊ីន​មេ OSM "
+"ដោយ​ប្រើ​ថូខឹន​ចូល​ដំណើរការ​បច្ចុប្បន្ន"
 
 msgid "<html>Use the default OSM server URL (<strong>{0}</strong>)</html>"
-msgstr ""
+msgstr "<html>ប្រើ URL ម៉ាស៊ីន​មេ OSM លំនាំដើម (<strong>{0}</strong>)</html>"
 
 msgid "Test the API URL"
-msgstr ""
+msgstr "សាកល្បង API URL"
 
 msgid "The API URL is valid."
-msgstr ""
+msgstr "API URL មិន​ត្រឹមត្រូវ។"
 
 msgid "Validation failed. The API URL seems to be invalid."
-msgstr ""
+msgstr "ការ​ធ្វើ​សុពលកម្ម​បាន​បរាជ័យ។ API URL ហាក់ដូចជា​មិន​ត្រឹមត្រូវ។"
 
 msgid "OSM API URL must not be empty. Please enter the OSM API URL."
-msgstr ""
+msgstr "OSM API URL មិន​ត្រូវ​ទទេ​ឡើយ។ សូម​បញ្ចូល OSM API URL ។"
 
 msgid "The current value is not a valid URL"
-msgstr ""
+msgstr "តម្លៃ​បច្ចុប្បន្ន​មិនមែន​ជា URL ត្រឹមត្រូវ​ឡើយ"
 
 msgid "Please enter the OSM API URL."
-msgstr ""
+msgstr "សូម​បញ្ចូល OSM API URL ។"
 
 msgid "Proxy settings"
-msgstr ""
+msgstr "ការកំណត់​ប្រូកស៊ី"
 
 msgid "Configure whether to use a proxy server"
-msgstr ""
+msgstr "កំណត់​ថា​តើ​ត្រូវ​ប្រើ​ម៉ាស៊ីន​មេ​ប្រូកស៊ី"
 
 msgid "Host:"
-msgstr ""
+msgstr "ម៉ាស៊ីន៖"
 
 msgctxt "server"
 msgid "Port:"
-msgstr ""
+msgstr "ច្រក៖"
 
 msgid ""
 "Please enter a username and a password if your proxy requires authentication."
 msgstr ""
+"សូម​បញ្ចូល​ឈ្មោះ​អ្នកប្រើ និង​ពាក្យសម្ងាត់ "
+"បើ​ប្រូកស៊ី​របស់​អ្នក​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់។"
 
 msgid "Password:"
-msgstr ""
+msgstr "ពាក្យសម្ងាត់៖"
 
 msgid "No proxy"
-msgstr ""
+msgstr "គ្មាន​ប្រូកស៊ី"
 
 msgid "Use standard system settings"
-msgstr ""
+msgstr "ប្រើ​ការ​កំណត់​ប្រព័ន្ធ​ស្តង់ដារ"
 
 msgid ""
 "Use standard system settings (disabled. Start JOSM with <tt>-"
 "Djava.net.useSystemProxies=true</tt> to enable)"
 msgstr ""
+"ប្រើ​ការ​កំណត់​ប្រព័ន្ធ​ស្តង់ដារ (បាន​បិទ។ ចាប់ផ្ដើម JOSM ជាមួយ <tt>-"
+"Djava.net.useSystemProxies=true</tt> ដើម្បី​បើក)"
 
 msgid "Manually configure a HTTP proxy"
-msgstr ""
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​ប្រូកស៊ី HTTP ដោយ​ដៃ"
 
 msgid "Use a SOCKS proxy"
-msgstr ""
+msgstr "ប្រើ​ប្រូកស៊ី SOCKS"
 
 msgid ""
 "JOSM is configured to use proxies from the system setting, but the JVM is "
 "not configured to retrieve them. Resetting preferences to ''No proxy''"
 msgstr ""
+"JOSM ត្រូវ​បាន​កំណត់​រចនាសម្ព័ន្ធ​ដើម្បី​ប្រើ​ប្រូកស៊ី​ពី​ការ​កំណត់​ប្រព័ន្ធ "
+"ប៉ុន្តែ JVM មិន​បាន​កំណត់​រចនាសម្ព័ន្ធ​ដើម្បី​ទៅ​យក​ពួក​វា​ទេ។ "
+"កំណត់​ចំណូលចិត្ត​ឡើងវិញ​ទៅ ''គ្មាន​ប្រូកស៊ី''"
 
 msgid "Connection Settings"
-msgstr ""
+msgstr "កំណត់​ការ​តភ្ជាប់"
 
 msgid "Connection Settings for the OSM server."
-msgstr ""
+msgstr "កំណត់​ការ​តភ្ជាប់​សម្រាប់​ម៉ាស៊ីន​មេ OSM ។"
 
 msgid "Action"
-msgstr ""
+msgstr "សកម្មភាព"
 
 msgid "Shortcut"
-msgstr ""
+msgstr "ផ្លូវកាត់"
 
 msgid "Shortcut Background: User"
-msgstr ""
+msgstr "ផ្លូវកាត់​ផ្ទៃ​ខាងក្រោយ៖ អ្នកប្រើ"
 
 msgid "Shortcut Background: Modified"
-msgstr ""
+msgstr "ផ្លូវកាត់​ផ្ទៃ​ខាងក្រោយ៖ បាន​កែប្រែ"
 
 msgid "Use default"
-msgstr ""
+msgstr "ប្រើ​លំនាំដើម"
 
 msgid "Key:"
-msgstr ""
+msgstr "ពាក្យ​គន្លឹះ៖"
 
 msgid "Attention: Use real keyboard keys only!"
-msgstr ""
+msgstr "ប្រយ័ត្ន៖ ប្រើ​តែ​ក្ដារចុច​ពិតប្រាកដ​ប៉ុណ្ណោះ!"
 
 msgid "Keyboard Shortcuts"
-msgstr ""
+msgstr "ផ្លូវកាត់​ក្ដារចុច"
 
 msgid "Changing keyboard shortcuts manually."
-msgstr ""
+msgstr "ការ​ប្ដូរ​ផ្លូវកាត់​ក្ដារចុច​ដោយ​ដៃ។"
 
 msgid "Data validator"
-msgstr ""
+msgstr "កម្មវិធី​កំណត់​សុពលកម្ម​ទិន្នន័យ"
 
 msgid ""
 "An OSM data validator that checks for common errors made by users and editor "
 "programs."
 msgstr ""
+"កម្មវិធី​កំណត់​សុពលកម្ម​ទិន្នន័យ OSM "
+"ពិនិត្យ​សម្រាប់​កំហុស​ទូទៅ​ដែល​បាន​បង្កើត​ឡើង​ដោយ​អ្នកប្រើ "
+"និង​កម្មវិធី​និពន្ធ។"
 
 msgid "Available rules:"
-msgstr ""
+msgstr "បន្ទាត់​ដែល​មាន៖"
 
 msgid "Active rules:"
-msgstr ""
+msgstr "បន្ទាត់​សកម្ម៖"
 
 msgid "Add a new rule by entering filename or URL"
-msgstr ""
+msgstr "បន្ថែម​បន្ទាត់​ថ្មី​ដោយ​ការ​បញ្ចូល​ឈ្មោះ​ឯកសារ ឬ URL"
 
 msgid "New rule entry:"
-msgstr ""
+msgstr "ធាតុ​បន្ទាត់​ថ្មី៖"
 
 msgid "Remove the selected rules from the list of active rules"
-msgstr ""
+msgstr "លុប​បន្ទាត់​ដែល​បាន​ជ្រើស​ចេញពី​បញ្ជី​បន្ទាត់​សកម្ម"
 
 msgid "Edit the filename or URL for the selected active rule"
-msgstr ""
+msgstr "កែសម្រួល​ឈ្មោះ​ឯកសារ ឬ URL សម្រាប់​បន្ទាត់​សកម្ម​ដែល​បាន​ជ្រើស"
 
 msgid "Add the selected available rules to the list of active rules"
-msgstr ""
+msgstr "បន្ថែម​បន្ទាត់​ដែល​បាន​ជ្រើស​ទៅកាន់​បញ្ជី​បន្ទាត់​សកម្ម"
 
 msgid "Reloads the list of available rules from ''{0}''"
-msgstr ""
+msgstr "ផ្ទុក​ឡើងវិញ​បញ្ជី​បន្ទាត់​ដែល​មាន​ពី ''{0}''"
 
 msgid "Loading rule sources from ''{0}''"
-msgstr ""
+msgstr "ការ​ផ្ទុក​ប្រភព​បន្ទាត់​ពី ''{0}''"
 
 msgid ""
 "<html>Failed to load the list of rule sources "
 "from<br>''{0}''.<br><br>Details (untranslated):<br>{1}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​បញ្ជី​ប្រភព​បន្ទាត់​ពី<br>''{0}'' "
+"។<br><br>ព័ត៌មាន​លម្អិត (មិន​បាន​បកប្រែ)៖<br>{1}</html>"
 
 msgid "Warning: illegal format of entry in rule list ''{0}''. Got ''{1}''"
 msgstr ""
+"ព្រមាន៖ ទ្រង់ទ្រាយ​មិន​ត្រឹមត្រូវ​នៃ​ធាតុ​នៅ​ក្នុង​បញ្ជី​បន្ទាត់ ''{0}'' ។ "
+"បាន​ទទួល ''{1}''"
 
 msgid "Checks for errors on addresses"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​អាសយដ្ឋាន"
 
 msgid "Tag combinations"
-msgstr ""
+msgstr "ស្លាក​បន្សំ"
 
 msgid "Checks for missing tag or suspicious combinations"
-msgstr ""
+msgstr "ពិនិត្យមើល​ស្លាក​ដែល​បាត់ ឬ​បន្សំ​ដែល​សង្ស័យ"
 
 msgid "Deprecated features"
-msgstr ""
+msgstr "លក្ខណៈ​ដែល​បាន​បដិសេធ"
 
 msgid "Checks for deprecated features"
-msgstr ""
+msgstr "ពិនិត្យ​លក្ខណៈ​ដែល​បាន​បដិសេធ"
 
 msgid "Geometry"
-msgstr ""
+msgstr "ធរណីមាត្រ"
 
 msgid "Checks for geometry errors"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​ធរណីមាត្រ"
 
 msgid "Checks for errors on highways"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​នៅ​លើ​ផ្លូវ​ធំ"
 
 msgid "Multiple values"
-msgstr ""
+msgstr "តម្លៃ​ច្រើន"
 
 msgid "Checks for wrong multiple values"
-msgstr ""
+msgstr "ពិនិត្យមើល​តម្លៃ​ច្រើន​ដែល​ខុស"
 
 msgid "Numeric values"
-msgstr ""
+msgstr "តម្លៃ​ជា​លេខ"
 
 msgid "Checks for wrong numeric values"
-msgstr ""
+msgstr "ពិនិត្យមើល​តម្លៃ​ជា​លេខ​ដែល​ខុស"
 
 msgid "Power"
-msgstr ""
+msgstr "ថាមពល"
 
 msgid "Checks for errors on power infrastructures"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​នៅ​លើ​ហេដ្ឋារចនាសម្ព័ន្ធ​ថាមពល"
 
 msgid "Religion"
-msgstr ""
+msgstr "សាសនា"
 
 msgid "Checks for errors on religious objects"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​នៅ​លើ​វត្ថុ​សាសនា"
 
 msgid "Checks for errors on relations"
-msgstr ""
+msgstr "ពិនិត្យមើល​កំហុស​នៅ​លើ​ទំនាក់ទំនង"
 
 msgid "Unnecessary tags"
-msgstr ""
+msgstr "ស្លាក​មិន​ចាំបាច់"
 
 msgid "Checks for unnecessary tags"
-msgstr ""
+msgstr "ពិនិត្យមើល​ស្លាក​មិន​ចាំបាច់"
 
 msgid "Wikipedia"
-msgstr ""
+msgstr "វីគីភីឌៀ"
 
 msgid "Checks for wrong wikipedia tags"
-msgstr ""
+msgstr "ពិនិត្យមើល​ស្លាក​វីគីភីឌៀ​មិន​ត្រឹមត្រូវ"
 
 msgid "Tag checker rules"
-msgstr ""
+msgstr "បន្ទាត់​កម្មវិធី​ពិនិត្យ​ស្លាក"
 
 msgid "Choose Tag checker rules to enable"
-msgstr ""
+msgstr "ជ្រើស​កម្មវិធី​ពិនិត្យ​ស្លាក​ដើម្បី​បើក"
 
 msgid "Use ignore list."
-msgstr ""
+msgstr "ប្រើ​បញ្ជី​មិន​អើពើ។"
 
 msgid "Use the ignore list to suppress warnings."
-msgstr ""
+msgstr "ប្រើ​បញ្ជី​មិន​អើពើ​ដើម្បី​ទប់ស្កាត់​ការ​ព្រមាន។"
 
 msgid "Use error layer."
-msgstr ""
+msgstr "ប្រើ​ស្រទាប់​មាន​កំហុស។"
 
 msgid "Use the error layer to display problematic elements."
-msgstr ""
+msgstr "ប្រើ​ស្រទាប់​មាន​កំហុស​ដើម្បី​បង្ហាញ​ធាតុ​មាន​បញ្ហា។"
 
 msgid "Show informational level."
-msgstr ""
+msgstr "បង្ហាញ​ព័ត៌មាន​ស្រទាប់។"
 
 msgid "Show the informational tests."
-msgstr ""
+msgstr "បង្ហាញ​ព័ត៌មាន​ការ​សាកល្បង។"
 
 msgid "Show informational level on upload."
-msgstr ""
+msgstr "បង្ហាញ​ព័ត៌មាន​ស្រទាប់​ពេល​ផ្ទុក​ឡើង។"
 
 msgid "Show the informational tests in the upload check windows."
-msgstr ""
+msgstr "បង្ហាញ​ព័ត៌មាន​ការ​សាកល្បង​នៅ​ក្នុង​បង្អួច​ពិនិត្យ​ផ្ទុក​ឡើង។"
 
 msgid "On demand"
-msgstr ""
+msgstr "ឆាប់ៗ"
 
 msgid "On upload"
-msgstr ""
+msgstr "ពេល​ផ្ទុក​ឡើង"
 
 msgid "Tests"
-msgstr ""
+msgstr "សាកល្បង"
 
 msgid "Choose tests to enable"
-msgstr ""
+msgstr "ជ្រើស​ការសាកល្បង​ដើម្បី​បើក"
 
 msgid "multiple"
-msgstr ""
+msgstr "ច្រើន"
 
 msgid "Remove old keys from up to {0} object"
 msgid_plural "Remove old keys from up to {0} objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "លុប​ពាក្យ​គន្លឹះ​ចាស់​ចេញពី​វត្ថុ {0}"
 
 msgid "Delete the selection in the tag table"
-msgstr ""
+msgstr "លុប​ជម្រើស​ក្នុង​តារាង​ស្លាក"
 
 msgid "Add a new tag"
-msgstr ""
+msgstr "បន្ថែម​ស្លាក​ថ្មី"
 
 msgid "Paste tags from buffer"
-msgstr ""
+msgstr "បិទភ្ជាប់​ស្លាក​ពី​ទ្រនាប់"
 
 msgid "Use preset ''{0}'' of group ''{1}''"
-msgstr ""
+msgstr "ប្រើ​ការ​កំណត់​ស្រេច ''{0}'' នៃ​ក្រុម ''{1}''"
 
 msgid "Use preset ''{0}''"
-msgstr ""
+msgstr "ប្រើ​ការ​កំណត់​ស្រេច ''{0}''"
 
 msgid "Elements of type {0} are supported."
-msgstr ""
+msgstr "បាន​គាំទ្រ​ធាតុ​នៃ​ប្រភេទ {0} ។"
 
 msgid "Edit also …"
-msgstr ""
+msgstr "កែសម្រួល​ផង​ដែរ..."
 
 msgid "Apply Preset"
-msgstr ""
+msgstr "អនុវត្ត​ការ​កំណត់​ស្រេច"
 
 msgid "New relation"
-msgstr ""
+msgstr "ទំនាក់ទំនង​ថ្មី"
 
 msgid "Change {0} object"
 msgid_plural "Change {0} objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ប្ដូរ​វត្ថុ {0}"
 
 msgid "Nothing selected!"
-msgstr ""
+msgstr "មិន​បាន​ជ្រើស!"
 
 msgid "Selection unsuitable!"
-msgstr ""
+msgstr "ជម្រើស​មិន​សម!"
 
 msgid "Change Tags"
-msgstr ""
+msgstr "ប្តូរ​ស្លាក"
 
 msgid "Add or remove toolbar button"
-msgstr ""
+msgstr "បន្ថែម ឬ​លុប​ប៊ូតុង​របារ​ឧបករណ៍"
 
 msgid "Unknown requisite: {0}"
-msgstr ""
+msgstr "មិន​ស្គាល់​តម្រូវ​ការ៖ {0}"
 
 msgid "Illegal member expression: {0}"
-msgstr ""
+msgstr "កន្សោម​សមាជិក​មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "More information about this feature"
-msgstr ""
+msgstr "ព័ត៌មាន​បន្ថែម​អំពី​លក្ខណៈ​នេះ"
 
 msgid "Available roles"
-msgstr ""
+msgstr "តួនាទី​ដែល​មាន"
 
 msgid "role"
-msgstr ""
+msgstr "តួនាទី"
 
 msgid "count"
-msgstr ""
+msgstr "រាប់"
 
 msgid "elements"
-msgstr ""
+msgstr "ធាតុ"
 
 msgid "Optional Attributes:"
-msgstr ""
+msgstr "គុណ​លក្ខណៈ​ជា​ជម្រើស៖"
 
 msgid "Select auto-increment of {0} for this field"
-msgstr ""
+msgstr "ជ្រើស​ការ​បង្កើន​ស្វ័យប្រវត្តិ​នៃ {0} សម្រាប់​វាល​នេះ"
 
 msgid "Cancel auto-increment for this field"
-msgstr ""
+msgstr "បោះបង់​ការ​បង្កើន​ស្វ័យប្រវត្តិ​សម្រាប់​វាល​នេះ"
 
 msgid "{0}:"
-msgstr ""
+msgstr "{0}:"
 
 msgid ""
 "Warning in tagging preset \"{0}-{1}\": Ignoring ''{2}'' attribute as ''{3}'' "
 "elements are given."
 msgstr ""
+"ការ​ព្រមាន​ក្នុង​ការ​ដាក់​ស្លាក​ការ​កំណត់​ស្រេច \"{0}-{1}\" ៖ "
+"មិន​អើពើ​គុណ​លក្ខណៈ ''{2}'' ជា​ធាតុ ''{3}'' ដែល​បាន​ផ្ដល់។"
 
 msgid ""
 "Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' is "
 "not \"{2}\""
 msgstr ""
+"ការ​ដាក់​ស្លាក​ការ​កំណត់​ស្រេច \"{0}-{1}\" បាន​ខូច - វិធីសាស្ត្រ Java "
+"ដែល​បាន​ផ្ដល់​នៅ​ក្នុង ''values_from'' គឺ​មិនមែន \"{2}\""
 
 msgid ""
 "Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' "
 "threw {2} ({3})"
 msgstr ""
+"ការ​ដាក់​ស្លាក​ការ​កំណត់​ស្រេច \"{0}-{1}\" បាន​ខូច - វិធីសាស្ត្រ Java "
+"ដែល​បាន​ផ្ដល់​នៅ​ក្នុង ''values_from'' បាន​បោះចោល {2} ({3})"
 
 msgid ""
 "Broken tagging preset \"{0}-{1}\" - number of items in ''display_values'' "
 "must be the same as in ''values''"
 msgstr ""
+"ការ​ដាក់​ស្លាក​ការ​កំណត់​ស្រេច \"{0}-{1}\" បាន​ខូច - ចំនួន​ធាតុ​នៅ​ក្នុង "
+"''display_values'' ត្រូវតែ​ដូច​ទៅ​នឹង ''values''"
 
 msgid ""
 "Broken tagging preset \"{0}-{1}\" - number of items in "
 "''short_descriptions'' must be the same as in ''values''"
 msgstr ""
+"ការ​ដាក់​ស្លាក​ការ​កំណត់​ស្រេច \"{0}-{1}\" - បាន​ខូច - ចំនួន​ធាតុ​នៅ​ក្នុង "
+"''short_descriptions'' ត្រូវតែ​ដូច​ទៅ​នឹង ''values''"
 
 msgid "Unknown type: {0}"
-msgstr ""
+msgstr "មិន​ស្គាល់​ប្រភេទ៖ {0}"
 
 msgid "Preset group {1} / {0}"
-msgstr ""
+msgstr "ក្រុម​កំណត់​ស្រេច {1} / {0}"
 
 msgid "Preset group {0}"
-msgstr ""
+msgstr "ក្រុម​កំណត់​ស្រេច {0}"
 
 msgid "Reference {0} is being used before it was defined"
-msgstr ""
+msgstr "សេចក្ដី​យោង {0} ត្រូវ​បាន​ប្រើ​មុន​ពេល​កំណត់"
 
 msgid "Roles cannot appear more than once"
-msgstr ""
+msgstr "តួនាទី​មិន​អាច​លេចឡើង​ច្រើន​ជាង​ម្ដង​ឡើយ"
 
 msgid "Preset role element without parent"
-msgstr ""
+msgstr "ធាតុ​តួនាទី​កំណត់​ស្រេច​ដែល​គ្មាន​មេ"
 
 msgid "Preset sub element without parent"
-msgstr ""
+msgstr "ធាតុ​រង​ការ​កំណត់​ស្រេច​ដែល​គ្មាន​មេ"
 
 msgid "Error parsing {0}: "
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ញែក {0}: "
 
 msgid "Search preset"
-msgstr ""
+msgstr "ស្វែងរក​ការ​កំណត់​ស្រេច"
 
 msgid "Show preset search dialog"
-msgstr ""
+msgstr "បង្ហាញ​ប្រអប់​ស្វែងរក​ការ​កំណត់​ស្រេច"
 
 msgid "Search presets"
-msgstr ""
+msgstr "ស្វែងរក​ការ​កំណត់​ស្រេច"
 
 msgid "Search for objects by preset"
-msgstr ""
+msgstr "ស្វែងរក​វត្ថុ​តាម​ការ​កំណត់​ស្រេច"
 
 msgid "Show only applicable to selection"
-msgstr ""
+msgstr "បង្ហាញ​តែ​អ្វី​ដែល​ត្រូវ​ជាមួយ​ជម្រើស​ប៉ុណ្ណោះ"
 
 msgid "Search in tags"
-msgstr ""
+msgstr "ស្វែងរក​ក្នុង​ស្លាក"
 
 msgid "Add toolbar button"
-msgstr ""
+msgstr "បន្ថែម​ប៊ូតុង​របារ​ឧបករណ៍"
 
 msgid ""
 "Adjustable {0} not registered yet. Cannot set participation in synchronized "
 "adjustment."
 msgstr ""
+"{0} ដែល​អាច​លៃ​តម្រូវ​បាន មិនទាន់​ចុះឈ្មោះ​នៅ​ឡើយ​ទេ។ "
+"មិន​អាច​កំណត់​អ្នកចូលរួម​នៅ​ក្នុង​ការ​លៃ​តម្រូវ​ដែល​បាន​ធ្វើ​សមកាលកម្ម​ឡើយ។"
 
 msgid "Adjustable {0} not registered yet."
-msgstr ""
+msgstr "{0} ដែល​អាច​លៃ​តម្រូវ​បាន មិនទាន់​ចុះឈ្មោះ​នៅ​ឡើយ​ទេ។"
 
 msgid "Some of the key listeners forgot to remove themselves: {0}"
-msgstr ""
+msgstr "កម្មវិធី​ស្ដាប់​ពាក្យគន្លឹះ​មួយ​ចំនួន​មិន​បាន​លុប​ខ្លួន​វា​ចេញ៖ {0}"
 
 msgid "Some of the key modifier listeners forgot to remove themselves: {0}"
 msgstr ""
+"កម្មវិធី​ស្ដាប់​កម្មវិធី​​កែ​ពាក្យ​គន្លឹះ​មួយ​ចំនួន​មិន​បាន​លុប​ខ្លួន​វា​ចេញ៖"
+" {0}"
 
 msgid "All files (*.*)"
-msgstr ""
+msgstr "ឯកសារ​​ទាំងអស់ (*.*)"
 
 msgid "Received error page:"
-msgstr ""
+msgstr "បាន​ទទួល​ទំព័រ​កំហុស៖"
 
 msgid "Min. latitude"
-msgstr ""
+msgstr "រយៈទទឹង​អប្ប."
 
 msgid "Min. longitude"
-msgstr ""
+msgstr "រយៈបណ្ដោយ​អប្ប."
 
 msgid "Max. latitude"
-msgstr ""
+msgstr "រយៈទទឹង​អតិ."
 
 msgid "Max. longitude"
-msgstr ""
+msgstr "រយៈបណ្ដោយ​អតិ."
 
 msgid ""
 "URL from www.openstreetmap.org (you can paste a download URL here to specify "
 "a bounding box)"
 msgstr ""
+"URL ពី www.openstreetmap.org (អ្នក​អាច​បិទភ្ជាប់ URL "
+"ទាញ​យក​នៅ​ទីនេះ​ដើម្បី​បញ្ជាក់​ប្រអប់​ព្រំដែន)"
 
 msgid ""
 "The current value is not a valid changeset ID. Please enter an integer value "
 "> 0"
 msgstr ""
+"តម្លៃ​បច្ចុប្បន្ន​មិនមែន​ជា​លេខ​សម្គាល់​សំណុំ​ផ្លាស់ប្ដូរ​ត្រឹមត្រូវ។ "
+"សូម​បញ្ចូល​តម្លៃ​ចំនួន​គត់ > 0"
 
 msgid "Add a new source to the list."
-msgstr ""
+msgstr "បន្ថែម​ប្រភព​ថ្មី​ទៅ​បញ្ជី។"
 
 msgid "Edit the selected source."
-msgstr ""
+msgstr "កែ​ប្រភព​ដែល​បាន​ជ្រើស។"
 
 msgid "Delete the selected source from the list."
-msgstr ""
+msgstr "លុប​ប្រភព​ដែល​បាន​ជ្រើស​ពី​បញ្ជី។"
 
 msgid ""
 "The current value is not a valid OSM ID. Please enter an integer value > 0"
 msgstr ""
+"តម្លៃ​បច្ចុប្បន្ន​មិនមែន​ជា​លេខ​សម្គាល់ OSM ត្រឹមត្រូវ។ "
+"សូម​បញ្ចូល​តម្លៃ​ចំនួន​គត់ > 0"
 
 msgid "false: the property is explicitly switched off"
-msgstr ""
+msgstr "មិន​ពិត៖ លក្ខណសម្បត្តិ​ត្រូវ​បាន​បិទ​"
 
 msgid "true: the property is explicitly switched on"
-msgstr ""
+msgstr "ពិត៖ លក្ខណសម្បត្តិ​ត្រូវ​បាន​បើក"
 
 msgid ""
 "partial: different selected objects have different values, do not change"
-msgstr ""
+msgstr "ភាគ​ខ្លះ៖ វត្ថុ​ដែល​បាន​ជ្រើស​ផ្សេងគ្នា មាន​តម្លៃ​ខុសគ្នា, កុំ​ប្ដូរ"
 
 msgid "unset: do not set this property on the selected objects"
-msgstr ""
+msgstr "មិន​កំណត់៖ កុំ​កំណត់​លក្ខណសម្បត្តិ​នេះ​ឲ្យ​វត្ថុ​ដែល​បាន​ជ្រើស"
 
 msgid "Cut"
-msgstr ""
+msgstr "​កាត់"
 
 msgid "Right click = copy to clipboard"
-msgstr ""
+msgstr "កណ្ដុរស្ដាំ = ចម្លង​ទៅ​ក្ដារ​តម្បៀត​ខ្ទាស់"
 
 msgid "Missing mandatory attribute ''{0}''."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' ។"
 
 msgid ""
 "Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' នៃ​ប្រភេទ long ។ "
+"បាន​ទទួល ''{1}'' ។"
 
 msgid ""
 "Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got "
 "''{1}''."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' នៃ​ប្រភេទ long (>=0) "
+"។ បាន​ទទួល ''{1}'' ។"
 
 msgid "Illegal value for attribute ''{0}'' of type double. Got ''{1}''."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' នៃ​ប្រភេទ double ។ បាន​ទទួល "
+"''{1}'' ។"
 
 msgid ""
 "Illegal value for mandatory attribute ''{0}'' of type boolean. Got ''{1}''."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' នៃ​ប្រភេទ boolean ។ បាន​ទទួល "
+"''{1}'' ។"
 
 msgid ""
 "Illegal value for mandatory attribute ''{0}'' of type OsmPrimitiveType. Got "
 "''{1}''."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' នៃ​ប្រភេទ "
+"OsmPrimitiveType ។ បាន​ទទួល ''{1}'' ។"
 
 msgid ""
 "Way with external ID ''{0}'' includes missing node with external ID ''{1}''."
 msgstr ""
+"ផ្លូវ​ដែល​មាន​លេខ​សម្គាល់​ខាងក្រៅ ''{0}'' បាន​រួមបញ្ចូល​តំណ​ដែល​បាត់ "
+"និង​មាន​លេខ​សម្គាល់​ខាងក្រៅ ''{1}'' ។"
 
 msgid "Deleted node {0} is part of way {1}"
-msgstr ""
+msgstr "បាន​លុប​តំណ {0} ដែល​ជា​ផ្នែក​នៃ​ផ្លូវ {1}"
 
 msgid ""
 "Way {0} with {1} nodes has incomplete nodes because at least one node was "
 "missing in the loaded data."
 msgstr ""
+"ផ្លូវ {0} ដែល​មាន​តំណ {1} មាន​តំណ​មិន​បញ្ចប់ "
+"ព្រោះ​មាន​តំណ​យ៉ាង​ហោច​មួយ​ត្រូវ​បាន​បាត់​ពេល​ផ្ទុក​ទិន្នន័យ។"
 
 msgid ""
 "Relation with external id ''{0}'' refers to a missing primitive with "
 "external id ''{1}''."
 msgstr ""
+"ទំនាក់ទំនង​ដែល​មាន​លេខ​សម្គាល់​ខាងក្រៅ ''{0}'' "
+"បាន​សំដៅ​ទៅ​ព្រមីទីវ​ដែល​មាន​លេខ​សម្គាល់​ខាងក្រៅ ''{1}'' ។"
 
 msgid "Deleted member {0} is used by relation {1}"
-msgstr ""
+msgstr "លុប​សមាជិក {0} ដែល​បាន​ប្រើ​ដោយ {1}"
 
 msgid "All Formats"
-msgstr ""
+msgstr "ទ្រង់ទ្រាយ​ទាំងអស់"
 
 msgid "Downloading points {0} to {1}..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​ចំណុច {0} ទៅ {1}..."
 
 msgid "Contacting OSM Server..."
-msgstr ""
+msgstr "កំពុង​ទាក់ទង​ម៉ាស៊ីន​មេ OSM..."
 
 msgid "Failed to open input stream for resource ''{0}''"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​បើក​ស្ទ្រីម​បញ្ចូល​សម្រាប់​ធនធាន ''{0}''"
 
 msgid ""
 "Failed to open file with extension ''{2}'' and namepart ''{3}'' in zip file "
 "''{0}''. Exception was: {1}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​បើក​ឯកសារ​ដែល​មាន​ផ្នែក​បន្ថែម ''{2}'' "
+"និង​ផ្នែក​នៃ​ឈ្មោះ ''{3}'' នៅ​ក្នុង​ឯកសារ​បង្ហាប់ ''{0}'' ។ ករណី​លើកលែង​គឺ "
+"{1}"
 
 msgid "Failed to rename file {0} to {1}."
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ប្ដូរ​ឈ្មោះ​ឯកសារ {0} ទៅ {1} ។"
 
 msgid "Failed to load {0}, use cached file and retry next time: {1}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក {0}, ប្រើ​ឯកសារ​ដែល​បាន​ទុក​ក្នុង​ឃ្លាំង "
+"រួច​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ៖ {1}"
 
 msgid ""
 "Unexpected response from HTTP server. Got {0} response without ''Location'' "
 "header. Can''t redirect. Aborting."
 msgstr ""
+"ចម្លើយតប​មិន​រំពឹង​ទុក​ពី​ម៉ាស៊ីន​មេ HTTP ។ បាន​ទទួល​ចម្លើយ​តប {0} "
+"ដោយ​គ្មាន​ក្បាល ''ទីតាំង'' ។​ មិន​អាច​ប្ដូរ​ទិស។ កពុង​បោះបង់។"
 
 msgid "Too many redirects to the download URL detected. Aborting."
-msgstr ""
+msgstr "បាន​រក​ឃើញ​ការ​ប្ដូរ​ទិស​ច្រើន​ពេក​ទៅកាន់ URL ទាញ​យក។ កំពុង​បោះបង់។"
 
 msgid "Download redirected to ''{0}''"
-msgstr ""
+msgstr "ទាញ​យក​ការ​ប្ដូរ​ទិស​ទៅ ''{0}''"
 
 msgid "Failed to read from ''{0}''. Server responded with status code {1}."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​អាន​ពី ''{0}'' ។ "
+"ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​ជាមួយ​កូដ​ស្ថានភាព {1} ។"
 
 msgid ""
 "Illegal value of attribute ''{0}'' of element ''{1}'' in server "
 "capabilities. Got ''{2}''"
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​​នៃ​គុណ​លក្ខណៈ ''{0}'' របស់​ធាតុ ''{1}'' "
+"នៅ​ក្នុង​សមត្ថភាព​ម៉ាស៊ីន​មេ។ បាន​ទទួល ''{2}''"
 
 msgid "Failed to parse date ''{0}'' replied by server."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ញែក​កាលបរិច្ឆេទ ''{0}'' បាន​ឆ្លើយតប​ដោយ​ម៉ាស៊ីន​មេ។"
 
 msgid ""
 "Unexpected format of error header for conflict in changeset update. Got "
 "''{0}''"
 msgstr ""
+"ទ្រង់ទ្រាយ​មិន​រំពឹង​ទុក​នៃ​កំហុស​បឋមកថា​សម្រាប់​ការ​ប៉ះទង្គិច​នៅ​ក្នុង​បច្ចុ"
+"ប្បន្នភាព​សំណុំ​ផ្លាស់ប្ដូរ។ បាន​ទទួល ''{0}''"
 
 msgid "Illegal longitude value for parameter ''{0}'', got {1}"
 msgstr ""
+"តម្លៃ​រយៈបណ្ដោយ​មិន​ត្រឹមត្រូវ​សម្រាប់​ប៉ារ៉ាម៉ែត្រ ''{0}'', បាន​ទទួល {1}"
 
 msgid "Illegal latitude value for parameter ''{0}'', got {1}"
 msgstr ""
+"តម្លៃ​រយៈទទឹង​មិន​ត្រឹមត្រូវ​សម្រាប់​ប៉ារ៉ាម៉ែត្រ ''{0}'', បាន​ទទួល {1}"
 
 msgid "Unexpected value for ''{0}'' in changeset query url, got {1}"
 msgstr ""
+"តម្លៃ​មិន​រំពឹង​ទុក​សម្រាប់ ''{0}'' នៅ​ក្នុង url សំណួរ​សំណុំ​ផ្លាស់ប្ដូរ, "
+"បាន​ទទួល {1}"
 
 msgid ""
 "Cannot create a changeset query including both the query parameters ''uid'' "
 "and ''display_name''"
 msgstr ""
+"មិន​អាច​បង្កើត​សំណួរ​សំណុំ​ផ្លាស់ប្ដូរ​ដោយ​រួមបញ្ចូល​ទាំង​ប៉ារ៉ាម៉ែត្រ​សំណួរ "
+"''uid'' និង ''display_name''"
 
 msgid "Unsupported parameter ''{0}'' in changeset query string"
 msgstr ""
+"មិន​គាំទ្រ​ប៉ារ៉ាម៉ែត្រ ''{0}'' នៅ​ក្នុង​ឃ្លា​សំណួរ​សំណុំ​ផ្លាស់ប្ដូរ"
 
 msgid "Unexpected format for port number in preference ''{0}''. Got ''{1}''."
 msgstr ""
+"ទ្រង់ទ្រាយ​មិន​រំពឹង​ទុក​សម្រាប់​លេខ​ច្រក​នៅ​ក្នុង​ចំណូលចិត្ត ''{0}'' ។ "
+"បាន​ទទួល ''{1}'' ។"
 
 msgid "The proxy will not be used."
-msgstr ""
+msgstr "នឹង​មិន​ប្រើ​ប្រូកស៊ី​ឡើយ។"
 
 msgid "Illegal port number in preference ''{0}''. Got {1}."
-msgstr ""
+msgstr "លេខ​ច្រក​មិន​ត្រឹមត្រូវ​ក្នុង​ចំណូលចិត្ត ''{0}'' ។ បាន​ទទួល {1} ។"
 
 msgid ""
 "Unexpected value for preference ''{0}'' found. Got ''{1}''. Will use no "
 "proxy."
 msgstr ""
+"បាន​រក​ឃើញ​តម្លៃ​មិន​រំពឹង​សម្រាប់​ចំណូលចិត្ត ''{0}'' ។ បាន​ទទួល ''{1}'' ។ "
+"នឹង​ប្រើ​ដោយ​គ្មាន​ប្រូកស៊ី។"
 
 msgid ""
 "Unexpected parameters for HTTP proxy. Got host ''{0}'' and port ''{1}''."
 msgstr ""
+"ប៉ារ៉ាម៉ែត្រ​មិន​រំពឹង​ទុក​សម្រាប់​ប្រូកស៊ី HTTP ។ បាន​ទទួល​ម៉ាស៊ីន ''{0}'' "
+"និង​ច្រក ''{1}'' ។"
 
 msgid ""
 "Unexpected parameters for SOCKS proxy. Got host ''{0}'' and port ''{1}''."
 msgstr ""
+"ប៉ារ៉ាម៉ែត្រ​មិន​រំពឹង​ទុក​សម្រាប់​ប្រូកស៊ី SOCKS ។ បាន​ទទួល​ម៉ាស៊ីន ''{0}'' "
+"និង​ច្រក ''{1}'' ។"
 
 msgid ""
 "Connection to proxy ''{0}'' for URI ''{1}'' failed. Exception was: {2}"
 msgstr ""
+"ការ​តភ្ជាប់​ទៅ​ប្រូកស៊ី ''{0}'' សម្រាប់ URI ''{1}'' បាន​បរាជ័យ។ "
+"ករណី​លើកលែង​គឺ៖ {2}"
 
 msgid ""
 "The JVM is not configured to lookup proxies from the system settings. The "
 "property ''java.net.useSystemProxies'' was missing at startup time.  Will "
 "not use a proxy."
 msgstr ""
+"JVM "
+"មិន​បាន​កំណត់​រចនាសម្ព័ន្ធ​ដើម្បី​រក​មើល​ប្រូកស៊ី​ពី​ការ​កំណត់​ប្រព័ន្ធ​ទេ។ "
+"លក្ខណសម្បត្តិ ''java.net.useSystemProxies'' គឺ​បាន​បាត់​នៅ​ពេល​ចាប់ផ្ដើម។ "
+"នឹង​ប្រើ​ដោយ​គ្មាន​ប្រូកស៊ី។"
 
 msgid "Parsing response from server..."
-msgstr ""
+msgstr "កំពុង​ញែក​ចម្លើយតប​ពី​ម៉ាស៊ីន​មេ..."
 
 msgid "Unexpected XML element with name ''{0}''"
-msgstr ""
+msgstr "ធាតុ XML មិន​រំពឹង​ទុក​ដែល​មាន​ឈ្មោះ ''{0}''"
 
 msgid "Could not export ''{0}''."
-msgstr ""
+msgstr "មិន​អាច​នាំចេញ ''{0}'' ។"
 
 msgid "Could not import ''{0}''."
-msgstr ""
+msgstr "មិន​អាច​នាំចូល ''{0}'' ។"
 
 msgid "Could not import files."
-msgstr ""
+msgstr "មិន​អាច​នាំចូល​ឯកសារ។"
 
 msgid "<html>Could not read file ''{0}''.<br>Error is:<br>{1}</html>"
-msgstr ""
+msgstr "<html>មិន​អាច​អាន​ឯកសារ ''{0}'' ។<br>កំហុស​គឺ៖<br>{1}</html>"
 
 msgid "<html>Could not read files.<br>Error is:<br>{0}</html>"
-msgstr ""
+msgstr "<html>មិន​អាច​អាន​ឯកសារ។<br>កំហុស​គឺ៖<br>{0}</html>"
 
 msgid "GeoJSON Files"
-msgstr ""
+msgstr "ឯកសារ GeoJSON"
 
 msgid "Layer ''{0}'' not supported"
-msgstr ""
+msgstr "មិន​គាំទ្រ​ស្រទាប់ ''{0}''"
 
 msgid ""
 "Note: GPL is not compatible with the OSM license. Do not upload GPL licensed "
 "tracks."
 msgstr ""
+"ចំណាំ៖ GPL មិន​ឆបគ្នា​ជាមួយ​អាជ្ញាប័ណ្ណ OSM ។ កុំ​ផ្ទុក​ដាន​អាជ្ញាប័ណ្ណ GPL "
+"ឡើង។"
 
 msgid "GPS track description"
-msgstr ""
+msgstr "សេចក្ដី​ពណ៌នា​ដាន GPS"
 
 msgid "Add author information"
-msgstr ""
+msgstr "បន្ថែម​ព័ត៌មាន​អ្នកនិពន្ធ"
 
 msgid "Real name"
 msgstr "ឈ្មោះ​ពិត"
@@ -12795,13 +13165,13 @@ msgid "Predefined"
 msgstr "កំណត់​ជា​មុន"
 
 msgid "Copyright year"
-msgstr ""
+msgstr "ឆ្នាំរក្សាសិទ្ធិ"
 
 msgid "Keywords"
 msgstr "ពាក្យ​គន្លឹះ"
 
 msgid "Export options"
-msgstr ""
+msgstr "ជម្រើស​នាំចេញ"
 
 msgid "Export and Save"
 msgstr "នាំចេញ រូច​ហើយ​រក្សាទុក"
@@ -12810,502 +13180,555 @@ msgid ""
 "Error while exporting {0}:\n"
 "{1}"
 msgstr ""
+"កំហុស​ពេល​នាំចេញ {0} ៖\n"
+"{1}"
 
 msgid "Choose a predefined license"
-msgstr ""
+msgstr "ជ្រើស​អាជ្ញាប័ណ្ណ​កំណត់​មុន"
 
 msgid "GPX Files"
-msgstr ""
+msgstr "ឯកសារ GPX"
 
 msgid "Parsing data for layer ''{0}'' failed"
-msgstr ""
+msgstr "ការ​ញែក​ទិន្នន័យ​សម្រាប់​ស្រទាប់ ''{0}'' បាន​បរាជ័យ"
 
 msgid ""
 "Error occurred while parsing gpx data for layer ''{0}''. Only a part of the "
 "file will be available."
 msgstr ""
+"មាន​កំហុស​ពេល​ញែក​ទិន្នន័យ gpx សម្រាប់​ស្រទាប់ ''{0}'' ។ "
+"នឹង​អាច​រក​បានតែ​ផ្នែក​នៃ​ឯកសារ​ប៉ុណ្ណោះ។"
 
 msgid ""
 "Error occurred while parsing gpx file ''{0}''. Only a part of the file will "
 "be available."
 msgstr ""
+"មាន​កំហុស​ពេល​ញែក​ឯកសារ gpx ''{0}'' ។ "
+"នឹង​អាច​រក​បានតែ​ផ្នែក​នៃ​ឯកសារ​ប៉ុណ្ណោះ។"
 
 msgid "Parse error: invalid document structure for GPX document."
-msgstr ""
+msgstr "កំហុស​ញែក៖ រចនាសម្ព័ន្ធ​ឯកសារ​មិន​ត្រឹមត្រូវ​សម្រាប់​ឯកសារ GPX ។"
 
 msgid "(at line {0}, column {1})"
-msgstr ""
+msgstr "(នៅ​បន្ទាត់​ទី {0}, ជួរឈរ {1})"
 
 msgid "Unknown mode {0}."
-msgstr ""
+msgstr "មិន​ស្គាល់​របៀប {0} ។"
 
 msgid "Image Files"
-msgstr ""
+msgstr "ឯកសារ​រូបភាព"
 
 msgid "folder"
-msgstr ""
+msgstr "ថត"
 
 msgid "Looking for image files"
-msgstr ""
+msgstr "រក​មើល​ឯកសារ​រូបភាព"
 
 msgid "No image files found."
-msgstr ""
+msgstr "រក​មិន​ឃើញ​ឯកសារ​រូបភាព"
 
 msgid "get number of unread messages"
-msgstr ""
+msgstr "យក​សារ​មួយ​ចំនួន​ដែល​មិន​បាន​អាន"
 
 msgid "You have {0} unread message."
 msgid_plural "You have {0} unread messages."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "អ្នក​មាន​សារ​មិនទាន់​អាន {0} ។"
 
 msgid "Click here to see your inbox."
-msgstr ""
+msgstr "ចុច​ទីនេះ​ដើម្បី​មើល​ប្រអប់​ទទួល​របស់​អ្នក។"
 
 msgid "Message notifier"
-msgstr ""
+msgstr "កម្មវិធី​ជូនដំណឹង​សារ"
 
 msgid "{0} not available (offline mode)"
-msgstr ""
+msgstr "{0} មិន​អាច​រក​បាន (របៀប​ក្រៅ​បណ្ដាញ)"
 
 msgid ""
 "No primitive with id {0} in local dataset. Cannot infer primitive type."
 msgstr ""
+"មិន​មាន​ព្រីមីទីវ​ដែល​មាន​លេខ​សម្គាល់ {0} នៅ​ក្នុង​សំណុំ​ទិន្នន័យ។ "
+"មិន​អាច​ស្គាល់​ប្រភេទ​ព្រីមីទីវ។"
 
 msgid "Fetching a package of nodes from ''{0}''"
-msgstr ""
+msgstr "ទៅ​ប្រមូល​កញ្ចប់​តំណ​ពី ''{0}''"
 
 msgid "Fetching a package of ways from ''{0}''"
-msgstr ""
+msgstr "ទៅ​ប្រមូល​កញ្ចប់​ផ្លូវ​ពី ''{0}''"
 
 msgid "Fetching a package of relations from ''{0}''"
-msgstr ""
+msgstr "ទៅ​ប្រមូល​កញ្ចប់​ទំនាក់ទំនង​ពី ''{0}''"
 
 msgid "Downloading {0} object from ''{1}''"
 msgid_plural "Downloading {0} objects from ''{1}''"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ទាញ​យក​វត្ថុ {0} ពី ''{1}''"
 
 msgid ""
 "Server replied with response code 404, retrying with an individual request "
 "for each object."
 msgstr ""
+"ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​ដោយ​កូដ 404, "
+"ឆ្លើយតប​ជាមួយ​សំណើ​ដាច់ដោយឡែក​សម្រាប់​វត្ថុ​នីមួយៗ។"
 
 msgid "Downloading OSM data..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​ទិន្នន័យ OSM..."
 
 msgid "Fetching node with id {0} from ''{1}''"
-msgstr ""
+msgstr "កំពុង​ទៅ​យក​តំណ​ដែល​មាន​លេខ​សម្គាល់ {0} ពី ''{1}''"
 
 msgid "Fetching way with id {0} from ''{1}''"
-msgstr ""
+msgstr "ទៅ​យក​ផ្លូវ​ដែល​មាន​លេខ​សម្គាល់ {0} ពី ''{1}''"
 
 msgid "Fetching relation with id {0} from ''{1}''"
-msgstr ""
+msgstr "ទៅ​យក​ទំនាក់ទំនង​ដែល​មាន​លេខ​សម្គាល់ {0} ពី ''{1}''"
 
 msgid "Server replied with response code 404 for id {0}. Skipping."
 msgstr ""
+"ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​ដោយ​ចម្លើយ​កូដ 404 សម្រាប់​លេខ​សម្គាល់ {0} ។ រំលង។"
 
 msgid "NMEA-0183 Files"
-msgstr ""
+msgstr "ឯកសារ NMEA-0183"
 
 msgid "Coordinates imported: {0}"
-msgstr ""
+msgstr "បាន​នាំចូល​កូអរដោណេ៖ {0}"
 
 msgid "Malformed sentences: {0}"
-msgstr ""
+msgstr "ប្រយោគ​មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "Checksum errors: {0}"
-msgstr ""
+msgstr "កំហុស​ឆេកសាំ៖ {0}"
 
 msgid "Unknown sentences: {0}"
-msgstr ""
+msgstr "មិន​ស្គាល់​ប្រយោគ៖ {0}"
 
 msgid "Zero coordinates: {0}"
-msgstr ""
+msgstr "កូអរដោណេ​សូន្យ៖ {0}"
 
 msgid "NMEA import success:"
-msgstr ""
+msgstr "នាំចូល NMEA ដោយ​ជោគជ័យ៖"
 
 msgid "NMEA import failure!"
-msgstr ""
+msgstr "ការ​នាំចូល NMEA បាន​បរាជ័យ!"
 
 msgid "Note Files"
-msgstr ""
+msgstr "ឯកសារ​ចំណាំ"
 
 msgid "OSM API"
-msgstr ""
+msgstr "OSM API"
 
 msgid "JOSM website"
-msgstr ""
+msgstr "វេបសាយ JOSM"
 
 msgid "Unable to access ''{0}'': {1} not available (offline mode)"
-msgstr ""
+msgstr "មិន​អាច​ចូល​ដំណើរការ ''{0}'' ៖ មិន​មាន {1} (របៀប​គ្មាន​អ៊ីនធឺណិត)"
 
 msgid "Unable to initialize OSM API."
-msgstr ""
+msgstr "មិន​អាច​ចាប់ផ្ដើម OSM API ។"
 
 msgid "This version of JOSM is incompatible with the configured server."
-msgstr ""
+msgstr "កំណែ JOSM នេះ​មិន​ឆបគ្នា​ជាមួយ​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​មេ។"
 
 msgid ""
 "It supports protocol version 0.6, while the server says it supports {0} to "
 "{1}."
 msgstr ""
+"វា​គាំទ្រ​ពិធីការ​កំណែ 0.6, ខណៈ​ដែល​ម៉ាស៊ីន​មេ​និយាយ​ថា​វា​គាំទ្រ​កំណែ {0} "
+"ដល់ {1} ។"
 
 msgid "Removed layer {0} because it is not allowed by the configured API."
-msgstr ""
+msgstr "យក​ស្រទាប់ {0} ចេញ ព្រោះ​វា​មិន​បាន​អនុញ្ញាត​ដោយ​រចនាសម្ព័ន្ធ API ។"
 
 msgid "Unexpected format of ID replied by the server. Got ''{0}''."
 msgstr ""
+"ទ្រង់ទ្រាយ​មិន​រំពឹង​ទុក​របស់​លេខ​សម្គាល់​ដែល​បាន​ឆ្លើយតប​ដោយ​ម៉ាស៊ីន​មេ។ "
+"បាន​ទទួល ''{0}'' ។"
 
 msgid ""
 "Unexpected format of new version of modified primitive ''{0}''. Got ''{1}''."
 msgstr ""
+"ទ្រង់ទ្រាយ​មិន​រំពឹង​ទុក​នៃ​កំណែ​ថ្មី​របស់​ព្រីមីទីវ​ដែល​បាន​កែ ''{0}'' ។ "
+"បាន​ទទួល ''{1}'' ។"
 
 msgid "Creating changeset..."
-msgstr ""
+msgstr "កំពុង​បង្កើត​សំណុំ​ផ្លាស់ប្ដូរ..."
 
 msgid "Successfully opened changeset {0}"
-msgstr ""
+msgstr "បាន​បើក​សំណុំ​ផ្លាស់ប្ដូរ {0} ដោយ​ជោគជ័យ"
 
 msgid "Changeset ID > 0 expected. Got {0}."
-msgstr ""
+msgstr "លេខ​សម្គាល់​សំណុំ​ផ្លាស់ប្ដូរ > 0 ដែល​បាន​រំពឹង​ទុក។ បាប​ទទួល {0} ។"
 
 msgid "Updating changeset..."
-msgstr ""
+msgstr "កំពុង​ធ្វើ​បច្ចុប្បន្នភាព​សំណុំ​ផ្លាស់ប្ដូរ..."
 
 msgid "Updating changeset {0}..."
-msgstr ""
+msgstr "កំពុង​ធ្វើ​បច្ចុប្បន្នភាព​សំណុំ​ផ្លាស់ប្ដូរ {0}..."
 
 msgid "Closing changeset..."
-msgstr ""
+msgstr "កំពុង​បិទ​សំណុំ​ផ្លាស់ប្ដូរ..."
 
 msgid "No changeset present for diff upload."
-msgstr ""
+msgstr "មិន​មាន​សំណុំ​ផ្លាស់ប្ដូរ​សម្រាប់​ការ​ផ្ទុក​ឡើង diff ។"
 
 msgid "Preparing upload request..."
-msgstr ""
+msgstr "កំពុង​រៀបចំ​ការ​ផ្ទុក​សំណើ​ឡើង..."
 
 msgid "Waiting 10 seconds ... "
-msgstr ""
+msgstr "កំពុង​រង់ចាំ​១០​វិនាទី... "
 
 msgid "Starting retry {0} of {1} in {2} seconds ..."
-msgstr ""
+msgstr "ចាប់ផ្ដើម​ព្យាយាម​ម្ដងទៀត {0} នៃ {1} ក្នុង​រយៈពេល {2} វិនាទី..."
 
 msgid "OK - trying again."
-msgstr ""
+msgstr "ល្អ! ព្យាយាម​ម្ដងទៀត។"
 
 msgid "Starting retry {0} of {1}."
-msgstr ""
+msgstr "ចាប់ផ្ដើម​ព្យាយាម​ម្ដងទៀត {0} នៃ {1} ។"
 
 msgid "Current changeset is null. Cannot upload data."
 msgstr ""
+"សំណុំ​ផ្លាស់ប្ដូរ​បច្ចុប្បន្ន​គឺ​មិន​មាន។ មិន​អាច​ផ្ទុក​ទិន្នន័យ​ឡើង។"
 
 msgid "ID of current changeset > 0 required. Current ID is {0}."
 msgstr ""
+"លេខ​សម្គាល់​សំណុំ​ផ្លាស់ប្ដូរ​បច្ចុប្បន្ន > 0 ដែល​បាន​ទាមទារ។ "
+"លេខ​សម្គាល់​បច្ចុប្បន្ន​គឺ {0} ។"
 
 msgid "Open changeset expected. Got closed changeset with id {0}."
 msgstr ""
+"បាន​រំពឹង​ថា​បើក​សំណុំ​ផ្លាស់ប្ដូរ។ "
+"បាន​ទទួល​សំណុំ​ផ្លាស់ប្ដូរ​បិទ​ដែល​មាន​លេខ​សម្គាល់ {0} ។"
 
 msgid "Note upload failed"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​ចំណាំ​ឡើង"
 
 msgid "Error parsing note response from server"
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ញែក​ចំណាំ​ពី​ម៉ាស៊ីន​មេ"
 
 msgid "Error encoding string: {0}"
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ដាក់​លេខ​កូដ​ឃ្លា៖ {0}"
 
 msgid "(Code={0})"
-msgstr ""
+msgstr "(កូដ={0})"
 
 msgid "The server replied an error with code {0}."
-msgstr ""
+msgstr "ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប​កំហុស​ដែល​មាន​កូដ {0} ។"
 
 msgid "OSM Server Files bzip2 compressed"
-msgstr ""
+msgstr "ឯកសារ​ម៉ាស៊ីន​មេ OSM bzip2 បាន​បង្ហាប់"
 
 msgid "Prolog of OsmChange document already written. Please write only once."
 msgstr ""
+"ឯកសារ Prolog របស់ OsmChange បាន​សរសេរ​រួចរាល់។ សូម​សរសេរ​តែ​ម្ដង​បាន​ហើយ។"
 
 msgid "Prolog of OsmChange document not written yet. Please write first."
 msgstr ""
+"ឯកសារ Prolog របស់ OsmChange មិនទាន់​បាន​សរសេរ​ទេ។ សូម​សរសេរ​ជាមុន​សិន។"
 
 msgid "OsmChange File"
-msgstr ""
+msgstr "ឯកសារ OsmChange"
 
 msgid "File ''{0}'' does not exist."
-msgstr ""
+msgstr "មិន​មាន​ឯកសារ ''{0}'' ។"
 
 msgid "No data found in file {0}."
-msgstr ""
+msgstr "រក​មិន​ឃើញ​ទិន្នន័យ​នៅ​ក្នុង​ឯកសារ {0} ។"
 
 msgid "Open OsmChange file"
-msgstr ""
+msgstr "បើក​ឯកសារ OsmChange"
 
 msgid "Unsupported version: {0}"
-msgstr ""
+msgstr "មិន​គាំទ្រ​កំណែ៖ {0}"
 
 msgid ""
 "Unsupported start element ''{0}'' in changeset content at position "
 "({1},{2}). Skipping."
 msgstr ""
+"មិន​គាំទ្រ​ធាតុ​ចាប់ផ្ដើម ''{0}'' ក្នុង​មាតិកា​សំណុំ​ផ្លាស់ប្ដូរ​នៅ​ទីតាំង "
+"({1},{2}) ។ រំលង។"
 
 msgid ""
 "Illegal document structure. Found node, way, or relation outside of "
 "''create'', ''modify'', or ''delete''."
 msgstr ""
+"រចនាសម្ព័ន្ធ​ឯកសារ​មិន​ត្រឹមត្រូវ។ បាន​រក​ឃើញ​តំណ ផ្លូវ ឬ​ទំនាក់ទំនង​នៅ​ក្រៅ "
+"''បង្កើត'', ''កែប្រែ'', ឬ ''លុប'' ។"
 
 msgid ""
 "Unsupported end element ''{0}'' in changeset content at position ({1},{2}). "
 "Skipping."
 msgstr ""
+"មិន​គាំទ្រ​ធាតុ​ចុង ''{0}'' ក្នុង​មាតិកា​សំណុំ​ផ្លាស់ប្ដូរ​នៅ​ទីតាំង "
+"({1},{2}) ។ រំលង។"
 
 msgid "Parsing changeset content ..."
-msgstr ""
+msgstr "កំពុង​ញែក​មាតិកា​សំណុំ​ផ្លាស់ប្ដូរ..."
 
 msgid "Illegal boolean value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
+"តម្លៃ​ប៊ូលីន​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
 msgid "Illegal value for attribute ''{0}''. Got ''{1}''."
-msgstr ""
+msgstr "តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
 msgid "Illegal numeric value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
+"តម្លៃ​លេខ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
 msgid "Missing mandatory attribute ''{0}'' of XML element {1}."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' នៃ​ធាតុ XML {1} ។"
 
 msgid "Undefined element ''{0}'' found in input stream. Aborting."
-msgstr ""
+msgstr "មិន​បាន​កំណត់​ធាតុ ''{0}'' ដែល​បាន​រក​ឃើញ​នៅ​ក្នុង​ស្ទ្រីម។ បោះបង់។"
 
 msgid "Parsing list of changesets..."
-msgstr ""
+msgstr "កំពុង​ញែក​បញ្ជី​សំណុំ​ផ្លាស់ប្ដូ..."
 
 msgid "Failed to sign a HTTP connection with an OAuth Authentication header"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ចុះហត្ថលេខា​ការ​តភ្ជាប់ HTTP "
+"ជាមួយ​បឋមកថា​ការ​ផ្ទៀងផ្ទាត់ OAuth"
 
 msgid "Unexpected value for preference ''{0}''. Got ''{1}''."
-msgstr ""
+msgstr "តម្លៃ​មិន​រំពឹង​ទុក​សម្រាប់​ចំណូលចិត្ត ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
 msgid "<html>An error occurred while saving.<br>Error is:<br>{0}</html>"
-msgstr ""
+msgstr "<html>កំហុស​បាន​កើតឡើង​ពេល​រក្សាទុក។<br>កំហុស​គឺ៖<br>{0}</html>"
 
 msgid ""
 "<html>An error occurred while restoring backup file.<br>Error "
 "is:<br>{0}</html>"
 msgstr ""
+"<html>កំហុស​បាន​កើតឡើង​ពេល​ស្ដារ​ឯកសារ​បម្រុងទុក។<br>កំហុស​គឺ៖<br>{0}</html>"
 
 msgid "OSM Server Files gzip compressed"
-msgstr ""
+msgstr "ឯកសារ​ម៉ាស៊ីន​មេ OSM gzip បាន​បង្ហាប់"
 
 msgid "Parsing OSM history data ..."
-msgstr ""
+msgstr "កំពុង​ញែក​ទិន្នន័យ​ប្រវត្តិ OSM ..."
 
 msgid "OSM Server Files"
-msgstr ""
+msgstr "ឯកសារ​ម៉ាស៊ីន​មេ OSM"
 
 msgid "Invalid dataset"
-msgstr ""
+msgstr "សំណុំ​ទិន្នន័យ​មិន​ត្រឹមត្រូវ"
 
 msgid "No data found for layer ''{0}''."
-msgstr ""
+msgstr "រក​មិន​ឃើញ​ទិន្នន័យ​សម្រាប់​ស្រទាប់ ''{0}'' ។"
 
 msgid "No data found in file ''{0}''."
-msgstr ""
+msgstr "រក​មិន​ឃើញ​ទិន្នន័យ​នៅ​ក្នុង​ឯកសារ ''{0}'' ។"
 
 msgid "Open OSM file"
-msgstr ""
+msgstr "បើក​ឯកសារ OSM"
 
 msgid "Reading was canceled"
-msgstr ""
+msgstr "បាន​បោះបង់​ការ​អាន"
 
 msgid ""
 "Missing mandatory attributes on element ''bounds''. Got "
 "minlon=''{0}'',minlat=''{1}'',maxlon=''{3}'',maxlat=''{4}'', origin=''{5}''."
 msgstr ""
+"បាត់​គុណ​លក្ខណៈ​ចាំបាច់​នៅ​លើ​ធាតុ ''bounds''. Got "
+"minlon=''{0}'',minlat=''{1}'',maxlon=''{3}'',maxlat=''{4}'', origin=''{5}'' ។"
 
 msgid "Deleted way {0} contains nodes"
-msgstr ""
+msgstr "បាន​លុប​ផ្លូវ {0} មាន​តំណ"
 
 msgid "Missing mandatory attribute ''{0}'' on <nd> of way {1}."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ចាំបាច់ ''{0}'' នៅ​លើ <nd> នៃ​ផ្លូវ {1} ។"
 
 msgid "Illegal value of attribute ''ref'' of element <nd>. Got {0}."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​នៃ​គុណ​លក្ខណៈ ''ref'' របស់​ធាតុ <nd> ។ បាន​ទទួល {0} ។"
 
 msgid "Deleted relation {0} contains members"
-msgstr ""
+msgstr "លុប​ទំនាក់ទំនង {0} មាន​សមាជិក"
 
 msgid "Missing attribute ''ref'' on member in relation {0}."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ ''ref'' នៅ​លើ​សមាជិក​ក្នុង​ទំនាក់ទំនង {0} ។"
 
 msgid ""
 "Illegal value for attribute ''ref'' on member in relation {0}. Got {1}"
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''ref'' "
+"នៅ​លើ​សមាជិក​ក្នុង​ទំនាក់ទំនង {0} ។ បាន​ទទួល {1}"
 
 msgid "Missing attribute ''type'' on member {0} in relation {1}."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ ''ប្រភេទ'' នៅ​លើ​សមាជិក {0} ក្នុង​ទំនាក់ទំនង {1} ។"
 
 msgid ""
 "Illegal value for attribute ''type'' on member {0} in relation {1}. Got {2}."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''ប្រភេទ'' នៅ​លើ​សមាជិក {0} "
+"ក្នុង​ទំនាក់ទំនង {1} ។ បាន​ទទួល {2} ។"
 
 msgid "Incomplete <member> specification with ref=0"
-msgstr ""
+msgstr "ការ​បញ្ជាក់ <សមាជិក> មិន​បញ្ចប់​ដែល​មាន ref=0"
 
 msgid "Missing key or value attribute in tag."
-msgstr ""
+msgstr "បាត់​ពាក្យ​គន្លឹះ ឬ​តម្លៃ​គុណ​លក្ខណៈ​នៅ​ក្នុង​ស្លាក។"
 
 msgid "Undefined element ''{0}'' found in input stream. Skipping."
-msgstr ""
+msgstr "បាន​រក​ឃើញ​ធាតុ​មិន​ទាន់​កំណត់ ''{0}'' នៅ​ក្នុង​ស្ទ្រីម។ រំលង។"
 
 msgid "Illegal object with ID=0."
-msgstr ""
+msgstr "វត្ថុ​មិន​ត្រឹមត្រូវ​ដែល​មាន​លេខ​សម្គាល់=០ ។"
 
 msgid ""
 "Illegal value for attribute ''version'' on OSM primitive with ID {0}. Got "
 "{1}."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''កំណែ'' នៅ​លើ​ព្រីមីទីវ OSM "
+"ដែល​មាន​លេខ​សម្គាល់ {0} ។ បាន​ទទួល {1} ។"
 
 msgid ""
 "Normalizing value of attribute ''version'' of element {0} to {2}, API "
 "version is ''{3}''. Got {1}."
 msgstr ""
+"តម្លៃ​ធម្មតា​នៃ​គុណ​លក្ខណៈ ''កំណែ'' របស់​ធាតុ {0} ទៅ {2}, កំណែ API គឺ "
+"''{3}'' ។ បាន​ទទួល {1} ។"
 
 msgid "Unknown or unsupported API version. Got {0}."
-msgstr ""
+msgstr "មិន​ស្គាល់ ឬ​មិន​គាំទ្រ​កំណែ API ។ បាន​ទទួល {0} ។"
 
 msgid "Missing attribute ''version'' on OSM primitive with ID {0}."
 msgstr ""
+"បាត់​គុណ​លក្ខណៈ ''កំណែ'' នៅ​លើ​ព្រីមីទីវ OSM ដែល​មាន​លេខ​សម្គាល់ {0} ។"
 
 msgid ""
 "Illegal value for attribute ''changeset'' on new object {1}. Got {0}. "
 "Resetting to 0."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''សំណុំ​ផ្លាស់ប្ដូរ'' "
+"នៅ​លើ​វត្ថុ​ថ្មី {1} ។ បាន​ទទួល {0} ។ កំណត់​ឡើងវិញ​ទៅ ០។"
 
 msgid "Illegal value for attribute ''changeset''. Got {0}."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''សំណុំ​ផ្លាស់ប្ដូរ'' ។ បាន​ទទួល {0} "
+"។"
 
 msgid "Missing required attribute ''{0}''."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ដែល​ទាមទារ ''{0}'' ។"
 
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
+"តម្លៃ long មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "បាន​អាន {0} បៃ"
 
 msgid "Prepare OSM data..."
-msgstr ""
+msgstr "កំពុង​រៀបចំ​ទិន្នន័យ OSM..."
 
 msgid "Parsing OSM data..."
-msgstr ""
+msgstr "កំពុង​ញែក​ទិន្នន័យ OSM..."
 
 msgid "Preparing data set..."
-msgstr ""
+msgstr "កំពុង​រៀបចំ​សំណុំ​ទិន្នន័យ..."
 
 msgid "Line {0} column {1}: "
-msgstr ""
+msgstr "បន្ទាត់​ទី {0} ជួរឈរ​ទី {1} ៖ "
 
 msgid "Downloading referring ways ..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​ផ្លូវ​យោង..."
 
 msgid "Downloading referring relations ..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​ទំនាក់ទំនង​យោង..."
 
 msgid "Reading changesets..."
-msgstr ""
+msgstr "កំពុង​អាន​សំណុំ​ទិន្នន័យ..."
 
 msgid "Downloading changesets ..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​សំណុំ​ផ្លាស់ប្ដូរ..."
 
 msgid "Reading changeset {0} ..."
-msgstr ""
+msgstr "កំពុង​អាន​សំណុំ​ផ្លាស់ប្ដូរ {0} ..."
 
 msgid "Downloading changeset {0} ..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​សំណុំ​ផ្លាស់ប្ដូរ {0} ..."
 
 msgid "Downloading {0} changeset ..."
 msgid_plural "Downloading {0} changesets ..."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "កំពុង​ទាញ​យក​សំណុំ​ផ្លាស់ប្ដូរ {0} ..."
 
 msgid "({0}/{1}) Downloading changeset {2} ..."
-msgstr ""
+msgstr "({0}/{1}) កំពុង​ទាញ​យក​សំណុំ​ផ្លាស់ប្ដូរ {2} ..."
 
 msgid "Downloading content for changeset {0} ..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​មាតិកា​សម្រាប់​សំណុំ​ផ្លាស់ប្ដូរ {0} ..."
 
 msgid "Downloading history..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​ប្រវត្តិ..."
 
 msgid "Contacting Server..."
-msgstr ""
+msgstr "កំពុង​ទាក់ទង​ទៅ​ម៉ាស៊ីន​មេ..."
 
 msgid "Downloading OSM notes..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​តំណ OSM..."
 
 msgid "Failed to open connection to API {0}."
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​បើក​តំណ​ភ្ជាប់​ទៅ API {0} ។"
 
 msgid ""
 "Could not connect to the OSM server. Please check your internet connection."
 msgstr ""
+"មិន​អាច​តភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ OSM ។ "
+"សូម​ពិនិត្យមើល​ការ​តភ្ជាប់​អ៊ីនធឺណិត​របស់​អ្នក។"
 
 msgid "Reading error text failed."
-msgstr ""
+msgstr "ការ​អាន​អត្ថបទ​កំហុស​បាន​បរាជ័យ។"
 
 msgid "XML tag <user> is missing."
-msgstr ""
+msgstr "ស្លាក XML <user> គឺ​បាត់។"
 
 msgid "Missing attribute ''{0}'' on XML tag ''{1}''."
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ ''{0}'' នៅ​លើ​ស្លាក XML ''{1}'' ។"
 
 msgid "Illegal value for attribute ''{0}'' on XML tag ''{1}''. Got {2}."
 msgstr ""
+"តម្លៃ​មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' នៅ​លើ​ស្លាក XML ''{1}'' "
+"បាន​ទទួល {2} ។"
 
 msgid "Reading user info ..."
-msgstr ""
+msgstr "កំពុង​អាន​ទិន្នន័យ​អ្នកប្រើ..."
 
 msgid "Starting to upload with one request per primitive ..."
-msgstr ""
+msgstr "កំពុង​ចាប់ផ្ដើម​ផ្ទុក​ឡើង​ដោយ​សំណើ​មួយ​ក្នុង​មួយ​ព្រីមីទីវ..."
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"
-msgstr ""
+msgstr "{0}% ({1}/{2}), នៅសល់ {3} ។ កំពុង​ផ្ទុក​ឡើង​តំណ ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"
-msgstr ""
+msgstr "{0}% ({1}/{2}), នៅសល់ {3} ។ កំពុង​ផ្ទុក​ឡើង​ផ្លូវ ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"
-msgstr ""
+msgstr "{0}% ({1}/{2}), នៅសល់ {3} កំពុង​ផ្ទុក​ឡើង​តំណ ''{4}'' (id: {5})"
 
 msgid "Starting to upload in one request ..."
-msgstr ""
+msgstr "កំពុង​ចាប់ផ្ដើម​ផ្ទុក​ឡើង​សំណើ​មួយ..."
 
 msgid "Value >0 expected for parameter ''{0}'', got {1}"
 msgstr ""
+"តម្លៃ >0 ដែល​បាន​រំពឹង​ទុក​សម្រាប់​ប៉ារ៉ាម៉ែត្រ ''{0}'', បាន​ទទួល {1}"
 
 msgid "Starting to upload in chunks..."
-msgstr ""
+msgstr "កំពុង​ចាប់ផ្ដើម​ផ្ទុក​កំណាត់​ឡើង..."
 
 msgid "({0}/{1}) Uploading {2} object..."
 msgid_plural "({0}/{1}) Uploading {2} objects..."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "({0}/{1}) កំពុង​ផ្ទុក​ឡើង​វត្ថុ {2}..."
 
 msgid "Uploading data ..."
-msgstr ""
+msgstr "កំពុង​ផ្ទុក​ទិន្នន័យ​ឡើង..."
 
 msgid "Unexpected id 0 for osm primitive found"
-msgstr ""
+msgstr "បាន​រក​ឃើញ​លេខ​សម្គាល់ 0 មិន​រំពឹង​ទុក​សម្រាប់​ព្រីមីទីវ osm"
 
 msgid "OSM Server Files zip compressed"
-msgstr ""
+msgstr "បាន​បង្ហាប់​ឯកសារ​ម៉ាស៊ីន​មេ OSM ហ្ស៊ីប"
 
 msgid "WMS Files (*.wms)"
-msgstr ""
+msgstr "ឯកសារ WMS (*.wms)"
 
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
@@ -13313,376 +13736,433 @@ msgid ""
 "transferred <strong>unencrypted</strong> in every request sent to the OSM "
 "server. <strong>Do not use a valuable password.</strong></p></body></html>"
 msgstr ""
+"<html><body><p class=\"warning-body\"><strong>Warning:</strong> "
+"ពាក្យសម្ងាត់​ត្រូវ​បាន​ផ្ទុក​ជា​អត្ថបទ​ធម្មតា​នៅ​ក្នុង​ឯកសារ​ចំណូលចិត្ត JOSM "
+"។ ម្យ៉ាងទៀត វា​ត្រូវ​បាន​ផ្ទេរ​ពាក្យសម្ងាត់ "
+"<strong>ដែល​មិន​បាន​ដាក់​លេខ​កូដ</strong> "
+"នៅ​រាល់​សំណើ​ដែល​បាន​ផ្ញើ​ទៅ​ម៉ាស៊ីន​មេ OSM ។ "
+"<strong>កុំ​ប្រើ​ពាក្យ​សម្ងាត់​ដែល​មាន​តម្លៃ។</strong></p></body></html>"
 
 msgid "Save user and password (unencrypted)"
-msgstr ""
+msgstr "រក្សាទុក​អ្នកប្រើ និង​ពាក្យសម្ងាត់ (មិន​បាន​ដាក់​លេខ​កូដ)"
 
 msgid "<delete from {0} objects>"
-msgstr ""
+msgstr "<លុប​ចេញពី​វត្ថុ {0}>"
 
 msgid "Old values of"
-msgstr ""
+msgstr "តម្លៃ​ចាស់​របស់"
 
 msgid "Add tags to selected objects"
-msgstr ""
+msgstr "បន្ថែម​ស្លាក​ទៅ​វត្ថុ​ដែល​បាន​ជ្រើស"
 
 msgid "Add selected tags"
-msgstr ""
+msgstr "បន្ថែម​ស្លាក​ដែល​បាន​ជ្រើស"
 
 msgid "Add all tags"
-msgstr ""
+msgstr "បន្ថែម​ស្លាក​ទាំងអស់"
 
 msgid "Add checked tags to selected objects"
-msgstr ""
+msgstr "បន្ថែម​ស្លាក​ដែល​បាន​ធីក ទៅ​វត្ថុ​ដែល​បាន​ជ្រើស"
 
 msgid "Shift+Enter: Add all tags to selected objects"
-msgstr ""
+msgstr "Shift+Enter: បន្ថែម​ស្លាក​ទាំងអស់​ទៅ​វត្ថុ​ដែល​បាន​ជ្រើស"
 
 msgid "Assume"
-msgstr ""
+msgstr "សន្មត"
 
 msgid "Existing values"
-msgstr ""
+msgstr "តម្លៃ​មាន​ស្រាប់"
 
 msgid "Enable the checkbox to accept the value"
-msgstr ""
+msgstr "បើក​ប្រអប់​ធីក​ដើម្បី​ព្រម​ទទួល​តម្លៃ"
 
 msgid "Accept all tags from {0} for this session"
-msgstr ""
+msgstr "ព្រម​ទទួល​ស្លាក​ទាំងអស់​ពី {0} សម្រាប់​សម័យ​នេះ"
 
 msgid "Load data from API"
-msgstr ""
+msgstr "ផ្ទុក​ទិន្នន័យ​ពី API"
 
 msgid "Import data from URL"
-msgstr ""
+msgstr "នាំចូល​ទិន្នន័យ​ពី URL"
 
 msgid "Open local files"
-msgstr ""
+msgstr "បើក​ឯកសារ​មូលដ្ឋាន"
 
 msgid "Load imagery layers"
-msgstr ""
+msgstr "ផ្ទុក​ស្រទាប់​រូបភាព"
 
 msgid "Change the selection"
-msgstr ""
+msgstr "ប្ដូរ​ជម្រើស"
 
 msgid "Change the viewport"
-msgstr ""
+msgstr "ប្ដូរ​ផ្ទៃ​មើល"
 
 msgid "Create new objects"
-msgstr ""
+msgstr "បង្កើត​វត្ថុ​ថ្មី"
 
 msgid "Read protocol version"
-msgstr ""
+msgstr "អាន​កំណែ​ពិធីការ"
 
 msgid "Cannot start remotecontrol server on port {0}: {1}"
-msgstr ""
+msgstr "មិន​អាច​ចាប់ផ្ដើម​ម៉ាស៊ីន​មេ​គ្រប់គ្រង​ពី​ចម្ងាយ​នៅ​លើ​ច្រក {0}: {1}"
 
 msgid "RemoteControl::Accepting connections on {0}:{1}"
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ៖ ព្រម​ទទួល​ការ​តភ្ជាប់​នៅ​លើ {0}:{1}"
 
 msgid "RemoteControl::Server stopped."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ៖ ម៉ាស៊ីន​មេ​បាន​ឈប់។"
 
 msgid "Cannot start remotecontrol https server on port {0}: {1}"
 msgstr ""
+"មិន​អាច​ចាប់ផ្ដើម​ម៉ាស៊ីន​មេ https គ្រប់គ្រង​ពី​ចម្ងាយ​នៅ​លើ​ច្រក {0}: {1}"
 
 msgid "Unable to initialize Remote Control HTTPS Server"
-msgstr ""
+msgstr "មិន​អាច​ចាប់ផ្ដើម​ម៉ាស៊ីន​មេ HTTPS គ្រប់គ្រង​ពី​ចម្ងាយ"
 
 msgid "RemoteControl::Accepting secure connections on {0}:{1}"
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ៖ ព្រម​ទទួល​ការ​តភ្ជាប់​សុវត្ថិភាព​នៅ​លើ {0}:{1}"
 
 msgid "RemoteControl::Server (https) stopped."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ៖ ម៉ាស៊ីន​មេ (https) បាន​ឈប់។"
 
 msgid "Remote Control has been asked to create a new node."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​ឲ្យ​បង្កើត​តំណ​ថ្មី។"
 
 msgid "There is no layer opened to add node"
-msgstr ""
+msgstr "មិន​មាន​ស្រទាប់​ដែល​បាន​បើក​ដើម្បី​បន្ថែម​តំណ"
 
 msgid "Remote Control has been asked to create a new way."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​បង្កើត​ផ្លូវ​ថ្មី។"
 
 msgid "Invalid coordinates: {0}"
-msgstr ""
+msgstr "កូអរដោណេ​មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "There is no layer opened to add way"
-msgstr ""
+msgstr "មិន​មាន​ស្រទាប់​ដែល​បាន​បើក​ដើម្បី​បន្ថែម​ផ្លូវ"
 
 msgid "Add way"
-msgstr ""
+msgstr "បន្ថែម​ផ្លូវ"
 
 msgid ""
 "Remote Control has been asked to report its supported features. This enables "
 "web sites to guess a running JOSM version"
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​រាយការណ៍​លក្ខណៈ​គាំទ្រ​របស់​វា។ "
+"វា​នឹង​បើក​តំបន់​បណ្ដាញ​ដើម្បី​ស្មាន​កំណែ JOSM ដែល​កំពុង​ដំណើរការ"
 
 msgid ""
 "Remote Control has been asked to load an imagery layer from the following "
 "URL:"
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​ផ្ទុក​ស្រទាប់​រូបភាព​ពី URL "
+"ដូច​ខាងក្រោម៖"
 
 msgid "Remote imagery"
-msgstr ""
+msgstr "រូបភាព​ពី​ចម្ងាយ"
 
 msgid "Remote Control has been asked to import data from the following URL:"
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​នាំចូល​ទិន្នន័យ​ពី URL ដូច​ខាងក្រោម៖"
 
 msgid "Remote Control has been asked to load data from the API."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​ផ្ទុក​ទិន្នន័យ​ពី API ។"
 
 msgid "The latitudes must be between {0} and {1}"
-msgstr ""
+msgstr "រយៈទទឹង​ត្រូវតែ​នៅ​ចន្លោះ​រវាង {0} និង {1}"
 
 msgid "The longitudes must be between {0} and {1}"
-msgstr ""
+msgstr "រយៈបណ្ដោយ​ត្រូវតែ​នៅ​ចន្លោះ​រវាង {0} និង {1}"
 
 msgid "The minima must be less than the maxima"
-msgstr ""
+msgstr "អប្បបរមា​ត្រូវតែ​តិច​ជាង​អតិបរមា"
 
 msgid "Remote Control has been asked to load the following data:"
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​ផ្ទុក​ទិន្នន័យ​ដូច​ខាងក្រោម៖"
 
 msgid "Loading data"
-msgstr ""
+msgstr "ផ្ទុក​ទិន្នន័យ"
 
 msgid ""
 "Remote Control has been asked to load objects (specified by their id) from "
 "the API."
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​ផ្ទុក​វត្ថុ "
+"(បញ្ជាក់​ដោយ​លេខ​សម្គាល់​របស់​វា) ពី API ។"
 
 msgid "Remote Control has been asked to open a local file."
-msgstr ""
+msgstr "ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​បើក​ឯកសារ​មូលដ្ឋាន។"
 
 msgid "Do you want to allow this?"
-msgstr ""
+msgstr "តើ​អ្នក​ចង់​អនុញ្ញាត​វា​ឬ?"
 
 msgid "Confirm Remote Control action"
-msgstr ""
+msgstr "បញ្ជាក់​សកម្មភាព​គ្រប់គ្រង​ពី​ចម្ងាយ"
 
 msgid ""
 "Remote Control has been asked to report its protocol version. This enables "
 "web sites to detect a running JOSM."
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​បាន​ស្នើ​សុំ​រាយការណ៍​កំណែ​ពិធីការ​របស់​វា។ "
+"វា​នឹង​បើក​តំបន់​បណ្ដាញ​ដើម្បី​លុប JOSM ដែល​កំពុង​ដំណើរការ។"
 
 msgid ""
 "Version ''{0}'' of meta data for geoimage layer is not supported. Expected: "
 "0.1"
 msgstr ""
+"កំណែ ''{0}'' "
+"របស់​ទិន្នន័យ​មេតា​សម្រាប់​ស្រទាប់​រូបភាព​ភូមិសាស្ត្រ​មិន​បាន​គាំទ្រ។ "
+"បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid "Data:"
-msgstr ""
+msgstr "ទិន្នន័យ៖"
 
 msgid "local file"
-msgstr ""
+msgstr "ឯកសារ​មូលដ្ឋាន"
 
 msgid "Link to a GPX file on your local disk."
-msgstr ""
+msgstr "តភ្ចាប់​ទៅ​ឯកសារ GPX នៅ​លើ​ថាស​មូលដ្ឋាន​របស់​អ្នក។"
 
 msgid "include"
-msgstr ""
+msgstr "រួមបញ្ចូល"
 
 msgid "Include GPX data in the .joz session file."
-msgstr ""
+msgstr "រួមបញ្ចូល​ទិន្នន័យ GPX នៅ​ក្នុង​ឯកសារ​សម័យ .joz ។"
 
 msgid "No file association"
-msgstr ""
+msgstr "មិន​មាន​ឯកសារ​ពាក់ព័ន្ធ"
 
 msgid "GPX data will be included in the session file."
-msgstr ""
+msgstr "ទិន្នន័យ GPX នឹង​ត្រូវ​បាន​រួមបញ្ចូល​នៅ​ក្នុង​ឯកសារ​សម័យ។"
 
 msgid ""
 "Version ''{0}'' of meta data for gpx track layer is not supported. Expected: "
 "0.1"
 msgstr ""
+"កំណែ ''{0}'' នៃ​ទិន្នន័យ​មេតា​សម្រាប់​ស្រទាប់​ដាន gpx មិន​បាន​គាំទ្រ។ "
+"បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid "File name expected for layer no. {0}"
-msgstr ""
+msgstr "ឈ្មោះ​ឯកសារ​ដែល​បា​នរំពឹង​ទុក​សម្រាប់​ស្រទាប់។ {0}"
 
 msgid ""
 "Version ''{0}'' of meta data for imagery layer is not supported. Expected: "
 "0.1"
 msgstr ""
+"កំណែ ''{0}'' របស់​ទិន្នន័យ​មេតា​សម្រាប់​ស្រទាប់​រូបភាព​គឺ​មិន​បាន​គាំទ្រ។ "
+"បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid ""
 "Version ''{0}'' of meta data for marker layer is not supported. Expected: 0.1"
 msgstr ""
+"កំណែ ''{0}'' "
+"របស់​ទិន្នន័យ​មេតា​សម្រាប់​ស្រទាប់​កម្មវិធី​ចំណាំ​គឺ​មិន​បាន​គាំទ្រ។ "
+"បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid "Layer contains unsaved data - save to file."
-msgstr ""
+msgstr "ស្រទាប់​មាន​ទិន្នន័យ​មិន​ទាន់​រក្សាទុក - រក្សាទុក​ទៅ​ឯកសារ។"
 
 msgid "Layer does not contain unsaved data."
-msgstr ""
+msgstr "ស្រទាប់​មិន​មាន​ទិន្នន័យ​ដែល​មិន​បាន​រក្សាទុក​ទេ។"
 
 msgid "Link to a OSM data file on your local disk."
-msgstr ""
+msgstr "តភ្ជាប់​ទៅ​ឯកសារ​ទិន្នន័យ OSM នៅ​លើ​ថាស​មូលដ្ឋាន​របស់​អ្នក។"
 
 msgid "Include OSM data in the .joz session file."
-msgstr ""
+msgstr "រួម​បញ្ចូល​ទិន្នន័យ OSM នៅ​ក្នុង​ឯកសារ​សម័យ .joz ។"
 
 msgid "OSM data will be included in the session file."
-msgstr ""
+msgstr "ទិន្នន័យ OSM នឹង​ត្រូវ​បាន​រួមបញ្ចូល​នៅ​ក្នុង​ឯកសារ​សម័យ។"
 
 msgid ""
 "Version ''{0}'' of meta data for osm data layer is not supported. Expected: "
 "0.1"
 msgstr ""
+"កំណែ ''{0}'' របស់​ទិន្នន័យ​មេតា​សម្រាប់​ស្រទាប់​ទិន្នន័យ osm "
+"គឺ​មិន​បាន​គាំទ្រ។ បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid "Session file (*.jos, *.joz)"
-msgstr ""
+msgstr "ឯកសារ​សម័យ (*.jos, *.joz)"
 
 msgid "Unable to locate file  ''{0}''."
-msgstr ""
+msgstr "មិន​អាច​កំណត់​ទីតាំង​ឯកសារ  ''{0}'' ។"
 
 msgid "Unsupported scheme ''{0}'' in URI ''{1}''."
-msgstr ""
+msgstr "មិន​គាំទ្រ​គ្រោងការណ៍ ''{0}'' នៅ​ក្នុង URI ''{1}'' ។"
 
 msgid "Unexpected root element ''{0}'' in session file"
-msgstr ""
+msgstr "ធាតុ root មិន​រំពឹង​ទុក ''{0}'' នៅ​ក្នុង​ឯកសារ​សម័យ"
 
 msgid "Version ''{0}'' of session file is not supported. Expected: 0.1"
-msgstr ""
+msgstr "កំណែ ''{0}'' របស់​ឯកសារ​សម័យ​គឺ​មិន​បាន​គាំទ្រ។ បាន​រំពឹង​ទុក៖ 0.1"
 
 msgid "missing mandatory attribute ''index'' for element ''layer''"
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ ''លិបិក្រម'' សម្រាប់​ធាតុ ''ស្រទាប់''"
 
 msgid "unexpected format of attribute ''index'' for element ''layer''"
 msgstr ""
+"ទ្រង់ទ្រាយ​មិន​រំពឹង​ទុក​នៃ​គុណ​លក្ខណៈ​ ''លិបិក្រម'' សម្រាប់​ធាតុ ''ស្រទាប់''"
 
 msgid "attribute ''index'' ({0}) for element ''layer'' must be unique"
 msgstr ""
+"គុណ​លក្ខណៈ ''លិបិក្រម'' ({0}) សម្រាប់​ធាតុ ''ស្រទាប់'' ត្រូវតែ​មានតែ​មួយ"
 
 msgid "missing layer with index {0}"
-msgstr ""
+msgstr "បាត់​ស្រទាប់​ដែល​មាន​លិបិក្រម {0}"
 
 msgid "missing mandatory attribute ''name'' for element ''layer''"
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ចាំបាច់ ''ឈ្មោះ'' សម្រាប់​ធាតុ ''ស្រទាប់''"
 
 msgid "missing mandatory attribute ''type'' for element ''layer''"
-msgstr ""
+msgstr "បាត់​គុណ​លក្ខណៈ​ចាំបាច់ ''ប្រភេទ'' សម្រាប់​ធាតុ ''ស្រទាប់''"
 
 msgid "Unable to load layer"
-msgstr ""
+msgstr "មិន​អាច​ផ្ទុក​ស្រទាប់"
 
 msgid ""
 "Cannot load layer of type ''{0}'' because no suitable importer was found."
 msgstr ""
+"មិន​អាច​ផ្ទុក​ស្រទាប់​នៃ​ប្រភេទ ''{0}'' "
+"ព្រោះ​រក​មិន​ឃើញ​កម្មវិធី​នាំចូល​សមរម្យ។"
 
 msgid ""
 "Cannot load layer {0} because it depends on layer {1} which has been skipped."
 msgstr ""
+"មិន​អាច​ផ្ទុក​ស្រទាប់ {0} ព្រោះ​វា​អាស្រ័យ​លើ​ស្រទាប់ {1} ដែល​បាន​រំលង។"
 
 msgid "Error loading layer"
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ផ្ទុក​ស្រទាប់"
 
 msgid "<html>Could not load layer {0} ''{1}''.<br>Error is:<br>{2}</html>"
-msgstr ""
+msgstr "<html>មិន​អាច​ផ្ទុក​ស្រទាប់ {0} ''{1}'' ។<br>កំហុស​គឺ៖<br>{2}</html>"
 
 msgid "Skip layer and continue"
-msgstr ""
+msgstr "រំលង​ស្រទាប់ រួច​បន្ត"
 
 msgid "expected .jos file inside .joz archive"
-msgstr ""
+msgstr "ឯកសារ .jos ដែល​បាន​រំពឹង​ទុក​ខាងក្នុង​ប័ណ្ណសារ .joz"
 
 msgid "Skip download"
-msgstr ""
+msgstr "រំលង​ការ​ទាញ​យក"
 
 msgid "Download Plugin"
-msgstr ""
+msgstr "ទាញ​យក​កម្មវិធី​ជំនួយ"
 
 msgid "Skip Download"
-msgstr ""
+msgstr "រំលង​ការ​ទាញ​យក"
 
 msgid "JOSM version {0} required for plugin {1}."
-msgstr ""
+msgstr "បាន​ទាមទារ JOSM កំណែ {0} សម្រាប់​កម្មវិធី​ជំនួយ {1} ។"
 
 msgid "Download skipped"
-msgstr ""
+msgstr "បាន​រំលង​ការ​ទាញ​យក"
 
 msgid ""
 "Cannot download plugin ''{0}''. Its download link is not known. Skipping "
 "download."
 msgstr ""
+"មិន​អាច​ទាញ​យក​កម្មវិធី​ជំនួយ ''{0}'' ។ មិន​ស្គាល់​តំណ​ទាញ​យក​របស់​វា។ "
+"រំលង​ការ​ទាញ​យក។"
 
 msgid ""
 "Cannot download plugin ''{0}''. Its download link ''{1}'' is not a valid "
 "URL. Skipping download."
 msgstr ""
+"មិន​អាច​ទាញ​យក​កម្មវិធី​ជំនួយ ''{0}'' ។ តំណ​ទាញ​យក ''{1}'' របស់​វា​មិនមែន​ជា "
+"URL ត្រឹមត្រូវ។ រំលង​ការ​ទាញ​យក។"
 
 msgid "Failed to create plugin directory ''{0}''"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​បង្កើត​ថត​កម្មវិធី​ជំនួយ ''{0}''"
 
 msgid "Downloading Plugin {0}..."
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​កម្មវិធី​ជំនួយ {0}..."
 
 msgid "An error occurred in plugin {0}"
-msgstr ""
+msgstr "មាន​កំហុស​ក្នុង​កម្មវិធី​ជំនួយ {0}"
 
 msgid "integrated into main program"
-msgstr ""
+msgstr "ដាក់​បញ្ចូល​ក្នុង​កម្មវិធី​មេ"
 
 msgid "replaced by new {0} plugin"
-msgstr ""
+msgstr "បាន​ជំនួស​ដោយ​កម្មវិធី​ជំនួយ {0} ថ្មី"
 
 msgid "no longer required"
-msgstr ""
+msgstr "លែង​ទាមទារ​ទៀត​ហើយ"
 
 msgid "The following plugin is no longer necessary and has been deactivated:"
 msgid_plural ""
 "The following plugins are no longer necessary and have been deactivated:"
 msgstr[0] ""
-msgstr[1] ""
+"កម្មវិធី​ជំនួយ​ដូច​ខាងក្រោម​លែង​ចាំបាច់​ទៀត​ហើយ "
+"ហើយ​វា​ត្រូវ​បាន​ធ្វើឲ្យ​អសកម្ម៖"
 
 msgid ""
 "<html>Loading of the plugin \"{0}\" was requested.<br>This plugin is no "
 "longer developed and very likely will produce errors.<br>It should be "
 "disabled.<br>Delete from preferences?</html>"
 msgstr ""
+"<html>ការ​ផ្ទុក​កម្មវិធី​ជំនួយ \"{0}\" "
+"ត្រូវ​បាន​ស្នើ។<br>កម្មវិធី​ជំនួយ​នេះ​លែង​ត្រូវ​បាន​អភិវឌ្ឍ "
+"ហើយ​វា​នឹង​បង្កើត​កំហុស​ច្រើន។<br>វា​គួរតែ​បាន​បិទ។<br>លុប​ចេញពី​ចំណូលចិត្ត​ឬ"
+"?</html>"
 
 msgid "Plugin update"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ"
 
 msgid ""
 "You updated your JOSM software.<br>To prevent problems the plugins should be "
 "updated as well.<br><br>Update plugins now?"
 msgstr ""
+"អ្នក​បាន​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី JOSM ។<br>ដើម្បី​ការពារ​បញ្ហា "
+"កម្មវិធី​ជំនួយ​គួរតែ​បាន​ធ្វើ​បច្ចុប្បន្នភាព។<br><br>ធ្វើ​បច្ចុប្បន្នភាព​កម្ម"
+"វិធី​ជំនួយ​ឥឡូវ?"
 
 msgid "Last plugin update more than {0} days ago."
-msgstr ""
+msgstr "បច្ចប្បន្នភាព​កម្មវិធី​ជំនួយ​ចុងក្រោយ​ច្រើន​ជាង {0} កន្លង​ទៅ​ហើយ។"
 
 msgid "Click to update the activated plugins"
-msgstr ""
+msgstr "ចុច​ដើម្បី​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​ដែល​បាន​ធ្វើឲ្យ​សកម្ម"
 
 msgid "Skip update"
-msgstr ""
+msgstr "រំលង​ការ​ធ្វើ​បច្ចុប្បន្នភាព"
 
 msgid "Click to skip updating the activated plugins"
 msgstr ""
+"ចុច​ដើម្បី​រំលង​ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​ដែល​បាន​ធ្វើឲ្យ​សកម្ម"
 
 msgid ""
 "Skipping plugin update after JOSM upgrade. Automatic update at startup is "
 "disabled."
 msgstr ""
+"រំលង​ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​បន្ទាប់ពី​បាន​ធ្វើឲ្យ JOSM "
+"ប្រសើរ​ឡើង។ បាន​បិទ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់​ផ្ដើម។"
 
 msgid ""
 "Skipping plugin update after elapsed update interval. Automatic update at "
 "startup is disabled."
 msgstr ""
+"រំលង​ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​បន្ទាប់ពី​ចន្លោះ​ពេល​ធ្វើ​បច្ចុប្"
+"បន្នភាព។ បាន​បិទ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់​ផ្ដើម។"
 
 msgid ""
 "Running plugin update after JOSM upgrade. Automatic update at startup is "
 "enabled."
 msgstr ""
+"ដំណើរការ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​បន្ទាប់ពី​បាន​ធ្វើឲ្យ JOSM "
+"ប្រសើរ​ឡើង។ បាន​បិទ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់​ផ្ដើម។"
 
 msgid ""
 "Running plugin update after elapsed update interval. Automatic update at "
 "startup is disabled."
 msgstr ""
+"ដំណើរការ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​បន្ទាប់ពី​ចន្លោះ​ពេល​ធ្វើ​បច្"
+"ចុប្បន្នភាព។ បាន​បិទ​ការ​ធ្វើ​បច្ចុប្បន្នភាព​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់​ផ្ដើម។"
 
 msgid ""
 "Unexpected value ''{0}'' for preference ''{1}''. Assuming value ''ask''."
 msgstr ""
+"តម្លៃ ''{0}'' មិន​រំពឹង​ទុក​សម្រាប់​ចំណូលចិត្ត ''{1}'' ។ តម្លៃ​សន្មត ''សួរ'' "
+"។"
 
 msgid ""
 "Plugin {0} requires a plugin which was not found. The missing plugin is:"
@@ -13690,56 +14170,60 @@ msgid_plural ""
 "Plugin {0} requires {1} plugins which were not found. The missing plugins "
 "are:"
 msgstr[0] ""
-msgstr[1] ""
+"កម្មវិធី​ជំនួយ {0} ទាមទារ​កម្មវិធី​ជំនួយ {1} ដែល​រក​មិន​ឃើញ។ "
+"កម្មវិធី​ជំនួយ​ដែល​បាត់​គឺ៖"
 
 msgid ""
 "<html>Plugin {0} requires JOSM version {1}. The current JOSM version is "
 "{2}.<br>You have to update JOSM in order to use this plugin.</html>"
 msgstr ""
+"<html>កម្មវិធី​ជំនួយ {0} ទាមទារ JOSM កំណែ {1} ។ កំណែ JOSM បច្ចុប្បន្ន​គឺ {2} "
+"។<br>អ្នក​ត្រូវ​ធ្វើ​បច្ចុប្បន្នភាព JOSM "
+"ទើប​អាច​ប្រើ​កម្មវិធី​ជំនួយ​នេះ​បាន។</html>"
 
 msgid "Could not load plugin {0}. Delete from preferences?"
-msgstr ""
+msgstr "មិន​អាច​ផ្ទុក​កម្មវិធី​ជំនួយ {0} ។ លុប​ចេញពី​ចំណូលចិត្ត​ឬ?"
 
 msgid "loading plugin ''{0}'' (version {1})"
-msgstr ""
+msgstr "កំពុង​ផ្ទុក​កម្មវិធី​ជំនួយ ''{0}'' (កំណែ {1})"
 
 msgid ""
 "<html>Could not load plugin {0} because the plugin<br>main class ''{1}'' was "
 "not found.<br>Delete from preferences?</html>"
 msgstr ""
+"<html>មិន​អាច​ផ្ទុក​កម្មវិធី​ជំនួយ {0} "
+"ព្រោះ​រក​មិន​ឃើញ​កម្មវិធី​ជំនួយ<br>ថ្នាក់​មេ ''{1}'' "
+"។<br>លុប​ចេញពី​ចំណូលចិត្ត​ឬ?</html>"
 
 msgid "Loading plugins ..."
-msgstr ""
+msgstr "កំពុង​ផ្ទុក​កម្មវិធី​ជំនួយ..."
 
 msgid "Checking plugin preconditions..."
-msgstr ""
+msgstr "កំពុង​ពីនិត្យមើល​លក្ខខណ្ឌ​កំណត់​ជាមុន​របស់​កម្មវិធី​ជំនួយ..."
 
 msgid "Loading plugin ''{0}''..."
-msgstr ""
+msgstr "កំពុង​ផ្ទុក​កម្មវិធី​ជំនួយ ''{0}''..."
 
 msgid "JOSM could not find information about the following plugin:"
 msgid_plural "JOSM could not find information about the following plugins:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "JOSM មិន​អាច​រក​ឃើញ​ព័ត៌មាន​អំពី​កម្មវិធី​ជំនួយ​ដូច​ខាងក្រោម៖"
 
 msgid "The plugin is not going to be loaded."
 msgid_plural "The plugins are not going to be loaded."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "កម្មវិធី​ជំនួយ​នឹង​មិន​ត្រូវ​បាន​ផ្ទុក​ឡើង។"
 
 msgid "Determine plugins to load..."
-msgstr ""
+msgstr "កំណត់​កម្មវិធី​ជំនួយ​ដើម្បី​ផ្ទុក​ឡើង..."
 
 msgid "Removing deprecated plugins..."
-msgstr ""
+msgstr "កំពុង​លុប​កម្មវិធី​ជំនួយ​ដែល​បាន​បដិសេធ..."
 
 msgid "Removing unmaintained plugins..."
-msgstr ""
+msgstr "កំពុង​លុប​កម្មវិធី​ជំនួយ​ដែល​មិន​បាន​រក្សាទុក..."
 
 msgid "Updating the following plugin has failed:"
 msgid_plural "Updating the following plugins has failed:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ខាងក្រោម​បាន​បរាជ័យ៖"
 
 msgid ""
 "Please open the Preference Dialog after JOSM has started and try to update "
@@ -13748,184 +14232,213 @@ msgid_plural ""
 "Please open the Preference Dialog after JOSM has started and try to update "
 "them manually."
 msgstr[0] ""
-msgstr[1] ""
+"សូម​បើក​ប្រអប់​ចំណូលចិត្ត​បន្ទាប់ពី JOSM បាន​ចាប់ផ្ដើម "
+"រួច​ព្យាយាម​ធ្វើ​បច្ចុប្បន្នភាព​ពួកវា​ដោយ​ដៃ។"
 
 msgid "Plugin update failed"
-msgstr ""
+msgstr "ការ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​បាន​បរាជ័យ"
 
 msgid "Failed to find plugin {0}"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​រក​កម្មវិធី​ជំនួយ {0}"
 
 msgid "Failed to download plugin information list"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ទាញ​យក​បញ្ជី​ព័ត៌មាន​កម្មវិធី​ជំនួយ"
 
 msgid "Disable plugin"
-msgstr ""
+msgstr "បិទ​កម្មវិធី​ជំនួយ"
 
 msgid "Click to delete the plugin ''{0}''"
-msgstr ""
+msgstr "ចុច​ដើម្បី​លុប​កម្មវិធី​ជំនួយ ''{0}''"
 
 msgid "Keep plugin"
-msgstr ""
+msgstr "រក្សាទុក​កម្មវិធី​ជំនួយ"
 
 msgid "Click to keep the plugin ''{0}''"
-msgstr ""
+msgstr "ចុច​ដើម្បី​រក្សាទុក​កម្មវិធី​ជំនួយ ''{0}''"
 
 msgid "Failed to delete outdated plugin ''{0}''."
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​លុប​កម្មវិធី​ជំនួយ​ដែល​ហួស​សម័យ ''{0}'' ។"
 
 msgid ""
 "Failed to install already downloaded plugin ''{0}''. Skipping installation. "
 "JOSM is still going to load the old plugin version."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ដំឡើង​កម្មវិធី​ជំនួយ ''{0}'' ដែល​បាន​ទាញ​យក។ "
+"រំលង​ការ​ដំឡើង។ JOSM នឹង​នៅតែ​ផ្ទុក​កំណែ​កម្មវិធី​ជំនួយ​ចាស់។"
 
 msgid ""
 "Failed to install plugin ''{0}'' from temporary download file ''{1}''. {2}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ដំឡើង​កម្មវិធី​ជំនួយ ''{0}'' "
+"ពី​ឯកសារ​ទាញ​យក​បណ្ដោះអាសន្ន ''{1}'' ។ {2}"
 
 msgid ""
 "Failed to install plugin ''{0}'' from temporary download file ''{1}''. "
 "Renaming failed."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ដំឡើង​កម្មវិធី​ជំនួយ ''{0}'' "
+"ពី​ឯកសារ​ទាញ​យក​បណ្ដោះអាសន្ន ''{1}'' ។ ការ​ប្ដូរ​ឈ្មោះ​បាន​បរាជ័យ។"
 
 msgid "Update plugin"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ"
 
 msgid "Click to update the plugin ''{0}''"
-msgstr ""
+msgstr "ពិនិត្យមើល​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ ''{0}''"
 
 msgid "Click to disable the plugin ''{0}''"
-msgstr ""
+msgstr "ចុច​ដើម្បី​បិទ​កម្មវិធី​ជំនួយ ''{0}''"
 
 msgid ""
 "An unexpected exception occurred that may have come from the ''{0}'' plugin."
 msgstr ""
+"មាន​ករណី​លើកលែង​មិន​រំពឹង​ទុក​បាន​កើតឡើង​ដែល​អាច​បណ្ដាល​មកពី​កម្មវិធី​ជំនួយ "
+"''{0}'' ។"
 
 msgid "According to the information within the plugin, the author is {0}."
-msgstr ""
+msgstr "ផ្អែក​លើ​ព័ត៌មាន​ក្នុង​កម្មវិធី​ជំនួយ អ្នកនិពន្ធ​គឺ {0} ។"
 
 msgid ""
 "Try updating to the newest version of this plugin before reporting a bug."
 msgstr ""
+"ព្យាយាម​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​នេះ​ទៅ​កំណែ​ថ្មី​បំផុត "
+"មុន​នឹងរាយការណ៍​កំហុស។"
 
 msgid ""
 "The plugin has been removed from the configuration. Please restart JOSM to "
 "unload the plugin."
 msgstr ""
+"បាន​លុប​កម្មវិធី​ជំនួយ​ចេញពី​ការ​កំណត់​រចនាសម្ព័ន្ធ។ សូម​ចាប់ផ្ដើម JOSM "
+"ឡើងវិញ​ដើម្បី​មិន​ផ្ទុក​កម្មវិធី​ជំនួយ។"
 
 msgid "Plugin information"
-msgstr ""
+msgstr "ព័ត៌មាន​កម្មវិធី​ជំនួយ"
 
 msgid "no description available"
-msgstr ""
+msgstr "មិន​មាន​សេចក្ដី​ពណ៌នា"
 
 msgid ""
 "Do not ask again and remember my decision (go to Preferences->Plugins to "
 "change it later)"
 msgstr ""
+"កុំ​សួរ​ម្ដងទៀត ហើយ​ចងចាំ​ការ​សម្រេចចិត្ត​របស់​ខ្ញុំ (ចូល​ទៅ​ចំណូលចិត្ត-"
+">កម្មវិធី​ជំនួយ​ដើម្បី​ប្ដូរ​វា​នៅ​ពេល​ក្រោយ)"
 
 msgid "Invalid jar file ''{0}''"
-msgstr ""
+msgstr "ឯកសារ jar មិន​ត្រឹមត្រូវ ''{0}''"
 
 msgid "The plugin file ''{0}'' does not include a Manifest."
-msgstr ""
+msgstr "ឯកសារ​កម្មវិធី​ជំនួយ ''{0}'' មិន​បាន​រួមបញ្ចូល Manifest ។"
 
 msgid "Invalid URL ''{0}'' in plugin {1}"
-msgstr ""
+msgstr "URL ''{0}'' មិន​ត្រឹមត្រូវ​ក្នុង​កម្មវិធី​ជំនួយ {1}"
 
 msgid "Invalid plugin description ''{0}'' in plugin {1}"
 msgstr ""
+"សេចក្ដី​ពណ៌នា​កម្មវិធី​ជំនួយ​មិន​ត្រឹមត្រូវ ''{0}'' នៅ​ក្នុង​កម្មវិធី​ជំនួយ "
+"{1}"
 
 msgid "Invalid plugin main version ''{0}'' in plugin {1}"
 msgstr ""
+"កំណែ​មេ​កម្មវិធី​ជំនួយ​មិន​ត្រឹមត្រូវ ''{0}'' នៅ​ក្នុង​កម្មវិធី​ជំនួយ {1}"
 
 msgid "Missing plugin main version in plugin {0}"
-msgstr ""
+msgstr "បាត់​កំណែ​មេ​កម្មវិធី​ជំនួយ​នៅ​ក្នុង​កម្មវិធី​ជំនួយ {0}"
 
 msgid "More info..."
-msgstr ""
+msgstr "ព័ត៌មាន​បន្ថែម..."
 
 msgid "<b>Plugin provided by an external source:</b> {0}"
-msgstr ""
+msgstr "<b>កម្មវិធី​ជំនួយ​ដែល​បាន​ផ្ដល់​ដោយ​ប្រភព​ខាងក្រៅ៖</b> {0}"
 
 msgid "Failed to create plugin information from manifest for plugin ''{0}''"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​បង្កើត​ព័ត៌មាន​កម្មវិធី​ជំនួយ​ចេញពី​បញ្ជី​សម្រាប់​កម្មវិ"
+"ធី​ជំនួយ ''{0}''"
 
 msgid "Illegal entry in plugin list."
-msgstr ""
+msgstr "ធាតុ​មិន​ត្រឹមត្រូវ​នៅ​ក្នុងបញ្ជីកម្មវិធី​ជំនួយ។"
 
 msgid "Reading local plugin information.."
-msgstr ""
+msgstr "កំពុង​អាន​ព័ត៌មាន​កម្មវិធី​ជំនួយ​មូលដ្ឋាន..."
 
 msgid "Processing plugin site cache files..."
-msgstr ""
+msgstr "កំពុង​ដំណើរការ​ឯកសារ​ឃ្លាំង​សម្ងាត់​តំបន់បណ្ដាញ​កម្មវិធី​ជំនួយ..."
 
 msgid "Processing file ''{0}''"
-msgstr ""
+msgstr "ដំណើរការ​ឯកសារ ''{0}''"
 
 msgid "Failed to scan file ''{0}'' for plugin information. Skipping."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ស្កេន​ឯកសារ ''{0}'' សម្រាប់​ព័ត៌មាន​កម្មវិធី​ជំនួយ។ "
+"រំលង។"
 
 msgid "Processing plugin files..."
-msgstr ""
+msgstr "កំពុង​ដំណើរការ​ឯកសារ​កម្មវិធី​ជំនួយ..."
 
 msgid "Download plugin list..."
-msgstr ""
+msgstr "ទាញ​យក​បញ្ជី​កម្មវិធី​ជំនួយ..."
 
 msgid "Downloading plugin list from ''{0}''"
-msgstr ""
+msgstr "កំពុង​ទាញ​យក​បញ្ជី​កម្មវិធី​ជំនួយ​ពី​ ''{0}''"
 
 msgid "Plugin list download error"
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ទាញ​យក​បញ្ជី​កម្មវិធី​ជំនួយ"
 
 msgid "JOSM failed to download plugin list:"
-msgstr ""
+msgstr "JOSM បាន​បរាជ័យ​ក្នុង​ការ​ទាញ​យក​បញ្ជី​កម្មវិធី​ជំនួយ៖"
 
 msgid "Details:"
-msgstr ""
+msgstr "សេចក្តី​លម្អិត៖"
 
 msgid ""
 "Failed to create plugin directory ''{0}''. Cannot cache plugin list from "
 "plugin site ''{1}''."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​បង្កើត​ថត​កម្មវិធី​ជំនួយ ''{0}'' ។ "
+"មិន​អាច​រក្សាទុក​បញ្ជី​កម្មវិធី​ជំនួយ​ពី​តំបន់​បណ្ដាញ ''{1}'' ។"
 
 msgid "Writing plugin list to local cache ''{0}''"
-msgstr ""
+msgstr "សរសេរ​បញ្ជី​កម្មវិធី​ជំនួយ​ទៅ​ឃ្លាំង​សម្ងាត់​មូលដ្ឋាន ''{0}''"
 
 msgid "Parsing plugin list from site ''{0}''"
-msgstr ""
+msgstr "ការ​ញែក​បញ្ជី​កម្មវិធី​ជំនួយ​ពី​តំបន់បណ្ដាញ ''{0}''"
 
 msgid ""
 "Failed to parse plugin list document from site ''{0}''. Skipping site. "
 "Exception was: {1}"
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ញែក​ឯកសារ​បញ្ជី​កម្មវិធី​ជំនួយ​ពី​តំបន់បណ្ដាញ ''{0}'' ។ "
+"រំលង​តំបន់​បណ្ដាញ។ ករណី​លើកលែង​គឺ៖ {1}"
 
 msgid "Processing plugin list from site ''{0}''"
-msgstr ""
+msgstr "ដំណើរការ​បញ្ជី​កម្មវិធី​ជំនួយ​ពី​តំបន់បណ្ដាញ ''{0}''"
 
 msgid "This is after the end of the recording"
-msgstr ""
+msgstr "នេះ​គឺ​បន្ទាប់ពី​ចុង​បញ្ចប់​នៃ​ការ​ថត"
 
 msgid "unspecified reason"
-msgstr ""
+msgstr "មិន​បាន​បញ្ជាក់​ហេតុផល"
 
 msgid "Error playing sound"
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ចាក់​សំឡេង"
 
 msgid "Do nothing"
-msgstr ""
+msgstr "កុំ​ធ្វើ​អ្វី​ទាំងអស់"
 
 msgid "Report Bug"
-msgstr ""
+msgstr "រាយការណ៍​កំហុស"
 
 msgid ""
 "An unexpected exception occurred.<br>This is always a coding error. If you "
 "are running the latest<br>version of JOSM, please consider being kind and "
 "file a bug report."
 msgstr ""
+"មាន​ករណី​មិន​រំពឹង​ទុក​បាន​កើតឡើង។<br>ជាទូទៅ​វា​ជា​កំហុស​ការ​សរសេរ​កូដ។ "
+"បើ​អ្នក​កំពុង​ប្រើ​កំណែ<br>ចុងក្រោយ​បំផុត​​របស់ JOSM, "
+"សូម​ចាត់ទុក​ថា​វា​ជា​ឯកសារ​របាយការណ៍​កំហុស។"
 
 msgid "Update JOSM"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព JOSM"
 
 msgid ""
 "An unexpected exception occurred. This is always a coding "
@@ -13934,44 +14447,63 @@ msgid ""
 "(<b>{1}</b>).<br><br><b>Please update JOSM</b> before considering to file a "
 "bug report."
 msgstr ""
+"មាន​ករណី​លើកលែង​មិន​រំពឹង​ទុក​បាន​កើតឡើង។ "
+"ជាទូទៅ​វា​ជា​កំហុស​ការ​សរសេរ​កូដ។<br><br>ទោះបីជា​អ្នក​កំពុង​ប្រើ​កំណែ​ចាស់​រប"
+"ស់ JOSM ({0}),<br>ជំនួស​ឲ្យ​ការ​ប្រើ​កំណែ​សាកល្បង​ថ្មី​ក៏ដោយ "
+"(<b>{1}</b>)។<br><br><b>សូម​ធ្វើ​បច្ចុប្បន្នភាព JOSM</b> "
+"មុន​នឹង​ចាត់ទុក​ថា​វា​ជា​ឯកសារ​របាយការណ៍​កំហុស។"
 
 msgid "Unexpected Exception"
-msgstr ""
+msgstr "ករណី​លើកលែង​មិន​រំពឹង​ទុក"
 
 msgid "Suppress further error dialogs for this session."
-msgstr ""
+msgstr "ប្រអប់​កំហុស​ទប់ស្កាត់​សម្រាប់​សម័យ​នេះ។"
 
 msgid ""
 "You have encountered an error in JOSM. Before you file a bug report make "
 "sure you have updated to the latest version of JOSM here:"
 msgstr ""
+"អ្នក​បាន​ជួប​កំហុស​នៅ​ក្នុង JOSM ។ មុន​នឹង​ផ្ញើ​របាយការណ៍​កំហុស "
+"សូម​ប្រាកដ​ថា​អ្នក​បាន​ធ្វើ​បច្ចុប្បន្នភាព​ទៅ​កំណែ​ចុងក្រោយ​បំផុត​របស់ JOSM "
+"នៅ​ទីនេះ៖"
 
 msgid ""
 "You should also update your plugins. If neither of those help please file a "
 "bug report in our bugtracker using this link:"
 msgstr ""
+"អ្នក​ក៏​គួរតែ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​របស់​អ្នក​ផង​ដែរ។ "
+"បើ​វា​នៅតែ​មិន​អាច​ជួយ​បាន​ទៀត "
+"សូម​ផ្ញើ​របាយការណ៍​កំហុស​នៅ​ក្នុង​កម្មវិធី​តាមដាន​កំហុស​របស់​យើង​ដោយ​ប្រើ​តំណ"
+"​នេះ៖"
 
 msgid ""
 "There the error information provided below should already be filled in for "
 "you. Please include information on how to reproduce the error and try to "
 "supply as much detail as possible."
 msgstr ""
+"ព័ត៌មាន​កំហុស​ដែល​បាន​ផ្ដល់​ខាងក្រោម​គួរតែ​បាន​បំពេញ​សម្រាប់​អ្នក។ "
+"សូម​រួមបញ្ចូល​ព័ត៌មាន​អំពី​មូលហេតុ​ដែល​នាំឲ្យ​កើត​មាន​កំហុស​ឡើងវិញ "
+"និង​ព្យាយាម​ផ្ដល់​ព័ត៌មាន​លម្អិត​ឲ្យ​បាន​ច្រើន​តាម​ដែល​អាច​ធ្វើ​ទៅ​បាន។"
 
 msgid ""
 "Alternatively, if that does not work you can manually fill in the "
 "information below at this URL:"
 msgstr ""
+"ម្យ៉ាងទៀត​បើ​វា​មិន​បង្ហាញ​ទេ អ្នក​អាច​បំពេញ​វា​ដោយ​ដៃ​ដោយ​ប្រើ URL នេះ៖"
 
 msgid "(The text has already been copied to your clipboard.)"
-msgstr ""
+msgstr "(អត្ថបទ​ត្រូវ​បាន​ចម្លង​ទៅ​ក្ដារ​តម្បៀត​ខ្ទាស់​របស់​អ្នក)"
 
 msgid "You have encountered a bug in JOSM"
-msgstr ""
+msgstr "អ្នក​បាន​ជួប​បញ្ហា​របាយការណ៍​កំហុស​នី​ក្នុង JOSM"
 
 msgid ""
 "<html>Failed to initialize communication with the OSM server {0}.<br>Check "
 "the server URL in your preferences and your internet connection."
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ចាប់ផ្ដើម​ទំនាក់ទំនង​ជាមួយ​ម៉ាស៊ីន​មេ OSM {0} "
+"។<br>ពិនិត្យមើល URL ម៉ាស៊ីន​មេ​នៅ​ក្នុង​ចំណូលចិត្ត "
+"និង​ការ​តភ្ជាប់​អ៊ីនធឺណិត​របស់​អ្នក។"
 
 msgid ""
 "<html>Failed to authenticate at the OSM server ''{0}''.<br>You are using "
@@ -13979,6 +14511,11 @@ msgid ""
 "configured.<br>Please open the Preferences Dialog and generate or enter an "
 "Access Token.</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទៀងផ្ទាត់​នៅ​ម៉ាស៊ីន​មេ OSM ''{0}'' "
+"។<br>អ្នក​កំពុង​ប្រើ OAuth "
+"ដើម្បី​ផ្ទៀងផ្ទាត់​ប៉ុន្តែ​បច្ចុប្បន្ន​មិន​មាន<br>OAuth "
+"ថូខឹន​ចូល​ដំណើរការ​ដែល​បាន​កំណត់​រចនាសម្ព័ន្ធ។<br>សូម​បើក​ប្រអប់​ចំណូលចិត្ត "
+"រួច​បង្កើត​វា ឬ​បញ្ចូល​ថូខឹន​ចូល​ដំណើរការ។</html>"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>node {0}</strong>. It is still "
@@ -13989,7 +14526,9 @@ msgid_plural ""
 "referred to by nodes {1}.<br>Please load the nodes, remove the reference to "
 "the node, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>តំណ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​តំណ {1}។<br>សូម​ផ្ទុក​តំណ លុប​សេចក្ដី​យោង​ទៅ​តំណ "
+"រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>node {0}</strong>. It is still "
@@ -14000,7 +14539,9 @@ msgid_plural ""
 "referred to by ways {1}.<br>Please load the ways, remove the reference to "
 "the node, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>តំណ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ផ្លូវ {1}។<br>សូម​ផ្ទុក​ផ្លូវ លុប​សេចក្ដី​យោង​ទៅ​តំណ "
+"រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>node {0}</strong>. It is still "
@@ -14011,7 +14552,9 @@ msgid_plural ""
 "referred to by relations {1}.<br>Please load the relations, remove the "
 "reference to the node, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>តំណ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ទំនាក់ទំនង {1}។<br>សូម​ផ្ទុក​ទំនាក់ទំនង "
+"លុប​សេចក្ដី​យោង​ទៅ​តំណ រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>way {0}</strong>. It is still "
@@ -14022,7 +14565,9 @@ msgid_plural ""
 "referred to by nodes {1}.<br>Please load the nodes, remove the reference to "
 "the way, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>ផ្លូវ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​តំណ {1}។<br>សូម​ផ្ទុក​តំណ លុប​សេចក្ដី​យោង​ទៅ​ផ្លូវ "
+"រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>way {0}</strong>. It is still "
@@ -14033,7 +14578,9 @@ msgid_plural ""
 "referred to by ways {1}.<br>Please load the ways, remove the reference to "
 "the way, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>ផ្លូវ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ផ្លូវ {1}។<br>សូម​ផ្ទុក​ផ្លូវ "
+"លុប​សេចក្ដី​យោង​ទៅ​ផ្លូវ រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>way {0}</strong>. It is still "
@@ -14044,7 +14591,9 @@ msgid_plural ""
 "referred to by relations {1}.<br>Please load the relations, remove the "
 "reference to the way, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>ផ្លូវ {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ទំនាក់ទំនង {1}។<br>សូម​ផ្ទុក​ទំនាក់ទំនង "
+"លុប​សេចក្ដី​យោង​ទៅ​ផ្លូវ រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>relation {0}</strong>. It is still "
@@ -14055,7 +14604,9 @@ msgid_plural ""
 "referred to by nodes {1}.<br>Please load the nodes, remove the reference to "
 "the relation, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>ទំនាក់ទំនង {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​តំណ {1}។<br>សូម​ផ្ទុក​តំណ "
+"លុប​សេចក្ដី​យោង​ទៅ​ទំនាក់ទំនង រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>relation {0}</strong>. It is still "
@@ -14066,7 +14617,9 @@ msgid_plural ""
 "referred to by ways {1}.<br>Please load the ways, remove the reference to "
 "the relation, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ក្នុង​ការ​លុប <strong>ទំនាក់ទំនង {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ផ្លូវ {1}។<br>សូម​ផ្ទុក​ផ្លូវ "
+"លុប​សេចក្ដី​យោង​ទៅ​ទំនាក់ទំនង រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<strong>Failed</strong> to delete <strong>relation {0}</strong>. It is still "
@@ -14077,33 +14630,45 @@ msgid_plural ""
 "referred to by relations {1}.<br>Please load the relations, remove the "
 "reference to the relation, and upload again."
 msgstr[0] ""
-msgstr[1] ""
+"<strong>បាន​បរាជ័យ</strong> ដើម្បី​លុប <strong>ទំនាក់ទំនង {0}</strong>។ "
+"វា​នៅ​ត្រូវ​បាន​យោង​ដោយ​ទំនាក់ទំនង {1}។<br>សូម​ផ្ទុក​ទំនាក់ទំនង "
+"លុប​សេចក្ដី​យោង​ទៅ​ទំនាក់ទំនង រួច​ផ្ទុក​ឡើង​ម្ដងទៀត។"
 
 msgid ""
 "<html>Uploading to the server <strong>failed</strong> because your "
 "current<br>dataset violates a precondition.<br>The error message "
 "is:<br>{0}</html>"
 msgstr ""
+"<html>ការ​ផ្ទុក​ឡើង​ទៅ​ម៉ាស៊ីន​មេ <strong>បាន​បរាជ័យ</strong> "
+"ដោយសារ​សំណុំ​ទិន្នន័យ<br>បច្ចុប្បន្ន​របស់​អ្នក​បំពាន​លើ​លក្ខខណ្ឌ​កំណត់​ជាមុន។"
+"<br>សារ​កំហុស​គឺ៖<br>{0}</html>"
 
 msgid ""
 "<html>Authentication at the OSM server with the username ''{0}'' "
 "failed.<br>Please check the username and the password in the JOSM "
 "preferences.</html>"
 msgstr ""
+"<html>ការ​ផ្ទៀងផ្ទាត់​នៅ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ​ឈ្មោះ​អ្នកប្រើ ''{0}'' "
+"បាន​បរាជ័យ។<br>សូម​ពិនិត្យ​ឈ្មោះ​អ្នកប្រើ "
+"និង​ពាក្យសម្ងាត់​នៅ​ក្នុង​ចំណូលចិត្ត JOSM ។</html>"
 
 msgid ""
 "<html>Authentication at the OSM server with the OAuth token ''{0}'' "
 "failed.<br>Please launch the preferences dialog and retrieve another OAuth "
 "token.</html>"
 msgstr ""
+"<html>ការ​ផ្ទៀងផ្ទាត់​នៅ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ​ថូខឹន OAuth ''{0}'' "
+"បាន​បរាជ័យ។<br>សូម​បើក​ប្រអប់​ចំណូលចិត្ត រួច​យក​ថូខឹន OAuth ផ្សេងទៀត។</html>"
 
 msgid ""
 "<html>Authorisation at the OSM server failed.<br>The server reported the "
 "following error:<br>''{0}''</html>"
 msgstr ""
+"<html>ការ​អនុញ្ញាត​នៅ​ម៉ាស៊ីន​មេ OSM "
+"បាន​បរាជ័យ។<br>ម៉ាស៊ីន​មេ​បាន​រាយការណ៍​កំហុស​ដូច​ខាងក្រោម៖<br>''{0}''</html>"
 
 msgid "<html>Authorisation at the OSM server failed.<br></html>"
-msgstr ""
+msgstr "<html>ការ​អនុញ្ញាត​នៅ​ម៉ាស៊ីន​មេ OSM បាន​បរាជ័យ។<br></html>"
 
 msgid ""
 "<html>Authorisation at the OSM server with the OAuth token ''{0}'' "
@@ -14111,14 +14676,19 @@ msgid ""
 "resource<br>''{1}''.<br>Please launch the preferences dialog and retrieve "
 "another OAuth token.</html>"
 msgstr ""
+"<html>ការ​អនុញ្ញាត​នៅ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ​ថូខឹន OAuth ''{0}'' "
+"បាន​បរាជ័យ។<br>ថូខឹន​មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ចូល​ប្រើ​ធនធាន​ដែល​បាន​ការពារ"
+"<br>''{1}''។<br>សូម​បើក​ប្រអប់​ចំណូលចិត្ត រួច​យក​ថូខឹន OAuth ផ្សេងទៀត។</html>"
 
 msgid ""
 "<html>Communication with the OSM server ''{0}'' timed out. Please retry "
 "later.</html>"
 msgstr ""
+"<html>ទំនាក់ទំនង​ជាមួយ​ម៉ាស៊ីន​មេ OSM ''{0}'' បាន​អស់​ពេល។ "
+"សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។</html>"
 
 msgid "no error message available"
-msgstr ""
+msgstr "មិន​មាន​សារ​កំហុស"
 
 msgid ""
 "<html>Communication with the OSM server ''{0}''failed. The server "
@@ -14126,70 +14696,101 @@ msgid ""
 "message:<br><strong>Error code:<strong> {1}<br><strong>Error message "
 "(untranslated)</strong>: {2}</html>"
 msgstr ""
+"<html>ទំនាក់ទំនង​ជាមួយ​ម៉ាស៊ីន​មេ OSM ''{0}'' បាន​បរាជ័យ។ "
+"ម៉ាស៊ីន​មេ​បាន​ឆ្លើយតប<br>កូដ​កំហុស "
+"និង​សារ​កំហុស​ដូច​ខាងក្រោម៖<br><strong>កូដ​កំហុស៖<strong> "
+"{1}<br><strong>សារ​កំហុស (មិន​បាន​បកប្រែ)</strong>៖ {2}</html>"
 
 msgid ""
 "<html>Closing of changeset <strong>{0}</strong> failed <br>because it has "
 "already been closed."
 msgstr ""
+"<html>ការ​បិទ​សំណុំ​ផ្លាស់ប្ដូរ <strong>{0}</strong> បាន​បរាជ័យ "
+"<br>ព្រោះ​វា​បាន​បិទ​រួច​ហើយ។"
 
 msgid ""
 "<html>Closing of changeset <strong>{0}</strong> failed<br> because it has "
 "already been closed on {1}."
 msgstr ""
+"<html>ការ​បិទ​សំណុំ​ផ្លាស់ប្ដូរ <strong>{0}</strong> បាន​បរាជ័យ<br> "
+"ព្រោះ​វា​បាន​បិទ​រួចហើយ​នៅ {1}។"
 
 msgid ""
 "<html>The server reported that it has detected a conflict.<br>Error message "
 "(untranslated):<br>{0}</html>"
 msgstr ""
+"<html>ម៉ាស៊ីន​មេ​បាន​រាយការណ៍​ថា​វា​មាន​ការ​ប៉ះទង្គិច។<br>សារ​កំហុស "
+"(មិន​បាន​បកប្រែ)៖<br>{0}</html>"
 
 msgid "<html>The server reported that it has detected a conflict."
-msgstr ""
+msgstr "<html>ម៉ាស៊ីន​មេ​បាន​រាយការណ៍​ថា​វា​មាន​ការ​ប៉ះទង្គិច។"
 
 msgid ""
 "<html>Failed to upload to changeset <strong>{0}</strong><br>because it has "
 "already been closed on {1}."
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​សំណុំ​ផ្លាស់ប្ដូរ​ឡើង "
+"<strong>{0}</strong><br>ព្រោះ​វា​បាន​បិទ​រួចហើយ​នៅ {1}។"
 
 msgid ""
 "<html>Failed to open a connection to the remote server<br>''{0}''<br>for "
 "security reasons. This is most likely because you are running<br>in an "
 "applet and because you did not load your applet from ''{1}''."
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​បើក​តំណ​ភ្ជាប់​ទៅ​កាន់​ម៉ាស៊ីន​មេ​ពី​ចម្ងាយ<br>''{"
+"0}''<br> សម្រាប់​ហេតុផល​សុវត្ថិភាព។ "
+"វា​គឺ​ដោយសារតែ​អ្នក​កំពុង​ដំណើរការ<br>នៅ​ក្នុង​អាប់ភ្លេត "
+"និង​ដោយសារតែ​អ្នក​មិន​បាន​ផ្ទុក​អាប់ភ្លេត​របស់​អ្នក​ពី ''{1}''។"
 
 msgid ""
 "<html>Failed to open a connection to the remote server<br>''{0}''.<br>Please "
 "check your internet connection."
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​បើក​តំណ​ភ្ជាប់​ទៅ​កាន់​ម៉ាស៊ីន​មេ​ពី​ចម្ងាយ<br>''{"
+"0}''។<br>សូម​ពិនិត្យ​ការ​តភ្ជាប់​អ៊ីនធឺណិត​របស់​អ្នក។"
 
 msgid ""
 "<html>Failed to upload data to or download data from<br>''{0}''<br>due to a "
 "problem with transferring data.<br>Details (untranslated): {1}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​ឡើង "
+"ឬ​ទាញ​យក​ទិន្នន័យ​ពី<br>''{0}''<br>ដោយសារ​បញ្ហា​ការ​ផ្ទេរ​ទិន្នន័យ។<br>ព័ត៌មា"
+"ន​លម្អិត (មិន​បាន​បកប្រែ)៖ {1}</html>"
 
 msgid ""
 "<html>Failed to download data. Its format is either unsupported, ill-formed, "
 "and/or inconsistent.<br><br>Details (untranslated): {0}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ទាញ​យក​ទិន្នន័យ។ "
+"ដោយសារ​ទ្រង់ទ្រាយ​របស់​វា​មិន​គាំទ្រ ill-formed, "
+"និង/ឬ​មិន​សមស្រប។<br><br>ព័ត៌មាន​លម្អិត(មិន​បាន​បកប្រែ)៖ {0}</html>"
 
 msgid "<html>Failed to download data.<br><br>Details: {0}</html>"
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​ទាញ​យក​ទិន្នន័យ។<br><br>ព័ត៌មាន​លម្អិត៖ {0}</html>"
 
 msgid ""
 "<html>The OSM server<br>''{0}''<br>reported an internal server "
 "error.<br>This is most likely a temporary problem. Please try again later."
 msgstr ""
+"<html>ម៉ាស៊ីន​មេ "
+"OSM<br>''{0}''<br>បាន​រាយការណ៍​ថា​មាន​កំហុស​ម៉ាស៊ីន​មេ​ខាងក្នុង។<br>វា​គ្រាន់"
+"តែ​ជា​បញ្ហា​បណ្ដោះអាសន្ន​ប៉ុណ្ណោះ។ សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។"
 
 msgid "The OSM server ''{0}'' reported a bad request.<br>"
-msgstr ""
+msgstr "ម៉ាស៊ីន​មេ OSM ''{0}'' បាន​រាយការណ៍​សំណើ​មិន​ល្អ។<br>"
 
 msgid ""
 "The area you tried to download is too big or your request was too "
 "large.<br>Either request a smaller area or use an export file provided by "
 "the OSM community."
 msgstr ""
+"ផ្ទៃ​ដែល​អ្នក​បាន​ព្យាយាម​ទាញ​យក "
+"ឬ​សំណើ​របស់​អ្នក​គឺ​ធំ​ពេក។<br>ទាំង​សំណើ​សុំ​ផ្ទៃ​តូច "
+"ឬ​ការ​ប្រើ​ឯកសារ​នាំចេញ​គឺ​ត្រូវ​បាន​ផ្ដល់​ដោយ​សហគមន៍ OSM ។"
 
 msgid "<br>Error message(untranslated): {0}"
-msgstr ""
+msgstr "<br>សារ​កំហុស (មិន​បកប្រែ)៖ {0}"
 
 msgid ""
 "The OSM server ''{0}'' does not know about an object<br>you tried to read, "
@@ -14197,12 +14798,19 @@ msgid ""
 "server or you are using an invalid URL to access<br>it. Please carefully "
 "check the server''s address ''{0}'' for typos."
 msgstr ""
+"ម៉ាស៊ីន​មេ OSM ''{0}'' មិន​ស្គាល់​វត្ថុ<br>ដែល​អ្នក​បាន​ព្យាយាម​អាន "
+"ធ្វើ​បច្ចុប្បន្នភាព ឬ​លុប។ វត្ថុ​នីមួយៗ<br>គឺ​មិន​មាន​នៅ​លើ​ម៉ាស៊ីន​មេ "
+"ឬ​អ្នក​កំពុង​ប្រើ URL មិន​ត្រឹមត្រូវ​ដើម្បី​ចូល​ដំណើរការ<br>វា។ "
+"សូម​ពិនិត្យ​ការ​សរសេរ​អាសយដ្ឋាន​របស់​ម៉ាស៊ីន​មេ ''{0}'' ដោយ​ប្រុងប្រយ័ត្ន។"
 
 msgid ""
 "<html>Failed to open a connection to the remote server<br>''{0}''.<br>Host "
 "name ''{1}'' could not be resolved. <br>Please check the API URL in your "
 "preferences and your internet connection."
 msgstr ""
+"<html>បាន​បរាជ័យ​ក្នុង​ការ​បើក​តំណ​ភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ​ពី​ចម្ងាយ<br>''{0}''។"
+"<br>ម៉ាស៊ីន​ឈ្មោះ ''{1}'' មិន​អាច​ដោះ​ស្រាយ​បាន។ <br>សូម​ពិនិត្យមើល API URL "
+"នៅ​ក្នុង​ចំណូលចិត្ត​របស់​អ្នក និង​ការ​តភ្ជាប់​អ៊ីនធឺណិត។"
 
 msgid ""
 "<html>The server reports that an object is deleted.<br><strong>Uploading "
@@ -14210,20 +14818,26 @@ msgid ""
 "<strong>Downloading failed</strong> if you tried to download this "
 "object.<br><br>The error message is:<br>{0}</html>"
 msgstr ""
+"<html>ម៉ាស៊ីន​មេ​រាយការណ៍​ថា​វត្ថុ​ត្រូវ​បាន​លុប។<br><strong>ការ​ផ្ទុក​ឡើង​នឹ"
+"ង​បរាជ័យ</strong> បើ​អ្នក​ព្យាយាម​ធ្វើ​បច្ចុប្បន្នភាព ឬ​លុប​វត្ថុ​នេះ។<br> "
+"<strong>ការ​ទាញ​យក​នឹង​បរាជ័យ</strong> "
+"បើ​អ្នក​ព្យាយាម​ទាញ​យក​វត្ថុ​នេះ។<br><br>សារ​កំហុស​គឺ៖<br>{0}</html>"
 
 msgid "Unable to find translation for the locale {0}. Reverting to {1}."
-msgstr ""
+msgstr "មិន​អាច​រក​ឃើញ​ការ​បកប្រែ​សម្រាប់​ភាសា {0}។ ត្រឡប់​ទៅ {1}។"
 
 msgid ""
 "Fatal: failed to locate image ''{0}''. This is a serious configuration "
 "problem. JOSM will stop working."
 msgstr ""
+"សំខាន់៖ បាន​បរាជ័យ​កំណត់​ទីតាំង​រូបភាព ''{0}''។ "
+"នេះ​ជា​បញ្ហា​ធ្ងន់ធ្ងរ​ចំពោះ​ការ​កំណត់​រចនាសម្ព័ន្ធ។ JOSM នឹង​ឈប់​ដំណើរការ។"
 
 msgid "Failed to locate image ''{0}''"
-msgstr ""
+msgstr "បាន​បរាជ័យ​កំណត់​ទីតាំង​រូបភាព ''{0}''"
 
 msgid "Failed to handle zip file ''{0}''. Exception was: {1}"
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ដោះស្រាយ​ឯកសារ ''{0}''។ ករណី​លើកលែង​គឺ៖ {1}"
 
 msgid ""
 "Failed to access directory ''{0}'' for security reasons. Exception was: {1}"
@@ -14259,49 +14873,59 @@ msgid "reserved"
 msgstr ""
 
 msgid "Outdated Java version"
-msgstr ""
+msgstr "កំណែ Java ហួស​សម័យ"
 
 msgid "Update Java"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព Java"
 
 msgid "You are running version {0} of Java."
-msgstr ""
+msgstr "អ្នក​កំពុង​ប្រើ Java កំណែ {0} ។"
 
 msgid "April 2015"
-msgstr ""
+msgstr "ខែ​មេសា ឆ្នាំ២០១៥"
 
 msgid ""
 "This version is no longer supported by {0} since {1} and is not recommended "
 "for use."
 msgstr ""
+"កំណែ​នេះ​លែង​បាន​គាំទ្រ​ដោយ {0} តាំងពី {1} ហើយ​វា​មិន​គួរ​ប្រើ​ទៀត​ទេ។"
 
 msgid ""
 "JOSM will soon stop working with this version; we highly recommend you to "
 "update to Java {0}."
 msgstr ""
+"JOSM ឆាប់ៗ​នឹង​លែង​ដំណើរការ​ជាមួយ​កំណែ​នេះ "
+"យើង​សូម​ឲ្យ​អ្នក​ធ្វើ​បច្ចុប្បន្នភាព​ទៅ Java {0} ។"
 
 msgid "Would you like to update now ?"
-msgstr ""
+msgstr "តើ​អ្នក​ចង់​ធ្វើ​បច្ចុប្បន្នភាព​ឥឡូវ?"
 
 msgid ""
 "A previous version of JOSM has installed a custom certificate in order to "
 "provide HTTPS support for Remote Control:"
 msgstr ""
+"កំណែ​ពី​មុន​របស់ JOSM "
+"បាន​ដំឡើង​វិញ្ញាបនបត្រ​ផ្ទាល់ខ្លួន​ក្នុង​គោលបំណង​ផ្ដល់​ការ​គាំទ្រ HTTPS "
+"សម្រាប់​ការ​គ្រប់គ្រង​ពី​ចម្ងាយ៖"
 
 msgid ""
 "It appears it could be an important <b>security risk</b>.<br><br>You are now "
 "going to be prompted by Windows to remove this insecure certificate.<br>For "
 "your own safety, <b>please click Yes</b> in next dialog."
 msgstr ""
+"វា​បង្ហាញ​ថា​វា​អាច​ជា​ <b>គ្រោះថ្នាក់​សុវត្ថិភាព</b> "
+"យ៉ាង​ចាំបាច់។<br><br>អ្នក​នឹង​ទទួល​បាន​ការ​ព្រមាន​ដោយ​វីនដូ​ដើម្បី​លុប​វិញ្ញា"
+"បនបត្រ​គ្មាន​សុវត្ថិភាព​នេះ​ចេញ។<br>សម្រាប់​សុវត្ថិភាព​ផ្ទាល់ខ្លួន​របស់​អ្នក "
+"<b>សូម​ចុច​បាទ/ចាស</b> នៅ​ក្នុង​ប្រអប់​បន្ទាប់។"
 
 msgid "Removing insecure certificate from {0} keystore: {1}"
-msgstr ""
+msgstr "លុប​វិញ្ញាបនបត្រ​គ្មាន​សុវត្ថិភាព​នេះ​ចេញពី {0} keystore: {1}"
 
 msgid "Unable to remove insecure certificate from keystore: {0}"
-msgstr ""
+msgstr "មិន​អាច​លុប​វិញ្ញាបនបត្រ​គ្មាន​សុវត្ថិភាព​ចេញពី keystore: {0}"
 
 msgid "JOSM localhost certificate found in {0} keystore: {1}"
-msgstr ""
+msgstr "បាន​រក​ឃើញ​វិញ្ញាបនបត្រ JOSM localhost នៅ​ក្នុង {0} keystore: {1}"
 
 msgid ""
 "Remote Control is configured to provide HTTPS support.<br>This requires to "
@@ -14311,433 +14935,484 @@ msgid ""
 "next dialog.<br><br>If unsure, you can also click No then disable HTTPS "
 "support in Remote Control preferences."
 msgstr ""
+"ការ​គ្រប់គ្រង​ពី​ចម្ងាយ​ត្រូវ​បាន​កំណត់​រចនាសម្ព័ន្ធ​ដើម្បី​ផ្ដល់​ការ​គាំទ្រ "
+"HTTPS ។<br>វា​ទាមទារ​ឲ្យ​បន្ថែម​វិញ្ញាបនបត្រ​ផ្ទាល់ខ្លួន​ដែល​បាន​បង្កើត​ដោយ "
+"JOSM ទៅកាន់​ឃ្លាំង Windows Root CA "
+"។<br><br>ឥឡូវនេះ​អ្នក​នឹង​ទទួល​បាន​ការ​ព្រមាន​ដោយ​វីនដូ​ដើម្បី​បញ្ជាក់​ប្រតិប"
+"ត្តិ​ការ​នេះ។<br>ដើម្បី​បើក​ការ​គាំទ្រ HTTPS ត្រឹមត្រូវ "
+"<b>សូម​ចុច​បាទ/ចាស</b> "
+"នៅ​ក្នុង​ប្រអប់​បញ្ចូល​បន្ទាប់។<br><br>បើ​មិន​សុវត្ថិភាព អ្នក​អាច​ចុច​ទេ "
+"រួច​បិទ​ការ​គាំទ្រ HTTPS នៅ​ក្នុង​ចំណូលចិត្ត​ការ​គ្រប់គ្រង​ពី​ចម្ងាយ។"
 
 msgid "HTTPS support in Remote Control"
-msgstr ""
+msgstr "ការ​គាំទ្រ HTTPS នៅ​ក្នុង​ការ​គ្រប់គ្រង​ពី​ចម្ងាយ"
 
 msgid "Adding JOSM localhost certificate to {0} keystore"
-msgstr ""
+msgstr "ការ​បន្ថែម​វិញ្ញាបនបត្រ JOSM localhost ទៅ {0} keystore"
 
 msgid "Silent shortcut conflict: ''{0}'' moved by ''{1}'' to ''{2}''."
 msgstr ""
+"ផ្លូវកាត់​ស្ងាត់​មាន​ការ​ប៉ះទង្គិច៖ ''{0}'' បាន​ផ្លាស់ទី​ដោយ ''{1}'' ទៅ "
+"''{2}'' ។"
 
 msgid "There was {0} tag found in the buffer, it is suspicious!"
 msgid_plural "There were {0} tags found in the buffer, it is suspicious!"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "បាន​រក​ឃើញ​ស្លាក {0} នៅ​ក្នុង​ទ្រនាប់ វា​គួរឲ្យ​សង្ស័យ​ណាស់!"
 
 msgid "Key is too long (max {0} characters):"
-msgstr ""
+msgstr "ពាក្យ​គន្លឹះ​វែង​ពេក (តួអក្សរ​អតិប្បបរមា {0})៖"
 
 msgid "Suspicious characters in key:"
-msgstr ""
+msgstr "តួអក្សរ​សង្ស័យ​នៅ​ក្នុង​ពាក្យ​គន្លឹះ៖"
 
 msgid "Value is too long (max {0} characters):"
-msgstr ""
+msgstr "តម្លៃ​វែង​ពេក (តួងក្សរ​អតិប្បបរមា {0})៖"
 
 msgid "Do you want to paste these tags?"
-msgstr ""
+msgstr "តើ​អ្នក​ចង់​បិទភ្ជាប់​ស្លាក​ទាំងនេះ​ឬ?"
 
 msgid "Clear buffer"
-msgstr ""
+msgstr "សម្អាត​ទ្រនាប់"
 
 msgid "Ignore warnings"
-msgstr ""
+msgstr "មិន​អើពើ​ការ​ព្រមាន"
 
 msgid ""
 "<html><p> Sorry, it is impossible to paste tags from buffer. It does not "
 "contain any JOSM object or suitable text. </p></html>"
 msgstr ""
+"<html><p> សូមទោស មិន​អាច​បិទភ្ជាប់​ស្លាក​ពី​ទ្រនាប់។ វា​មិន​មាន​វត្ថុ JOSM "
+"ឬ​អត្ថបទ​សមរម្យ។ </p></html>"
 
 msgid "ms"
-msgstr ""
+msgstr "មិល្លី​វិនាទី"
 
 msgid "s"
-msgstr ""
+msgstr "វិនាទី"
 
 msgid "min"
-msgstr ""
+msgstr "នាទី"
 
 msgid "h"
-msgstr ""
+msgstr "ម៉ោង"
 
 msgid "day"
 msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ថ្ងៃ"
 
 msgid ""
 "Preference with key ''{0}'' does not include ''{1}''. Cannot restore window "
 "geometry from preferences."
 msgstr ""
+"ចំណូលចិត្ត​ដែល​មាន ''{0}'' មិន​រួមបញ្ចូល ''{1}'' ។ "
+"មិន​អាច​ស្ដារ​ភូមិសាស្ត្រ​បង្អួច​ពី​ចំណូលចិត្ត។"
 
 msgid ""
 "Preference with key ''{0}'' does not provide an int value for ''{1}''. Got "
 "{2}. Cannot restore window geometry from preferences."
 msgstr ""
+"ចំណូលចិត្ត​ដែល​ប្រើ​ពាក្យ​គន្លឹះ ''{0}'' "
+"មិន​បាន​ផ្ដល់​តម្លៃ​ចំនួន​គត់​សម្រាប់ ''{1}'' ។ បាន​ទទួល {2} ។ "
+"មិន​អាច​ស្ដារ​ធរណីមាត្រ​បង្អួច​ពី​ចំណូលចិត្ត។"
 
 msgid ""
 "Failed to parse field ''{1}'' in preference with key ''{0}''. Exception was: "
 "{2}. Cannot restore window geometry from preferences."
 msgstr ""
+"បាន​បរាជ័យ​ក្នុង​ការ​ញែក​វាល ''{1}'' "
+"នៅ​ក្នុង​ចំណូលចិត្ត​ដោយ​ប្រើ​ពាក្យគន្លឹះ ''{0}'' ។ ករណី​លើកលែង​គឺ៖ {2} ។ "
+"មិន​អាច​ស្ដារ​ធរណីមាត្រ​បង្អួច​ពី​ចំណូលចិត្ត។"
 
 msgid ""
 "Preference with key ''{0}'' does not exist. Cannot restore window geometry "
 "from preferences."
 msgstr ""
+"ចំណូលចិត្ត​ដែល​ប្រើ​ពាក្យ​គន្លឹះ ''{0}'' មិន​មាន។ "
+"មិន​អាច​ស្ដារ​ធរណីមាត្រ​បង្អួច​ពី​ចំណូលចិត្ត។"
 
 msgid "Ignoring malformed geometry: {0}"
-msgstr ""
+msgstr "មិន​អើពើ​ធរណីមាត្រ​មិន​ត្រឹមត្រូវ៖ {0}"
 
 msgid "Failed to load XML schema."
-msgstr ""
+msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ផ្ទុក​ដ្យាក្រាម XML ។"
 
 msgid ""
 "Error in search expression on position {0} - right side of or(|) expression "
 "must return set of primitives"
 msgstr ""
+"កំហុស​ក្នុង​កន្សោម​ស្វែងរក​នៅ​ទីតាំង {0} - ផ្នែក​ខាងស្ដាំ​នៃ ឬ​កន្សោម(|) "
+"ត្រូវតែ​ត្រឡប់​សំណុំ​ព្រីមីទីវ"
 
 msgid ""
 "Error in search expression on position {0} - left side of or(|) expression "
 "must return set of primitives"
 msgstr ""
+"កំហុស​ក្នុង​កន្សោម​ស្វែងរក​នៅ​ទីតាំង {0} - ផ្នែក​ខាងឆ្វេង​នៃ ឬ​កន្សោម(|) "
+"ត្រូវតែ​ត្រឡប់​សំណុំ​ព្រីមីទីវ"
 
 msgid ""
 "Error in search expression on position {0} - not(-) cannot be used in this "
 "context"
 msgstr ""
+"កំហុស​ក្នុង​កន្សោម​ស្វែងរក​នៅ​ទីតាំង {0} - មិន(-) "
+"ប្រើ​បាន​នៅ​ក្នុង​បរិបទ​នេះ​ទេ"
 
 msgid ""
 "Error in search expression on position {0} - expression must return "
 "different then current primitive"
 msgstr ""
+"កំហុស​ក្នុង​កន្សោម​ស្វែងរក​នៅ​ទីតាំង {0} - កន្សោម​ត្រូវតែ​ត្រឡប់​ខុសគ្នា "
+"បន្ទាប់មក​គឺ​ព្រីមីទីវ​បច្ចុប្បន្ន"
 
 msgid "Unexpected token ({0}) on position {1}"
-msgstr ""
+msgstr "ថូខឹន​មិន​រំពឹង​ទុក ({0}) នៅ​ទីតាំង {1}"
 
 msgid "Unexpected token on position {0}. Expected {1}, found {2}"
 msgstr ""
+"ថូខឹន​មិន​រំពឹង​ទុក​នៅ​ទីតាំង {0} ។ បាន​រំពឹង​ទុក {1}, បាន​រក​ឃើញ {2}"
 
 msgid "Error while parsing search expression on position {0}"
-msgstr ""
+msgstr "កំហុស​ពេល​ញែក​កន្សោម​ស្វែងរក​នៅ​ទីតាំង {0}"
 
 msgid "Unexpected char on {0}. Expected {1} found {2}"
-msgstr ""
+msgstr "តួអក្សរ​មិន​រំពឹង​ទុក {0} ។ បាន​រំពឹង​ទុក {1} បាន​រក​ឃើញ {2}"
 
 msgid "Expected search expression"
-msgstr ""
+msgstr "កន្សោម​ស្វែងរក​ដែល​រំពឹង​ទុក"
 
 msgid ""
 "You requested too many nodes (limit is 50,000). Either request a smaller "
 "area, or use planet.osm"
 msgstr ""
+"អ្នក​បាន​ស្នើ​តំណ​ច្រើន​ពេក (ដែន​កំណត់​គឺ 50,000)។ ទាំង​សំណើ​ក្រឡាផ្ទៃ​តូច "
+"ឬ​ការ​ប្រើ planet.osm"
 
 msgid "Database offline for maintenance"
-msgstr ""
+msgstr "មូលដ្ឋាន​ទិន្នន័យ​ក្រៅ​បណ្ដាញ​សម្រាប់​ការ​ថែ​ទាំ"
 
 msgid "You have downloaded too much data. Please try again later."
 msgstr ""
+"អ្នក​បាន​ទាញ​យក​ទិន្នន័យ​ច្រើន​ពេក។ សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។"
 
 msgid ""
 "The maximum bbox size is 0.25, and your request was too large. Either "
 "request a smaller area, or use planet.osm"
 msgstr ""
+"ទំហំ bbox អតិបរមា​គឺ 0.25, ហើយ​សំណើ​របស់​អ្នក​គឺ​ធំ​ពេក។ "
+"ទាំង​សំណើ​ក្រឡាផ្ទៃ​តូច ឬ​ការ​ប្រើ planet.osm"
 
 msgid "JOSM-Trac login at josm.openstreetmap.de"
-msgstr ""
+msgstr "ការ​ចូល JOSM-Trac នៅ josm.openstreetmap.de"
 
 msgid "could not get audio input stream from input URL"
-msgstr ""
+msgstr "មិន​អាច​យក​ស្ទ្រីម​ព័ត៌មាន​បញ្ចូល​អូឌីយ៉ូ​ពី URL ព័ត៌មាន​បញ្ចូល"
 
 msgid "Audio Device Unavailable"
-msgstr ""
+msgstr "មិន​មាន​ឧបករណ៍​អូឌីយ៉ូ"
 
 msgid "You must make your edits public to upload new data"
 msgstr ""
+"អ្នក​ត្រូវតែ​បង្កើត​ការ​កែសម្រួល​សាធារណៈ​របស់​អ្នក​ដើម្បី​ផ្ទុក​ទិន្នន័យ​ថ្មី"
+"​ឡើង"
 
 msgid "town"
-msgstr ""
+msgstr "ទីក្រុង"
 
 msgctxt "landuse"
 msgid "forest"
-msgstr ""
+msgstr "ព្រៃឈើ"
 
 msgctxt "landuse"
 msgid "meadow"
-msgstr ""
+msgstr "វាល​ស្មៅ"
 
 msgctxt "landuse"
 msgid "farmland"
-msgstr ""
+msgstr "ដី​កសិដ្ឋាន"
 
 msgctxt "landuse"
 msgid "residential"
-msgstr ""
+msgstr "ដី​លំនៅឋាន"
 
 msgctxt "natural"
 msgid "scrub"
-msgstr ""
+msgstr "ព្រៃ​គុម្ពោត"
 
 msgctxt "Relation type"
 msgid "associatedStreet"
-msgstr ""
+msgstr "ផ្លូវ​ពាក់ព័ន្ធ"
 
 msgctxt "Relation type"
 msgid "boundary"
-msgstr ""
+msgstr "ព្រំដែន"
 
 msgctxt "Relation type"
 msgid "bridge"
-msgstr ""
+msgstr "ស្ពាន"
 
 msgctxt "Relation type"
 msgid "destination_sign"
-msgstr ""
+msgstr "សញ្ញា​ទិសដៅ"
 
 msgctxt "Relation type"
 msgid "enforcement"
-msgstr ""
+msgstr "ការ​បង្ខំ"
 
 msgctxt "Relation type"
 msgid "multipolygon"
-msgstr ""
+msgstr "ពហុកោណ​ច្រើន"
 
 msgctxt "Relation type"
 msgid "network"
-msgstr ""
+msgstr "បណ្ដាញ"
 
 msgctxt "Relation type"
 msgid "public_transport"
-msgstr ""
+msgstr "ការ​ដឹកជញ្ជូន​សាធារណៈ"
 
 msgctxt "Relation type"
 msgid "restriction"
-msgstr ""
+msgstr "ការ​ដាក់​កម្រិត"
 
 msgctxt "Relation type"
 msgid "route"
-msgstr ""
+msgstr "ផ្លូវ"
 
 msgctxt "Relation type"
 msgid "route_master"
-msgstr ""
+msgstr "ផ្លូវ​មេ"
 
 msgctxt "Relation type"
 msgid "site"
-msgstr ""
+msgstr "ការដ្ឋាន"
 
 msgctxt "Relation type"
 msgid "street"
-msgstr ""
+msgstr "វិថី"
 
 msgctxt "Relation type"
 msgid "tunnel"
-msgstr ""
+msgstr "ធ្យូនែល"
 
 msgctxt "Relation type"
 msgid "waterway"
-msgstr ""
+msgstr "ផ្លូវ​ទឹក"
 
 msgctxt "Place type"
 msgid "city"
-msgstr ""
+msgstr "រដ្ឋធានី"
 
 msgctxt "Place type"
 msgid "locality"
-msgstr ""
+msgstr "មូលដ្ឋាន"
 
 msgctxt "Place type"
 msgid "village"
-msgstr ""
+msgstr "ភូមិ"
 
 msgctxt "Place type"
 msgid "town"
-msgstr ""
+msgstr "ទីក្រុង"
 
 msgctxt "Place type"
 msgid "borough"
-msgstr ""
+msgstr "សង្កាត់"
 
 msgctxt "Place type"
 msgid "municipality"
-msgstr ""
+msgstr "សាលា​ក្រុង"
 
 msgctxt "Place type"
 msgid "island"
-msgstr ""
+msgstr "កោះ"
 
 msgctxt "Place type"
 msgid "county"
-msgstr ""
+msgstr "ប្រទេស"
 
 msgctxt "Place type"
 msgid "hamlet"
-msgstr ""
+msgstr "ភូមិ​តូច"
 
 msgctxt "Place type"
 msgid "suburb"
-msgstr ""
+msgstr "ជាយ​ក្រុង"
 
 msgid "All Files"
-msgstr ""
+msgstr "ឯកសារ​ទាំងអស់"
 
 msgid "Attributes"
-msgstr ""
+msgstr "គុណលក្ខណៈ"
 
 msgid "Abort file chooser dialog"
-msgstr ""
+msgstr "បោះបង់​ប្រអប់​កម្មវិធី​ជ្រើស​ឯកសារ"
 
 msgid "Abort file chooser dialog."
-msgstr ""
+msgstr "បោះបង់​ប្រអប់​កម្មវិធី​ជ្រើស​ឯកសារ។"
 
 msgid "Create New Folder"
-msgstr ""
+msgstr "បង្កើត​ថត​ថ្មី"
 
 msgid "Delete File"
-msgstr ""
+msgstr "លុប​ឯកសារ"
 
 msgid "Enter file name:"
-msgstr ""
+msgstr "បញ្ចូល​ឈ្មោះ​ឯកសារ៖"
 
 msgid "Enter path or folder name:"
-msgstr ""
+msgstr "បញ្ចូល​ផ្លូវ ឬ​ឈ្មោះ​ថត៖"
 
 msgid "Error "
-msgstr ""
+msgstr "កំហុស "
 
 msgid "Error renaming file \"{0}\" to \"{1}\""
-msgstr ""
+msgstr "កំហុស​ក្នុង​ការ​ប្ដូរ​ឈ្មោះ​ឯកសារ \"{0}\" ទៅ \"{1}\""
 
 msgid "File name:"
-msgstr ""
+msgstr "ឈ្មោះ​ឯកសារ៖"
 
 msgid "File Name:"
-msgstr ""
+msgstr "ឈ្មោះ​ឯកសារ៖"
 
 msgid "FileChooser help."
-msgstr ""
+msgstr "ជំនួយ​កម្មវិធី​ជ្រើស​ឯកសារ។"
 
 msgid "Files"
-msgstr ""
+msgstr "ឯកសារ"
 
 msgid "Files of type:"
-msgstr ""
+msgstr "ប្រភេទ​ឯកសារ៖"
 
 msgid "Files of Type:"
-msgstr ""
+msgstr "ប្រភេទ​ឯកសារ៖"
 
 msgid "Filter:"
-msgstr ""
+msgstr "តម្រង៖"
 
 msgid "Folders"
-msgstr ""
+msgstr "ថត"
 
 msgid "Home"
-msgstr ""
+msgstr "ផ្ទះ"
 
 msgid "Look in:"
-msgstr ""
+msgstr "មើល​នៅ​ក្នុង៖"
 
 msgid "Look In:"
-msgstr ""
+msgstr "មើល​នៅ​ក្នុង៖"
 
 msgid "Modified"
-msgstr ""
+msgstr "បាន​កែប្រែ"
 
 msgid "New Folder"
-msgstr ""
+msgstr "ថត​ថ្មី"
 
 msgid "Open selected file"
-msgstr ""
+msgstr "បើក​ឯកសារ​ដែល​បាន​ជ្រើស"
 
 msgid "Open selected file."
-msgstr ""
+msgstr "បើក​ឯកសារ​ដែល​បាន​ជ្រើស។"
 
 msgid "Refresh"
-msgstr ""
+msgstr "ផ្ទុក​ឡើងវិញ"
 
 msgid "Rename File"
-msgstr ""
+msgstr "ប្ដូរ​ឈ្មោះ​ឯកសារ"
 
 msgid "Rename file \"{0}\" to"
-msgstr ""
+msgstr "ប្ដូរ​ឈ្មោះ​ឯកសារ \"{0}\" ទៅ"
 
 msgid "Save in:"
-msgstr ""
+msgstr "រក្សាទុក​ក្នុង៖"
 
 msgid "Save In:"
-msgstr ""
+msgstr "រក្សាទុក​ក្នុង៖"
 
 msgid "Save selected file."
-msgstr ""
+msgstr "រក្សាទុក​ឯកសារ​ដែល​បាន​ជ្រើស។"
 
 msgid "Selection:"
-msgstr ""
+msgstr "ជម្រើស៖"
 
 msgid "Size"
-msgstr ""
+msgstr "​ទំហំ"
 
 msgid "Up One Level"
-msgstr ""
+msgstr "ឡើងលើ​មួយ​កម្រិត"
 
 msgid "Update"
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព"
 
 msgid "Update directory listing."
-msgstr ""
+msgstr "ធ្វើ​បច្ចុប្បន្នភាព​បញ្ជី​ថត។"
 
 msgid "Blue:"
-msgstr ""
+msgstr "ខៀវ៖"
 
 msgid "Color Name:"
-msgstr ""
+msgstr "ឈ្មោះ​ពណ៌៖"
 
 msgid "Green:"
-msgstr ""
+msgstr "បៃតង៖"
 
 msgid "Hue:"
-msgstr ""
+msgstr "ពណ៌​លាំៗ៖"
 
 msgid "GTK Color Chooser"
-msgstr ""
+msgstr "កម្មវិធី​ជ្រើស​ពណ៌ GTK"
 
 msgid "Red:"
-msgstr ""
+msgstr "ក្រហម៖"
 
 msgid "Saturation:"
-msgstr ""
+msgstr "តិត្ថិភាព៖"
 
 msgid ""
 "Allows to edit traffic information and export it to the urban mobility "
 "simulator SUMO"
 msgstr ""
+"អនុញ្ញាត​ឲ្យ​កែសម្រួល​ព័ត៌មាន​ចរាចរ "
+"រួច​នាំចេញ​វា​ទៅកាន់​កម្មវិធី​ក្លែង​ធ្វើ​ចល័ត SUMO នៃ​ទីក្រុង"
 
 msgid ""
 "Group common Address Interpolation inputs in a single dialog, as well as an "
 "option to automatically generate individual house number nodes from a Way."
 msgstr ""
+"បញ្ចូល​ក្រុម​អាសយដ្ឋាន​បន្ថែម​ថ្មី​ទូទៅ​ក្នុង​ប្រអប់ "
+"ក៏​ដូចជា​ជម្រើស​ដើម្បី​បង្កើត​តំណ​លេខ​ផ្ទះ​ដាច់ដោយឡែក​ស្វ័យប្រវត្តិ​សម្រាប់​ផ"
+"្លូវ។"
 
 msgid ""
 "Makes a pair of selected way segments parallel by rotating one of them "
 "around a chosen pivot."
 msgstr ""
+"ដាក់​កំណាត់​ផ្លូវ​ដែល​បាន​ជ្រើស​ជា​គូ​ប៉ារ៉ាឡែល​ដោយ​បង្វិល​វា​ជុំវិញ​ស្នូល។"
 
 msgid ""
 "Allows selection of areas in an layer and automatic creation of a way as "
 "polygon. Built to ease mapping of building from background layers. Optimized "
 "for basemap.at."
 msgstr ""
+"អនុញ្ញាត​ជម្រើស​ផ្ទៃ​នៅ​ក្នុង​ស្រទាប់ "
+"និង​ការ​បង្កើត​​ផ្លូវ​ដោយ​ស្វ័យប្រវត្តិ​ជា​ពហុកោណ។ "
+"បង្កើត​ដើម្បី​បន្ថយ​ការ​គូរ​ផែនទី​អគារ​ពី​ស្រទាប់​ផ្ទៃ​ខាងក្រោយ។ "
+"គុណភាព​ខ្ពស់​សម្រាប់ basemap.at."
 
 msgid "Tools for drawing buildings."
-msgstr ""
+msgstr "ឧបករណ៍​សម្រាប់​គូរ​អគារ។"
 
 msgid "A special handler for the French land registry WMS server."
 msgstr ""
+"កម្មវិធី​ដោះស្រាយ​ពិសេស​សម្រាប់​ការ​ចុះឈ្មោះ​ដី​នៅ​ប្រទេស​បារាំង​ដោយ​ប្រើ​ម៉ា"
+"ស៊ីន​មេ WMS ។"
 
 msgid ""
 "Overlays the canvec tile grid on the map and prints URL''s to the .zip "
 "files. Future goals: allow auto-downloading and loading of canvec .osm files"
 msgstr ""
+"ត្រួត​ក្រឡា canvec នៅ​លើ​ផែនទី រួច​បោះពុម្ព URL''s ទៅ​ឯកសារ .zip ។ "
+"គោលដៅ​អនាគត៖ អនុញ្ញាត​ការ​ទាញ​យក​ស្វ័យប្រវត្តិ និង​ការ​ផ្ទុក​ឯកសារ .osm របស់ "
+"canvec ។"
 
 msgid ""
 "Allows the user to create different color schemes and to switch between "
@@ -14745,254 +15420,328 @@ msgid ""
 "white background with matching colors for better visibility in bright "
 "sunlight. See dialog in display preferences."
 msgstr ""
+"អនុញ្ញាត​ឲ្យ​អ្នកប្រើ​បង្កើត​គ្រោង​ពណ៌​ខុសគ្នា ដើម្បី​ប្ដូរ​ពួកវា។ "
+"គ្រាន់តែ​ប្ដូរ​ពណ៌ និង​បង្កើត​គ្រោង​ថ្មី។ "
+"ប្រើ​ដើម្បី​ប្ដូរ​ផ្ទៃ​ខាងក្រោយ​ពណ៌ស "
+"ជាមួយ​ពណ៌​ដែល​ត្រូវគ្នា​ដើម្បីឲ្យ​ការ​មើល​ឃើញ​ល្អ​ជាង​មុន​នៅ​ពេល​ក្នុង​ពន្លឺ​"
+"ថ្ងៃ​ភ្លឺ។ មើល​ប្រអប់​នៅ​ក្នុង​ចំណូលចិត្ត​ការ​បង្ហាញ។"
 
 msgid ""
 "Imports proprietary CSV files of the Columbus/Visiontac V-900 GPS logger "
 "into a GPX layer."
 msgstr ""
+"នាំចូល​ឯកសារ CSV ត្រឹមត្រូវ​របស់​កម្មវិធី​ចុះឈ្មោះ Columbus/Visiontac V-900 "
+"GPS ទៅ​ក្នុង​ស្រទាប់ GPX ។"
 
 msgid ""
 "Implements a command line and enables to create your commands. See link for "
 "standard commands (arc, circle etc.)"
 msgstr ""
+"អនុវត្ត​បន្ទាត់​ពាក្យ​បញ្ជា រួច​បើក​វា​ដើម្បី​បង្កើត​ពាក្យ​បញ្ជា​របស់​អ្នក។ "
+"មើល​តំណ​សម្រាប់​ពាក្យ​បញ្ជា​ស្តង់ដារ (អ័ក្ស រង្វង់។ល។)"
 
 msgid "(Warning: Experimental!) Tool for conflating (merging) data."
 msgstr ""
+"(ព្រមាន៖ សម្រាប់​ពិសោធន៍!) ឧបករណ៍​សម្រាប់​ភ្ជាប់ (បញ្ចូល) ទិន្នន័យ​ចូលគ្នា។"
 
 msgid "Create a grid of ways."
-msgstr ""
+msgstr "បង្កើត​ក្រឡា​ផ្លូវ។"
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
 msgstr ""
+"ការ​បង្កើត និង​ការ​ដោះស្រាយ​តំណ​អាសយដ្ឋាន និង​អគារ​នៅ​ក្នុង​សាធារណរដ្ឋ​ឆែក។"
 
 msgid ""
 "Allows to import various file formats into JOSM directly. Currently "
 "supported: TangoGPS, Garmin Trainings Center TCX."
 msgstr ""
+"អនុញ្ញាត​ឲ្យ​នាំចូល​ទ្រង់ទ្រាយ​ឯកសារ​ផ្សេងៗ​ទៅ​ក្នុង​ថត JOSM ។ "
+"បច្ចុប្បន្ន​គាំទ្រ៖ TangoGPS, Garmin Trainings Center TCX ។"
 
 msgid "Download your GPX tracks from openstreetmap.org"
-msgstr ""
+msgstr "ទាញ​យក​ដាន GPX របស់​អ្នក​ពី openstreetmap.org"
 
 msgid ""
 "This plugin directly upload GPS Traces from current active layer in JOSM to "
 "openstreetmap.org."
 msgstr ""
+"ថត​កម្មវិធី​ជំនួយ​នេះ​ផ្ទុក​ដាន GPS "
+"ឡើង​ពី​ស្រទាប់​សកម្ម​បច្ចុប្បន្ន​នៅ​ក្នុង JOSM ទៅកាន់ openstreetmap.org ។"
 
 msgid "Downloads OSM data along a way"
-msgstr ""
+msgstr "ទាញ​យក​ទិន្នន័យ OSM តាម​ផ្លូវ"
 
 msgid ""
 "Allows the user to anonymize timestamps and delete parts of huge GPX tracks "
 "very fast."
 msgstr ""
+"អនុញ្ញាត​អ្នកប្រើ​ឲ្យ​កំណត់​ត្រា​ពេលវេលា​អនាមិក និង​លុប​ផ្នែក​ដាន GPX "
+"ធំ​យ៉ាង​រហ័ស។"
 
 msgid "Shows the elevation profile and some statistical data of a GPX track."
 msgstr ""
+"បង្ហាញ​ប្រវត្តិរូប​ការ​វាយតម្លៃ និង​ទិន្នន័យ​ស្ថិតិ​មួយ​ចំនួន​របស់​ដាន GPX ។"
 
 msgid "Handling of French EPCIs (boundary=local_authority)"
-msgstr ""
+msgstr "Handling of French EPCIs (boundary=local_authority)"
 
 msgid "Use external scripts in JOSM"
-msgstr ""
+msgstr "ប្រើ​ស្គ្រីប​ខាងក្រៅ​នៅ​ក្នុង JOSM"
 
 msgid "Fast drawing ways by mouse"
-msgstr ""
+msgstr "របៀប​គូរ​រហ័ស​ដោយ​ប្រើ​កណ្ដុរ"
 
 msgid "Finds and fixes invalid street addresses in a comfortable way."
-msgstr ""
+msgstr "រក​មើល និង​កែ​អាសយដ្ឋាន​វិថី​នៅ​ក្នុង​ផ្លូវ​ងាយស្រួល។"
 
 msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
+"ជជែក​ជាមួយ​អ្នកប្រើ​ដែល​កែសម្រួល​ផែនទី​នៅ​ក្បែរ "
+"ដោយ​ជូនដំណឹង​ពេល​ពួកគេ​មក​ក្បែរ។"
 
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
 msgstr ""
+"ផ្ដល់​ផ្នែក​នៃ​បណ្ណាល័យ GeoTools សម្រាប់​កម្មវិធី​ជំនួយ JOSM ផ្សេងទៀត។ "
+"មានន័យ​ថា​មិន​បាន​ដំឡើង​ផ្ទាល់​ដោយ​អ្នកប្រើ "
+"ប៉ុន្តែ​ជាជាង​ភាព​អាស្រ័យ​សម្រាប់​កម្មវិធី​ជំនួយ​ផ្សេងទៀត។"
 
 msgid ""
 "Download GPS points from Globalsat dg100 data logger directly in JOSM."
 msgstr ""
+"ទាញ​យក​ចំណុច​ជីភីអេស​ពី​ថត​កម្មវិធី​ចូល​ទិន្នន័យ Globalsat dg100 នៅ​ក្នុង "
+"JOSM ។"
 
 msgid ""
 "Analyse a set of GPS points to obtain its centre and direction of spread."
 msgstr ""
+"វិភាគ​សំណុំ​ចំណុច​ជីភីអេស​ដើម្បី​ដាក់​វា​នៅ​ចំកណ្ដាល និង​ទិស​នៃ​ការ​ផ្សាយ។"
 
 msgid "Allows to filter out unnecessary GPS tracks"
-msgstr ""
+msgstr "អនុញ្ញាត​ឲ្យ​ត្រង​ដាន​ជីភីអេស​មិន​ចាំបាច់"
 
 msgid "Visualizes routing information as a routing graph."
-msgstr ""
+msgstr "បង្ហាញ​ព័ត៌មាន​ការ​នាំ​ផ្លូវ​ជា​ក្រាហ្វិក​ការ​នាំ​ផ្លូវ។"
 
 msgid "Simple tool to tag house numbers."
-msgstr ""
+msgstr "ឧបករណ៍​ធម្មតា​សម្រាប់​ដាក់​ស្លាក​លេខ​ផ្ទះ។"
 
 msgid "Generate Imagery XML bounds from a multipolygon"
-msgstr ""
+msgstr "បង្កើត​រូបភាព​ព្រំដែន XML ពី​ពហុកោណ​ច្រើន"
 
 msgid ""
 "Database of imagery offsets: share and aquire imagery offsets with one "
 "button."
 msgstr ""
+"មូលដ្ឋាន​ទិន្នន័យ​អុហ្វសិត​រូបភាព៖ ចែករំលែក "
+"និង​ទទួល​យក​អុហ្វសិត​រូបភាព​ដោយ​ប្រើ​ប៊ូតុង​មួយ។"
 
 msgid "WMSPlugin-style imagery adjustment mapmode"
-msgstr ""
+msgstr "WMSPlugin-style របៀប​ផែនទី​ការ​លៃ​តម្រូវ​រូបភាព"
 
 msgid ""
 "This experimental plugin allows JOSM to store tile cache in database files, "
 "not in huge cache directories"
 msgstr ""
+"កម្មវិធី​ជំនួយ​ពិសោធន៍​នេះ​អនុញ្ញាត​ឲ្យ JOSM "
+"ស្ដារ​ឃ្លាំង​សម្ងាត់​ក្រឡា​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ "
+"មិនមែន​នៅ​ក្នុង​ថត​ឃ្លាំង​សម្ងាត់​ធំ​ទេ"
 
 msgid ""
 "Another plugin to match images to the waypoints in a GPX file. A match is "
 "made when the ''name'', ''cmt'' or ''desc'' attribute of a waypoint tag "
 "matches the filename of an image."
 msgstr ""
+"កម្មវិធី​ជំនួយ​ផ្សេងទៀត​ដើម្បី​ផ្គូផ្គង​រូបភាព​ជាមួយ waypoints "
+"នៅ​ក្នុង​ឯកសារ GPX ។ ការ​ផ្គូផ្គង​ត្រូវ​បាន​ធ្វើ នៅ​ពេល​ដែល​គុណ​លក្ខណៈ "
+"''name'', ''cmt'' ឬ ''desc'' របស់​ស្លាក waypoint "
+"ត្រូវគ្នា​ជាមួយ​ឈ្មោះ​ឯកសារ​របស់​រូបភាព។"
 
 msgid "Plugin for importing spatial referenced images"
-msgstr ""
+msgstr "កម្មវិធី​ជំនួយ​សម្រាប់​នាំចូល​រូបភាព​យោង​លំហ"
 
 msgid "Import vector graphics (SVG)"
-msgstr ""
+msgstr "នាំចូល​ក្រាហ្វិក​វ៉ិចទ័រ (SVG)"
 
 msgid ""
 "Extra information about current layer objects pop ups - currently GPX "
 "trackpoint info"
 msgstr ""
+"ព័ត៌មាន​បន្ថែម​អំពី​ស្រទាប់​បច្ចុប្បន្ន​របស់​វត្ថុ​លេចឡើង - ព័ត៌មាន GPX "
+"trackpoint"
 
 msgid "A helper for IRS satellite adjustment."
-msgstr ""
+msgstr "កម្មវិធី​ជំនួយ​សម្រាប់​ការ​លៃ​តម្រូវ​ផ្កាយរណប IRS ។"
 
 msgid ""
 "Provides Java Native Access (JNA) library. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
 msgstr ""
+"ផ្ដល់​បណ្ណាល័យ Java Native Access (JNA) ។ "
+"មានន័យ​ថា​មិន​បាន​ដំឡើង​ដោយ​អ្នកប្រើ​ផ្ទាល់ "
+"ប៉ុន្តែ​ជា​ជាង​ភាព​អាស្រ័យ​សម្រាប់​កម្មវិធី​ជំនួយ​ផ្សេងទៀត។"
 
 msgid ""
 "Provides Java Topology Suite (JTS) library and related utilities. Not meant "
 "to be installed directly by users, but rather as a dependency for other "
 "plugins."
 msgstr ""
+"ផ្ដល់​បណ្ណាល័យ Java Topology Suite (JTS) និង​អត្ថប្រយោជន៍​ពាក់ព័ន្ធ ។ "
+"មានន័យ​ថា​មិន​បាន​ដំឡើង​ដោយ​អ្នកប្រើ​ផ្ទាល់ "
+"ប៉ុន្តែ​ជា​ជាង​ភាព​អាស្រ័យ​សម្រាប់​កម្មវិធី​ជំនួយ​ផ្សេងទៀត។"
 
 msgid ""
 "creates a channel digraph and checks a subset of channels if it is a "
 "junction or searches in a subset of channels for junctions"
 msgstr ""
+"បង្កើត​ឆានែល​អក្សរ​ពីរ​មាន​សំឡេង​តែមួយ រួច​ពិនិត្យមើល​សំណុំ​រង​របស់​វា "
+"បើ​វា​ជា​ចំណុច​ប្រសព្វ "
+"ឬ​ស្វែងរក​នៅ​ក្នុង​សំណុំ​រង​របស់​ឆានែល​សម្រាប់​ចំណុច​ប្រសព្វ"
 
 msgid "Helps vectorizing WMS images."
-msgstr ""
+msgstr "ជំនួយ​ការ​បង្កើត​វ៉ិចទ័រ​រូបភាព WMS ។"
 
 msgid ""
 "Support live GPS input (moving dot) through a connection to gpsd server."
 msgstr ""
+"គាំទ្រ​ព័ត៌មាន​បញ្ចូល​ជីភីអេស​បន្ត​ផ្ទាល់ (ការ​ផ្លាស់ទី​ចំណុច) "
+"តាមរយៈ​ការ​តភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ gpsd ។"
 
 msgid ""
 "Provides the Log4j library for other JOSM plugins. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
 msgstr ""
+"ផ្ដល់​បណ្ណាល័យ Log4j សម្រាប់​កម្មវិធី​ជំនួយ JOSM ផ្សេងទៀត ។ "
+"មានន័យ​ថា​មិន​បាន​ដំឡើង​ផ្ទាល់​ដោយ​អ្នកប្រើ "
+"ប៉ុន្តែ​ជា​ជាង​ភាព​អាស្រ័យ​សម្រាប់​កម្មវិធី​ជំនួយ​ផ្សេងទៀត។"
 
 msgid ""
 "The MapDust Plug-In shows the MapDust bug reports on the map. You can "
 "create, close,invalidate, re-open and comment bug reports by using this "
 "plugin."
 msgstr ""
+"MapDust Plug-In បង្ហាញ​របាយការណ៍​បំបាត់​កំហុស MapDust នៅ​លើ​ផែនទី។ "
+"អ្នក​អាច​បង្កើត បិទ ដក​សុពលភាព បើក​ឡើងវិញ "
+"និង​ផ្ដល់​របាយការណ៍​បំបាត់​កំហុស​ដោយ​ប្រើ​កម្មវិធី​ជំនួយ​នេះ។"
 
 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 "
 "paths (which also can be imported from a gps layer)."
 msgstr ""
+"ផ្ដល់​ប្រអប់​រង្វាស់ និង​ស្រទាប់​ដើម្បី​វាស់​ប្រវែង និង​មុំ​របស់​អង្កត់ "
+"ក្រឡាផ្ទៃ​ដែល​ព័ទ្ធ​ជុំវិញ​ដោយ​ផ្លូវ​បិទ​ជិត (ធម្មតា) "
+"រួច​បង្កើត​ផ្លូវ​រង្វាស់ (ដែល​អាច​បាន​នាំចូល​ពី​ស្រទាប់​ជីភីអែស)។"
 
 msgid "Merge overlapping part of ways."
-msgstr ""
+msgstr "បញ្ចូល​គ្នា​នូវ​ផ្នែក​ត្រួត​គ្នា​របស់​ផ្លូវ។"
 
 msgid "Adds no left turn for sets of 4 or 5 ways"
-msgstr ""
+msgstr "បន្ថែម​ការ​មិន​បត់​ឆ្វេង​សម្រាប់​ផ្លូវ ៤ ឬ ៥"
 
 msgid "Simplifies download from different read-only APIs."
-msgstr ""
+msgstr "ទាញ​យក​ធម្មតា​ពី APIs បានតែ​អាន​ផ្សេងគ្នា។"
 
 msgid "Allows to attribute tags to all objects in any selected area at once"
 msgstr ""
+"អនុញ្ញាត​ឲ្យ​កំណត់​គុណ​លក្ខណៈ​ស្លាក​ចំពោះ​វត្ថុ​ទាំងអស់​នៅ​ក្នុង​ផ្ទៃ​ដែល​បាន"
+"​ជ្រើស​ក្នុង​មួយ​ពេល"
 
 msgid "NanoLog adjustment and browsing layer"
-msgstr ""
+msgstr "ការ​លៃ​តម្រូវ NanoLog និង​ការ​រក​មើល​ស្រទាប់"
 
 msgid ""
 "Use your system''s password manager to store the API username and password. "
 "(KWallet and gnome-keyring are supported.)"
 msgstr ""
+"ប្រើ​កម្មវិធី​គ្រប់គ្រង​ពាក្យសម្ងាត់​ប្រព័ន្ធ​របស់​អ្នក​ដើម្បី​រក្សាទុក​ពាក្យ"
+"សម្ងាត់ និង​ឈ្មោះ​អ្នកប្រើ API ។ (KWallet និង gnome-keyring ត្រូវ​បាន​គាំទ្រ)"
 
 msgid ""
 "Disallow using JOSM forever (WARNING: this plugin prevents JOSM from loading "
 "and is hard to rid of)"
 msgstr ""
+"មិន​អនុញ្ញាត​ការ​ប្រើ JOSM រៀង​រហូត (ព្រមាន៖ កម្មវិធី​ជំនួយ​នេះ​រារាំង JOSM "
+"ពី​ការ​ផ្ទុក ហើយ​វា​ពិបាក​កម្ចាត់​ណាស់)"
 
 msgid "Convert data from Open Data portals to OSM layer"
-msgstr ""
+msgstr "បម្លែង​ទិន្នន័យ​ពី Open Data portals ទៅ​ស្រទាប់ OSM"
 
 msgid "extended options for editing opening_hours"
-msgstr ""
+msgstr "ជម្រើស​បន្ថែម​សម្រាប់​កែសម្រួល opening_hours"
 
 msgid ""
 "Allows opening gpx/osm files that intersect the currently visible screen area"
 msgstr ""
+"អនុញ្ញាត​ឲ្យ​បើក​ឯកសារ gpx/osm "
+"ដែល​ប្រសព្វគ្នា​ជាមួយ​ផ្ទៃ​អេក្រង់​មើល​ឃើញ​បច្ចុប្បន្ន"
 
 msgid ""
 "Launches FireFox to display the current visible screen as a nice SVG image."
 msgstr ""
+"ចាប់ផ្ដើម FireFox ដើម្បី​បង្ហាញ​អេក្រង់​មើលឃើញ​បច្ចុប្បន្ន​ជា​រូបភាព SVG ល្អ។"
 
 msgid ""
 "Bring in errors from Osm Inspector and display it on the current JOSM "
 "bounding box"
 msgstr ""
+"នាំ​យក​កំហុស​ពី​កម្មវិធី​ត្រួតពិនិត្យ Osm រួច​បង្ហាញ​វា​នៅ​លើ​ប្រអប់​ព្រំដែន "
+"JOSM បច្ចុប្បន្ន"
 
 msgid "Import/export OSM data in PBF format"
-msgstr ""
+msgstr "នាំចេញ/នាំចូល​ទិន្នន័យ OSM ក្នុង​ទ្រង់ទ្រាយ PBF"
 
 msgid "Import PDF file and convert to ways."
-msgstr ""
+msgstr "នាំចូល​ឯកសារ PDF រួច​បម្លែង​វា​ទៅ​ជា​ផ្លូវ។"
 
 msgid ""
 "Write gps position info to the image file header. Run this feature from the "
 "right click menu of the image layer."
 msgstr ""
+"សរសេរ​ព័ត៌មាន​ទីតាំង​ជីភីអេស​ទៅកាន់​បឋមកថា​ឯកសារ​រូបភាព។ "
+"ដំណើរការ​លក្ខណៈ​នេះ​ដោយ​ចុច​កណ្ដុរ​ស្ដាំ​លើ​ម៉ឺនុយ​ស្រទាប់​រូបភាព។"
 
 msgid "Make photos movable and position them on the map."
-msgstr ""
+msgstr "ធ្វើឲ្យ​រូបថត​អាច​ផ្លាស់ទី​បាន រួច​កំណត់​ទីតាំង​ពួកវា​នៅ​លើ​ផែនទី។"
 
 msgid ""
 "This plugin allows to display any picture as a background in the editor and "
 "align it with the map."
 msgstr ""
+"កម្មវិធី​ជំនួយ​នេះ​អនុញ្ញាត​ឲ្យ​បង្ហាញ​រូបភាព​ជា​ផ្ទៃ​ខាងក្រោយ​នៅ​ក្នុង​កម្មវ"
+"ិធី​កែសម្រួល រួច​តម្រឹម​វា​ជាមួយ​ផែនទី។"
 
 msgid "The great JGoodies Plastic Look and Feel."
-msgstr ""
+msgstr "រូបរាង​ល្អ​របស់ JGoodies Plastic ។"
 
 msgid ""
 "Shows an additional information about point on map. There is only a Czech "
 "RUIAN module available at this moment."
 msgstr ""
+"បង្ហាញ​ព័ត៌មាន​បន្ថែម​អំពី​ចំណុច​នៅ​លើ​ផែនទី។ នៅ​ពេល​នេះ​មានតែ​ម៉ូឌុល Czech "
+"RUIAN ប៉ុណ្ណោះ។"
 
 msgid "Read and write osmosis poly filter files"
-msgstr ""
+msgstr "អាន និង​សរសេរ​ឯកសារ​តម្រង osmosis poly"
 
 msgid "Adds map printing to JOSM"
-msgstr ""
+msgstr "បន្ថែម​ការ​បោះពុម្ព​ផែនទី​ទៅ JOSM"
 
 msgid "adds projections from Proj4J"
-msgstr ""
+msgstr "បន្ថែម​ចំណោល​ពី Proj4J"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
-msgstr ""
+msgstr "កម្មវិធី​ជំនួយ​នេះ​កំណត់​ផែនទី និង​កែសម្រួល​ផ្លូវ​ដឹកជញ្ជូន​សាធារណៈ។"
 
 msgid "Relation and multipolygon creating and editing panel."
-msgstr ""
+msgstr "ទំនាក់ទំនង និង​ការ​បង្កើត​ពហុកោណ​ចម្រុះ និង​ការ​កែសម្រួល​ផ្ទាំង។"
 
 msgid "Plugin for reverting changesets"
-msgstr ""
+msgstr "កម្មវិធី​ជំនួយ​សម្រាប់​ត្រឡប់​សំណុំ​ផ្លាស់ប្ដូរ"
 
 msgid ""
 "Plugin for tagging of objects based on a selection of road signs. The dialog "
@@ -15000,11 +15749,16 @@ msgid ""
 "properties window. Available country presets: Germany, Poland, Slovakia, "
 "Spain."
 msgstr ""
+"កម្មវិធី​ជំនួយ​សម្រាប់​ដាក់​ស្លាក​វត្ថុ​ដោយ​ផ្អែក​លើ​ជម្រើស​នៃ​សញ្ញា​ផ្លូវ។ "
+"ប្រអប់​អាច​ត្រូវ​បាន​បើក​ដោយ​ចុច​រូបតំណាង​តូច​នៅ​ជ្រុង​ស្ដាំ​ខាងលើ​នៃ​បង្អួច​"
+"លក្ខណសម្បត្តិ។ ប្រទេស​កំណត់​ស្រេច​មាន៖ អាល្លឺម៉ង់ ប៉ូឡូញ ស្លូវ៉ាគី អេស្ប៉ាញ។"
 
 msgid ""
 "Renders routes (bus, hiking trails, bicycle routes, ..). Route types must be "
 "defined in routes.xml file in plugin directory"
 msgstr ""
+"បង្ហាញ​ផ្លូវ (រថយន្ត​ក្រុង ផ្លូវ​ក្នុង​ព្រៃ ផ្លូវ​កង់...)។ "
+"ប្រភេទ​ផ្លូវ​ត្រូវតែ​កំណត់​នៅ​ក្នុង​ឯកសារ routes.xml នៃ​ថត​កម្មវិធី​ជំនួយ"
 
 msgid "Provides routing capabilities."
 msgstr ""
@@ -15012,6 +15766,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15918,96 +16678,172 @@ msgstr ""
 msgid "Primary"
 msgstr ""
 
-msgid "Primary Link"
+msgid "Primary Link"
+msgstr ""
+
+msgid "Secondary"
+msgstr ""
+
+msgid "Secondary Link"
+msgstr ""
+
+msgid "Tertiary"
+msgstr ""
+
+msgid "Tertiary Link"
+msgstr ""
+
+msgid "Unclassified"
+msgstr ""
+
+msgid "Passing Places"
+msgstr ""
+
+msgid "Residential"
+msgstr ""
+
+msgid "Bicycle Road"
+msgstr ""
+
+msgid "Highway type"
+msgstr ""
+
+msgctxt "Highway"
+msgid "residential"
+msgstr ""
+
+msgctxt "Highway"
+msgid "service"
+msgstr ""
+
+msgctxt "Highway"
+msgid "unclassified"
+msgstr ""
+
+msgctxt "Highway"
+msgid "path"
+msgstr ""
+
+msgctxt "Highway"
+msgid "cycleway"
+msgstr ""
+
+msgid "Vehicle access"
+msgstr ""
+
+msgid "Oneway for bicycle"
+msgstr ""
+
+msgid "Living Street"
+msgstr ""
+
+msgid "Pedestrian"
+msgstr ""
+
+msgid "Area"
+msgstr ""
+
+msgid "Service"
 msgstr ""
 
-msgid "Secondary"
+msgid "Service way type"
 msgstr ""
 
-msgid "Secondary Link"
+msgid "alley"
 msgstr ""
 
-msgid "Tertiary"
+msgid "driveway"
 msgstr ""
 
-msgid "Tertiary Link"
+msgid "parking_aisle"
 msgstr ""
 
-msgid "Unclassified"
+msgid "drive-through"
 msgstr ""
 
-msgid "Passing Places"
+msgid "Parking Aisle"
 msgstr ""
 
-msgid "Residential"
+msgid "Escape"
 msgstr ""
 
-msgid "Bicycle Road"
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
 msgstr ""
 
-msgid "Highway type"
+msgid "Road (Unknown Type)"
 msgstr ""
 
-msgctxt "Highway"
-msgid "residential"
+msgid "Construction"
 msgstr ""
 
 msgctxt "Highway"
-msgid "service"
+msgid "motorway"
 msgstr ""
 
 msgctxt "Highway"
-msgid "unclassified"
+msgid "motorway_link"
 msgstr ""
 
 msgctxt "Highway"
-msgid "path"
+msgid "trunk"
 msgstr ""
 
 msgctxt "Highway"
-msgid "cycleway"
-msgstr ""
-
-msgid "Vehicle access"
+msgid "trunk_link"
 msgstr ""
 
-msgid "Oneway for bicycle"
+msgctxt "Highway"
+msgid "primary"
 msgstr ""
 
-msgid "Living Street"
+msgctxt "Highway"
+msgid "primary_link"
 msgstr ""
 
-msgid "Pedestrian"
+msgctxt "Highway"
+msgid "secondary"
 msgstr ""
 
-msgid "Area"
+msgctxt "Highway"
+msgid "secondary_link"
 msgstr ""
 
-msgid "Service"
+msgctxt "Highway"
+msgid "tertiary"
 msgstr ""
 
-msgid "Service way type"
+msgctxt "Highway"
+msgid "tertiary_link"
 msgstr ""
 
-msgid "alley"
+msgctxt "Highway"
+msgid "bus_guideway"
 msgstr ""
 
-msgid "driveway"
+msgctxt "Highway"
+msgid "bridleway"
 msgstr ""
 
-msgid "parking_aisle"
+msgctxt "Highway"
+msgid "living_street"
 msgstr ""
 
-msgid "drive-through"
+msgctxt "Highway"
+msgid "pedestrian"
 msgstr ""
 
-msgid "Parking Aisle"
+msgctxt "Highway"
+msgid "track"
 msgstr ""
 
-msgid "Road (Unknown Type)"
+msgctxt "Highway"
+msgid "footway"
 msgstr ""
 
-msgid "Construction"
+msgctxt "Highway"
+msgid "steps"
 msgstr ""
 
 msgid "Junction"
@@ -16105,45 +16941,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16978,31 +17776,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -17017,16 +17812,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -17111,6 +17914,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -17141,12 +17947,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -17342,6 +18151,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -17600,6 +18412,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18843,10 +19663,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18867,15 +19683,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18949,6 +19765,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -20446,7 +21266,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20476,28 +21296,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -21015,6 +21835,37 @@ msgstr "រូបភាព"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -21378,16 +22229,13 @@ msgstr "សាកល្បង"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21399,13 +22247,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21438,6 +22286,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21481,7 +22377,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21502,6 +22401,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21630,7 +22535,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21713,6 +22618,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21929,16 +22840,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21947,6 +22858,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22214,6 +23128,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22306,6 +23223,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27640,6 +28560,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27700,9 +28635,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ko.po b/i18n/po/ko.po
index 2782c04..1961f35 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-09-26 15:59+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: 2014-12-29 05:07+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:03+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ko\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr "<html>원본 레이어에 레이어가 없습니다.<br>''{0}''<br>병
 msgid "No target layers"
 msgstr "대상 레이어가 없습니다"
 
+msgid "Select"
+msgstr "선택"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "영상 레이어 {0} 추가"
 
@@ -2031,9 +2038,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "선택"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5598,10 +5602,6 @@ msgstr "분석"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9040,7 +9040,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9061,6 +9061,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG이미지 (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11030,7 +11036,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14210,6 +14216,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15202,12 +15214,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15303,45 +15391,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16176,31 +16226,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16215,16 +16262,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16309,6 +16364,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16339,12 +16397,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16540,6 +16601,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16798,6 +16862,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18041,10 +18113,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18065,15 +18133,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18147,6 +18215,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19644,7 +19716,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19674,28 +19746,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20213,6 +20285,37 @@ msgstr "그림"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20576,16 +20679,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20597,13 +20697,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20636,6 +20736,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20679,7 +20827,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20700,6 +20851,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20828,7 +20985,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20911,6 +21068,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21127,16 +21290,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21145,6 +21308,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21412,6 +21578,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21504,6 +21673,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26838,6 +27010,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26898,9 +27085,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ky.po b/i18n/po/ky.po
index bbc2413..95428f4 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-12-18 02:36+0000\n"
 "Last-Translator: chyngyz <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: 2014-12-29 05:06+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:03+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -214,6 +214,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2035,9 +2042,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5610,10 +5614,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9047,7 +9047,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9068,6 +9068,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11037,7 +11043,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14217,6 +14223,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15209,12 +15221,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15310,45 +15398,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16183,31 +16233,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16222,16 +16269,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16316,6 +16371,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16346,12 +16404,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16547,6 +16608,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16805,6 +16869,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18048,10 +18120,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18072,15 +18140,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18154,6 +18222,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19651,7 +19723,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19681,28 +19753,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20220,6 +20292,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20583,16 +20686,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20604,13 +20704,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20643,6 +20743,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20686,7 +20834,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20707,6 +20858,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20835,7 +20992,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20918,6 +21075,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21134,16 +21297,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21152,6 +21315,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21419,6 +21585,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21511,6 +21680,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26845,6 +27017,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26905,9 +27092,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/lo.po b/i18n/po/lo.po
index 29634a4..4bb8021 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-09-15 10:06+0000\n"
 "Last-Translator: Anousone <Unknown>\n"
 "Language-Team: Lao <lo at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:08+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:04+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr "<html>ບໍ່ປະກົດມີແຫຼ່ງຂອງຊັ້ນ
 msgid "No target layers"
 msgstr "ບໍ່ມີບັນດາຊັ້ນເປົ້າໝາຍ"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/lt.po b/i18n/po/lt.po
index 64aa740..a293812 100644
--- a/i18n/po/lt.po
+++ b/i18n/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-06-17 02:41+0000\n"
 "Last-Translator: Mantas Kriaučiūnas <mantas at akl.lt>\n"
 "Language-Team: Lithuanian <lt at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "(n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:09+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:06+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: lt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr "Parinkti"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Pridėti vaizdo sluoksnį {0}"
 
@@ -2067,9 +2074,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Parinkti"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Parinkti, perkelti, keiti dydį ir pasukti objektus"
 
@@ -5651,10 +5655,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9102,10 +9102,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9131,6 +9129,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG atvaizdžiai (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11100,7 +11104,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14284,6 +14288,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr "Įkelti duomenis iš SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15277,12 +15287,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Kelias (nežinomo tipo)"
 
 msgid "Construction"
 msgstr "Statoma"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Sankryža"
 
@@ -15378,45 +15464,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Žiedas"
 
-msgid "motorway"
-msgstr "automagistralė/greitkelis"
-
-msgid "motorway_link"
-msgstr "motorway_link"
-
-msgid "trunk"
-msgstr "magistralinis kelias"
-
-msgid "trunk_link"
-msgstr "magistralinio kelio rampa"
-
-msgid "primary"
-msgstr "krašto kelias"
-
-msgid "primary_link"
-msgstr "krašto kelio rampa"
-
-msgid "secondary"
-msgstr "rajoninis grįstas kelias"
-
-msgid "tertiary"
-msgstr "rajoninis negrįstas kelias"
-
-msgid "unclassified"
-msgstr "nepriskirtas kelias"
-
-msgid "residential"
-msgstr "gyvenamasis"
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16251,32 +16299,29 @@ msgstr "Geležinkelio iešmas"
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
-msgstr ""
+msgid "Cable Car"
+msgstr "Funikulieriaus vagonas"
 
 msgid "Number of people per hour"
 msgstr "Žmonių skaičius per valandą"
 
-msgid "Number of people per chair"
-msgstr "Žmonių skaičius kėdei"
+msgid "Number of people per car"
+msgstr "Žmonių skaičius vagonui"
 
 msgid "Typical journey time in minutes"
 msgstr "Tipinis kelionės laikas minutėmis"
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
-msgstr "Funikulieriaus vagonas"
+msgid "Number of people per chair"
+msgstr "Žmonių skaičius kėdei"
 
-msgid "Number of people per car"
-msgstr "Žmonių skaičius vagonui"
+msgid "Has bubble?"
+msgstr ""
 
 msgid "Gondola"
 msgstr "Gondola"
@@ -16290,16 +16335,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr "Žmonių skaičius gondolai/kėdei"
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16384,6 +16437,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16414,12 +16470,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -16615,6 +16674,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Viešasis transportas"
 
@@ -16873,6 +16935,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18116,10 +18186,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18140,15 +18206,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18222,6 +18288,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Įėjimas"
 
@@ -19719,7 +19789,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19749,28 +19819,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20288,6 +20358,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20651,16 +20752,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20672,13 +20770,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20711,6 +20809,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20754,7 +20900,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20775,6 +20924,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20903,7 +21058,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20986,6 +21141,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21202,16 +21363,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21220,6 +21381,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21487,6 +21651,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21579,6 +21746,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26915,6 +27085,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Išsaugoti SDS failą"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Supaprastinti Sritį"
 
@@ -26975,9 +27160,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/lv.po b/i18n/po/lv.po
index d8bf06d..72331d1 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-10-03 22:16+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: Latvian <lv at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:09+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:05+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: lv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Nav mērķa slāņu"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Pievienot attēla slāni {0}"
 
@@ -2047,9 +2054,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5621,10 +5625,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9058,7 +9058,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9079,6 +9079,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11048,7 +11054,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14232,6 +14238,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15224,12 +15236,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15325,45 +15413,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16198,31 +16248,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16237,16 +16284,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16331,6 +16386,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16361,12 +16419,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16562,6 +16623,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16820,6 +16884,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18063,10 +18135,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18087,15 +18155,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18169,6 +18237,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19666,7 +19738,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19696,28 +19768,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20235,6 +20307,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20598,16 +20701,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20619,13 +20719,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20658,6 +20758,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20701,7 +20849,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20722,6 +20873,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20850,7 +21007,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20933,6 +21090,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21149,16 +21312,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21167,6 +21330,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21434,6 +21600,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21526,6 +21695,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26860,6 +27032,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26920,9 +27107,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/mk.po b/i18n/po/mk.po
index bc8b656..10c1113 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-05-11 04:37+0000\n"
 "Last-Translator: Bojan Jankuloski <bojan.jankuloski at gmail.com>\n"
 "Language-Team: Macedonian <mk at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:10+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:07+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: mk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -218,6 +218,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Нема целни слоеви"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2039,9 +2046,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5614,10 +5618,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9051,7 +9051,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9072,6 +9072,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11041,7 +11047,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14222,6 +14228,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15214,12 +15226,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15315,45 +15403,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16188,31 +16238,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16227,16 +16274,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16321,6 +16376,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16351,12 +16409,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16552,6 +16613,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16810,6 +16874,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18053,10 +18125,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18077,15 +18145,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18159,6 +18227,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19656,7 +19728,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19686,28 +19758,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20225,6 +20297,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20588,16 +20691,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20609,13 +20709,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20648,6 +20748,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20691,7 +20839,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20712,6 +20863,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20840,7 +20997,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20923,6 +21080,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21139,16 +21302,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21157,6 +21320,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21424,6 +21590,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21516,6 +21685,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26850,6 +27022,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26910,9 +27097,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ms.po b/i18n/po/ms.po
index 1a6d220..de32725 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-12-11 22:14+0000\n"
 "Last-Translator: abuyop <Unknown>\n"
 "Language-Team: Malay <ms at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:11+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:07+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ms\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/nb.po b/i18n/po/nb.po
index 06e1659..646ea72 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-03-19 14:25+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: 2014-12-29 05:13+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:09+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: nb\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -217,6 +217,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Ikke noe lag som mål"
 
+msgid "Select"
+msgstr "Velg"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Sett valgte kartobjekt til det som er valgt i lista ovenfor."
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2057,9 +2064,6 @@ msgstr ""
 "Dra og slipp avspillingsmarkør der du vil avspilling skal starte; "
 "Shift+slipp synkroniserer audio i dette punktet."
 
-msgid "Select"
-msgstr "Velg"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5683,10 +5687,6 @@ msgstr "Løs"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Åpne en dialog for å sammenføye element i lista ovenfor."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Sett valgte kartobjekt til det som er valgt i lista ovenfor."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9155,10 +9155,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/t"
 
 msgid ""
 "\n"
@@ -9178,6 +9176,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-bilder (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11177,7 +11181,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14400,6 +14404,12 @@ msgstr "Gir deg Ruteplanlegger på OSM data."
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15395,12 +15405,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Parkeringsvei"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Vei (ukjent type)"
 
 msgid "Construction"
 msgstr "Veiarbeid"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Kryss"
 
@@ -15496,47 +15582,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rundkjøring"
 
-msgid "motorway"
-msgstr "motorway"
-
-msgid "motorway_link"
-msgstr "motorway_link"
-
-msgid "trunk"
-msgstr "trunk"
-
-msgid "trunk_link"
-msgstr "trunk_link"
-
-msgid "primary"
-msgstr "riksvei"
-
-msgid "primary_link"
-msgstr "tilkjørselsvei_riksvei"
-
-msgid "secondary"
-msgstr "fylkesvei"
-
-msgid "tertiary"
-msgstr "kommunevei"
-
-msgid "unclassified"
-msgstr "småvei"
-
-msgid "residential"
-msgstr "boligvei"
-
-msgid "living_street"
-msgstr "gatetun"
-
-msgid "service"
-msgstr "adkomstvei"
-
-msgid "bus_guideway"
-msgstr "trikkespor"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "veiarbeid"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vadested"
@@ -16369,31 +16417,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Taubaner og -heiser"
 
-msgid "Chair Lift"
-msgstr "Stolheis"
+msgid "Cable Car"
+msgstr "Taubane"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "T-krokheis"
+msgid "Chair Lift"
+msgstr "Stolheis"
 
-msgid "Cable Car"
-msgstr "Taubane"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16408,16 +16453,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "T-krokheis"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16502,6 +16555,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16532,12 +16588,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16733,6 +16792,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Offentlig transport"
 
@@ -16991,6 +17053,14 @@ msgstr "Oppstillingsplass"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Fyrlykt"
 
@@ -18234,10 +18304,6 @@ msgid "Man Made"
 msgstr "Menneskeskapt"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18258,15 +18324,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18340,6 +18406,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Inngang"
 
@@ -19837,7 +19907,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19867,28 +19937,28 @@ msgstr "Storby"
 msgid "Town"
 msgstr "By"
 
-msgid "Suburb"
-msgstr "Forstad/bydel"
-
 msgid "Village"
 msgstr "Landsby"
 
 msgid "Hamlet"
 msgstr "Grend"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Forstad/bydel"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20406,6 +20476,37 @@ msgstr "Bilde"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "ytre linjesegment"
 
@@ -20769,16 +20870,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20790,13 +20888,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20829,6 +20927,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20872,7 +21018,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20893,6 +21042,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21021,7 +21176,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21104,6 +21259,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21320,16 +21481,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21338,6 +21499,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21605,6 +21769,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21697,6 +21864,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27068,6 +27238,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -27128,9 +27313,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "Lagre LiveData automatisk"
 
diff --git a/i18n/po/nds.po b/i18n/po/nds.po
index 3ec777b..295a47e 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-11-29 09:01+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: German, Low <nds at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:12+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:08+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5610,10 +5614,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9047,7 +9047,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9068,6 +9068,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11037,7 +11043,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14217,6 +14223,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15209,12 +15221,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15310,45 +15398,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16183,31 +16233,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16222,16 +16269,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16316,6 +16371,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16346,12 +16404,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16547,6 +16608,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16805,6 +16869,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18048,10 +18120,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18072,15 +18140,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18154,6 +18222,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19651,7 +19723,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19681,28 +19753,28 @@ msgstr "Oort"
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr "Dorp"
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20220,6 +20292,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20583,16 +20686,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20604,13 +20704,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20643,6 +20743,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20686,7 +20834,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20707,6 +20858,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20835,7 +20992,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20918,6 +21075,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21134,16 +21297,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21152,6 +21315,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21419,6 +21585,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21511,6 +21680,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26845,6 +27017,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26905,9 +27092,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/nl.po b/i18n/po/nl.po
index f630c7d..9166812 100644
--- a/i18n/po/nl.po
+++ b/i18n/po/nl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-06-10 11:21+0000\n"
 "Last-Translator: Jan Cnops <jan.cnops at scarlet.be>\n"
 "Language-Team: Dutch\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: 2014-12-29 04:46+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:45+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: nl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -227,6 +227,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Geen doellagen"
 
+msgid "Select"
+msgstr "Selecteren"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"De geselecteerde elementen op de kaart instellen op de geselecteerde items "
+"in de bovenstaande lijst."
+
 msgid "Add imagery layer {0}"
 msgstr "Afbeeldingslaag {0} toevoegen"
 
@@ -2252,9 +2261,6 @@ msgstr ""
 "Versleep de afspeelkop en laat los nabij track om het geluid vanaf daar af "
 "te spelen; SHIFT+loslaten om het geluid op dat punt te synchroniseren."
 
-msgid "Select"
-msgstr "Selecteren"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Objecten selecteren, verplaatsen, schalen en roteren"
 
@@ -6167,12 +6173,6 @@ msgstr ""
 "Een dialoogvenster om samen te voegen openen voor alle geselecteerde items "
 "in bovenstaande lijst."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"De geselecteerde elementen op de kaart instellen op de geselecteerde items "
-"in de bovenstaande lijst."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Er werd {0} conflict gedetecteerd."
@@ -10022,10 +10022,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/u"
 
 msgid ""
 "\n"
@@ -10051,6 +10049,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-afbeeldingen (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Kies zichtbare sporen"
 
@@ -12297,7 +12301,7 @@ msgstr "Ingebouwd:"
 msgid "Projection bounds (in degrees)"
 msgstr "Grenzen projectie (in graden)"
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -15972,6 +15976,12 @@ msgstr "Verschaft mogelijkheden voor routebepaling."
 msgid "Loads data from SDS"
 msgstr "Laadt gegevens van SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -17003,12 +17013,88 @@ msgstr "doorgang"
 msgid "Parking Aisle"
 msgstr "Weg op parkeerplaats"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Weg (onbekend type)"
 
 msgid "Construction"
 msgstr "Weg in aanleg"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Afrit"
 
@@ -17104,47 +17190,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rotonde"
 
-msgid "motorway"
-msgstr "Autosnelweg"
-
-msgid "motorway_link"
-msgstr "op- en afrit autosnelweg"
-
-msgid "trunk"
-msgstr "autoweg"
-
-msgid "trunk_link"
-msgstr "op- en afrit autoweg"
-
-msgid "primary"
-msgstr "provinciale weg"
-
-msgid "primary_link"
-msgstr "op- en afrit provinciale weg"
-
-msgid "secondary"
-msgstr "N-weg"
-
-msgid "tertiary"
-msgstr "weg buiten bebouwde kom"
-
-msgid "unclassified"
-msgstr "niet geclassificeerd"
-
-msgid "residential"
-msgstr "woongebied"
-
-msgid "living_street"
-msgstr "woonerf"
-
-msgid "service"
-msgstr "toegangsweg"
-
-msgid "bus_guideway"
-msgstr "busbaan"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "weg in aanleg"
+msgstr ""
 
 msgid "Ford"
 msgstr "Doorwaadplek"
@@ -17990,32 +18038,29 @@ msgstr "wissel spoorweg"
 msgid "Aerialway"
 msgstr "Kabelbaan"
 
-msgid "Chair Lift"
-msgstr "Stoeltjeslift"
+msgid "Cable Car"
+msgstr "Kabinebaan"
 
 msgid "Number of people per hour"
 msgstr "Aantal mensen per uur"
 
-msgid "Number of people per chair"
-msgstr "Aantal mensen per stoel"
+msgid "Number of people per car"
+msgstr "Aantal mensen per cabine"
 
 msgid "Typical journey time in minutes"
 msgstr "Normale reistijd in minuten"
 
-msgid "Has bubble?"
-msgstr "Heeft overkapping?"
-
 msgid "Has heating?"
 msgstr "Heeft verwarming?"
 
-msgid "Drag Lift"
-msgstr "Sleeplift"
+msgid "Chair Lift"
+msgstr "Stoeltjeslift"
 
-msgid "Cable Car"
-msgstr "Kabinebaan"
+msgid "Number of people per chair"
+msgstr "Aantal mensen per stoel"
 
-msgid "Number of people per car"
-msgstr "Aantal mensen per cabine"
+msgid "Has bubble?"
+msgstr "Heeft overkapping?"
 
 msgid "Gondola"
 msgstr "Gondelbaan"
@@ -18029,17 +18074,25 @@ msgstr "Gemengde lift"
 msgid "Number of people per gondola/chair"
 msgstr "Aantal mensen per gondel/stoel"
 
-msgid "T-bar Lift"
-msgstr "Skilift"
-
-msgid "J-bar Lift"
+msgid "Drag Lift"
 msgstr "Sleeplift"
 
-msgid "Platter Lift"
-msgstr "Skilift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
+
+msgid "j-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Touwlift"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Vliegend tapijt"
@@ -18123,6 +18176,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18153,12 +18209,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18355,6 +18414,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Wassen van fietsen (tegen vergoeding)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Openbaar vervoer"
 
@@ -18613,6 +18675,14 @@ msgstr "Parkeerplaats luchtvaartuig"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "ja"
+
 msgid "Beacon"
 msgstr "Baken"
 
@@ -19856,10 +19926,6 @@ msgid "Man Made"
 msgstr "Bouwwerken"
 
 msgctxt "building"
-msgid "yes"
-msgstr "ja"
-
-msgctxt "building"
 msgid "roof"
 msgstr "dak"
 
@@ -19880,16 +19946,16 @@ msgid "school"
 msgstr "school"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "zakelijk"
 
 msgctxt "building"
-msgid "farm"
-msgstr "land-/tuinbouw"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19962,6 +20028,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "vrijstaand"
 
+msgctxt "building"
+msgid "farm"
+msgstr "land-/tuinbouw"
+
 msgid "Entrance"
 msgstr "Doorgang"
 
@@ -21461,7 +21531,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21491,15 +21561,21 @@ msgstr "Stad (groot)"
 msgid "Town"
 msgstr "Stad"
 
-msgid "Suburb"
-msgstr "Deelgemeente"
-
 msgid "Village"
 msgstr "Dorp"
 
 msgid "Hamlet"
 msgstr "Gehucht"
 
+msgid "Isolated Dwelling"
+msgstr "Afgelegen plaats"
+
+msgid "Suburb"
+msgstr "Deelgemeente"
+
+msgid "Neighbourhood"
+msgstr "Buurt"
+
 msgid "Farm"
 msgstr ""
 
@@ -21509,12 +21585,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Afgelegen plaats"
-
-msgid "Neighbourhood"
-msgstr "Buurt"
-
 msgid "Locality"
 msgstr "Onbewoond gebied"
 
@@ -22030,6 +22100,37 @@ msgstr "Afbeelding"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "buitensegment"
 
@@ -22393,16 +22494,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -22414,13 +22512,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -22453,6 +22551,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -22496,7 +22642,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22517,6 +22666,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -22645,7 +22800,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22728,6 +22883,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22944,16 +23105,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22962,6 +23123,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -23229,6 +23393,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -23321,6 +23488,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -29100,6 +29270,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Sla het SDS-bestand op"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Bewerken SeaMap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Gebied vereenvoudigen"
 
@@ -29175,9 +29360,6 @@ msgstr "Factor afstand"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Drempel voor samenvoegen dicht bij elkaar gelegen knopen"
 
-msgid "SeaMap Editor"
-msgstr "Bewerken SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "LiveData automatisch opslaan"
 
diff --git a/i18n/po/nn.po b/i18n/po/nn.po
index 3a2238f..036dd41 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-07-15 12:49+0000\n"
 "Last-Translator: Skippern <Unknown>\n"
 "Language-Team: Norwegian Nynorsk <nn at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:13+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:09+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: nn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/oc.po b/i18n/po/oc.po
index 4d4c3f8..f3e157f 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-10-03 22:14+0000\n"
 "Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary at yahoo.fr>\n"
 "Language-Team: Occitan (post 1500) <oc at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:14+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:10+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -218,6 +218,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Pas de calc de destinacion"
 
+msgid "Select"
+msgstr "Seleccionar"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Apondre lo calc d’imatjariá {0}"
 
@@ -2043,9 +2050,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Seleccionar"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5618,10 +5622,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9057,10 +9057,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9080,6 +9078,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "imatges JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11049,7 +11053,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14229,6 +14233,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15221,12 +15231,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15322,45 +15408,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16195,31 +16243,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16234,16 +16279,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16328,6 +16381,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16358,12 +16414,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16559,6 +16618,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16817,6 +16879,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18060,10 +18130,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18084,15 +18150,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18166,6 +18232,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19663,7 +19733,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19693,28 +19763,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20232,6 +20302,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20595,16 +20696,13 @@ msgstr "Tèst"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20616,13 +20714,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20655,6 +20753,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20698,7 +20844,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20719,6 +20868,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20847,7 +21002,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20930,6 +21085,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21146,16 +21307,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21164,6 +21325,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21431,6 +21595,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21523,6 +21690,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26857,6 +27027,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26917,9 +27102,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/pa.po b/i18n/po/pa.po
index eb2eb63..7b0f3fb 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-05-06 15:52+0000\n"
 "Last-Translator: A S Alam <aalam at users.sf.net>\n"
 "Language-Team: Punjabi <pa at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:15+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:11+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: pa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/pl.po b/i18n/po/pl.po
index e97de5d..3df65c5 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-25 22:52+0000\n"
-"Last-Translator: Daniel Koć <daniel at xn--ko-wla.pl>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-16 11:11+0000\n"
+"Last-Translator: KAcper <kacper.perschke 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: 2014-12-29 05:16+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:13+0000\n"
+"X-Generator: Launchpad (build 17306)\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"
@@ -111,7 +111,7 @@ msgid "Updating user interface"
 msgstr "Odświeżanie interfejsu użytkownika"
 
 msgid "{0} completed in {1}"
-msgstr ""
+msgstr "zakończono {0} z {1}"
 
 msgid "Ignoring malformed file URL: \"{0}\""
 msgstr "Pominięto niepoprawny URL do pliku: \"{0}\""
@@ -221,7 +221,7 @@ msgid "Click to abort launching external browsers"
 msgstr "Kliknij aby anulować uruchomienie zewnetrznych przeglądarek"
 
 msgid "Please select at least one already uploaded node, way, or relation."
-msgstr "Proszę wybrać co najmniej jeden węzeł, drogę lub relację"
+msgstr "Proszę wybrać co najmniej jeden węzeł, linię lub relację"
 
 msgid "Please select the target layer."
 msgstr "Wybierz warstwę docelową"
@@ -242,6 +242,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Brak warstw docelowych."
 
+msgid "Select"
+msgstr "Zaznacz"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Zaznacz na mapie elementy zaznaczone na powyższej liście."
+
 msgid "Add imagery layer {0}"
 msgstr "Dodaj warstwę zdjęć {0}"
 
@@ -313,7 +320,7 @@ msgstr "Nie można wyrównać wieloboku. Akcja przerwana."
 
 msgid "Intersection of three or more ways can not be solved. Abort."
 msgstr ""
-"Nie można rozwiązać przecięcia trzech, lub więcej dróg. Akcja przerwana."
+"Nie można rozwiązać przecięcia trzech, lub więcej linii. Akcja przerwana."
 
 msgid "Two parallels ways found. Abort."
 msgstr "Znaleziono dwie równoległe linie. Akcja przerwana."
@@ -407,7 +414,7 @@ msgid ""
 "Could not combine ways<br>(They could not be merged into a single string of "
 "nodes)"
 msgstr ""
-"Nie można połączyć dróg<br>(Nie mogą zostać połączone w jeden ciąg węzłów)"
+"Nie można połączyć linii<br>(Nie mogą zostać połączone w jeden ciąg węzłów)"
 
 msgid "Combine {0} way"
 msgid_plural "Combine {0} ways"
@@ -443,7 +450,7 @@ msgid ""
 "Please select exactly two or three nodes or one way with exactly two or "
 "three nodes."
 msgstr ""
-"Proszę wybrać dwa lub trzy węzły lub drogę składającą się dokładnie z dwóch "
+"Proszę wybrać dwa lub trzy węzły lub linię składającą się dokładnie z dwóch "
 "lub trzech węzłów."
 
 msgid "Those nodes are not in a circle. Aborting."
@@ -459,7 +466,7 @@ msgid "No data loaded."
 msgstr "Nie wczytano żadnych danych."
 
 msgid "You must select at least one way."
-msgstr "Musisz zaznaczyć co najmniej jedną drogę."
+msgstr "Musisz zaznaczyć co najmniej jedną linię."
 
 msgid "Delete"
 msgstr "Usuń"
@@ -561,7 +568,7 @@ msgid "History"
 msgstr "Historia"
 
 msgid "Display history information about OSM ways, nodes, or relations."
-msgstr "Wyświetl historyczne informacjie o drogach, węzłach i relacjach OSM."
+msgstr "Wyświetl historyczne informacje o liniach, węzłach i relacjach OSM."
 
 msgid "Show history"
 msgstr "Pokaż historię"
@@ -613,7 +620,7 @@ msgstr "Szczegółowe informacje"
 
 msgid ""
 "Display advanced object information about OSM nodes, ways, or relations."
-msgstr "Wyświetl szczegółowe informacje o węzłach, drogach lub relacjach."
+msgstr "Wyświetl szczegółowe informacje o węzłach, liniach lub relacjach."
 
 msgid "Advanced info (web)"
 msgstr "Szczegółowe informacje (WWW)"
@@ -621,7 +628,7 @@ msgstr "Szczegółowe informacje (WWW)"
 msgid ""
 "Display object information about OSM nodes, ways, or relations in web "
 "browser."
-msgstr "Wyświetl informacje o węzłach, drogach lub relacjach na stronie WWW."
+msgstr "Wyświetl informacje o węzłach, liniach lub relacjach na stronie WWW."
 
 msgid "Join overlapping Areas"
 msgstr "Połącz nakładające się obszary"
@@ -631,12 +638,12 @@ msgstr "Łączy nakładające się obszary"
 
 msgid "Please select at least one closed way that should be joined."
 msgstr ""
-"Proszę wybrać co najmniej jedną zamkniętą drogę, która powinna być połączona"
+"Proszę wybrać co najmniej jedną zamkniętą linię, która powinna być połączona"
 
 msgid ""
 "One of the selected ways is not closed and therefore cannot be joined."
 msgstr ""
-"Jedna z wybranych dróg nie jest zamknięta i dlatego nie może być łączona."
+"Jedna z wybranych linii nie jest zamknięta i dlatego nie może być łączona."
 
 msgid "Join area confirmation"
 msgstr "Potwierdzenie przy łączeniu obszarów"
@@ -682,7 +689,7 @@ msgid "Delete relations"
 msgstr "Kasuje relacje"
 
 msgid "Delete Ways that are not part of an inner multipolygon"
-msgstr "Usuń linie ktore nie należą do wewnętrznego wielokąta"
+msgstr "Usuń linie które nie należą do wewnętrznego wielokąta"
 
 msgid "Joined overlapping areas"
 msgstr "Połączono nakładające się na siebie obszary"
@@ -698,7 +705,7 @@ msgid "Fix tag conflicts"
 msgstr "Popraw konflikty tagów"
 
 msgid "Split ways into fragments"
-msgstr "Rozdziela drogę na fragmenty"
+msgstr "Rozdziela linie na fragmenty"
 
 msgid "Sorry. Cannot handle multipolygon relations with multiple outer ways."
 msgstr "Relacja multipolygon może mieć tylko jeden zewnętrzny wielokąt."
@@ -706,20 +713,20 @@ msgstr "Relacja multipolygon może mieć tylko jeden zewnętrzny wielokąt."
 msgid ""
 "Sorry. Cannot handle way that is outer in multiple multipolygon relations."
 msgstr ""
-"Nie można tego zrobić jeśli droga jest użyta jako zewnętrzny wielokąt w "
+"Nie można tego zrobić jeśli linia jest użyta jako zewnętrzny wielokąt w "
 "wielu relacjach multipolygon."
 
 msgid ""
 "Sorry. Cannot handle way that is both inner and outer in multipolygon "
 "relations."
 msgstr ""
-"Nie można tego zrobić jeśli droga jest użyta jako zewnętrzny i jako "
+"Nie można tego zrobić jeśli linia jest użyta jako zewnętrzny i jako "
 "wewnetrzny wielokąt w relacjach multipolygon."
 
 msgid ""
 "Sorry. Cannot handle way that is inner in multiple multipolygon relations."
 msgstr ""
-"Nie można tego zrobić jeśli droga jest użyta jako wewnętrzny wielokąt w "
+"Nie można tego zrobić jeśli linia jest użyta jako wewnętrzny wielokąt w "
 "wielu relacjach multipolygon."
 
 msgid "Removed Element from Relations"
@@ -732,13 +739,13 @@ msgid "Join Areas Function"
 msgstr "Funkcja łączenia obszarów"
 
 msgid "Join Node to Way"
-msgstr "Połącz węzeł z drogą"
+msgstr "Połącz węzeł z linią"
 
 msgid "Include a node into the nearest way segments"
 msgstr "Dołącz węzeł do najbliższego segmentu linii"
 
 msgid "Move Node onto Way"
-msgstr "Przenieś węzeł na drogę"
+msgstr "Przenieś węzeł na linię"
 
 msgid "Move the node onto the nearest way segments and include it"
 msgstr "Przenieś węzeł do najbliższego segmentu linii i dołącz go tam"
@@ -841,7 +848,7 @@ msgid ""
 msgstr ""
 "Chcesz połączyć warstwy ''{0}'' i ''{1}''.<br /><br />Mają one różną "
 "politykę wrzucania na serwer i nie powinny być łączone<br />Połączenie ich "
-"wymusi surowe zasady dla ''{1}''.<br /><br /><b>Nie jest to polecana droga "
+"wymusi surowe zasady dla ''{1}''.<br /><br /><b>Nie jest to polecana metoda "
 "łączenia takich danych</b>.<br />Powinieneś zamiast tego sprawdzić i każdy "
 "element, jeden po drugim, używając ''<i>Łączenia wybranych</i>''.<br /><br "
 "/>Jesteś pewny że chcesz kontynuować?"
@@ -871,7 +878,7 @@ msgstr "Kliknij aby anulować łączenie węzłów"
 msgid ""
 "Cannot merge nodes: Would have to delete way {0} which is still used by {1}"
 msgstr ""
-"Błąd łączenia węzłów: należałoby usunąć drogę {0} nadal używaną przez {1}"
+"Błąd łączenia węzłów: należałoby usunąć linię {0} nadal używaną przez {1}"
 
 msgid "Merge {0} node"
 msgid_plural "Merge {0} nodes"
@@ -906,7 +913,7 @@ msgid "Mirror selected nodes and ways."
 msgstr "Odwraca zaznaczone węzły i linie."
 
 msgid "Please select at least one node or way."
-msgstr "Wybierz co najmniej jeden węzeł lub drogę."
+msgstr "Wybierz co najmniej jeden węzeł lub linię."
 
 msgid "up"
 msgstr "do góry"
@@ -1046,8 +1053,8 @@ msgid ""
 "can undo the movement for certain nodes:<br>Select them and press the "
 "shortcut for Orthogonalize / Undo. The default is Shift-Q.)"
 msgstr ""
-"<h3>Kiedy jedna lub więcej dróg jest zaznaczonych, kształt jest "
-"dostosowywany tak że każdy kąt ma 90 lub 180 stopni.</h3>Możesz dodać dwa "
+"<h3>Kiedy jedna lub więcej linii jest zaznaczonych, kształt jest "
+"dostosowywany tak, że każdy kąt ma 90 lub 180 stopni.</h3>Możesz dodać dwa "
 "węzły do zaznaczenia. Wtedy kierunek ustalony jest na podstawie tych dwóch "
 "węzłów. (Pyzatym możesz cofnąć zmiany dla niektórych węzłów:<br>Zaznacz je i "
 "naciśnij skrót dla Korekta prostopadłości / Cofnij. Domyślnie Shift-Q.)"
@@ -1237,7 +1244,7 @@ msgid "Reverse the direction of all selected ways."
 msgstr "Zmienia kierunek wszystkich zaznaczonych linii na przeciwny."
 
 msgid "Please select at least one way."
-msgstr "Proszę zaznaczyć co najmniej jedną drogę."
+msgstr "Proszę zaznaczyć co najmniej jedną linię."
 
 msgid "Reverse ways"
 msgstr "Odwróć kierunek linii"
@@ -1274,10 +1281,10 @@ msgstr ""
 "obiekty niekompletne."
 
 msgid "Non-branching way sequences"
-msgstr "Nierozgałęziające sekwencje dróg"
+msgstr "Nierozgałęziające sekwencje linii"
 
 msgid "Select non-branching sequences of ways"
-msgstr "Wybierz nierozgałęziającą się sekwencję dróg"
+msgstr "Wybierz nierozgałęziającą się sekwencję linii"
 
 msgid "Load Session"
 msgstr "Wczytaj Sesję"
@@ -1353,13 +1360,13 @@ msgid "Close"
 msgstr "Zamknij"
 
 msgid "Simplify Way"
-msgstr "Uprość drogę"
+msgstr "Uprość linię"
 
 msgid "Delete unnecessary nodes from a way."
 msgstr "Usuwa zbędne węzły z linii."
 
 msgid "Please select at least one way to simplify."
-msgstr "Wybierz przynajmniej jedną drogę do uproszczenia."
+msgstr "Wybierz przynajmniej jedną linię do uproszczenia."
 
 msgid "Yes"
 msgstr "Tak"
@@ -1387,15 +1394,15 @@ msgstr[2] "Uproszczono {0} linii"
 
 msgid "Simplify Way (remove {0} node)"
 msgid_plural "Simplify Way (remove {0} nodes)"
-msgstr[0] "Uprość drogę (usuń {0} węzeł)"
-msgstr[1] "Uprość drogę (usuń {0} węzeły)"
-msgstr[2] "Uprość drogę (usuń {0} węzłów)"
+msgstr[0] "Uprość linię (usuń {0} węzeł)"
+msgstr[1] "Uprość linię (usuń {0} węzeły)"
+msgstr[2] "Uprość linię (usuń {0} węzłów)"
 
 msgid "Split Way"
 msgstr "Przetnij linię"
 
 msgid "Split a way at the selected node."
-msgstr "Przecina drogę w zaznaczonym węźle"
+msgstr "Przecina linię w zaznaczonym węźle"
 
 msgid ""
 "The current selection cannot be used for splitting - no node is selected."
@@ -1418,19 +1425,25 @@ msgid ""
 msgid_plural ""
 "There is more than one way using the nodes you selected. Please select the "
 "way also."
-msgstr[0] "Więcej niż jedna droga używa wybrany węzeł. Wybierz także drogę."
-msgstr[1] "Więcej niż jedna droga używa wybrane węzły. Wybierz także drogę."
-msgstr[2] "Więcej niż jedna droga używa wybrane węzły. Wybierz także drogę."
+msgstr[0] ""
+"Więcej niż jedna linia używa wybranego węzła. Zaznacz także linię, którą "
+"chcesz podzielić."
+msgstr[1] ""
+"Więcej niż jedna linia używa wybranych węzłów. Zaznacz także linię, którą "
+"chcesz podzielić."
+msgstr[2] ""
+"Więcej niż jedna linia używa wybranych węzłów. Zaznacz także linię, którą "
+"chcesz podzielić."
 
 msgid "You must select two or more nodes to split a circular way."
-msgstr "Musisz wybrać dwa lub więcej węzłów aby rozdzielić drogę okrężną."
+msgstr "Musisz wybrać dwa lub więcej węzłów aby rozdzielić linię okrężną."
 
 msgid ""
 "The way cannot be split at the selected nodes. (Hint: Select nodes in the "
 "middle of the way.)"
 msgstr ""
-"Linia nie może być rozdzielona w wybranych węzłach. (Podpowiedź: wybierz "
-"węzły w obrębie linii.)"
+"Linia nie może być rozdzielona w wybranych węzłach (podpowiedź: wybierz "
+"węzły w obrębie linii)."
 
 msgid ""
 "A role based relation membership was copied to all new ways.<br>You should "
@@ -1448,9 +1461,9 @@ msgstr ""
 
 msgid "Split way {0} into {1} part"
 msgid_plural "Split way {0} into {1} parts"
-msgstr[0] "Rozdziel drogę {0} na {1} część"
-msgstr[1] "Rozdziel drogę {0} na {1} części"
-msgstr[2] "Rozdziel drogę {0} na {1} części"
+msgstr[0] "Rozdziel linię {0} na {1} część"
+msgstr[1] "Rozdziel linię {0} na {1} części"
+msgstr[2] "Rozdziel linię {0} na {1} części"
 
 msgid "Toggle GPX Lines"
 msgstr "Przełącz linie łączące punktu GPX"
@@ -1468,7 +1481,7 @@ msgid "UnGlue Ways"
 msgstr "Rozdziel linie"
 
 msgid "Duplicate nodes that are used by multiple ways."
-msgstr "Powiela węzły które używane są przez różne drogi."
+msgstr "Powiela węzły które używane są przez różne linie."
 
 msgid "This node is not glued to anything else."
 msgstr "Ten węzeł nie jest przyklejony do niczego więcej."
@@ -1489,25 +1502,25 @@ msgid "* One tagged node, or"
 msgstr "* Jeden węzęł z tagami lub"
 
 msgid "* One node that is used by more than one way, or"
-msgstr "* Jeden węzeł który jest użyty przez więcej niż jedną drogę lub"
+msgstr "* Jeden węzeł który jest użyty przez więcej niż jedną linię lub"
 
 msgid ""
 "* One node that is used by more than one way and one of those ways, or"
 msgstr ""
-"* Jeden węzeł, który jest użyty przez więcej niż jedną drogę oraz jedną z "
-"tych dróg lub"
+"* Jeden węzeł, który jest użyty przez więcej niż jedną linię oraz jedną z "
+"tych linii lub"
 
 msgid ""
 "* One way that has one or more nodes that are used by more than one way, or"
 msgstr ""
-"* Jedną drogę która ma jeden lub więcej węzłów użyty przez więcej niż jedną "
+"* Jedną linię która ma jeden lub więcej węzłów użyty przez więcej niż jedną "
 "drogę, lub"
 
 msgid ""
 "* One way and one or more of its nodes that are used by more than one way."
 msgstr ""
-"* Jedną drogę oraz jeden lub więcej jej węzłów, które są użyte przez więcej "
-"niż jedną drogę."
+"* Jedną linię oraz jeden lub więcej jej węzłów, które są użyte przez więcej "
+"niż jedną linię."
 
 msgid ""
 "Note: If a way is selected, this way will get fresh copies of the unglued\n"
@@ -1573,9 +1586,9 @@ msgid ""
 "The affected way would disappear after disconnecting the selected node."
 msgid_plural ""
 "The affected way would disappear after disconnecting the selected nodes."
-msgstr[0] "Powiązana droga zniknie po odłączeniu wybranego węzła."
-msgstr[1] "Powiązana droga zniknie po odłączeniu wybranych węzłów."
-msgstr[2] "Powiązana droga zniknie po odłączeniu wybranych węzłów."
+msgstr[0] "Powiązana linia zniknie po odłączeniu wybranego węzła."
+msgstr[1] "Powiązana linia zniknie po odłączeniu wybranych węzłów."
+msgstr[2] "Powiązana linia zniknie po odłączeniu wybranych węzłów."
 
 msgid "Undo"
 msgstr "Cofnij"
@@ -1607,7 +1620,7 @@ msgstr "Pobierz zmiany"
 msgid ""
 "Updates the currently modified objects from the server (re-downloads data)"
 msgstr ""
-"Aktualizuje obecnie zmodyfikowane obiekty  z serwerem (pobiera ponownie dane)"
+"Aktualizuje obecnie zmodyfikowane obiekty z serwerem (pobiera ponownie dane)"
 
 msgid "No current dataset found"
 msgstr "Nie znaleziono aktualnego zestawu danych"
@@ -1666,13 +1679,13 @@ msgid "Nothing to upload. Get some data first."
 msgstr "Nie ma nic do wysłania. Wprowadź jakieś dane."
 
 msgid "Upload note changes to server"
-msgstr ""
+msgstr "Wyślij zmiany w uwagach na serwer"
 
 msgid "Upload notes"
-msgstr ""
+msgstr "Wyślij uwagi"
 
 msgid "Uploading notes to server"
-msgstr ""
+msgstr "Wysyłanie uwag na serwer"
 
 msgid "Upload selection"
 msgstr "Wyślij wybrane elementy"
@@ -1753,7 +1766,7 @@ msgid "Zoom to the first selected node"
 msgstr "Przybliż do pierwszego wybranego węzła"
 
 msgid "Zooming disabled because layer of this way is not active"
-msgstr "Przybliżanie wyłączone ponieważ warstwa tej drogi jest nieaktywna"
+msgstr "Przybliżanie wyłączone ponieważ warstwa tej linii jest nieaktywna"
 
 msgid "Zooming disabled because there is no selected node"
 msgstr "Przybliżanie wyłączone poniewać nie jest wybrany żaden węzeł"
@@ -1829,7 +1842,7 @@ msgid "Markers from {0}"
 msgstr "Znaczniki z {0}"
 
 msgid "Downloading Notes"
-msgstr ""
+msgstr "Pobieranie uwag"
 
 msgid "Download Compressed OSM Change"
 msgstr "Pobiera skompresowane zmiany OSM"
@@ -1882,7 +1895,7 @@ msgid "({0}/{1}) Loading parents of node {2}"
 msgstr "({0}/{1}) ładuję rodzica węzła {2}"
 
 msgid "({0}/{1}) Loading parents of way {2}"
-msgstr "({0}/{1}) Ładuję rodzica drogi {2}"
+msgstr "({0}/{1}) Ładuję rodzica linii {2}"
 
 msgid "({0}/{1}) Loading parents of relation {2}"
 msgstr "({0}/{1}) ładuję rodzica relacji {2}"
@@ -1994,7 +2007,7 @@ msgid ""
 "when deleting a way. Ctrl: delete referring objects."
 msgstr ""
 "Kliknij aby usunąć. Shift: usuwa segment. Alt: nie usuwa węzłów przy "
-"usuwaniu drogi. Ctrl: usuwa powiązane obiekty."
+"usuwaniu linii. Ctrl: usuwa powiązane obiekty."
 
 msgid "Draw"
 msgstr "Rysuj"
@@ -2021,13 +2034,13 @@ msgid "Add node into way"
 msgstr "Dodaj węzeł do linii"
 
 msgid "Connect existing way to node"
-msgstr "Połącz istniejący drogę z węzłem"
+msgstr "Połącz istniejącą linię z węzłem"
 
 msgid "Add a new node to an existing way"
 msgstr "Dodaj nowy węzeł do istniejącej linii"
 
 msgid "Add node into way and connect"
-msgstr "Dodaj węzeł do drogi i połącz"
+msgstr "Dodaj węzeł do linii i połącz"
 
 msgid "Create new node."
 msgstr "Utwórz nowy węzeł."
@@ -2037,15 +2050,15 @@ msgstr "Zaznacz węzeł pod kursorem."
 
 msgid "Insert new node into way."
 msgid_plural "Insert new node into {0} ways."
-msgstr[0] "Wstaw w drogę nowy węzeł."
-msgstr[1] "Wstaw w drogę nowe węzły {0}"
-msgstr[2] "Wstaw w drogę nowe węzły {0}"
+msgstr[0] "Wstaw w linię nowy węzeł."
+msgstr[1] "Wstaw w linię nowe węzły {0}"
+msgstr[2] "Wstaw w linię nowe węzły {0}"
 
 msgid "Start new way from last node."
-msgstr "Zacznij nową drogę od ostatniego węzła"
+msgstr "Zacznij nową linię od ostatniego węzła"
 
 msgid "Continue way from last node."
-msgstr "Kontynuuj drogę od ostatniego węzła."
+msgstr "Kontynuuj linię od ostatniego węzła."
 
 msgid "Angle snapping active."
 msgstr "Przyciąganie kątów włączone"
@@ -2117,7 +2130,7 @@ msgid "Dual alignment active."
 msgstr "Jednoczesne przesuwanie aktywne."
 
 msgid "Segment collapsed due to its direction reversing."
-msgstr ""
+msgstr "Segment zwinięty ze względu na odwrócenie jego kierunku."
 
 msgid "Move a segment along its normal, then release the mouse button."
 msgstr "Przesuń segment wzdłuż jego prostopadłej i zwolnij przycisk myszy."
@@ -2137,7 +2150,7 @@ msgid "Extrude: helper line"
 msgstr "Wytłocz: linia pomocnicza"
 
 msgid "Extrude Way"
-msgstr "Wytłocz drogę"
+msgstr "Wytłocz linię"
 
 msgid "Improve Way Accuracy"
 msgstr "Popraw dokładność linii"
@@ -2149,10 +2162,10 @@ msgid "improve way accuracy helper line"
 msgstr "linia pomocnicza do poprawniania dokładności"
 
 msgid "Click on the way to start improving its shape."
-msgstr "Kliknij drogę by zacząć poprawiać jej kształt."
+msgstr "Kliknij linię by zacząć poprawiać jej kształt."
 
 msgid "Select a way that you want to make more accurate."
-msgstr "Zaznacz drogę którą chcesz wyrysować dokładniej."
+msgstr "Zaznacz linię którą chcesz wyrysować dokładniej."
 
 msgid ""
 "Click to add a new node. Release Ctrl to move existing nodes or hold Alt to "
@@ -2203,7 +2216,7 @@ msgid ""
 "Select ways as in Select mode. Drag selected ways or a single way to create "
 "a parallel copy (Alt toggles tag preservation)"
 msgstr ""
-"Wybierz linię jak w trybie wyboru. Przeciągnij wybraną linię lub linie by "
+"Wybierz linie jak w trybie wyboru. Przeciągnij wybraną linię lub linie by "
 "utworzyć równoległą kopię (Alt przełącza zachowywanie tagów)"
 
 msgid "Hold Ctrl to toggle snapping"
@@ -2214,7 +2227,7 @@ msgid ""
 "The ways selected must form a simple branchless path"
 msgstr ""
 "ParallelWayAction\n"
-"Wybrane drogi muszą tworzyć pojedynczą ścieżkę bez rozgałęzień"
+"Wybrane linie muszą tworzyć pojedynczą ścieżkę bez rozgałęzień"
 
 msgid "Make parallel way error"
 msgstr "Błąd tworzenia linii równoległej"
@@ -2227,9 +2240,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Zaznacz"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Zaznaczanie, przesuwanie, skalowanie i obracanie obiektów"
 
@@ -2288,9 +2298,9 @@ msgstr ""
 
 msgid "Add and move a virtual new node to way"
 msgid_plural "Add and move a virtual new node to {0} ways"
-msgstr[0] "Dodaj i przesuń wirtualny nowy węzeł do drogi"
-msgstr[1] "Dodaj i przesuń wirtualny nowy węzeł do {0} dróg"
-msgstr[2] "Dodaj i przesuń wirtualny nowy węzeł do {0} dróg"
+msgstr[0] "Dodaj i przesuń wirtualny nowy węzeł do linii"
+msgstr[1] "Dodaj i przesuń wirtualny nowy węzeł do {0} linii"
+msgstr[2] "Dodaj i przesuń wirtualny nowy węzeł do {0} linii"
 
 msgid "Zoom"
 msgstr "Powiększ"
@@ -2531,7 +2541,7 @@ msgid ""
 "<b>relation</b>)"
 msgstr ""
 "<b>typ:</b>... - obiekty o określonym typie (<b>node</b> - węzeł, <b>way</b> "
-"- droga, <b>relation</b> - relacja)"
+"- linia, <b>relation</b> - relacja)"
 
 msgid "<b>user:</b>... - objects changed by user"
 msgstr "<b>user:</b>... - obiekty zmienione przez \"user\""
@@ -2588,7 +2598,7 @@ msgid ""
 "<b>areasize:</b>... - closed ways with given area in m² (<b>areasize:</b>min-"
 "max or <b>areasize:</b>max)"
 msgstr ""
-"<b>areasize:</b>... - zamknięte drogi ograniczające obszar o podanej "
+"<b>areasize:</b>... - zamknięte linie ograniczające obszar o podanej "
 "wielkości w m² (<b>areasize:</b>min-max lub <b>areasize:</b>max)"
 
 msgid "<b>modified</b> - all changed objects"
@@ -2605,8 +2615,8 @@ msgstr "<b>untagged</b> - wszystkie obiekty bez tagów"
 
 msgid "<b>closed</b> - all closed ways (a node is not considered closed)"
 msgstr ""
-"<b>closed</b> - wszystkie zamknięte drogi (pojedynczy węzeł nie tworzy "
-"zamkniętej drogi)"
+"<b>closed</b> - wszystkie zamknięte linie (pojedynczy węzeł nie tworzy "
+"zamkniętej linii)"
 
 msgid ""
 "<b>child <i>expr</i></b> - all children of objects matching the expression"
@@ -2622,14 +2632,14 @@ msgid ""
 "<b>(all)indownloadedarea</b> - objects (and all its way nodes / relation "
 "members) in downloaded area"
 msgstr ""
-"<b>(all)indownloadedarea</b> - obiekty (i wszystkie węzły należace do dróg, "
+"<b>(all)indownloadedarea</b> - obiekty (i wszystkie węzły należace do linii, "
 "i obiekty w relacjach) w pobranym obszarze"
 
 msgid ""
 "<b>(all)inview</b> - objects (and all its way nodes / relation members) in "
 "current view"
 msgstr ""
-"<b>(all)inview</b> - obiekty (i wszystkie węzły należace do dróg, i obiekty "
+"<b>(all)inview</b> - obiekty (i wszystkie węzły należace do linii, i obiekty "
 "w relacjach) w aktualnym widoku"
 
 msgid "Use <b>|</b> or <b>OR</b> to combine with logical or"
@@ -2755,7 +2765,7 @@ msgid "objects with given role in a relation"
 msgstr "obiekty w ustaloną rolą w relacji"
 
 msgid "closed ways with an area of 100 m²"
-msgstr "zamknięte drogi z terenem od 100m²"
+msgstr "zamknięte linie z terenem od 100 m²"
 
 msgid "state"
 msgstr "stan"
@@ -2782,10 +2792,10 @@ msgid "all parents of objects matching the expression"
 msgstr "wszyscy rodzice obiektów pasujących do wyrażenia"
 
 msgid "n-th member of relation and/or n-th node of way"
-msgstr "n-ty członek relacji i/lub n-ty węzeł drogi"
+msgstr "n-ty członek relacji i/lub n-ty węzeł linii"
 
 msgid "every n-th member of relation and/or every n-th node of way"
-msgstr "każdy n-ty członek relacji i/lub każdy n-ty węzeł drogi"
+msgstr "każdy n-ty członek relacji i/lub każdy n-ty węzeł linii"
 
 msgid "view"
 msgstr "widok"
@@ -2795,7 +2805,7 @@ msgstr "obiekty w obecnym podglądzie"
 
 msgid "objects (and all its way nodes / relation members) in current view"
 msgstr ""
-"obiekty (i wszystkie jego drogi wezłów / relacje członków) w obecnym "
+"obiekty (i wszystkie jego węzły linii / członków relacji) w obecnym "
 "podglądzie"
 
 msgid "objects in downloaded area"
@@ -2803,8 +2813,7 @@ msgstr "obiekty w pobranym obszarze"
 
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
-"obiekty (i wszystkie jego drogi wezłów / relacje członków) w pobranym "
-"obszarze"
+"obiekty (i wszystkie jego węzły linii / członków relacji) w pobranym obszarze"
 
 msgid "No match found for ''{0}''"
 msgstr "Nie znaleziono nic szukając ''{0}''"
@@ -2875,7 +2884,7 @@ msgstr ""
 
 msgid "Unknown primitive type: {0}. Allowed values are node, way or relation"
 msgstr ""
-"Nieznany typ elementu: {0}. Dozwolone wartości to węzeł, droga lub relacja"
+"Nieznany typ elementu: {0}. Dozwolone wartości to węzeł, linia lub relacja"
 
 msgid "Positive integer expected"
 msgstr "Oczekiwano dodatniej liczby całkowitej"
@@ -2913,7 +2922,7 @@ msgid "Precondition Violation"
 msgstr "Naruszenie warunku wstępnego"
 
 msgid "{0} nodes in way {1} exceed the max. allowed number of nodes {2}"
-msgstr "{0} węzłów w drodze {1} przekracza dopuszczalną liczbę węzłów {2}"
+msgstr "{0} węzłów w linii {1} przekracza dopuszczalną liczbę węzłów {2}"
 
 msgid "API Capabilities Violation"
 msgstr "Naruszenie możliwości API"
@@ -2993,7 +3002,7 @@ msgid "Add node {0}"
 msgstr "Dodano węzeł {0}"
 
 msgid "Add way {0}"
-msgstr "Dodano drogę {0}"
+msgstr "Dodano linię {0}"
 
 msgid "Add relation {0}"
 msgstr "Dodano relację {0}"
@@ -3005,13 +3014,13 @@ msgstr[1] "Dodano {0} obiekty"
 msgstr[2] "Dodano {0} obiektów"
 
 msgid "New way {0} has 0 nodes"
-msgstr "Nowa droga {0} zawiera 0 węzłów"
+msgstr "Nowa linia {0} zawiera 0 węzłów"
 
 msgid "Change node {0}"
 msgstr "Zmień węzeł {0}"
 
 msgid "Change way {0}"
-msgstr "Zmień drogę {0}"
+msgstr "Zmień linię {0}"
 
 msgid "Change relation {0}"
 msgstr "Zmień relację {0}"
@@ -3023,7 +3032,7 @@ msgid "Remove \"{0}\" for node ''{1}''"
 msgstr "Usunięto  \"{0}\" w węźle ''{1}''"
 
 msgid "Remove \"{0}\" for way ''{1}''"
-msgstr "Usunięto \"{0}\" w drodze ''{1}''"
+msgstr "Usunięto \"{0}\" w linii ''{1}''"
 
 msgid "Remove \"{0}\" for relation ''{1}''"
 msgstr "Usunięto \"{0}\" w relacji ''{1}''"
@@ -3032,7 +3041,7 @@ msgid "Set {0}={1} for node ''{2}''"
 msgstr "Ustawiono {0}={1} dla węzła \"{2}\""
 
 msgid "Set {0}={1} for way ''{2}''"
-msgstr "Ustawiono {0}={1} dla drogi \"{2}\""
+msgstr "Ustawiono {0}={1} dla linii \"{2}\""
 
 msgid "Set {0}={1} for relation ''{2}''"
 msgstr "Ustawiono {0}={1} dla relacji \"{2}\""
@@ -3081,7 +3090,7 @@ msgid "Delete node {0}"
 msgstr "Usunięto węzeł {0}"
 
 msgid "Delete way {0}"
-msgstr "Usunięto drogę {0}"
+msgstr "Usunięto linię {0}"
 
 msgid "Delete relation {0}"
 msgstr "Usunięto relację {0}"
@@ -3185,8 +3194,9 @@ msgstr[2] "Skalowanie {0} węzłów"
 
 msgid "Selected {0} object"
 msgid_plural "Selected {0} objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Wybrano {0} obiekt"
+msgstr[1] "Wybrano {0} obiekty"
+msgstr[2] "Wybrano {0} obiektów"
 
 msgid "Sequence: {0}"
 msgstr "Kolejność: {0}"
@@ -3223,19 +3233,19 @@ msgstr ""
 "Nie można wycofać operacji ''{0}'' ponieważ warstwy ''{1}'' już nie ma"
 
 msgid "Resolve conflicts in coordinates in {0}"
-msgstr "Rozwiaż konflikt we współżednych w {0}"
+msgstr "Rozwiąż konflikt we współżednych w {0}"
 
 msgid "Cannot resolve undecided conflict."
 msgstr "Nie można rozwiązać niezdecydowanego konfliktu."
 
 msgid "Resolve conflicts in deleted state in {0}"
-msgstr ""
+msgstr "Rozwiąż konflikty z usuniętego stanu w {0}"
 
 msgid "Set the ''modified'' flag for node {0}"
 msgstr "Ustaw flagę \"zmodifikowano\" w węźle {0}"
 
 msgid "Set the ''modified'' flag for way {0}"
-msgstr "Ustaw flagę \"zmodifikowano\" w drodze {0}"
+msgstr "Ustaw flagę \"zmodifikowano\" w linii {0}"
 
 msgid "Set the ''modified'' flag for relation {0}"
 msgstr "Ustaw flagę \"zmodifikowano\" w relacji {0}"
@@ -3251,9 +3261,9 @@ msgstr[2] "Rozwiąż {0} konfliktów tagu w węźle {1}"
 
 msgid "Resolve {0} tag conflict in way {1}"
 msgid_plural "Resolve {0} tag conflicts in way {1}"
-msgstr[0] "Rozwiąż {0} konflikt tagu w drodze {1}"
-msgstr[1] "Rozwiąż {0} konflikty tagu w drodze {1}"
-msgstr[2] "Rozwiąż {0} konfliktów tagu w drodze {1}"
+msgstr[0] "Rozwiąż {0} konflikt tagu w linii {1}"
+msgstr[1] "Rozwiąż {0} konflikty tagu w linii {1}"
+msgstr[2] "Rozwiąż {0} konfliktów tagu w linii {1}"
 
 msgid "Resolve {0} tag conflict in relation {1}"
 msgid_plural "Resolve {0} tag conflicts in relation {1}"
@@ -3265,13 +3275,13 @@ msgid "Resolve version conflict for node {0}"
 msgstr "Rozwiaż konflikt wersji w węźle {0}"
 
 msgid "Resolve version conflict for way {0}"
-msgstr "Rozwiaż konflikt wersji w drodze {0}"
+msgstr "Rozwiaż konflikt wersji w linii {0}"
 
 msgid "Resolve version conflict for relation {0}"
 msgstr "Rozwiaż konflikt wersji w relacji {0}"
 
 msgid "Resolve conflicts in node list of way {0}"
-msgstr "Rozwiaż konflikty w liscie węzłow drogi {0}"
+msgstr "Rozwiaż konflikty w liscie węzłów linii {0}"
 
 msgid "Main dataset does not include node {0}"
 msgstr "Główny zbiór danych nie zawiera węzła {0}"
@@ -3291,13 +3301,13 @@ msgstr[0] ""
 msgstr[1] ""
 
 msgid "Reverse directional way."
-msgstr "Odwróć drogę kierunkową."
+msgstr "Odwróć linię kierunkową."
 
 msgid ""
 "When reversing this way, the following changes are suggested in order to "
 "maintain data consistency."
 msgstr ""
-"Odwracając tę drogę, następujące zmiany są sugerowane w celu zachowania "
+"Przy odwracaniu tej linii następujące zmiany są sugerowane w celu zachowania "
 "spójności danych."
 
 msgid "Relation"
@@ -3434,7 +3444,7 @@ msgid ""
 "<html>Preferences file had errors.<br> Making backup of old one to "
 "<br>{0}<br> and creating a new default preference file.</html>"
 msgstr ""
-"<html>Plik ustawień  zawiera błędy. <br> Tworzenie kopii zapasowej starego "
+"<html>Plik ustawień zawiera błędy. <br> Tworzenie kopii zapasowej starego "
 "<br> {0} <br> i tworzenia nowego pliku ustawień domyślnych.</ html>"
 
 msgid ""
@@ -3549,7 +3559,7 @@ msgid ""
 msgstr ""
 
 msgid "Missing merge target for way with id {0}"
-msgstr "Brakuje celu do złączenia z drogą {0}."
+msgstr "Brakuje celu do złączenia z linią {0}."
 
 msgid ""
 "Object of type {0} with id {1} was marked to be deleted, but it''s missing "
@@ -3577,13 +3587,13 @@ msgid "Test ''{0}'' completed in {1}"
 msgstr "Test \"{0}\" kompletny w {1}"
 
 msgid "Cannot add a way with only {0} nodes."
-msgstr "Nie można dodać drogi zawierającej tylko {0} węzłów."
+msgstr "Nie można dodać linii zawierającej tylko {0} węzłów."
 
 msgid "Each node must connect exactly 2 ways"
-msgstr "Każdy węzeł musi łączyć dokładnie 2 drogi."
+msgstr "Każdy węzeł musi łączyć dokładnie 2 linie."
 
 msgid "There is an intersection between ways."
-msgstr "Drogi mają cześć wspólną."
+msgstr "Linie mają część wspólną."
 
 msgid ""
 "Cannot merge because either of the participating primitives is new and the "
@@ -3613,7 +3623,7 @@ msgstr[1] "relacje"
 msgstr[2] "relacji"
 
 msgid "closedway"
-msgstr "zamknięta droga"
+msgstr "zamknięta linia"
 
 msgid "multipolygon"
 msgstr "multipolygon"
@@ -3629,16 +3639,16 @@ msgid "<anonymous>"
 msgstr "<anonimowy>"
 
 msgid "Cannot add node {0} to incomplete way {1}."
-msgstr "Nie mogę dodać węzła {0} do niekompletnej drogi {1}"
+msgstr "Nie mogę dodać węzła {0} do niekompletnej linii {1}"
 
 msgid "Nodes in way must be in the same dataset"
-msgstr "Węzły w drodze muszą być w tym samym zestawie"
+msgstr "Węzły w linii muszą być w tym samym zestawie"
 
 msgid "Deleted node referenced by {0}"
 msgstr "Usunięty węzeł używany przez {0}"
 
 msgid "Complete node {0} with null coordinates in way {1}"
-msgstr "Uzupełnij węzeł {0} z pustymi współrzędnymi na drodze {1}"
+msgstr "Uzupełnij węzeł {0} z pustymi współrzędnymi na linii {1}"
 
 msgid ""
 "Cannot compare primitive with ID ''{0}'' to primitive with ID ''{1}''."
@@ -3673,13 +3683,13 @@ msgstr ""
 "zarejestrowana jako render mapy."
 
 msgid "Wireframe Map Renderer"
-msgstr ""
+msgstr "Wyświetlanie szkieletowe"
 
 msgid "Renders the map as simple wire frame."
 msgstr "Rysuje mapę w postaci uproszczonej (szkieletowej)."
 
 msgid "Styled Map Renderer"
-msgstr ""
+msgstr "Wyświetlanie ze stylu"
 
 msgid "Renders the map using style rules in a set of style sheets."
 msgstr ""
@@ -3703,7 +3713,7 @@ msgid "Node: tagged"
 msgstr "Węzeł: otagowany"
 
 msgid "untagged way"
-msgstr "nieotagowana droga"
+msgstr "nieotagowana linia"
 
 msgid "background"
 msgstr "tło"
@@ -3965,7 +3975,7 @@ msgid "Crossing waterways"
 msgstr "Przecinające się szlaki wodne"
 
 msgid "Crossing waterway/highway"
-msgstr "Przecinające się szlaki wodne z drogami"
+msgstr "Przecinające się cieki wodne z liniami"
 
 msgid "Crossing boundaries"
 msgstr "Przecinające się granice"
@@ -4042,7 +4052,7 @@ msgid ""
 "This test checks that there are no ways with same node coordinates and "
 "optionally also same tags."
 msgstr ""
-"Ten test sprawdza czy nie istnieją drogi z tymi samymi węzłami i opcjonalnie "
+"Ten test sprawdza czy nie istnieją linie z tymi samymi węzłami i opcjonalnie "
 "z tymi samymi tagami."
 
 msgid "Ways with same position"
@@ -4055,7 +4065,7 @@ msgid "Duplicated way nodes"
 msgstr "Powielone węzły linii"
 
 msgid "Checks for ways with identical consecutive nodes."
-msgstr "Sprawdza drogi z identycznymi, kolejnymi węzłami."
+msgstr "Sprawdza linie z identycznymi, kolejnymi węzłami."
 
 msgid "Highways"
 msgstr "Drogi"
@@ -4176,16 +4186,16 @@ msgid "Multipolygon is not closed"
 msgstr "Wielokąt nie jest zamknięty"
 
 msgid "Multipolygon inner way is outside"
-msgstr "Wewnętrzna droga w relacji multipolygon znajduje się na zewnątrz"
+msgstr "Wewnętrzna linia w relacji multipolygon znajduje się na zewnątrz"
 
 msgid "Intersection between multipolygon ways"
-msgstr "Drogi w relacji multipolygon przecinają się"
+msgstr "Linie w relacji multipolygon przecinają się"
 
 msgid "No useful role for multipolygon member"
 msgstr "Składnik relacji multipolygon nie ma przypisanej roli."
 
 msgid "Non-Way in multipolygon"
-msgstr "Obiekt niebędący drogą w relacji multipolygon"
+msgstr "Obiekt niebędący linią w relacji multipolygon"
 
 msgid "Missing name:* translation"
 msgstr "Brakujące tłumaczenie tagów name:*"
@@ -4243,28 +4253,28 @@ msgid ""
 "than one way."
 msgstr ""
 "Ten test sprawdza czy połączenie miedzy węzłami nie jest używane przez "
-"więcej niż jedną drogę."
+"więcej niż jedną linię."
 
 msgid "Areas share segment"
 msgstr "Obszary zawierają ten sam segment"
 
 msgid "Highways share segment with area"
-msgstr "Droga highway zawiera ten sam segment co obszar"
+msgstr "Linia highway zawiera ten sam segment co obszar"
 
 msgid "Railways share segment with area"
-msgstr "Droga railway zawiera ten sam segment co obszar"
+msgstr "Linia railway zawiera ten sam segment co obszar"
 
 msgid "Ways share segment with area"
-msgstr "Drogi zawierają ten sam segment co obszar"
+msgstr "Linia zawierają ten sam segment co obszar"
 
 msgid "Overlapping highways"
-msgstr "Nakładające się jezdnie"
+msgstr "Nakładające się drogi"
 
 msgid "Overlapping railways"
 msgstr "Nakładające się tory kolejowe"
 
 msgid "Way contains segment twice"
-msgstr "Droga zawiera zdublowane segmenty"
+msgstr "Linia zawiera zdublowane segmenty"
 
 msgid "Power lines"
 msgstr "Linie energetyczne"
@@ -4327,7 +4337,7 @@ msgstr "Linie przecinające same siebie"
 msgid ""
 "This test checks for ways that contain some of their nodes more than once."
 msgstr ""
-"Ten test sprawdza czy droga zawiera niektóre węzły więcej niż jeden raz."
+"Ten test sprawdza czy linia zawiera niektóre węzły więcej niż jeden raz."
 
 msgid "Similarly named ways"
 msgstr "Podobnie nazwane linie"
@@ -4335,7 +4345,7 @@ msgstr "Podobnie nazwane linie"
 msgid ""
 "This test checks for ways with similar names that may have been misspelled."
 msgstr ""
-"Ten test wyszukuje obiekty o podobnych nazwach - podejrzenie błędu w nazwie."
+"Ten test wyszukuje linie o podobnych nazwach - podejrzenie błędu w nazwie."
 
 msgid "Tag checker"
 msgstr "Walidator tagów"
@@ -4436,7 +4446,7 @@ msgid "Check for FIXMES."
 msgstr "Wyszukaj FIXME"
 
 msgid "Looks for nodes or ways with FIXME in any property value."
-msgstr "Wyszukaj węzły i drogi z \"FIXME\" w dowolnej właściwości."
+msgstr "Wyszukaj węzły i linie z \"FIXME\" w dowolnej właściwości."
 
 msgid "Fix tags"
 msgstr "Napraw tagi"
@@ -4469,52 +4479,52 @@ msgid "Unknown member type"
 msgstr "Nieznany rodzaj elementu"
 
 msgid "More than one \"from\" way found"
-msgstr "Znaleziono więcej niż jedną drogę \"from\""
+msgstr "Znaleziono więcej niż jedną linię \"from\""
 
 msgid "More than one \"to\" way found"
-msgstr "Znaleziono więcej niż jedną drogę \"to\""
+msgstr "Znaleziono więcej niż jedną linię \"to\""
 
 msgid "More than one \"via\" node found"
 msgstr "Więcej niż jeden węzeł w roli \"przez\""
 
 msgid "Cannot mix node and way for role \"via\""
-msgstr "Węzeł i droga nie mogą być razem w roli \"przez\"."
+msgstr "Węzeł i linia nie mogą być razem w roli \"przez\"."
 
 msgid "No \"from\" way found"
-msgstr "Nie znaleziono drogi \"from\""
+msgstr "Nie znaleziono linii \"from\""
 
 msgid "No \"to\" way found"
-msgstr "Nie znaleziono drogi z rolą \"to\""
+msgstr "Nie znaleziono linii z rolą \"to\""
 
 msgid "No \"via\" node or way found"
-msgstr "Nie znaleziono drogi lub węzła z rolą \"via\""
+msgstr "Nie znaleziono linii lub węzła z rolą \"via\""
 
 msgid "The \"from\" way does not start or end at a \"via\" node."
 msgstr "Linia \"from\" nie rozpoczyna się lub nie kończy w węźle\"via\"."
 
 msgid "Superfluous turnrestriction as \"to\" way is oneway"
-msgstr "Zbędne ograniczenie skrętu w drogę jednokierunkową"
+msgstr "Zbędne ograniczenie skrętu w linię jednokierunkową"
 
 msgid "The \"to\" way does not start or end at a \"via\" node."
 msgstr "Linia \"to\" nie rozpoczyna się lub nie kończy w węźle \"via\"."
 
 msgid "The \"from\" and the first \"via\" way are not connected."
-msgstr "Droga \"z\" nie jest połączona z pierwsza drogą \"przez\"."
+msgstr "Linia \"z\" nie jest połączona z pierwszą linią \"przez\"."
 
 msgid "The \"via\" ways are not connected."
-msgstr "Drogi \"przez\" nie są połączone."
+msgstr "Linie \"przez\" nie są połączone."
 
 msgid "The last \"via\" and the \"to\" way are not connected."
-msgstr "Ostatnia droga \"przez\" nie jest połączona z drogą \"do\"."
+msgstr "Ostatnia linia \"przez\" nie jest połączona z linią \"do\"."
 
 msgid "Unclosed Ways"
 msgstr "Niezamknięte linie"
 
 msgid "This tests if ways which should be circular are closed."
-msgstr "Sprawdza, czy drogi, które powinny być okrężne są zamknięte."
+msgstr "Sprawdza, czy linie, które powinny być okrężne, są zamknięte."
 
 msgid "Unclosed way"
-msgstr "Niezamknięta droga"
+msgstr "Niezamknięta linia"
 
 msgid "natural type {0}"
 msgstr "typ naturalny {0}"
@@ -4565,27 +4575,27 @@ msgid "Unconnected power ways"
 msgstr "Niepołączone linie elektryczne"
 
 msgid "This test checks if a way has an endpoint very near to another way."
-msgstr "Sprawdza, czy droga ma punkt końcowy bardzo blisko innej drogi."
+msgstr "Sprawdza, czy linia ma punkt końcowy bardzo blisko innej linii."
 
 msgid "Way end node near other highway"
-msgstr "Węzeł końca drogi leżący blisko innej drogi (ulicy)"
+msgstr "Węzeł końca linii leżący blisko innej drogi"
 
 msgid "Way end node near other way"
-msgstr "Węzeł końca drogi leżący blisko innej drogi"
+msgstr "Węzeł końca linii leżący blisko innej linii"
 
 msgid "Way node near other way"
 msgstr "Węzeł linii blisko innej linii"
 
 msgid "Connected way end node near other way"
 msgstr ""
-"Węzeł kończący jedną drogę blisko drugiej. Podejrzewamy brak złączenia dróg "
+"Węzeł kończący jedną linię blisko drugiej. Podejrzewamy brak złączenia linii "
 "posiadających w rzeczywistości połączenie."
 
 msgid "Untagged and unconnected nodes"
 msgstr "Nieotagowane i niepołączone węzły"
 
 msgid "This test checks for untagged nodes that are not part of any way."
-msgstr "Ten test znajduje węzły bez tagu i poza drogą."
+msgstr "Ten test znajduje węzły bez tagu i poza linią."
 
 msgid "Unconnected nodes without physical tags"
 msgstr "Niepołączone węzły bez tagów"
@@ -4612,10 +4622,10 @@ msgid "Untagged, empty and one node ways"
 msgstr "Nieoznaczone, puste i jednowęzłowe linie"
 
 msgid "This test checks for untagged, empty and one node ways."
-msgstr "Ten test znajduje drogi bez tagu, puste i z jednym węzłem."
+msgstr "Ten test znajduje linie bez tagów, puste i z jednym węzłem."
 
 msgid "Unnamed ways"
-msgstr "Drogi bez nazwy"
+msgstr "Linie bez nazwy"
 
 msgid "Unnamed junction"
 msgstr "Skrzyżowanie bez nazwy"
@@ -4633,13 +4643,13 @@ msgid "One node ways"
 msgstr "Linie z jednym węzłem"
 
 msgid "Way connected to Area"
-msgstr "Droga połączona z obszarem"
+msgstr "Linia połączona z obszarem"
 
 msgid "Checks for ways connected to areas."
-msgstr "Sprawdzanie czy drogi nie są połączone z obszarami."
+msgstr "Sprawdzanie czy linie nie są połączone z obszarami."
 
 msgid "Way terminates on Area"
-msgstr "Droga nakłada się na obszar"
+msgstr "Linia kończy się na obszarze"
 
 msgid "Wrongly Ordered Ways"
 msgstr "Nieprawidłowe kierunki linii"
@@ -4853,7 +4863,7 @@ msgid "Print debugging messages to console"
 msgstr "Drukuj wiadomości debugowania do konsoli"
 
 msgid "Disable access to the given resource(s), separated by comma"
-msgstr "Wyłącz dostęp do danego zasobu (ów), oddzielone przecinkiem"
+msgstr "Wyłącz dostęp do danego zasobu(-ów), oddzielone przecinkiem"
 
 msgid "options provided as Java system properties"
 msgstr "opcja dostarczano jako ustawienia systemowe Javy"
@@ -5128,7 +5138,7 @@ msgid "The (compass) heading of the line segment being drawn."
 msgstr "Namiar (kompasowy) tworzonego odcinka."
 
 msgid "The angle between the previous and the current way segment."
-msgstr "Kąt pomiędzy poprzednim i bieżącym segmentem tworzonej drogi."
+msgstr "Kąt pomiędzy poprzednim i bieżącym segmentem tworzonej linii."
 
 msgid "The length of the new way segment being drawn."
 msgstr "Długość nowego, tworzonego odcinka."
@@ -5162,19 +5172,19 @@ msgid "Layer ''{0}'' must be in list of layers"
 msgstr "Warstwa ''{0}'' musi być na liście warstw"
 
 msgid "Default (open, closed, new)"
-msgstr ""
+msgstr "Domyślnie (otwarte, zamknięte, nowe)"
 
 msgid "Username"
 msgstr "Nazwa użytkownika"
 
 msgid "Created date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgid "Last change date"
-msgstr ""
+msgstr "Data ostatniej zmiany"
 
 msgid "Select note sorting method"
-msgstr ""
+msgstr "Wybierz metodę sortowania uwag"
 
 msgid "Click to cancel the current operation"
 msgstr "Kliknij aby przerwać trwającą operację"
@@ -5433,13 +5443,13 @@ msgid ""
 "Merged node list frozen. No pending conflicts in the node list of this way"
 msgstr ""
 "Lista połączonych węzłów zamrożona. Brak oczekujących konfilktów w liście "
-"węzłów tej drogi."
+"węzłów tej linii."
 
 msgid "Nodes(with conflicts)"
 msgstr "Węzły (z konfliktami)"
 
 msgid "Pending conflicts in the node list of this way"
-msgstr "Oczekujące konflikty na liście wezłów tej drogi"
+msgstr "Oczekujące konflikty na liście wezłów tej linii"
 
 msgid "Members(resolved)"
 msgstr "Członkowie (rozwiązane)"
@@ -5753,7 +5763,7 @@ msgid "Conflicts when combining primitives"
 msgstr "Konflikty podczas łączenia elementów"
 
 msgid "Conflicts when combining ways - combined way is ''{0}''"
-msgstr "Konflikt podczas łączenia dróg - łączona jest droga \"{0}\""
+msgstr "Konflikt podczas łączenia linii - łączona linia jest \"{0}\""
 
 msgid "Conflicts when merging nodes - target node is ''{0}''"
 msgstr "Konflikt podczas łączenia węzłów - doelowy węzeł to ''{0}''"
@@ -5846,7 +5856,7 @@ msgid "Tags from nodes"
 msgstr "Tagi z węzłów"
 
 msgid "Tags from ways"
-msgstr "Tagi z drogi"
+msgstr "Tagi z linii"
 
 msgid "Tags from relations"
 msgstr "Tagi z relacji"
@@ -5938,12 +5948,12 @@ msgid ""
 "ways that are members of the same relation: the combined way will take the "
 "place of the original way in the relation.</html>"
 msgstr ""
-"<html>Połączone drogi są członkami w jednej lub więcej relacji. Proszę "
-"wybrać gdzie chcesz <strong>zosawić</strong> to członkostwo i gdzie chcesz "
+"<html>Połączone linie są członkami w jednej lub więcej relacji. Proszę "
+"wybrać gdzie chcesz <strong>zostawić</strong> to członkostwo i gdzie chcesz "
 "je <strong>usunąć</strong>.<br>Domyślnie jest <strong>zostawiana</strong> "
-"pierwsza droga i <strong>usuwane</strong> pozostałe kiedy są członkami tej "
-"samej relacji: połączone drogi powinny w relacji zająć miejsce oryginalnej "
-"drogi.</html>"
+"pierwsza linia i <strong>usuwane</strong> pozostałe kiedy są członkami tej "
+"samej relacji: połączone linie powinny w relacji zająć miejsce oryginalnej "
+"linii.</html>"
 
 msgid ""
 "<html>The merged nodes are members in one or more relations. Please decide "
@@ -5964,7 +5974,7 @@ msgid "Apply this role to all members"
 msgstr "Zastosuj tę rolę do wszystkich członków"
 
 msgid "Orig. Way"
-msgstr "Oryg. droga"
+msgstr "Oryg. linia"
 
 msgid "Decision"
 msgstr "Decyzja"
@@ -6069,10 +6079,6 @@ msgstr "Rozwiąż"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Zaznacz na mapie elementy zaznaczone na powyższej liście."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Wykryto {0} konflikt."
@@ -6234,7 +6240,7 @@ msgid "Node: "
 msgstr "Węzeł: "
 
 msgid "Way: "
-msgstr "Droga: "
+msgstr "Linia: "
 
 msgid "Relation: "
 msgstr "Relacja: "
@@ -6607,7 +6613,7 @@ msgid "Reopen note with message:"
 msgstr "Otwórz ponownie uwagę z komunikatem:"
 
 msgid "Sort notes"
-msgstr ""
+msgstr "Sortuj uwagi"
 
 msgid "Sort"
 msgstr "Sortuj"
@@ -7887,16 +7893,16 @@ msgid "Load relation"
 msgstr "Załaduj relacje"
 
 msgid "way is connected"
-msgstr "droga jest połączona"
+msgstr "linia jest połączona"
 
 msgid "way is connected to previous relation member"
-msgstr "droga jest połączona z poprzednim członkiem relacji"
+msgstr "linia jest połączona z poprzednim członkiem relacji"
 
 msgid "way is connected to next relation member"
-msgstr "droga jest połączona z kolejnym członkiem relacji"
+msgstr "linia jest połączona z kolejnym członkiem relacji"
 
 msgid "way is not connected to previous or next relation member"
-msgstr "droga nie jest połączona ani z poprzednim ani z następnym członkiem"
+msgstr "linia nie jest połączona ani z poprzednim ani z następnym członkiem"
 
 msgid "{0} - {1} ({2})"
 msgstr "{0} - {1} ({2})"
@@ -8267,7 +8273,7 @@ msgid "Open a history browser with the history of this node"
 msgstr "Otwórz przeglądarkę historii z historią tego węzła"
 
 msgid "Way {0}"
-msgstr "Droga {0}"
+msgstr "Linia {0}"
 
 msgid "Relation {0}"
 msgstr "Relacja {0}"
@@ -8344,7 +8350,7 @@ msgid "Synchronize node {0} only"
 msgstr "Synchronizuję tylko węzeł {0}"
 
 msgid "Synchronize way {0} only"
-msgstr "Synchronizuję tylko drogę {0}"
+msgstr "Synchronizuję tylko linię {0}"
 
 msgid "Synchronize relation {0} only"
 msgstr "Synchronizuję tylko relację {0}"
@@ -8394,7 +8400,7 @@ msgstr ""
 "ponownie używając nowego lub nadal otwartego zestawu zmian.</html>"
 
 msgid "Changeset closed"
-msgstr "Zamknięto changeset"
+msgstr "Zamknięto zestaw zmian"
 
 msgid "Prepare conflict resolution"
 msgstr "Przygotuj rozwiązanie konfliktu"
@@ -8851,7 +8857,7 @@ msgid "Initializing nodes to update ..."
 msgstr "Inicjuję węzły do uaktualnienia..."
 
 msgid "Initializing ways to update ..."
-msgstr "Inicjuję drogi do uaktualnienia..."
+msgstr "Inicjuję linie do uaktualnienia..."
 
 msgid "Initializing relations to update ..."
 msgstr "Inicjuję relację do uaktualnienia..."
@@ -9094,7 +9100,7 @@ msgid "Node ''{0}'' is already deleted. Skipping object in upload."
 msgstr "Węzeł \"{0}\" jest obecnie usunięty. Pomijanie obiektu."
 
 msgid "Way ''{0}'' is already deleted. Skipping object in upload."
-msgstr "Droga \"{0}\" jest obecnie usunięty. Pomijanie obiektu."
+msgstr "Linia \"{0}\" jest już usunięta. Pominięto obiekt."
 
 msgid "Relation ''{0}'' is already deleted. Skipping object in upload."
 msgstr "Relacja ''{0}''została już usunięta. Pomijanie wysyłania obiektu."
@@ -9831,10 +9837,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Prędkość: {0} km/h"
 
 msgid ""
 "\n"
@@ -9860,6 +9866,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Pliki JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Wybierz widoczne ścieżki"
 
@@ -9991,7 +10003,7 @@ msgid ""
 "correlate them with audio data.</html>"
 msgstr ""
 "<html>Dane z warstwy GPX ''{0}'' zostały pobrane z serwera.<br>Z tego powodu "
-"punkty drogi nie zawierają znaczników czasu i niemożliwe jest zestawienie z "
+"punkty linii nie zawierają znaczników czasu i niemożliwe jest zestawienie z "
 "nimi dźwięku.</html>"
 
 msgid "Import not possible"
@@ -10031,7 +10043,7 @@ msgid ""
 "correlate them with images.</html>"
 msgstr ""
 "<html>Dane z warstwy GPX ''{0}'' zostały pobrane z serwera.<br>Z tego powodu "
-"punkty drogi nie zawierają znaczników czasu i niemożliwe jest zestawienie z "
+"punkty linii nie zawierają znaczników czasu i niemożliwe jest zestawienie z "
 "nimi obrazków.</html>"
 
 msgid "Markers From Named Points"
@@ -10051,15 +10063,15 @@ msgstr[2] "znaczników"
 
 msgid "{0} consists of {1} marker"
 msgid_plural "{0} consists of {1} markers"
-msgstr[0] "{0} składa się z {1} markera"
-msgstr[1] "{0} składa się z {1} markerów"
-msgstr[2] "{0} składa się z {1} markerów"
+msgstr[0] "{0} składa się z {1} znacznika"
+msgstr[1] "{0} składa się z {1} znaczników"
+msgstr[2] "{0} składa się z {1} znaczników"
 
 msgid "No existing audio markers in this layer to offset from."
 msgstr ""
 
 msgid "Show Text/Icons"
-msgstr "Pokaż Tekst/Ikony"
+msgstr "Pokaż tekst/ikony"
 
 msgid "Toggle visible state of the marker text and icons."
 msgstr "Zmienia widoczność markerów tekstowych i ikon."
@@ -10691,7 +10703,7 @@ msgid "Ignore warning and install style anyway"
 msgstr "Ignoruj ostrzeżenie i zainstaluj styl"
 
 msgid "Some entries have unmet dependencies:"
-msgstr ""
+msgstr "Niektóre wpisy mają niespełnione zależności:"
 
 msgid "Reset"
 msgstr "Resetuj"
@@ -11040,7 +11052,7 @@ msgid "Draw Direction Arrows"
 msgstr "Rysuj strzałki kierunkowe"
 
 msgid "Only on the head of a way."
-msgstr "Tylko na początku drogi."
+msgstr "Tylko na początku linii."
 
 msgid "Draw oneway arrows."
 msgstr "Rysuj strzałki dla ulic jednokierunkowych"
@@ -11061,7 +11073,7 @@ msgid "Display discardable keys"
 msgstr "Pokaż przestarzałe tagi"
 
 msgid "Highlight target ways and nodes"
-msgstr "Podświetl docelowe drogi i węzły"
+msgstr "Podświetl docelowe linie i węzły"
 
 msgid "Draw rubber-band helper line"
 msgstr "Pokazuj linię pomocniczą za kursorem"
@@ -11085,7 +11097,7 @@ msgid "Draw arrows in the direction of oneways and other directed features."
 msgstr "Rysuj strzałki zgodnie z kierunkiem linii."
 
 msgid "Draw the order numbers of all segments within their way."
-msgstr "Rysuje kolejne numery wszystkich segmentów drogi."
+msgstr "Rysuje kolejne numery wszystkich segmentów linii."
 
 msgid "Draw the boundaries of data loaded from the server."
 msgstr "Rysuje granice obszaru danych pobranych z serwera."
@@ -11093,7 +11105,7 @@ msgstr "Rysuje granice obszaru danych pobranych z serwera."
 msgid "Draw virtual nodes in select mode for easy way modification."
 msgstr ""
 "Rysuje węzły wirtualne podczas pracy w trybie zaznaczania dla wygodnej "
-"modyfikacji dróg."
+"modyfikacji linii."
 
 msgid "Draw the inactive data layers in a different color."
 msgstr "Zaznacza nieaktywne warstwy danych innym kolorem."
@@ -11109,7 +11121,7 @@ msgstr ""
 "Stosuje antyaliasing dla mapy w widoku szkieletowym dając gładszy wygląd"
 
 msgid "Hightlight target nodes and ways while drawing or selecting"
-msgstr "Podświetl docelowe węzły i drogi podczas rysowania i zaznaczania"
+msgstr "Podświetl docelowe węzły i linie podczas rysowania i zaznaczania"
 
 msgid ""
 "This option suppresses the filling of areas, overriding anything specified "
@@ -11561,7 +11573,7 @@ msgid "Northing"
 msgstr "Północ"
 
 msgid "Auto zoom by default: "
-msgstr "Domyślny zoom automatyczny: "
+msgstr "Domyślny automatyczny poziom przybliżenia: "
 
 msgid "Autoload tiles by default: "
 msgstr "Domyślne ładowanie kafelków: "
@@ -11576,7 +11588,7 @@ msgid "Add to slippymap chooser: "
 msgstr ""
 
 msgid "Tile cache directory: "
-msgstr "Katalog cache kafelków: "
+msgstr "Katalog buforowania kafelków: "
 
 msgid ""
 "That layer does not support any of JOSM''s projections,\n"
@@ -11739,7 +11751,7 @@ msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=400>Error is: [{1}:{2}] {3}</table></html>"
 msgstr ""
-"<html>Niemożna przetworzyć źródła szablonu parsowania: {0}. Czy naprawdę "
+"<html>Nie można przetworzyć źródła szablonu parsowania: {0}. Czy naprawdę "
 "chcesz go użyć?<br><br><table width=400>Szczegóły błędu: [{1}:{2}] "
 "{3}</table></html>"
 
@@ -11799,11 +11811,11 @@ msgstr ""
 
 msgid "Warning: illegal format of entry in preset list ''{0}''. Got ''{1}''"
 msgstr ""
-"Ostrzeżenie: nielegalny format pozycji w liście szablonów ''{0}''. Otrzymano "
-"''{1}''"
+"Ostrzeżenie: nieprawidłowy format pozycji w liście szablonów ''{0}''. "
+"Otrzymano ''{1}''"
 
 msgid "Internal Preset"
-msgstr "Wewętrzne Szablony"
+msgstr "Wewętrzne szablony"
 
 msgid "The default preset for JOSM"
 msgstr "Domyślne szablony JOSM"
@@ -11996,7 +12008,7 @@ msgstr "Wbudowane:"
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -12287,7 +12299,7 @@ msgid ""
 msgstr ""
 
 msgid "Save to preferences"
-msgstr ""
+msgstr "Zapisz do ustawień"
 
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
@@ -12456,7 +12468,7 @@ msgid "Checks for errors on addresses"
 msgstr ""
 
 msgid "Tag combinations"
-msgstr ""
+msgstr "Kombinacje tagów"
 
 msgid "Checks for missing tag or suspicious combinations"
 msgstr ""
@@ -13056,7 +13068,7 @@ msgid "No image files found."
 msgstr "Nie znaleziono plików obrazu."
 
 msgid "get number of unread messages"
-msgstr "pobierz ilość nieprzeczytanych wiadomości"
+msgstr "pobieranie liczby nieprzeczytanych wiadomości"
 
 msgid "You have {0} unread message."
 msgid_plural "You have {0} unread messages."
@@ -13267,7 +13279,7 @@ msgid ""
 "Illegal document structure. Found node, way, or relation outside of "
 "''create'', ''modify'', or ''delete''."
 msgstr ""
-"Błędna struktura dokumentu. Znaleziono punkt, drogę lub relację poza "
+"Błędna struktura dokumentu. Znaleziono punkt, linię lub relację poza "
 "\"create\", \"modify lub \"delete\"."
 
 msgid ""
@@ -13316,7 +13328,7 @@ msgid "OSM Server Files gzip compressed"
 msgstr ""
 
 msgid "Parsing OSM history data ..."
-msgstr ""
+msgstr "Analiza danych o historii..."
 
 msgid "OSM Server Files"
 msgstr "Pliki serwera OSM"
@@ -13342,7 +13354,7 @@ msgid ""
 msgstr ""
 
 msgid "Deleted way {0} contains nodes"
-msgstr "Usunięta droga {0} zawiera węzły"
+msgstr "Usunięta linia {0} zawiera węzły"
 
 msgid "Missing mandatory attribute ''{0}'' on <nd> of way {1}."
 msgstr ""
@@ -13494,7 +13506,7 @@ msgid "{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"
 msgstr "{0}% ({1}/{2}), {3} zostało. Przesyłanie węzła ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"
-msgstr "{0}% ({1}/{2}), {3} zostało. Przesyłanie drogi ''{4}'' (id: {5})"
+msgstr "{0}% ({1}/{2}), {3} zostało. Przesyłanie linii ''{4}'' (id: {5})"
 
 msgid "{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"
 msgstr "{0}% ({1}/{2}), {3} zostało. Przesyłanie relacji ''{4}'' (id: {5})"
@@ -14051,7 +14063,7 @@ msgid ""
 msgstr ""
 
 msgid "Update plugin"
-msgstr ""
+msgstr "Aktualizuj wtyczkę"
 
 msgid "Click to update the plugin ''{0}''"
 msgstr ""
@@ -14146,7 +14158,7 @@ msgid "Downloading plugin list from ''{0}''"
 msgstr "Pobieranie listy wtyczek z \"{0}\""
 
 msgid "Plugin list download error"
-msgstr ""
+msgstr "Bład pobierania listy wtyczek"
 
 msgid "JOSM failed to download plugin list:"
 msgstr ""
@@ -14197,7 +14209,7 @@ msgstr ""
 "Jeśli używasz<br>najnowszej wersji JOSM, wyślij proszę zgłoszenie błędu."
 
 msgid "Update JOSM"
-msgstr ""
+msgstr "Aktualizuj JOSM"
 
 msgid ""
 "An unexpected exception occurred. This is always a coding "
@@ -14556,13 +14568,13 @@ msgid "reserved"
 msgstr "zarezerwowane"
 
 msgid "Outdated Java version"
-msgstr "Nieaktualna wersja Java"
+msgstr "Nieaktualna wersja Javy"
 
 msgid "Update Java"
 msgstr "Aktualizuj Javę"
 
 msgid "You are running version {0} of Java."
-msgstr "Używasz wersję {0} Javy"
+msgstr "Używasz wersji {0} Javy"
 
 msgid "April 2015"
 msgstr "Kwiecień 2015"
@@ -14637,7 +14649,7 @@ msgid "Key is too long (max {0} characters):"
 msgstr "Klucz jest zbyt długi (max {0} znaków):"
 
 msgid "Suspicious characters in key:"
-msgstr ""
+msgstr "Podejrzane znaki w kluczu:"
 
 msgid "Value is too long (max {0} characters):"
 msgstr "Wartość jest zbyt długa (max {0} znaków):"
@@ -14646,7 +14658,7 @@ msgid "Do you want to paste these tags?"
 msgstr "Czy chcesz wkleić te tagi?"
 
 msgid "Clear buffer"
-msgstr ""
+msgstr "Wyczyść bufor"
 
 msgid "Ignore warnings"
 msgstr "Ignoruj ostrzeżenia"
@@ -14657,16 +14669,16 @@ msgid ""
 msgstr ""
 
 msgid "ms"
-msgstr ""
+msgstr "ms"
 
 msgid "s"
-msgstr ""
+msgstr "s"
 
 msgid "min"
-msgstr ""
+msgstr "min"
 
 msgid "h"
-msgstr ""
+msgstr "h"
 
 msgid "day"
 msgid_plural "days"
@@ -14810,7 +14822,7 @@ msgstr "kontrola"
 
 msgctxt "Relation type"
 msgid "multipolygon"
-msgstr "multipolygon"
+msgstr "wielokąt złożony"
 
 msgctxt "Relation type"
 msgid "network"
@@ -14830,7 +14842,7 @@ msgstr "trasa"
 
 msgctxt "Relation type"
 msgid "route_master"
-msgstr ""
+msgstr "trasa nadrzędna"
 
 msgctxt "Relation type"
 msgid "site"
@@ -15009,7 +15021,7 @@ msgid "Hue:"
 msgstr "Barwa:"
 
 msgid "GTK Color Chooser"
-msgstr ""
+msgstr "Wybierak kolorów GTK"
 
 msgid "Red:"
 msgstr "Czerwony:"
@@ -15276,7 +15288,7 @@ msgid ""
 msgstr ""
 
 msgid "Import/export OSM data in PBF format"
-msgstr ""
+msgstr "Import/eksport danych OSM w formacie PBF"
 
 msgid "Import PDF file and convert to ways."
 msgstr "Importuj plik PDF i zamień na linie."
@@ -15341,6 +15353,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr "Wczytuje dane z SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15507,7 +15525,7 @@ msgid "clay"
 msgstr "glina"
 
 msgid "dirt"
-msgstr ""
+msgstr "nawierzchnia sypka"
 
 msgid "fine_gravel"
 msgstr ""
@@ -15556,19 +15574,19 @@ msgstr ""
 
 msgctxt "sidewalk"
 msgid "both"
-msgstr ""
+msgstr "obustronny"
 
 msgctxt "sidewalk"
 msgid "left"
-msgstr ""
+msgstr "po lewej"
 
 msgctxt "sidewalk"
 msgid "right"
-msgstr ""
+msgstr "po prawej"
 
 msgctxt "sidewalk"
 msgid "no"
-msgstr ""
+msgstr "brak"
 
 msgid "Service type"
 msgstr ""
@@ -15601,7 +15619,7 @@ msgid "Voltage in Volts (V)"
 msgstr "Napięcie w Voltach (V)"
 
 msgid "Frequency in Hertz (Hz)"
-msgstr "Częstotliwość w Hercach (Hz)"
+msgstr "Częstotliwość w hercach (Hz)"
 
 msgid "16.67"
 msgstr "16.67"
@@ -15845,7 +15863,7 @@ msgstr "gimnastyka"
 
 msgctxt "sport"
 msgid "handball"
-msgstr ""
+msgstr "piłka ręczna"
 
 msgctxt "sport"
 msgid "hockey"
@@ -15912,7 +15930,7 @@ msgstr "na monety"
 
 msgctxt "payment"
 msgid "Notes"
-msgstr ""
+msgstr "na banknoty"
 
 msgid "Electronic purses and Charge cards"
 msgstr "na karty chipowe"
@@ -15948,11 +15966,11 @@ msgstr ""
 
 msgctxt "parking"
 msgid "underground"
-msgstr ""
+msgstr "podziemny"
 
 msgctxt "parking"
 msgid "rooftop"
-msgstr ""
+msgstr "na dachu"
 
 msgid "Reference number"
 msgstr "Numer referencyjny"
@@ -16330,12 +16348,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Uliczka parkingowa"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Droga (nieokreślona)"
 
 msgid "Construction"
 msgstr "W budowie"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Skrzyżowanie"
 
@@ -16431,47 +16525,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rondo"
 
-msgid "motorway"
-msgstr "autostrada"
-
-msgid "motorway_link"
-msgstr "ciąg pieszy"
-
-msgid "trunk"
-msgstr "droga ekspresowa"
-
-msgid "trunk_link"
-msgstr "droga ekspresowa - dojazd"
-
-msgid "primary"
-msgstr "droga krajowa"
-
-msgid "primary_link"
-msgstr "droga krajowa - dojazd"
-
-msgid "secondary"
-msgstr "droga wojewódzka"
-
-msgid "tertiary"
-msgstr "droga trzeciorzędna"
-
-msgid "unclassified"
-msgstr "droga czwartorzędna"
-
-msgid "residential"
-msgstr "zabudowa"
-
-msgid "living_street"
-msgstr "strefa zamieszkania"
-
-msgid "service"
-msgstr "droga serwisowa"
-
-msgid "bus_guideway"
-msgstr "wydzielony pas autobusowy"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "w budowie"
+msgstr ""
 
 msgid "Ford"
 msgstr "Bród"
@@ -16561,23 +16617,23 @@ msgstr "Widoczność"
 
 msgctxt "trail_visibility"
 msgid "excellent"
-msgstr ""
+msgstr "doskonała"
 
 msgctxt "trail_visibility"
 msgid "good"
-msgstr ""
+msgstr "dobra"
 
 msgctxt "trail_visibility"
 msgid "intermediate"
-msgstr ""
+msgstr "średnia"
 
 msgctxt "trail_visibility"
 msgid "bad"
-msgstr "złe"
+msgstr "zła"
 
 msgctxt "trail_visibility"
 msgid "horrible"
-msgstr ""
+msgstr "fatalna"
 
 msgctxt "trail_visibility"
 msgid "no"
@@ -16599,7 +16655,7 @@ msgid "Cycleway"
 msgstr "Droga rowerowa"
 
 msgid "lane"
-msgstr "droga"
+msgstr "pas drogowy"
 
 msgid "track"
 msgstr "ścieżka"
@@ -16629,7 +16685,7 @@ msgid "Oneway (bicycle)"
 msgstr "Jednokierunkowa (dla rowerów)"
 
 msgid "Edit Highway Attributes:"
-msgstr ""
+msgstr "Edytuj atrybuty drogi:"
 
 msgid "Highway"
 msgstr "Droga"
@@ -16683,7 +16739,7 @@ msgid "Traffic Signal"
 msgstr "Sygnalizacja świetlna"
 
 msgid "Optional crossing attributes:"
-msgstr ""
+msgstr "Opjonalne atrybuty przejścia:"
 
 msgid "Pedestrian crossing type"
 msgstr "Typ przejścia dla pieszych"
@@ -16707,19 +16763,19 @@ msgid "zebra"
 msgstr "zebra"
 
 msgid "pelican"
-msgstr ""
+msgstr "pelikan"
 
 msgid "toucan"
-msgstr ""
+msgstr "tukan"
 
 msgid "puffin"
-msgstr ""
+msgstr "maskonur"
 
 msgid "pegasus"
-msgstr ""
+msgstr "pegaz"
 
 msgid "tiger"
-msgstr ""
+msgstr "tygrys"
 
 msgid "Button operated"
 msgstr ""
@@ -16737,7 +16793,7 @@ msgid "Cross on horseback"
 msgstr "Przejazd na koniu"
 
 msgid "Optional values for specific countries"
-msgstr ""
+msgstr "Opcjonalne wartości dla niektórych krajów"
 
 msgid "Stop"
 msgstr "Znak stop"
@@ -16797,7 +16853,7 @@ msgid "Speed Camera"
 msgstr "Fotoradar"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "Lustro drogowe"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
@@ -16869,7 +16925,7 @@ msgid "Hedge"
 msgstr "Żywopłot"
 
 msgid "Genus"
-msgstr ""
+msgstr "Rodzaj biologiczny"
 
 msgid "Species"
 msgstr "Gatunki"
@@ -16896,7 +16952,7 @@ msgid "split_rail"
 msgstr ""
 
 msgid "wire"
-msgstr ""
+msgstr "drut"
 
 msgid "Guard Rail"
 msgstr "Bariera drogowa/przeciwwypadkowa/energochłonna (Guard Rail)"
@@ -16934,11 +16990,11 @@ msgstr "Szlaban obrotowy"
 
 msgctxt "swing_gate"
 msgid "single"
-msgstr ""
+msgstr "pojedynczy"
 
 msgctxt "swing_gate"
 msgid "double"
-msgstr ""
+msgstr "podwójny"
 
 msgid "Hampshire Gate"
 msgstr "Ogrodzenie odsuwane (Hampshire)"
@@ -17121,7 +17177,7 @@ msgid "Mud"
 msgstr "Błota"
 
 msgid "Large area covered with mud."
-msgstr ""
+msgstr "Duży obszar pokryty błotami."
 
 msgid "Beach"
 msgstr "Plaża"
@@ -17304,32 +17360,29 @@ msgstr "Zwrotnica"
 msgid "Aerialway"
 msgstr "Koleje linowe"
 
-msgid "Chair Lift"
-msgstr "Wyciąg krzesełkowy"
+msgid "Cable Car"
+msgstr "Kolej linowa"
 
 msgid "Number of people per hour"
 msgstr "Liczba osób na godzinę"
 
-msgid "Number of people per chair"
-msgstr "Liczba osób na krzesełko"
+msgid "Number of people per car"
+msgstr "Liczba osób na wagonik"
 
 msgid "Typical journey time in minutes"
-msgstr ""
-
-msgid "Has bubble?"
-msgstr ""
+msgstr "Typowy czas przejazdu w minutach"
 
 msgid "Has heating?"
 msgstr "Ma ogrzewanie?"
 
-msgid "Drag Lift"
-msgstr "Wyciąg orczykowy"
+msgid "Chair Lift"
+msgstr "Wyciąg krzesełkowy"
 
-msgid "Cable Car"
-msgstr "Kolej linowa"
+msgid "Number of people per chair"
+msgstr "Liczba osób na krzesełko"
 
-msgid "Number of people per car"
-msgstr "Liczba osób na wagonik"
+msgid "Has bubble?"
+msgstr ""
 
 msgid "Gondola"
 msgstr "Gondola"
@@ -17343,16 +17396,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr "Liczba osób na gondolę/krzesełko"
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Wyciąg orczykowy"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -17437,6 +17498,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -17467,12 +17531,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -17668,6 +17735,9 @@ msgstr "narzędzia do własnej naprawy (może być pomoc innych)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "mycie rowerów (za opłatą)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transport publiczny"
 
@@ -17926,6 +17996,14 @@ msgstr "Płyta postojowa"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "tak"
+
 msgid "Beacon"
 msgstr "Radiolatarnia"
 
@@ -18253,7 +18331,7 @@ msgid "Fireplace"
 msgstr "Miejsce na ognisko"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Stół piknikowy"
 
 msgid "Public Grill"
 msgstr "Publiczny gril"
@@ -18299,7 +18377,7 @@ msgid "sculpture"
 msgstr "rzeźba"
 
 msgid "statue"
-msgstr ""
+msgstr "posąg"
 
 msgid "Artist Name"
 msgstr "Imię i nazwisko artysty"
@@ -18308,10 +18386,10 @@ msgid "Recording Studio"
 msgstr "Studio nagrań"
 
 msgid "audio"
-msgstr "audio"
+msgstr "dźwiękowe"
 
 msgid "video"
-msgstr "video"
+msgstr "filmowe"
 
 msgid "Place of Worship"
 msgstr "Miejsce kultu religijnego"
@@ -18339,43 +18417,43 @@ msgstr "świątynia"
 
 msgctxt "christian"
 msgid "anglican"
-msgstr ""
+msgstr "anglikanizm"
 
 msgctxt "christian"
 msgid "baptist"
-msgstr ""
+msgstr "baptyzm"
 
 msgctxt "christian"
 msgid "catholic"
-msgstr ""
+msgstr "katolicyzm"
 
 msgctxt "christian"
 msgid "evangelical"
-msgstr ""
+msgstr "ewangelikalizm"
 
 msgctxt "christian"
 msgid "greek_catholic"
-msgstr ""
+msgstr "grekokatolicyzm"
 
 msgctxt "christian"
 msgid "greek_orthodox"
-msgstr ""
+msgstr "grekokatolicyzm ortodoksyjny"
 
 msgctxt "christian"
 msgid "jehovahs_witness"
-msgstr ""
+msgstr "Świadkowie Jehowy"
 
 msgctxt "christian"
 msgid "lutheran"
-msgstr ""
+msgstr "luteranizm"
 
 msgctxt "christian"
 msgid "methodist"
-msgstr ""
+msgstr "metodyzm"
 
 msgctxt "christian"
 msgid "mormon"
-msgstr ""
+msgstr "mormonizm"
 
 msgctxt "christian"
 msgid "new_apostolic"
@@ -18383,7 +18461,7 @@ msgstr ""
 
 msgctxt "christian"
 msgid "orthodox"
-msgstr ""
+msgstr "ortodoksyjny"
 
 msgctxt "christian"
 msgid "pentecostal"
@@ -18391,11 +18469,11 @@ msgstr ""
 
 msgctxt "christian"
 msgid "presbyterian"
-msgstr ""
+msgstr "prezbiterianizm"
 
 msgctxt "christian"
 msgid "protestant"
-msgstr ""
+msgstr "protestantyzm"
 
 msgctxt "christian"
 msgid "quaker"
@@ -18403,7 +18481,7 @@ msgstr ""
 
 msgctxt "christian"
 msgid "roman_catholic"
-msgstr ""
+msgstr "rzynski katolicyzm"
 
 msgctxt "christian"
 msgid "russian_orthodox"
@@ -18411,7 +18489,7 @@ msgstr ""
 
 msgctxt "christian"
 msgid "seventh_day_adventist"
-msgstr ""
+msgstr "adwentyzm"
 
 msgid "Mosque"
 msgstr "Meczet"
@@ -18430,15 +18508,15 @@ msgstr "synagoga"
 
 msgctxt "jewish"
 msgid "orthodox"
-msgstr ""
+msgstr "ortodoksyjna"
 
 msgctxt "jewish"
 msgid "conservative"
-msgstr ""
+msgstr "konserwatywna"
 
 msgctxt "jewish"
 msgid "reform"
-msgstr ""
+msgstr "reformowana"
 
 msgid "Buddhist Temple"
 msgstr "Świątynia buddyjska"
@@ -18706,7 +18784,7 @@ msgid "street (up to 20m)"
 msgstr "na ulicy (do 20m)"
 
 msgid "area (more than 20m)"
-msgstr ""
+msgstr "obszar (powyżej 20 m)"
 
 msgid "Shows current date"
 msgstr "Pokazuje bieżącą datę"
@@ -18808,7 +18886,7 @@ msgid "Lock"
 msgstr "Zablokuj"
 
 msgid "Indoor"
-msgstr ""
+msgstr "W pomieszczeniu"
 
 msgid "Fire Hydrant"
 msgstr "Hydrant"
@@ -18864,7 +18942,7 @@ msgid "Advertising Column"
 msgstr ""
 
 msgid "Billboard"
-msgstr ""
+msgstr "Bilbord"
 
 msgid "Sports"
 msgstr "Sport"
@@ -18919,7 +18997,7 @@ msgid "Archery"
 msgstr "Łucznictwo"
 
 msgid "Track and Field Athletics"
-msgstr ""
+msgstr "Lekkoatletyka"
 
 msgid "Climbing"
 msgstr "Wspinaczka"
@@ -19169,10 +19247,6 @@ msgid "Man Made"
 msgstr "Obiekty sztuczne"
 
 msgctxt "building"
-msgid "yes"
-msgstr "tak"
-
-msgctxt "building"
 msgid "roof"
 msgstr "zadaszenie"
 
@@ -19193,16 +19267,16 @@ msgid "school"
 msgstr "szkoła"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "biura i usługi"
 
 msgctxt "building"
-msgid "farm"
-msgstr "budynek na farmie"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19249,7 +19323,7 @@ msgstr "Budynek mieszkalny"
 
 msgctxt "building"
 msgid "residential"
-msgstr ""
+msgstr "mieszkalny"
 
 msgctxt "building"
 msgid "apartments"
@@ -19275,6 +19349,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "jednorodzinny"
 
+msgctxt "building"
+msgid "farm"
+msgstr "budynek na farmie"
+
 msgid "Entrance"
 msgstr "Wejście"
 
@@ -19332,7 +19410,7 @@ msgid "Gasometer"
 msgstr "Zbiornik gazu"
 
 msgid "Bunker Silo"
-msgstr ""
+msgstr "Silos"
 
 msgid "Pipeline"
 msgstr "Rurociąg"
@@ -19487,7 +19565,7 @@ msgid "Tide Level"
 msgstr "Pływy"
 
 msgid "Groundwater"
-msgstr ""
+msgstr "Wody gruntowe"
 
 msgid "Traffic"
 msgstr "Ruch uliczny"
@@ -19550,19 +19628,19 @@ msgid "outdoor"
 msgstr "zewnętrzny"
 
 msgid "Zone"
-msgstr ""
+msgstr "Obszar"
 
 msgid "parking"
-msgstr ""
+msgstr "parking"
 
 msgid "traffic"
-msgstr ""
+msgstr "ruch drogowy"
 
 msgid "shop"
 msgstr "sklep"
 
 msgid "bank"
-msgstr ""
+msgstr "bank"
 
 msgid "Camera"
 msgstr "Kamera"
@@ -19584,7 +19662,7 @@ msgstr "Zamontowana na"
 
 msgctxt "camera:mount"
 msgid "wall"
-msgstr ""
+msgstr "ściana"
 
 msgctxt "camera:mount"
 msgid "pole"
@@ -19592,7 +19670,7 @@ msgstr "słup"
 
 msgctxt "camera:mount"
 msgid "ceiling"
-msgstr ""
+msgstr "sufit"
 
 msgid "Direction in degrees"
 msgstr ""
@@ -19709,7 +19787,7 @@ msgid "Generator Type"
 msgstr "Typ generatora"
 
 msgid "gas_turbine"
-msgstr ""
+msgstr "turbina gazowa"
 
 msgid "reciprocating_engine"
 msgstr ""
@@ -19772,7 +19850,7 @@ msgid "Gasoline Power Generator"
 msgstr ""
 
 msgid "Nuclear Reactor"
-msgstr ""
+msgstr "reaktor atomowy"
 
 msgctxt "generator method"
 msgid "fission"
@@ -19840,7 +19918,7 @@ msgid "Vodo-Vodyanoi Energetichesky Reactor (VVER)"
 msgstr ""
 
 msgid "Solar Power Generator"
-msgstr ""
+msgstr "Generator słoneczny"
 
 msgctxt "generator method"
 msgid "photovoltaic"
@@ -19873,7 +19951,7 @@ msgid "gasification"
 msgstr ""
 
 msgid "Water Turbine"
-msgstr ""
+msgstr "Turbina wodna"
 
 msgctxt "generator method"
 msgid "run-of-the-river"
@@ -20398,30 +20476,30 @@ msgstr "Miejsce pamięci"
 
 msgctxt "memorial"
 msgid "statue"
-msgstr ""
+msgstr "posąg"
 
 msgctxt "memorial"
 msgid "bust"
-msgstr ""
+msgstr "biust"
 
 msgctxt "memorial"
 msgid "plaque"
-msgstr ""
+msgstr "tablica"
 
 msgctxt "memorial"
 msgid "stele"
-msgstr ""
+msgstr "stela"
 
 msgctxt "memorial"
 msgid "stone"
-msgstr ""
+msgstr "kamień"
 
 msgctxt "memorial"
 msgid "war_memorial"
-msgstr ""
+msgstr "upamiętnienie wojenne"
 
 msgid "Inscription"
-msgstr ""
+msgstr "Inskrypcja"
 
 msgid "Wayside Cross"
 msgstr "Krzyż przydrożny"
@@ -20763,7 +20841,7 @@ msgid "linguistic_community"
 msgstr ""
 
 msgid "ward"
-msgstr ""
+msgstr "okręg"
 
 msgid "Postal Code"
 msgstr "Kod pocztowy"
@@ -20774,7 +20852,7 @@ msgstr "Park narodowy"
 msgid "Protected Area"
 msgstr "Obszar chroniony"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20804,15 +20882,21 @@ msgstr "Miasto"
 msgid "Town"
 msgstr "Małe miasto"
 
-msgid "Suburb"
-msgstr "Przedmieście"
-
 msgid "Village"
 msgstr "Wieś"
 
 msgid "Hamlet"
 msgstr "Przysiółek"
 
+msgid "Isolated Dwelling"
+msgstr "Pojedyncze zabudowania"
+
+msgid "Suburb"
+msgstr "Przedmieście"
+
+msgid "Neighbourhood"
+msgstr "Dzielnica"
+
 msgid "Farm"
 msgstr "Farma"
 
@@ -20822,12 +20906,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Pojedyncze zabudowania"
-
-msgid "Neighbourhood"
-msgstr "Dzielnica"
-
 msgid "Locality"
 msgstr "Okolica"
 
@@ -20858,7 +20936,7 @@ msgid "A volcano, either dormant, extinct or active."
 msgstr ""
 
 msgid "Current Status"
-msgstr ""
+msgstr "Stan obecny"
 
 msgid "dormant"
 msgstr ""
@@ -20879,7 +20957,7 @@ msgid "Cave Entrance"
 msgstr "Wejście do jaskini"
 
 msgid "The entrance to a cave."
-msgstr ""
+msgstr "Wejście do jaskini"
 
 msgid "Island"
 msgstr "Wyspa"
@@ -20891,7 +20969,7 @@ msgid "Ridge"
 msgstr "Grzbiet górski"
 
 msgid "A mountain or hill ridge."
-msgstr ""
+msgstr "Grzbiet górski lub wzgórza"
 
 msgid "Nature"
 msgstr "Natura"
@@ -20900,7 +20978,7 @@ msgid "Tree"
 msgstr "Drzewo"
 
 msgid "A single tree."
-msgstr ""
+msgstr "Pojedyncze drzewo"
 
 msgid "Botanical Name"
 msgstr "Nazwa systematyczna"
@@ -20909,7 +20987,7 @@ msgid "Tree Row"
 msgstr "Rząd drzew"
 
 msgid "A line of trees."
-msgstr ""
+msgstr "Rząd drzew"
 
 msgid "Wood"
 msgstr "Las pierwotny"
@@ -20929,22 +21007,22 @@ msgid ""
 msgstr ""
 
 msgid "pampas"
-msgstr ""
+msgstr "pampa"
 
 msgid "prairie"
-msgstr ""
+msgstr "preria"
 
 msgid "puszta"
-msgstr ""
+msgstr "puszta"
 
 msgid "savanna"
-msgstr ""
+msgstr "sawanna"
 
 msgid "steppe"
-msgstr ""
+msgstr "step"
 
 msgid "veld"
-msgstr ""
+msgstr "trawiaste wyżyny"
 
 msgid "Nature Reserve"
 msgstr "Rezerwat przyrody"
@@ -21343,6 +21421,37 @@ msgstr "Obraz"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Kontakt (z prefiksem contact:*)"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr "Do poprawy"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "Zewnętrzny segment"
 
@@ -21383,7 +21492,7 @@ msgid "Site"
 msgstr "Teren"
 
 msgid "Site name"
-msgstr ""
+msgstr "Nazwa terenu"
 
 msgid "where to place the label"
 msgstr ""
@@ -21468,7 +21577,7 @@ msgid "location of enforcement device"
 msgstr "lokalizacja urzędzenia kontrolującego"
 
 msgid "node on way where enforcement starts"
-msgstr "punkt na drodze gdzie kontrola jest rozpoczęta"
+msgstr "punkt na linii gdzie zaczyna się kontrola"
 
 msgid "where enforcement ends"
 msgstr "gdzie kontrola się kończy"
@@ -21576,7 +21685,7 @@ msgid "Street"
 msgstr "Ulica"
 
 msgid "ways being part of street"
-msgstr "drogi stanowiące część ulicy"
+msgstr "linie stanowiące część ulicy"
 
 msgid "addresses belonging to the street"
 msgstr "adresy należące do ulicy"
@@ -21585,7 +21694,7 @@ msgid "houses belonging to the street"
 msgstr "domy należące do ulicy"
 
 msgid "anything related to the street"
-msgstr ""
+msgstr "wszystko należące do ulicy"
 
 msgid "Destination Sign"
 msgstr "Znak wskazujący do celu"
@@ -21707,16 +21816,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21726,6 +21832,9 @@ msgid "OpenStreetMap GPS Traces"
 msgstr ""
 
 msgid "OpenStreetMap (Mapnik)"
+msgstr "OpenStreetMap (Mapnik)"
+
+msgid "skobbler"
 msgstr ""
 
 msgid "OpenStreetMap (Mapnik Black & White)"
@@ -21734,9 +21843,6 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
-msgid "skobbler"
-msgstr ""
-
 msgid "skobbler heatmap"
 msgstr ""
 
@@ -21744,7 +21850,7 @@ msgid "OpenCycleMap"
 msgstr ""
 
 msgid "MapQuest OSM"
-msgstr ""
+msgstr "MapQuest OSM"
 
 msgid "Public Transport (ÖPNV)"
 msgstr ""
@@ -21767,6 +21873,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21774,7 +21928,7 @@ msgid "Geoimage.at MaxRes"
 msgstr ""
 
 msgid "basemap.at"
-msgstr ""
+msgstr "basemap.at"
 
 msgid "Graz: Basiskarte (base map)"
 msgstr ""
@@ -21810,7 +21964,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21831,6 +21988,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21959,7 +22122,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22042,6 +22205,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22258,16 +22427,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22276,6 +22445,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22543,17 +22715,20 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
 msgid "{0} without {1}"
-msgstr ""
+msgstr "{0} bez {1}"
 
 msgid "{0} without {1} or {2}"
-msgstr ""
+msgstr "{0} bez {1} lub {2}"
 
 msgid "{0} without {1}, {2} or {3}"
-msgstr ""
+msgstr "{0} bez {1}, {2} lub {3}"
 
 msgid "{0} together with {1}"
 msgstr ""
@@ -22565,7 +22740,7 @@ msgid "restaurant without name"
 msgstr "restauracja bez wpisanej nazwy"
 
 msgid "{0} used with {1}"
-msgstr ""
+msgstr "{0} użyte z {1}"
 
 msgid "natural water used for swimming pool"
 msgstr ""
@@ -22635,6 +22810,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -22651,7 +22829,7 @@ msgid "Overlapping Areas"
 msgstr "Nakładające się obszary."
 
 msgid "{0} inside {1}"
-msgstr ""
+msgstr "{0} wewnątrz {1}"
 
 msgid "Overlapping Identical Natural Areas"
 msgstr ""
@@ -22759,12 +22937,12 @@ msgid "{0}={1} makes no sense"
 msgstr ""
 
 msgid "Nodes duplicating parent way tags"
-msgstr "Węzły powtarzają tagi drogi rodzica."
+msgstr "Węzły powtarzają tagi linii rodzica."
 
 msgid ""
 "no wikipedia-language given, use ''wikipedia''=''language:page title''"
 msgstr ""
-"nie wprowadzono języka wikipedii, użyj \"wikipedia\"=\"język:tytuł strony\""
+"nie wprowadzono języka Wikipedii, użyj \"wikipedia\"=\"język:tytuł strony\""
 
 msgid "unknown language prefix in wikipedia tag"
 msgstr ""
@@ -22773,16 +22951,16 @@ msgid "deprecated format for wikipedia tag"
 msgstr ""
 
 msgid "''wikipedia''=''language:page title''"
-msgstr ""
+msgstr "''wikipedia''=''język:tytuł hasła''"
 
 msgid "Hide icons at low zoom"
-msgstr ""
+msgstr "Ukrywaj ikony przy niskim przybliżeniu"
 
 msgid "Less obtrusive node symbols at low zoom"
-msgstr ""
+msgstr "Bardziej stonowane symbole przy niskim przybliżeniu"
 
 msgid "Display street labels (at high zoom)"
-msgstr ""
+msgstr "Wyświetlaj etykiety ulic (przy wysokim przybliżeniu)"
 
 msgid "OSM Export"
 msgstr ""
@@ -22845,7 +23023,7 @@ msgid "Missing audio file"
 msgstr "Brakujący plik audio"
 
 msgid "Commands"
-msgstr ""
+msgstr "Polecenia"
 
 msgid ""
 "No command has been found. Would you like to download and install default "
@@ -22853,7 +23031,7 @@ msgid ""
 msgstr ""
 
 msgid "No command found"
-msgstr ""
+msgstr "Nie znaleziono poleceń"
 
 msgid "Default commands have been successfully installed"
 msgstr ""
@@ -22898,7 +23076,7 @@ msgid "nodes"
 msgstr "węzły"
 
 msgid "ways"
-msgstr "drogi"
+msgstr "linie"
 
 msgid "relations"
 msgstr "relacje"
@@ -22910,7 +23088,7 @@ msgid "Can not draw outside of the world."
 msgstr "Nie można rysować poza światem"
 
 msgid "Create grid of ways"
-msgstr ""
+msgstr "Utwórz siatkę linii"
 
 msgid ""
 "Forms a grid of ways in base to two existing that have various nodes and one "
@@ -22924,10 +23102,10 @@ msgid "Select two ways with alone a node in common"
 msgstr ""
 
 msgid "Create a grid of ways"
-msgstr ""
+msgstr "Utwórz siatkę linii"
 
 msgid "Download Track ..."
-msgstr ""
+msgstr "Pobierz ślad..."
 
 msgid "Download GPX track from openstreetmap.org"
 msgstr "Pobierz ślad GPX z openstreetmap.org"
@@ -23048,13 +23226,13 @@ msgid "Open the elevation profile window."
 msgstr "Otwórz okno z profilem wysokości"
 
 msgid "Min"
-msgstr ""
+msgstr "Min"
 
 msgid "Avrg"
-msgstr ""
+msgstr "Śred"
 
 msgid "Max"
-msgstr ""
+msgstr "Maks"
 
 msgid "Dist"
 msgstr ""
@@ -23069,7 +23247,7 @@ msgid "Elevation profile for track ''{0}''."
 msgstr ""
 
 msgid "Elevation profile"
-msgstr ""
+msgstr "Profil wysokości"
 
 msgid "(No elevation data)"
 msgstr "(Brak danych o wysokości)"
@@ -23391,7 +23569,7 @@ msgid "Correlate entries with GPS trace"
 msgstr ""
 
 msgid "Save layer..."
-msgstr ""
+msgstr "Zapisz warstwę..."
 
 msgid "Save NanoLog layer"
 msgstr ""
@@ -23418,19 +23596,19 @@ msgid "edit new tag"
 msgstr "edytuj nowy tag"
 
 msgid "Display clock in 12h mode."
-msgstr "Wyświetlaj zegar w trybie 12 godzinnym."
+msgstr "Wyświetlaj zegar w trybie 12-godzinnym."
 
 msgid "Choose key"
 msgstr "Wybierz klawisz"
 
 msgid "apply {0}"
-msgstr ""
+msgstr "zastosuj {0}"
 
 msgid "There is something wrong in the value near:"
 msgstr "Coś złego jest w wartości obok:"
 
 msgid "Info: {0}"
-msgstr ""
+msgstr "Informacja: {0}"
 
 msgid "Correct the value manually and than press Enter."
 msgstr "Popraw ręcznie wartość i wciśnij Enter."
@@ -23523,7 +23701,7 @@ msgid "Accuracy:"
 msgstr "Dokładność:"
 
 msgid "Convert way to individual house numbers."
-msgstr "Zamień drogę na pojedyncze numery."
+msgstr "Zamień linię na pojedyncze numery."
 
 msgid "Will associate {0} additional house number nodes"
 msgstr "Powiąże {0} węzłów numerów domów"
@@ -23550,7 +23728,7 @@ msgid "Please select a street to associate with address interpolation way"
 msgstr "Zaznacz ulicę powiązaną z interpolowanym adresem"
 
 msgid "Please select address interpolation way for this street"
-msgstr "Zaznacz drogę interpolacji adresu powiązaną z ulicą"
+msgstr "Zaznacz linię interpolacji adresu powiązaną z ulicą"
 
 msgid "Expected odd numbers for addresses"
 msgstr ""
@@ -23824,10 +24002,10 @@ msgid "Building address"
 msgstr "Adres budynku"
 
 msgid "empty"
-msgstr ""
+msgstr "pusty"
 
 msgid "skip"
-msgstr ""
+msgstr "pomiń"
 
 msgid "House number:"
 msgstr "Numer budynku:"
@@ -23920,7 +24098,7 @@ msgid "Tolerance Angle"
 msgstr ""
 
 msgid "Plugin Settings"
-msgstr ""
+msgstr "Ustawienia wtyczki"
 
 msgid "Show Address Dialog after mapping an area"
 msgstr ""
@@ -24442,7 +24620,7 @@ msgid "Get a new cookie (session timeout)"
 msgstr ""
 
 msgid "Save image as..."
-msgstr ""
+msgstr "Zapisz obraz jako..."
 
 msgid "PNG files (*.png)"
 msgstr "pliki PNG (*.png)"
@@ -24701,7 +24879,7 @@ msgid "Invalid reference or subject"
 msgstr ""
 
 msgid "Address"
-msgstr ""
+msgstr "Adres"
 
 msgid "Split area"
 msgstr "Podział obszaru"
@@ -24872,16 +25050,16 @@ msgid "Users mapping nearby:"
 msgstr ""
 
 msgid "Private chat"
-msgstr ""
+msgstr "Prywatna rozmowa"
 
 msgid "Close tab"
-msgstr ""
+msgstr "Zamknij zakładkę"
 
 msgid "Logout"
 msgstr "Wyloguj"
 
 msgid "Clear log"
-msgstr ""
+msgstr "Wyczyść log"
 
 msgid "Show users on map"
 msgstr "Pokaż użytkowników na mapie"
@@ -25129,7 +25307,7 @@ msgid "Access class must not contain ''{0}''!"
 msgstr ""
 
 msgid "Access types"
-msgstr ""
+msgstr "Typy dostępności"
 
 msgid "Vehicle properties"
 msgstr ""
@@ -25230,7 +25408,7 @@ msgid "Node color"
 msgstr "Kolor węzła"
 
 msgid "Arrow color"
-msgstr ""
+msgstr "Kolor strzałki"
 
 msgid "Arrowhead fill color"
 msgstr ""
@@ -25337,7 +25515,7 @@ msgid "Open Imagery XML file"
 msgstr ""
 
 msgid "Calibration Layer"
-msgstr ""
+msgstr "Warstwa kalibracji"
 
 msgid "A deprecated calibration geometry of {0} nodes by {1}"
 msgstr ""
@@ -25400,7 +25578,7 @@ msgid "mm"
 msgstr "mm"
 
 msgid "cm"
-msgstr ""
+msgstr "cm"
 
 msgid "m"
 msgstr "m"
@@ -25821,7 +25999,7 @@ msgid "Direction to search for land"
 msgstr ""
 
 msgid "Tag ways as"
-msgstr "Oznacz drogi jako"
+msgstr "Oznacz linie jako"
 
 msgid "WMS Layer"
 msgstr "Warstwa WMS"
@@ -26003,7 +26181,7 @@ msgid "Merge overlap"
 msgstr "Scal nakładające się fragmenty"
 
 msgid "Merge overlap of ways."
-msgstr "Scala nakładające się fragmenty drogi."
+msgstr "Scala nakładające się fragmenty linie."
 
 msgid "Merge Overlap (combine)"
 msgstr ""
@@ -26023,7 +26201,7 @@ msgstr ""
 "linii.<br>Sprawdź i popraw jeśli potrzeba.</html>"
 
 msgid "Split way"
-msgstr "Podziel drogę"
+msgstr "Podziel linię"
 
 msgid "Michigan Left"
 msgstr ""
@@ -26282,7 +26460,7 @@ msgid "Download the list of available modules"
 msgstr ""
 
 msgid "Update modules"
-msgstr ""
+msgstr "Aktualizuj moduły"
 
 msgid "Update the selected modules"
 msgstr ""
@@ -26348,13 +26526,13 @@ msgid ""
 msgstr ""
 
 msgid "Overpass API server:"
-msgstr ""
+msgstr "Serwer Overpass API:"
 
 msgid "Overpass API server used to download OSM data"
 msgstr ""
 
 msgid "XAPI server:"
-msgstr ""
+msgstr "Serwer XAPI:"
 
 msgid ""
 "XAPI server used to download OSM data when Overpass API is not available"
@@ -26565,13 +26743,13 @@ msgid "Warning: failed to download module information list"
 msgstr ""
 
 msgid "Disable module"
-msgstr ""
+msgstr "Wyłącz moduł"
 
 msgid "Click to delete the module ''{0}''"
 msgstr ""
 
 msgid "Keep module"
-msgstr ""
+msgstr "Zatrzymaj moduł"
 
 msgid "Click to keep the module ''{0}''"
 msgstr ""
@@ -26682,7 +26860,7 @@ msgid "OSM Server Files pbf compressed"
 msgstr ""
 
 msgid "Download PBF"
-msgstr ""
+msgstr "Pobnierz PBF"
 
 msgid "Invalid changeset id: {0}"
 msgstr ""
@@ -26712,13 +26890,13 @@ msgid "Transform error: Unsupported orientation"
 msgstr ""
 
 msgid "Finished"
-msgstr ""
+msgstr "Zakończono"
 
 msgid "Prefs"
-msgstr ""
+msgstr "Preferencje"
 
 msgid "Load file..."
-msgstr ""
+msgstr "Wczytaj plik..."
 
 msgid "Place"
 msgstr ""
@@ -26805,7 +26983,7 @@ msgid "Loaded"
 msgstr "Załadowany"
 
 msgid "Imported PDF: "
-msgstr ""
+msgstr "Zaimportowany PDF: "
 
 msgid "Please select exactly one node."
 msgstr "Zaznacz dokładnie jeden węzeł."
@@ -26895,7 +27073,7 @@ msgid " {0} objects so far"
 msgstr " {0} obiektów do tej pory"
 
 msgid "Parsing PDF"
-msgstr ""
+msgstr "Analiza PDF-a"
 
 msgid "Encrypted documents not supported."
 msgstr "Zakodowane dokumenty nie są wspierane."
@@ -27273,7 +27451,7 @@ msgid "Printing stopped"
 msgstr "Zatrzymano drukowanie"
 
 msgid "Printing has failed."
-msgstr ""
+msgstr "Drukowanie nie powiodło się."
 
 msgid "Proj4J: {0} selected"
 msgstr ""
@@ -27550,7 +27728,7 @@ msgid "Open relation/multipolygon editor panel"
 msgstr ""
 
 msgid "Specify role"
-msgstr ""
+msgstr "Wyznacz rolę"
 
 msgid "Change relation member roles to {0}"
 msgstr ""
@@ -27568,7 +27746,7 @@ msgid "When moving tags, consider even non-repeating ones"
 msgstr ""
 
 msgid "Always split ways of neighbouring multipolygons"
-msgstr "Zawsze rozrywaj drogi w sąsiadujacych relacjach multipolygon"
+msgstr "Zawsze rozrywaj linie w sąsiadujacych relacjach multipolygon"
 
 msgid "Change role"
 msgstr "Zmień rolę"
@@ -27601,7 +27779,7 @@ msgid "Enter admin level and name for the border relation:"
 msgstr ""
 
 msgid "Admin level"
-msgstr ""
+msgstr "Szczebel administracyjny"
 
 msgid "Create a relation from selected objects"
 msgstr "Utwórz relację z zaznaczonych obiektów"
@@ -27718,7 +27896,7 @@ msgid "Missing merge target for {0} with id {1}"
 msgstr ""
 
 msgid "Objects history"
-msgstr ""
+msgstr "Historia obiektów"
 
 msgid "History reverter"
 msgstr ""
@@ -27744,7 +27922,7 @@ msgid "Fetching missing primitives"
 msgstr ""
 
 msgid "Downloading changeset"
-msgstr ""
+msgstr "Pobieranie zestawu zmian"
 
 msgid "See {0}"
 msgstr ""
@@ -28003,6 +28181,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Uprość obszar"
 
@@ -28063,9 +28256,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
@@ -28157,10 +28347,10 @@ msgid "You have to specify tagging preset sources in the preferences first."
 msgstr "Musisz najpierw określić źródła szablonu tagowania w preferencjach."
 
 msgid "Enter housenumbers or amount of segments"
-msgstr ""
+msgstr "Wprowadź numery domów lub liczbę segmentów"
 
 msgid "Terrace a house"
-msgstr ""
+msgstr "Podziel dom"
 
 msgid "Interpolation"
 msgstr "Interpolacja"
@@ -28175,7 +28365,7 @@ msgid "Highest Number"
 msgstr "Największy numer"
 
 msgid "List of Numbers"
-msgstr ""
+msgstr "Lista numerów"
 
 msgid "add to existing associatedStreet relation"
 msgstr ""
@@ -28184,13 +28374,13 @@ msgid "create an associatedStreet relation"
 msgstr ""
 
 msgid "keep outline way"
-msgstr ""
+msgstr "zachowaj linię obrysu"
 
 msgid "Street name: "
 msgstr "Nazwa ulicy: "
 
 msgid "Even/Odd"
-msgstr ""
+msgstr "Parzyste/nieparzyste"
 
 msgid "Lowest number"
 msgstr "Najmniejszy numer"
@@ -28428,13 +28618,13 @@ msgid "Open object signing window."
 msgstr ""
 
 msgid "Check"
-msgstr ""
+msgstr "Sprawdź"
 
 msgid "Check all available signatures for selected object."
 msgstr ""
 
 msgid "Sign"
-msgstr ""
+msgstr "Podpisz"
 
 msgid "Digital sign selected Tags, if you believe they are correct."
 msgstr ""
@@ -28475,7 +28665,7 @@ msgid "{0} Signatures found."
 msgstr ""
 
 msgid "Signature Info"
-msgstr ""
+msgstr "Informacje o podpisie"
 
 msgid "Sorry, there are no Signatures for the selected Node."
 msgstr ""
@@ -28617,7 +28807,7 @@ msgid "Create a new signing key"
 msgstr ""
 
 msgid "No such lane."
-msgstr ""
+msgstr "Brak takiego pasa."
 
 msgid ""
 "<html>The number of lanes is not specified for one or more roads; please add "
@@ -28931,7 +29121,7 @@ msgid "Bicycles"
 msgstr "Rowery"
 
 msgid "Mopeds"
-msgstr ""
+msgstr "Motorowery"
 
 msgid "Use standard exceptions"
 msgstr "Użyj standardowych wyjątków"
@@ -29008,7 +29198,7 @@ msgid "Set the current JOSM selection to the selected turn restrictions"
 msgstr "Ustawia zaznaczenie dla wybranego ograniczenia skrętu"
 
 msgid "Select in current data layer"
-msgstr ""
+msgstr "Zaznacz w bieżącej warstwie danych"
 
 msgid "Zoom to the currently selected turn restrictions"
 msgstr "Powiększa do obecnie wybranego ograniczenia skrętu"
@@ -29227,7 +29417,7 @@ msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
 msgid "Undelete object..."
-msgstr ""
+msgstr "Przywróć obiekt..."
 
 msgid "Undelete object by id"
 msgstr ""
@@ -29242,10 +29432,10 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
 msgid "Undelete Object"
-msgstr ""
+msgstr "Przywróć obiekt"
 
 msgid "Undelete object"
-msgstr ""
+msgstr "Przywróć obiekt"
 
 msgid ""
 "Enter the type and ID of the objects that should be undeleted, e.g., ''n1 "
@@ -29274,10 +29464,10 @@ msgid "Align Way Nodes"
 msgstr "Wyrównaj węzły linii"
 
 msgid "Align nodes in a way"
-msgstr ""
+msgstr "Wyrównaj węzły na linii"
 
 msgid "The way with selected nodes can not be straightened."
-msgstr "Droga z wybranymi węzłami nie może zostać wyrównana."
+msgstr "Linia z wybranymi węzłami nie może zostać wyrównana."
 
 msgid "Internal error: number of nodes is {0}."
 msgstr ""
@@ -29286,12 +29476,12 @@ msgid "Extract node"
 msgstr "Wydziel węzeł"
 
 msgid "Extracts node from a way"
-msgstr "Wydziela węzeł z drogi."
+msgstr "Wydziela węzeł z linii."
 
 msgid ""
 "This tool extracts node from its ways and requires single node to be "
 "selected."
-msgstr "To narzędzie wydziela z drogi zaznaczony węzeł."
+msgstr "To narzędzie wydziela z linii zaznaczony węzeł."
 
 msgid "Extract node from line"
 msgstr "Wydziel węzeł z linii"
@@ -29313,13 +29503,13 @@ msgid "The current selection cannot be used for splitting."
 msgstr "Bieżące zaznaczenie nie może być użyte do rozdzielenia."
 
 msgid "The selected way is not closed."
-msgstr ""
+msgstr "Zaznaczona linia nie jest zamknięta."
 
 msgid "The selected way does not contain the selected node."
 msgid_plural "The selected way does not contain all the selected nodes."
-msgstr[0] "Wybrana droga nie zawiera wybranego węzła."
-msgstr[1] "Wybrana droga nie zawiera wszystkich wybranych węzłów."
-msgstr[2] "Wybrana droga nie zawiera wszystkich wybranych węzłów."
+msgstr[0] "Wybrana linia nie zawiera wybranego węzła."
+msgstr[1] "Wybrana linia nie zawiera wszystkich wybranych węzłów."
+msgstr[2] "Wybrana linia nie zawiera wszystkich wybranych węzłów."
 
 msgid ""
 "The selected way is not a split way, please select split points or split way "
@@ -29401,7 +29591,7 @@ msgid "Opens specified URL browser"
 msgstr ""
 
 msgid "Utilsplugin2 settings"
-msgstr ""
+msgstr "Ustawienia Utilsplugin2"
 
 msgid "Here you can change some preferences of Utilsplugin2 functions"
 msgstr "Tu można zmienić niektóre ustawienia funkcji Utilsplugin2"
@@ -29530,14 +29720,14 @@ msgid ""
 "This tool can only replace a node, upgrade a node to a way or a "
 "multipolygon, or replace a way with a way."
 msgstr ""
-"To narzędzie może tylko podmienić węzeł, przekształcić węzeł w drogę lub "
-"wielokąt, lub zamienić drogę z drogą."
+"To narzędzie może tylko podmienić węzeł, przekształcić węzeł w linię lub "
+"wielokąt, lub zamienić linię z linią."
 
 msgid "Node belongs to way(s), cannot replace."
 msgstr "Węzeł należy do linii, nie można zamienić."
 
 msgid "Replace geometry for node {0}"
-msgstr ""
+msgstr "Zastąp geometrię dla węzła {0}"
 
 msgid "Relation is not a multipolygon, cannot be used as a replacement."
 msgstr ""
@@ -29546,11 +29736,11 @@ msgid ""
 "Please select one way that exists in the database and one new way with "
 "correct geometry."
 msgstr ""
-"Wybierz jedną drogę istniejącą w bazie danych i jedną drogę z poprawną "
+"Wybierz jedną linię istniejącą w bazie danych i jedną linię z poprawną "
 "geometrią."
 
 msgid "The ways must be entirely within the downloaded area."
-msgstr "Droga musi zawierać się całkowicie w pobranym obszarze"
+msgstr "Linia musi zawierać się całkowicie w pobranym obszarze"
 
 msgid ""
 "The way to be replaced cannot have any nodes with properties or relation "
@@ -29588,25 +29778,25 @@ msgid "Adjacent ways will be selected. Nodes will be deselected."
 msgstr "Sąsiadujące linie zostaną zaznaczone. Węzły zostaną odznaczone."
 
 msgid "All connected ways"
-msgstr "Wszystkie połączone drogi"
+msgstr "Wszystkie połączone linie"
 
 msgid "Select all connected ways"
-msgstr "Zaznacz wszystkie połączone drogi"
+msgstr "Zaznacz wszystkie połączone linie"
 
 msgid "Intersecting ways"
 msgstr "Przecinające się linie"
 
 msgid "Select intersecting ways"
-msgstr "Zaznacza przecinające się drogi"
+msgstr "Zaznacza przecinające się linie"
 
 msgid "Please select some ways to find connected and intersecting ways!"
 msgstr ""
 
 msgid "All intersecting ways"
-msgstr "Wszystkie przecinające się drogi"
+msgstr "Wszystkie przecinające się linie"
 
 msgid "Select all intersecting ways"
-msgstr "Zaznacza wszystkie przecinające się drogi"
+msgstr "Zaznacza wszystkie przecinające się linie"
 
 msgid "Please select some ways to find all connected and intersecting ways!"
 msgstr ""
@@ -29618,7 +29808,7 @@ msgid "Select middle nodes"
 msgstr "Zaznacza środkowe węzły"
 
 msgid "Please select two nodes connected by way!"
-msgstr "Wybierz dwa węzły połączone drogą!"
+msgstr "Wybierz dwa węzły połączone linią!"
 
 msgid "Too many ways are added: {0}!"
 msgstr "Dodano zbyt dużo linii: {0}!"
@@ -29633,8 +29823,8 @@ msgid ""
 "Nothing found. Please select some closed ways or multipolygons to find all "
 "primitives inside them!"
 msgstr ""
-"Nic nie znaleziono. Wybierz zamknięta drogę (drogi) lub relacje multipolygon "
-"aby odszukać wszystkie elementy w środku."
+"Nic nie znaleziono. Wybierz zamknięta linie lub relacje multipolygon aby "
+"odszukać wszystkie elementy w środku."
 
 msgid "Area boundary [testing]"
 msgstr "Granica obszaru (testowe)"
@@ -29648,20 +29838,19 @@ msgid ""
 msgstr ""
 
 msgid "Select Highway"
-msgstr "Zaznacz całą drogę (Highway)"
+msgstr "Zaznacz całą drogę"
 
 msgid "Select highway for the name/ref given"
-msgstr ""
-"Zaznacza całą drogę (highway) na podstawie tych samych tagów name/ref"
+msgstr "Zaznacza całą drogę na podstawie tych samych tagów name/ref"
 
 msgid "Please select one or two ways for this action"
-msgstr "Proszę wybrać jedną lub dwie drogi dla tej akcji"
+msgstr "Proszę wybrać jedną lub dwie linie dla tej akcji"
 
 msgid "Select last modified nodes"
 msgstr "Zaznacz ostatnio zmodyfikowane węzły"
 
 msgid "Select last modified ways"
-msgstr "Wybierz ostatnio zmodyfikowane drogi"
+msgstr "Wybierz ostatnio zmodyfikowane linie"
 
 msgid "Select Way Nodes"
 msgstr "Zaznacz węzły linii"
@@ -29694,7 +29883,7 @@ msgid "removes current video from layer"
 msgstr "usuwa bieżące wideo z warstwy"
 
 msgid "Play/Pause"
-msgstr "Odtwórz / wstrzymaj"
+msgstr "Odtwórz/wstrzymaj"
 
 msgid "starts/pauses video playback"
 msgstr "otwiera/wstrzymuje odtwarzanie wideo"
@@ -29836,7 +30025,7 @@ msgid "Way Download"
 msgstr "Pobierz na końcu..."
 
 msgid "Download map data on the end of selected way"
-msgstr "Pobierz dane mapy z końca wybranej drogi"
+msgstr "Pobierz dane mapy z końca wybranej linii"
 
 msgid ""
 "<html>Neither a node nor a way with an endpoint outside of the<br>current "
@@ -29872,7 +30061,7 @@ msgstr "<html>Nie ma więcej połączonych linii do pobrania.</html>"
 
 msgid "Node ''{0}'' is a junction with more than 2 connected ways."
 msgstr ""
-"Węzeł ''{0}'' jest skrzyżowaniem z więcej niż dwiema połączonymi drogami."
+"Węzeł ''{0}'' jest skrzyżowaniem z więcej niż dwiema połączonymi liniami."
 
 msgid "Enter search expression here.."
 msgstr "Wprowadź frazę do znalezienia..."
@@ -29965,7 +30154,7 @@ msgid "Sets the default language for the Wikipedia articles"
 msgstr "Ustawia domyślny język dla artykułów Wikipedii"
 
 msgid "Enter the Wikipedia language"
-msgstr "Wprowadź język wikipedii"
+msgstr "Wprowadź język Wikipedii"
 
 msgid ""
 "Adds a ''wikipedia'' tag corresponding to this article to the selected "
diff --git a/i18n/po/pt.po b/i18n/po/pt.po
index e481fa3..3e8eed1 100644
--- a/i18n/po/pt.po
+++ b/i18n/po/pt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-12-01 00:01+0000\n"
 "Last-Translator: Rui <xande6ruz at yandex.com>\n"
 "Language-Team: Portuguese <pt at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:17+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:13+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: pt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -227,6 +227,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Sem camadas de destino"
 
+msgid "Select"
+msgstr "Selecionar"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Seleciona no mapa os elementos selecionados na lista acima, desselecionando "
+"os restantes."
+
 msgid "Add imagery layer {0}"
 msgstr "Adicionar camada de imagem de fundo {0}"
 
@@ -2240,9 +2249,6 @@ msgstr ""
 "Arraste a cabeça de reprodução e largue perto do trilho GPS para reproduzir "
 "o áudio a partir daí. SHIFT+largar para sincronizar o áudio nesse ponto."
 
-msgid "Select"
-msgstr "Selecionar"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Selecionar, mover, escalonar e rodar objetos"
 
@@ -6110,12 +6116,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Abre uma janela de fusão de todos os itens selecionados da lista de cima."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Seleciona no mapa os elementos selecionados na lista acima, desselecionando "
-"os restantes."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Surgiu {0} conflito."
@@ -9924,10 +9924,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9953,6 +9951,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imagens JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Escolher trilhos GPS visíveis"
 
@@ -12195,7 +12199,7 @@ msgstr "Interno:"
 msgid "Projection bounds (in degrees)"
 msgstr "Limites da projeção (em graus)"
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -15831,6 +15835,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr "Carrega dados de Secure Data Server (SDS)"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16884,12 +16894,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Estrada de Parque de Estacionamento"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Estrada genérica (quando não se sabe o tipo)"
 
 msgid "Construction"
 msgstr "Em construção"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Cruzamento"
 
@@ -16985,47 +17071,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rotunda"
 
-msgid "motorway"
-msgstr "auto-estrada"
-
-msgid "motorway_link"
-msgstr "ligação a auto-estrada"
-
-msgid "trunk"
-msgstr "via-rápida, itinerário principal ou complementar"
-
-msgid "trunk_link"
-msgstr "ligação a via-rápida, itinerário principal ou compl."
-
-msgid "primary"
-msgstr "estrada nacional (primária)"
-
-msgid "primary_link"
-msgstr "ligação a estrada nacional"
-
-msgid "secondary"
-msgstr "estrada regional (secundária)"
-
-msgid "tertiary"
-msgstr "estrada municipal (terciária)"
-
-msgid "unclassified"
-msgstr "sem classificação oficial"
-
-msgid "residential"
-msgstr "residencial"
-
-msgid "living_street"
-msgstr "living street (não usada em Portugal)"
-
-msgid "service"
-msgstr "serviço"
-
-msgid "bus_guideway"
-msgstr "autocarro de guia"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "em construção"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vau (ponto de passagem num curso de água baixo)"
@@ -17866,32 +17914,29 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Aéreo por Cabo"
 
-msgid "Chair Lift"
-msgstr "Telecadeira"
+msgid "Cable Car"
+msgstr "Teleférico"
 
 msgid "Number of people per hour"
 msgstr "Número de pessoas por hora"
 
-msgid "Number of people per chair"
-msgstr "Número de pessoas por cadeira"
+msgid "Number of people per car"
+msgstr "Número de pessoas por cabine"
 
 msgid "Typical journey time in minutes"
 msgstr "Tempo de viagem médio em minutos"
 
-msgid "Has bubble?"
-msgstr "Tem pára-vento?"
-
 msgid "Has heating?"
 msgstr "Tem aquecimento?"
 
-msgid "Drag Lift"
-msgstr "Telesqui (genérico)"
+msgid "Chair Lift"
+msgstr "Telecadeira"
 
-msgid "Cable Car"
-msgstr "Teleférico"
+msgid "Number of people per chair"
+msgstr "Número de pessoas por cadeira"
 
-msgid "Number of people per car"
-msgstr "Número de pessoas por cabine"
+msgid "Has bubble?"
+msgstr "Tem pára-vento?"
 
 msgid "Gondola"
 msgstr "Gôndola"
@@ -17905,17 +17950,25 @@ msgstr "Misto (gôndolas e telecadeiras)"
 msgid "Number of people per gondola/chair"
 msgstr "Número de pessoas por gôndola/cadeira"
 
-msgid "T-bar Lift"
-msgstr "Telesqui T-bar (T invertido)"
+msgid "Drag Lift"
+msgstr "Telesqui (genérico)"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
 
-msgid "J-bar Lift"
-msgstr "Telesqui J-bar"
+msgid "t-bar"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Telesqui de prato (1 pessoa)"
+msgid "j-bar"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Telecorda"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Tapete Rolante"
@@ -17999,6 +18052,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18029,12 +18085,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18230,6 +18289,9 @@ msgstr "Ferramentas para reparações faça-você-mesmo"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Limpeza de bicicletas (paga)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transporte Público"
 
@@ -18488,6 +18550,14 @@ msgstr "Plataforma de Estacionamento"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Baliza"
 
@@ -19733,10 +19803,6 @@ msgid "Man Made"
 msgstr "Construção"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -19757,16 +19823,16 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
-msgstr "quinta"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19839,6 +19905,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr "quinta"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -21336,7 +21406,7 @@ msgstr "Parque Nacional"
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -21366,15 +21436,21 @@ msgstr "Capital de Distrito (cidade)"
 msgid "Town"
 msgstr "Sede de Concelho (cidade, vila)"
 
-msgid "Suburb"
-msgstr "Subúrbio"
-
 msgid "Village"
 msgstr "Sede de freguesia (cidade / vila / aldeia)"
 
 msgid "Hamlet"
 msgstr "Aldeia / Lugar"
 
+msgid "Isolated Dwelling"
+msgstr "Habitação Isolada"
+
+msgid "Suburb"
+msgstr "Subúrbio"
+
+msgid "Neighbourhood"
+msgstr "Bairro"
+
 msgid "Farm"
 msgstr "Quinta"
 
@@ -21385,12 +21461,6 @@ msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 "(por favor use isolated_dwelling/habitação isolada para uma quinta isolada)"
 
-msgid "Isolated Dwelling"
-msgstr "Habitação Isolada"
-
-msgid "Neighbourhood"
-msgstr "Bairro"
-
 msgid "Locality"
 msgstr "Sítio (evitar usar)"
 
@@ -21906,6 +21976,37 @@ msgstr "Imagem"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "linha exterior"
 
@@ -22269,16 +22370,13 @@ msgstr "Teste"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Equipa Humanitária do OpenStreetMap)"
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -22290,13 +22388,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -22329,6 +22427,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -22372,7 +22518,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22393,6 +22542,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -22521,7 +22676,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22604,6 +22759,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -22820,16 +22981,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -22838,6 +22999,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -23105,6 +23269,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -23197,6 +23364,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -28944,6 +29114,21 @@ msgstr "Gravar a informação Separate Data Store atual para um ficheiro."
 msgid "Save SDS file"
 msgstr "Gravar ficheiro Separate Data Store"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Simplificar Área"
 
@@ -29019,9 +29204,6 @@ msgstr "Fator de Distância"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Limiar de Fusão de Nós Adjacentes"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "Gravar Automaticamente"
 
diff --git a/i18n/po/pt_BR.po b/i18n/po/pt_BR.po
index 703709c..af45e0a 100644
--- a/i18n/po/pt_BR.po
+++ b/i18n/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-12-14 05:22+0000\n"
 "Last-Translator: Felipe L. <felipe.idj at hotmail.com>\n"
 "Language-Team: Português Brasileiro <gnome-pt_br-list at gnome.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:35+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:30+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: pt_BR\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -229,6 +229,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Sem camadas destino"
 
+msgid "Select"
+msgstr "Selecionar"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Defina os elementos selecionados no mapa para os itens selecionados na lista "
+"acima."
+
 msgid "Add imagery layer {0}"
 msgstr "adicionar camada de imagem {0}"
 
@@ -2221,9 +2230,6 @@ msgstr ""
 "Arraste a símbolo de reprodução e solte próximo à trilha para reproduzir "
 "áudio dali. SHIFT+soltar para sincronizar o áudio naquele ponto."
 
-msgid "Select"
-msgstr "Selecionar"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Selecionar, mover, escalar e rotacionar objetos"
 
@@ -6133,12 +6139,6 @@ msgstr "Resolver"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Abrir uma janela de união dos itens selecionados na lista acima."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Defina os elementos selecionados no mapa para os itens selecionados na lista "
-"acima."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Houve {0} conflito detectado."
@@ -9953,10 +9953,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9982,6 +9980,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imagens JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "Escolha faixas visíveis"
 
@@ -12200,8 +12204,8 @@ msgstr "Construído em:"
 msgid "Projection bounds (in degrees)"
 msgstr "Limites de projeção (em graus)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr ""
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -15887,6 +15891,12 @@ msgstr "Possibilita capacidade de roteamento."
 msgid "Loads data from SDS"
 msgstr "Carregar dados de SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16908,12 +16918,88 @@ msgstr "drive-through"
 msgid "Parking Aisle"
 msgstr "Vaga de Estacionamento"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Pista (tipo desconhecido)"
 
 msgid "Construction"
 msgstr "Construção"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Junção"
 
@@ -17009,47 +17095,9 @@ msgstr "não"
 msgid "Roundabout"
 msgstr "Rotatória"
 
-msgid "motorway"
-msgstr "auto-estrada"
-
-msgid "motorway_link"
-msgstr "motorway_link"
-
-msgid "trunk"
-msgstr "Tronco"
-
-msgid "trunk_link"
-msgstr "trunk_link"
-
-msgid "primary"
-msgstr "primária"
-
-msgid "primary_link"
-msgstr "primary_link"
-
-msgid "secondary"
-msgstr "secundária"
-
-msgid "tertiary"
-msgstr "terciária"
-
-msgid "unclassified"
-msgstr "sem classificação"
-
-msgid "residential"
-msgstr "residenncial"
-
-msgid "living_street"
-msgstr "living_street"
-
-msgid "service"
-msgstr "serviço"
-
-msgid "bus_guideway"
-msgstr "bus_guideway"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "construção"
+msgstr ""
 
 msgid "Ford"
 msgstr "Travessia de rio"
@@ -17901,32 +17949,29 @@ msgstr "Railway Switch"
 msgid "Aerialway"
 msgstr "Aerialway"
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr "Teleférico"
 
 msgid "Number of people per hour"
 msgstr "Número de pessoas por hora"
 
-msgid "Number of people per chair"
-msgstr "Número de pessoas por cadeira"
+msgid "Number of people per car"
+msgstr "Número de pessoas por carro"
 
 msgid "Typical journey time in minutes"
 msgstr "Tempo de viagem típica em minutos"
 
-msgid "Has bubble?"
-msgstr "Tem bolha?"
-
 msgid "Has heating?"
 msgstr "Tem aquecimento?"
 
-msgid "Drag Lift"
-msgstr "Arraste Levante"
-
-msgid "Cable Car"
+msgid "Chair Lift"
 msgstr "Teleférico"
 
-msgid "Number of people per car"
-msgstr "Número de pessoas por carro"
+msgid "Number of people per chair"
+msgstr "Número de pessoas por cadeira"
+
+msgid "Has bubble?"
+msgstr "Tem bolha?"
 
 msgid "Gondola"
 msgstr "Gôndola"
@@ -17940,17 +17985,25 @@ msgstr "Elevador misto"
 msgid "Number of people per gondola/chair"
 msgstr "Número de pessoas por gôndola/cadeira"
 
-msgid "T-bar Lift"
-msgstr "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Arraste Levante"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
+msgstr ""
 
-msgid "J-bar Lift"
-msgstr "J-bar Lift"
+msgid "j-bar"
+msgstr ""
 
-msgid "Platter Lift"
-msgstr "Platter Lift"
+msgid "platter"
+msgstr ""
 
-msgid "Rope Tow"
-msgstr "Cabo de reboque"
+msgid "rope_tow"
+msgstr ""
 
 msgid "Magic Carpet"
 msgstr "Magic Carpet"
@@ -18034,6 +18087,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18064,12 +18120,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18267,6 +18326,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Bicicletas são lavadas (por um certo valor)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Transporte Público"
 
@@ -18525,6 +18587,14 @@ msgstr "Apron"
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "sim"
+
 msgid "Beacon"
 msgstr "Sinal luminoso"
 
@@ -19771,10 +19841,6 @@ msgid "Man Made"
 msgstr "Construção humana"
 
 msgctxt "building"
-msgid "yes"
-msgstr "sim"
-
-msgctxt "building"
 msgid "roof"
 msgstr "telhado"
 
@@ -19795,16 +19861,16 @@ msgid "school"
 msgstr "escola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "Comercial"
 
 msgctxt "building"
-msgid "farm"
-msgstr "fazenda"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -19877,6 +19943,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "separado"
 
+msgctxt "building"
+msgid "farm"
+msgstr "fazenda"
+
 msgid "Entrance"
 msgstr "Entrada"
 
@@ -21376,8 +21446,8 @@ msgstr "Parque nacional"
 msgid "Protected Area"
 msgstr "Área protegida"
 
-msgid "Protected Class"
-msgstr "Classe protegida"
+msgid "Protect Class"
+msgstr ""
 
 msgid "Title or type of protection"
 msgstr "Título ou tipo de proteção"
@@ -21406,15 +21476,21 @@ msgstr "Cidade"
 msgid "Town"
 msgstr "Cidade"
 
-msgid "Suburb"
-msgstr "Bairro"
-
 msgid "Village"
 msgstr "Vilarejo"
 
 msgid "Hamlet"
 msgstr "Povoado"
 
+msgid "Isolated Dwelling"
+msgstr "Moradia isolada"
+
+msgid "Suburb"
+msgstr "Bairro"
+
+msgid "Neighbourhood"
+msgstr "Vizinhança"
+
 msgid "Farm"
 msgstr "Fazenda"
 
@@ -21424,12 +21500,6 @@ msgstr "Uma fazenda num grande lugar"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(por favor, use isolated_dwelling para uma fazenda isolada)"
 
-msgid "Isolated Dwelling"
-msgstr "Moradia isolada"
-
-msgid "Neighbourhood"
-msgstr "Vizinhança"
-
 msgid "Locality"
 msgstr "Localidade"
 
@@ -21959,6 +22029,37 @@ msgstr "Imagem"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Contato (esquema com o prefixo ''contato: *'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "segmento externo"
 
@@ -22322,17 +22423,14 @@ msgstr "Testar"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Satélite Yahoo"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "Satélite MapBox"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22343,14 +22441,14 @@ msgstr "OpenStreetMap GPS Traces"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik Black & White)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, no labels)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
@@ -22382,6 +22480,54 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI black-and-white 2.5m"
 
@@ -22425,7 +22571,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -22446,6 +22595,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Mosaico Columbia Britânica"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Czech CUZK:KM"
 
@@ -22576,8 +22731,8 @@ msgstr "Bavaria (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Luftbild)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Luftbild (5,0 cm)"
@@ -22662,6 +22817,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Itália"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
 
@@ -22878,17 +23039,17 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Large Scale Imagery"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr ""
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcels"
@@ -22896,6 +23057,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Últimas Ortoimagens"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
@@ -23163,6 +23327,9 @@ msgstr "OS Town Plans, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Diminuição do número de casas em interpolação de endereços"
 
@@ -23265,6 +23432,9 @@ msgstr "{0} em um nó. Deveria ser desenhado como uma área."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* em um nó. Deveria ser utilizado em uma relação"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} em uma via. Deveria ser utilizado em uma relação"
 
@@ -29028,6 +29198,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr "Salvar arquivo SDS"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "Editor SeaMap"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Área simplificada"
 
@@ -29100,9 +29285,6 @@ msgstr "Fator de distância"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Unir nós próximos"
 
-msgid "SeaMap Editor"
-msgstr "Editor SeaMap"
-
 msgid "AutoSave LiveData"
 msgstr "AutoSave LiveData"
 
diff --git a/i18n/po/rm.po b/i18n/po/rm.po
index a966052..241b469 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-06-21 19:14+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Raeto-Romance <rm at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n !=1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:18+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:14+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ro.po b/i18n/po/ro.po
index f8473dc..2bc2312 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-10-03 22:38+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: 2014-12-29 05:18+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:15+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "X-Poedit-Country: ROMANIA\n"
 "Language: ro\n"
 "X-Poedit-Language: Romanian\n"
@@ -221,6 +221,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Niciun strat țintă"
 
+msgid "Select"
+msgstr "Selectaţi"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Setaţi elementele selectate de pe hartă ca elemente selectate din lista de "
+"mai sus."
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2049,9 +2058,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Selectaţi"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5630,12 +5636,6 @@ msgstr ""
 "Deschide un dialog de îmbinare a tuturor elementelor selectate din lista de "
 "mai sus."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Setaţi elementele selectate de pe hartă ca elemente selectate din lista de "
-"mai sus."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9071,7 +9071,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9092,6 +9092,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Imagine JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11065,7 +11071,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14246,6 +14252,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15238,12 +15250,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15339,45 +15427,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16212,31 +16262,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16251,16 +16298,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr ""
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16345,6 +16400,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16375,12 +16433,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16576,6 +16637,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16834,6 +16898,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18077,10 +18149,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18101,15 +18169,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18183,6 +18251,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19680,7 +19752,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19710,28 +19782,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20249,6 +20321,37 @@ msgstr "Imagine"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20612,16 +20715,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20633,13 +20733,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20672,6 +20772,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20715,7 +20863,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20736,6 +20887,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20864,7 +21021,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20947,6 +21104,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21163,16 +21326,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21181,6 +21344,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21448,6 +21614,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21540,6 +21709,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26874,6 +27046,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26934,9 +27121,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/ru.po b/i18n/po/ru.po
index f9f13d6..c84620c 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-27 19:27+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-30 11:04+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: 2014-12-29 05:19+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:16+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ru_RU\n"
 
 msgid "Use Basic Authentication"
@@ -244,6 +244,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Не выбран слой"
 
+msgid "Select"
+msgstr "Выбор"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Выделить на карте объекты, выбранные в списке вверху."
+
 msgid "Add imagery layer {0}"
 msgstr "Добавить слой снимка {0}"
 
@@ -2254,9 +2261,6 @@ msgstr ""
 "проигрывания звука в этом месте. SHIFT+отпустить для синхронизации звука в "
 "этой точке"
 
-msgid "Select"
-msgstr "Выбор"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Выделять, перемещать, масштабировать и вращать объекты"
 
@@ -6194,10 +6198,6 @@ msgstr ""
 "Открыть диалоговое окно для объединения выбранных в вышеуказанном списке "
 "объектов."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Выделить на карте объекты, выбранные в списке вверху."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Обнаружен {0} конфликт."
@@ -10072,10 +10072,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} км/ч"
+"Скорость: {0} км/ч"
 
 msgid ""
 "\n"
@@ -10101,6 +10101,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Изображения JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Показывать миниатюры"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Показывать миниатюры изображений вместо значков"
+
 msgid "Choose visible tracks"
 msgstr "Фильтровать треки"
 
@@ -12315,8 +12321,8 @@ msgstr "Встроенная:"
 msgid "Projection bounds (in degrees)"
 msgstr "Границы проекции (в градусах)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (код EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Устанавливает параметр SRS=... в WMS-запросе"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -16013,6 +16019,12 @@ msgstr "Предоставляет возможности маршрутизац
 msgid "Loads data from SDS"
 msgstr "Хранение данных в Separate Data Store (SDS)"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Слой снимков для морских карт"
+
+msgid "Edit features for Sea Charts"
+msgstr "Редактирование объектов морских карт"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -17034,12 +17046,90 @@ msgstr "обслуживание в авто"
 msgid "Parking Aisle"
 msgstr "Проезд на парковке"
 
+msgid "Escape"
+msgstr "Полоса аварийного торможения"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Полоса безопасности вдоль длинных склонов для аварийной остановки грузовиков "
+"и другого автотранспорта при поломке тормозной системы."
+
 msgid "Road (Unknown Type)"
 msgstr "Дорога (тип неизвестен)"
 
 msgid "Construction"
 msgstr "Строительство"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "автомагистраль"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "съезд с автомагистрали"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "автострада"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "съезд с автострады"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "основная"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "съезд с основной"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "вторичная"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "съезд со вторичной"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "третичная"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "съезд с третичной"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "автобусный рельс"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "для верховой езды"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "жилая улица"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "пешеходная улица"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "полевая/лесная дорога"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "пешеходная дорожка"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "лестница"
+
 msgid "Junction"
 msgstr "Перекрёсток"
 
@@ -17135,45 +17225,7 @@ msgstr "нет"
 msgid "Roundabout"
 msgstr "Круг"
 
-msgid "motorway"
-msgstr "автомагистраль"
-
-msgid "motorway_link"
-msgstr "съезд с дороги"
-
-msgid "trunk"
-msgstr "автострада"
-
-msgid "trunk_link"
-msgstr "съезд с автострады"
-
-msgid "primary"
-msgstr "главная дорога"
-
-msgid "primary_link"
-msgstr "съезд с основной дороги"
-
-msgid "secondary"
-msgstr "второстепенная дорога"
-
-msgid "tertiary"
-msgstr "дорога третьего порядка"
-
-msgid "unclassified"
-msgstr "неклассифицированная дорога"
-
-msgid "residential"
-msgstr "дорога местного значения"
-
-msgid "living_street"
-msgstr "жилая улица"
-
-msgid "service"
-msgstr "служебный проезд"
-
-msgid "bus_guideway"
-msgstr "автобусный рельс"
-
+msgctxt "Highway"
 msgid "construction"
 msgstr "строящаяся дорога"
 
@@ -18028,32 +18080,29 @@ msgstr "Железнодорожная стрелка"
 msgid "Aerialway"
 msgstr "Канатная дорога"
 
-msgid "Chair Lift"
-msgstr "Кресельная"
+msgid "Cable Car"
+msgstr "Фуникулер"
 
 msgid "Number of people per hour"
 msgstr "Пассажиров в час"
 
-msgid "Number of people per chair"
-msgstr "Пассажиров в кресле"
+msgid "Number of people per car"
+msgstr "Пассажиров в кабинке"
 
 msgid "Typical journey time in minutes"
 msgstr "Среднее время пути"
 
-msgid "Has bubble?"
-msgstr "Есть купол?"
-
 msgid "Has heating?"
 msgstr "С подогревом?"
 
-msgid "Drag Lift"
-msgstr "Бугельная"
+msgid "Chair Lift"
+msgstr "Кресельная"
 
-msgid "Cable Car"
-msgstr "Фуникулер"
+msgid "Number of people per chair"
+msgstr "Пассажиров в кресле"
 
-msgid "Number of people per car"
-msgstr "Пассажиров в кабинке"
+msgid "Has bubble?"
+msgstr "Есть купол?"
 
 msgid "Gondola"
 msgstr "Гондольная"
@@ -18067,17 +18116,27 @@ msgstr "Смешанный подъёмник"
 msgid "Number of people per gondola/chair"
 msgstr "Количество человек в гондоле/кресле"
 
-msgid "T-bar Lift"
-msgstr "Т-образный бугельный подъёмник"
+msgid "Drag Lift"
+msgstr "Бугельная"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"бугельный подъёмник (общий тип - используйте, только если точный тип (см. "
+"значения ниже) неизвестен)"
+
+msgid "t-bar"
+msgstr "T-образный"
 
-msgid "J-bar Lift"
-msgstr "Г-образный бугельный подъёмник"
+msgid "j-bar"
+msgstr "J-образный"
 
-msgid "Platter Lift"
-msgstr "Бугельный подъёмник"
+msgid "platter"
+msgstr "тарелочный"
 
-msgid "Rope Tow"
-msgstr "Буксирный канат"
+msgid "rope_tow"
+msgstr "движущийся канат"
 
 msgid "Magic Carpet"
 msgstr "Ленточный подъёмник"
@@ -18161,6 +18220,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18191,12 +18253,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18394,6 +18459,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Велосипеды моют (за отдельную плату)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Стойка для ремонта велосипедов"
+
 msgid "Public Transport"
 msgstr "Общественный транспорт"
 
@@ -18652,6 +18720,14 @@ msgstr "Перрон"
 msgid "Hangar"
 msgstr "Ангар"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "ангар"
+
+msgctxt "building"
+msgid "yes"
+msgstr "да"
+
 msgid "Beacon"
 msgstr "Бакен"
 
@@ -19895,10 +19971,6 @@ msgid "Man Made"
 msgstr "Рукотворное"
 
 msgctxt "building"
-msgid "yes"
-msgstr "да"
-
-msgctxt "building"
 msgid "roof"
 msgstr "крыша или навес"
 
@@ -19919,16 +19991,16 @@ msgid "school"
 msgstr "школа"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "ангар"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "место деловой активности"
 
 msgctxt "building"
-msgid "farm"
-msgstr "ферма"
+msgid "barn"
+msgstr "амбар"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "нежилое здание фермы"
 
 msgctxt "building"
 msgid "transportation"
@@ -20001,6 +20073,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "отдельно стоящий дом"
 
+msgctxt "building"
+msgid "farm"
+msgstr "ферма"
+
 msgid "Entrance"
 msgstr "проход"
 
@@ -21500,7 +21576,7 @@ msgstr "Национальный парк"
 msgid "Protected Area"
 msgstr "Особо охраняемая природная территория"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Класс охраны"
 
 msgid "Title or type of protection"
@@ -21530,15 +21606,21 @@ msgstr "Город (более 100 000)"
 msgid "Town"
 msgstr "Город (до 100 000)"
 
-msgid "Suburb"
-msgstr "Пригород"
-
 msgid "Village"
 msgstr "Село"
 
 msgid "Hamlet"
 msgstr "Деревня"
 
+msgid "Isolated Dwelling"
+msgstr "Изолированное жилье"
+
+msgid "Suburb"
+msgstr "Пригород"
+
+msgid "Neighbourhood"
+msgstr "Микрорайон"
+
 msgid "Farm"
 msgstr "Ферма"
 
@@ -21549,12 +21631,6 @@ msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 "(используйте isolated_dwelling для фермы, расположенной не в поселении)"
 
-msgid "Isolated Dwelling"
-msgstr "Изолированное жилье"
-
-msgid "Neighbourhood"
-msgstr "Микрорайон"
-
 msgid "Locality"
 msgstr "Местность"
 
@@ -22082,6 +22158,41 @@ msgstr "Изображение"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Контактная информация (схема с префиксом ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Короткий текст с дополнительной информацией."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Он может быть виден пользователю карты (возможно, с помощью поисковой "
+"системы или карты со всплывающими комментариями)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Другие подобные теги:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Заметка"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr "Важная заметка для других картографов (не для пользователей карты)."
+
+msgid "Fixme"
+msgstr "Fixme"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Пометка другим картографам (не пользователям карты) о том, что объект "
+"нуждается в исправлении."
+
 msgid "outer segment"
 msgstr "внешний сегмент"
 
@@ -22445,17 +22556,14 @@ msgstr "Тест"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Спутниковые снимки Yahoo"
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr "Спутниковые снимки Bing"
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (команда по созданию карт гуманитарной помощи OpenStreetMap)"
 
-msgid "MapBox Satellite"
-msgstr "Спутниковые снимки MapBox"
+msgid "Mapbox Satellite"
+msgstr "Спутниковые снимки Mapbox"
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22466,15 +22574,15 @@ msgstr "GPS-треки OpenStreetMap"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik чёрно-белый)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, без подписей)"
 
-msgid "skobbler"
-msgstr "skobbler"
-
 msgid "skobbler heatmap"
 msgstr "Тепловая карта skobbler"
 
@@ -22505,6 +22613,54 @@ msgstr "Теплокарта Strava для велосипедистов"
 msgid "Strava running heatmap"
 msgstr "Теплокарта Strava для бегунов"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr "QA (без адресов)"
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Waymarked Trails: пешие прогулки"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Waymarked Trails: велоспорт"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Waymarked Trails: горный велоспорт"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Waymarked Trails: роликовые коньки"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Waymarked Trails: верховая езда"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Waymarked Trails: зимние виды спорта"
+
+msgid "OSM Inspector: Geometry"
+msgstr "OSM Inspector: геометрия"
+
+msgid "OSM Inspector: Tagging"
+msgstr "OSM Inspector: теги"
+
+msgid "OSM Inspector: Places"
+msgstr "OSM Inspector: места"
+
+msgid "OSM Inspector: Highways"
+msgstr "OSM Inspector: дороги"
+
+msgid "OSM Inspector: Multipolygon"
+msgstr "OSM Inspector: мультиполигоны"
+
+msgid "OSM Inspector: Routing"
+msgstr "OSM Inspector: маршруты"
+
+msgid "OSM Inspector: Addresses"
+msgstr "OSM Inspector: адреса"
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr "OSM Inspector: границы (ЕС)"
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI черно-белая 2.5м"
 
@@ -22546,10 +22702,13 @@ msgstr "VoGIS: DOM (модель поверхности)"
 
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
-msgstr ""
+msgstr "Аэрофотосъёмка AGIV(laanderen) (покрывает также Брюссель) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "Аэрофотосъёмка SPW(allonie) 2012"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "Аэрофотосъёмка SPW(allonie) 2009"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE: карта городских районов"
@@ -22569,6 +22728,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Мозаика Британской Колумбии"
 
+msgid "Kelowna 2012"
+msgstr "Келоуна 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Келоуна - оверлей дорог"
+
 msgid "Czech CUZK:KM"
 msgstr "Чехия CUZK:KM"
 
@@ -22686,7 +22851,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Гамбург (40 см)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Гамбург (20 см)"
 
 msgid "Hamburg (DK5)"
 msgstr "Гамбург (DK5)"
@@ -22697,8 +22862,8 @@ msgstr "Бавария (2 м)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Штутгарт (аэрофото)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Эрланген: аэрофотосъёмка 2013 (6,25 см)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr "Эрланген - аэрофотосъёмка (2013 6,25 см)"
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Эрланген: аэрофотосъёмка 2011 (5,0 см)"
@@ -22781,6 +22946,12 @@ msgstr "PCN 2008 - IT Лацио+Умбрия"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Италия"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Южный Тироль - ортофото 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Южный Тироль - топокарта"
+
 msgid "USSR - Latvia"
 msgstr "СССР - Латвия"
 
@@ -22997,17 +23168,17 @@ msgstr "MSR Maps Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Maps Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS: сканированные топографические карты"
+msgid "USGS Topographic Maps"
+msgstr "USGS Топографические карты"
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS: крупномасштабные снимки"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012: оверлей дорог"
+msgid "TIGER 2012 Roads Overlay"
+msgstr "TIGER 2012 - оверлей дорог"
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "Новые и смещённые дороги TIGER (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr "Новые и смещённые дороги TIGER (2014)"
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcels"
@@ -23015,6 +23186,9 @@ msgstr "MassGIS L3 Parcels"
 msgid "NC Latest Orthoimagery"
 msgstr "Северная Каролина: последние ортоснимки"
 
+msgid "U.S. Forest Service roads"
+msgstr "U.S. Forest Service - дороги"
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Украина - ортофото 2012"
 
@@ -23282,6 +23456,9 @@ msgstr "OS Town Plans, Уигтаун 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Town Plans, Уигтаун 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Номера домов по убыванию в интерполяции адресов"
 
@@ -23387,6 +23564,9 @@ msgstr "{0} на точке. Должен быть нарисован как о
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* на точке. Следует использовать в отношении"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} на линии. Следует использовать на точке."
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} на линии. Должен использоваться в отношении"
 
@@ -24828,10 +25008,10 @@ msgid "merge nodes"
 msgstr "Объединять точки"
 
 msgid "How often thinning operation should be applied (Default {0})."
-msgstr ""
+msgstr "Как часто должна применяться операция утончения (По умолчанию {0})."
 
 msgid "Thinning Iterations"
-msgstr ""
+msgstr "Итерации утончения"
 
 msgid "Street Name:"
 msgstr "Улица:"
@@ -28082,6 +28262,8 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Щёлкните и перетащите фото, shift+щелчок для позиционирования, "
+"control+щелчок для поворота."
 
 msgid "Please load some photos."
 msgstr "Позалуйста загрузите несколько фотографий."
@@ -29130,6 +29312,21 @@ msgstr "Сохранить текущую информацию SDS в файл"
 msgid "Save SDS file"
 msgstr "Сохранить SDS-файл"
 
+msgid "No object selected"
+msgstr "Объект не выбран"
+
+msgid "SeaMap Editor"
+msgstr "Редактор морских карт"
+
+msgid "Seamark Inspector"
+msgstr "Инспектор навигационных знаков"
+
+msgid "Select only one object"
+msgstr "Выделите только один объект"
+
+msgid "Select a map object"
+msgstr "Выделите объект карты"
+
 msgid "Simplify Area"
 msgstr "Упростить полигон"
 
@@ -29202,9 +29399,6 @@ msgstr "Коэффициент расстояния"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Порог близости точек (м)"
 
-msgid "SeaMap Editor"
-msgstr "Редактор карт морей (SeaMap)"
-
 msgid "AutoSave LiveData"
 msgstr "Автосохранение данных позиционирования"
 
diff --git a/i18n/po/sk.po b/i18n/po/sk.po
index 269ad81..fcefbdc 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: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-28 12:59+0000\n"
-"Last-Translator: Vlado <babicvm at szm.sk>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-29 18:15+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: 2014-12-29 05:23+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:18+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: sk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -233,6 +233,15 @@ msgstr ""
 msgid "No target layers"
 msgstr "Žiadne cieľové vrstvy"
 
+msgid "Select"
+msgstr "Vybrať"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Nastaviť vybrané elementy(prvky) na mape, podľa vybratých prvkov v zozname "
+"hore."
+
 msgid "Add imagery layer {0}"
 msgstr "Pridať vrstvu mapového podkladu {0}"
 
@@ -2228,9 +2237,6 @@ msgstr ""
 "Ťahajte \"play head\" a uvoľnite ho blízko miesta odkadiaľ chcete zvukový "
 "záznam prehrávať; SHIFT+uvoľnite synchronizovaný zvukový záznam v tom bode."
 
-msgid "Select"
-msgstr "Vybrať"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Vybrať, presúvať, mierka a otočenie objektov"
 
@@ -4100,7 +4106,7 @@ msgid "Checks for errors in internet-related tags."
 msgstr "Kontroluje chyby v značkách súvisiacich s Internetom."
 
 msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
+msgstr " URL sa nedá prekonvertovať do ASCII: {0}"
 
 msgid "''{0}'': {1}"
 msgstr "\"{0}\": {1}"
@@ -4326,20 +4332,20 @@ msgid "Relation is empty"
 msgstr "Relácia je prázdna"
 
 msgid "Role member does not match expression {0} in template {1}"
-msgstr ""
+msgstr "Člen nezodpovedá výrazu {0} v šablóne {1}"
 
 msgid ""
 "Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr ""
+msgstr "Typ člena {0} nezodpovedá povolenému zoznamu {1} v šablóne {2}"
 
 msgid "<empty>"
 msgstr "<prázdny>"
 
 msgid "Role {0} unknown in templates {1}"
-msgstr ""
+msgstr "Rola {0} je neznáma v šablónach {1}"
 
 msgid "Empty role type found when expecting one of {0}"
-msgstr ""
+msgstr "Našla sa prázdna rola, keď bola očakávaná jedna z {0}"
 
 msgid "Role {0} missing"
 msgstr "Úloha \"{0}\" chýba"
@@ -6150,12 +6156,6 @@ msgstr ""
 "Otvoriť dialógové okno pre spojenie(merge) všetkých vybraných položiek v "
 "zozname hore."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Nastaviť vybrané elementy(prvky) na mape, podľa vybratých prvkov v zozname "
-"hore."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Bolo zistených {0} konfliktov."
@@ -9535,7 +9535,7 @@ msgid "Empty document"
 msgstr "Prázdny dokument"
 
 msgid "Save anyway"
-msgstr "Uložiť akokoľvek"
+msgstr "Uložiť aj tak"
 
 msgid "The document contains no data."
 msgstr "Dokument neobsahuje dáta."
@@ -9992,10 +9992,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} km/h"
+"Rýchlosť: {0} km/h"
 
 msgid ""
 "\n"
@@ -10021,6 +10021,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG obrázky (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Zobraziť náhľady"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Zobrazovať náhľady namiesto ikon."
+
 msgid "Choose visible tracks"
 msgstr "Vyberte viditeľné stopy"
 
@@ -12225,8 +12231,8 @@ msgstr "Zabudované:"
 msgid "Projection bounds (in degrees)"
 msgstr "Hranice projekcie (v stupňoch)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (EPSG kód)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Nastaví parameter SRS=... v požiadavke na WMS"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger"
@@ -13759,7 +13765,7 @@ msgstr ""
 "Neplatná dlhá hodnota pre vlastnosť \"{0}\". Obdržaná hodnota je \"{1}\""
 
 msgid "{0} bytes have been read"
-msgstr ""
+msgstr "{0} bajtov prečítaných"
 
 msgid "Prepare OSM data..."
 msgstr "Pripravujem OSM údaje..."
@@ -15949,6 +15955,12 @@ msgstr "Zobrazuje možnosti navigácie (routing)."
 msgid "Loads data from SDS"
 msgstr "Načíta dáta z SDS"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Podkladová vrstva pre námorné mapy Sea Charts"
+
+msgid "Edit features for Sea Charts"
+msgstr "Upravuje objekty pre námorné mapy Sea Charts"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -16627,7 +16639,7 @@ msgid "delivery"
 msgstr "zásobovanie (delivery)"
 
 msgid "agricultural"
-msgstr "farmárstvo (agricultural)"
+msgstr "poľnohospodárske stroje (agricultural)"
 
 msgid "forestry"
 msgstr "lesnícke stroje"
@@ -16972,12 +16984,90 @@ msgstr "prejazd"
 msgid "Parking Aisle"
 msgstr "Parkovacia ulička"
 
+msgid "Escape"
+msgstr "Únikový pruh"
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+"Únikový pruh pre ťažké vozidlá popri dlhých klesajúcich svahoch, aby mohli "
+"zastaviť ak im zlyhajú brzdy."
+
 msgid "Road (Unknown Type)"
 msgstr "Cesta (neznámy typ)"
 
 msgid "Construction"
 msgstr "Cesta vo výstavbe"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "diaľnica"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "diaľničná prípojka"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "rýchlostná cesta"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "prípojka rýchlostnej cesty"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "cesta I. triedy"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "prípojka cesty I. triedy"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "cesta II. triedy"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "prípojka cesty II. triedy"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "cesta III. triedy"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "cesta III. triedy"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "vodiaca stopa pre autobus"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "cesta pre kone"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "obytná zóna"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "pešia zóna"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "poľná cesta"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "mestský chodník"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "schody"
+
 msgid "Junction"
 msgstr "Križovatka"
 
@@ -17073,47 +17163,9 @@ msgstr "nepovolené"
 msgid "Roundabout"
 msgstr "Kruhový objazd"
 
-msgid "motorway"
-msgstr "diaľnica (motorway)"
-
-msgid "motorway_link"
-msgstr "diaľničná prípojka"
-
-msgid "trunk"
-msgstr "rýchlostná cesta (trunk)"
-
-msgid "trunk_link"
-msgstr "prípojka rýchlostnej cesty"
-
-msgid "primary"
-msgstr "cesta prvej triedy"
-
-msgid "primary_link"
-msgstr "prípojka cesty I. triedy"
-
-msgid "secondary"
-msgstr "cesta druhej triedy"
-
-msgid "tertiary"
-msgstr "cesta tretej triedy"
-
-msgid "unclassified"
-msgstr "cesta bez klasifikácie (unclassified)"
-
-msgid "residential"
-msgstr "ulica"
-
-msgid "living_street"
-msgstr "obytná zóna"
-
-msgid "service"
-msgstr "obslužná cesta"
-
-msgid "bus_guideway"
-msgstr "vodiaca stopa pre autobus"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "cesta vo výstavbe"
+msgstr "vo výstavbe"
 
 msgid "Ford"
 msgstr "Brod"
@@ -17457,12 +17509,14 @@ msgstr "Cestné zrkadlo"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "Pomenovaná križovatka"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
 msgstr ""
+"Používané v niektorých krajinách, kde aj názvy križovatiek slúžia k "
+"orientácii."
 
 msgid "Elevator"
 msgstr "Výťah"
@@ -17965,32 +18019,29 @@ msgstr "Výhybka"
 msgid "Aerialway"
 msgstr "Lanovka"
 
-msgid "Chair Lift"
-msgstr "Sedačková lanovka"
+msgid "Cable Car"
+msgstr "Kabínková lanovka"
 
 msgid "Number of people per hour"
 msgstr "Počet ľudí za hodinu"
 
-msgid "Number of people per chair"
-msgstr "Počet ľudí na sedadlo"
+msgid "Number of people per car"
+msgstr "Počet ľudí v kabínke"
 
 msgid "Typical journey time in minutes"
 msgstr "Typický čas trasy v minútach"
 
-msgid "Has bubble?"
-msgstr "Má kryt?"
-
 msgid "Has heating?"
 msgstr "Má vyhrievanie?"
 
-msgid "Drag Lift"
-msgstr "Lyžiarsky vlek Drag_lift(nepoužíva sa, použite piste:lift=platter)"
+msgid "Chair Lift"
+msgstr "Sedačková lanovka"
 
-msgid "Cable Car"
-msgstr "Kabínková lanovka"
+msgid "Number of people per chair"
+msgstr "Počet ľudí na sedadlo"
 
-msgid "Number of people per car"
-msgstr "Počet ľudí v kabínke"
+msgid "Has bubble?"
+msgstr "Má kryt?"
 
 msgid "Gondola"
 msgstr "Gondola"
@@ -18004,17 +18055,27 @@ msgstr "Zmiešané lanovky"
 msgid "Number of people per gondola/chair"
 msgstr "Počet ľudí na gondolu/kreslo"
 
-msgid "T-bar Lift"
-msgstr "Vlek s dvojmiestnou kotvou"
+msgid "Drag Lift"
+msgstr "Lyžiarsky vlek Drag_lift(nepoužíva sa, použite piste:lift=platter)"
 
-msgid "J-bar Lift"
-msgstr "Vlek s jednomiestnou kotvou"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"Lyžiarsky vlek (všeobecný typ - použite len ak nie je vhodný iný typ z "
+"ponuky)"
+
+msgid "t-bar"
+msgstr "s dvojmiestnou kotvou"
 
-msgid "Platter Lift"
-msgstr "Vlek Poma (disk)"
+msgid "j-bar"
+msgstr "s jednomiestnou kotvou"
 
-msgid "Rope Tow"
-msgstr "Vlek lanový"
+msgid "platter"
+msgstr "Poma (disk)"
+
+msgid "rope_tow"
+msgstr "ťažné lano"
 
 msgid "Magic Carpet"
 msgstr "Posuvný pás"
@@ -18098,6 +18159,9 @@ msgstr "Chevron"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18128,12 +18192,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18329,6 +18396,9 @@ msgstr "Nástroje pre svojpomocnú opravu (môže byť bike co-operative)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "Čistenie bicyklov (za poplatok)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Samoobslužná opravovňa bicyklov"
+
 msgid "Public Transport"
 msgstr "Hromadná doprava"
 
@@ -18582,11 +18652,19 @@ msgid "Helipad"
 msgstr "Pristávacia plocha pre vrtuľníky"
 
 msgid "Apron"
-msgstr "Pristávacia plocha"
+msgstr "Letisková parkovacia plocha"
 
 msgid "Hangar"
 msgstr "Hangár"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangár"
+
+msgctxt "building"
+msgid "yes"
+msgstr "áno"
+
 msgid "Beacon"
 msgstr "Signál (rádiomaják)"
 
@@ -18733,7 +18811,7 @@ msgid "Bar"
 msgstr "Bar (výčap)"
 
 msgid "Night Club"
-msgstr "Nočný klub"
+msgstr "Nočný zábavný klub"
 
 msgid "Strip Club"
 msgstr "Striptízový klub"
@@ -18914,7 +18992,7 @@ msgid "Fireplace"
 msgstr "Ohnisko"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Piknikový stôl"
 
 msgid "Public Grill"
 msgstr "Verejný gril"
@@ -19830,10 +19908,6 @@ msgid "Man Made"
 msgstr "Človekom vytvorené (Man made)"
 
 msgctxt "building"
-msgid "yes"
-msgstr "áno"
-
-msgctxt "building"
 msgid "roof"
 msgstr "strecha"
 
@@ -19854,16 +19928,16 @@ msgid "school"
 msgstr "škola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangár"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "obchodná"
 
 msgctxt "building"
-msgid "farm"
-msgstr "farma"
+msgid "barn"
+msgstr "stodola"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "hospodárska budova na farme"
 
 msgctxt "building"
 msgid "transportation"
@@ -19895,7 +19969,7 @@ msgstr "maloobchody"
 
 msgctxt "building"
 msgid "shed"
-msgstr "stodola"
+msgstr "kôlňa"
 
 msgctxt "building"
 msgid "cowshed"
@@ -19936,6 +20010,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "dom na samote"
 
+msgctxt "building"
+msgid "farm"
+msgstr "farmársky dom"
+
 msgid "Entrance"
 msgstr "Vchod"
 
@@ -20271,7 +20349,7 @@ msgid "aqueduct"
 msgstr "akvadukt"
 
 msgid "boardwalk"
-msgstr ""
+msgstr "nadzemná lávka (boardwalk)"
 
 msgid "cantilever"
 msgstr "konzolový (cantilever)"
@@ -20292,64 +20370,64 @@ msgid "Structure"
 msgstr "Konštrukcia"
 
 msgid "arch"
-msgstr "oblúk"
+msgstr "oblúk (arch)"
 
 msgid "beam"
-msgstr ""
+msgstr "trám (beam)"
 
 msgid "truss"
-msgstr ""
+msgstr "priehradová konštrukcia (truss)"
 
 msgid "floating"
-msgstr ""
+msgstr "plávajúci (floating)"
 
 msgid "suspension"
-msgstr "visutý"
+msgstr "visutý (suspension)"
 
 msgid "cable-stayed"
-msgstr ""
+msgstr "zavesený (cable-stayed)"
 
 msgid "simple-suspension"
-msgstr ""
+msgstr "jednoduchý visutý (simple-suspension)"
 
 msgid "humpback"
-msgstr ""
+msgstr "vlnitý (humpback)"
 
 msgid "Movable Bridge"
 msgstr "Pohyblivý most"
 
 msgid "bascule"
-msgstr ""
+msgstr "sklápací (bascule)"
 
 msgid "drawbridge"
-msgstr ""
+msgstr "padací (drawbridge)"
 
 msgid "lift"
-msgstr ""
+msgstr "zdvíhací (lift)"
 
 msgid "submersible"
-msgstr ""
+msgstr "ponorný (submersible)"
 
 msgid "swing"
-msgstr "otočný"
+msgstr "otočný (swing)"
 
 msgid "transporter"
-msgstr ""
+msgstr "gondolový (transporter)"
 
 msgid "Bridge Support"
 msgstr "Mostná podpera"
 
 msgid "pier"
-msgstr ""
+msgstr "pilier (pier)"
 
 msgid "abutment"
-msgstr ""
+msgstr "koncová podpera (abutment)"
 
 msgid "lift_pier"
-msgstr ""
+msgstr "podpera pre zdvíhaciu vežu (lift_pier)"
 
 msgid "pivot_pier"
-msgstr ""
+msgstr "mostný čap (pivot_pier)"
 
 msgid "Bridge outline"
 msgstr "Obrys mostu"
@@ -20953,19 +21031,19 @@ msgid "monopolar"
 msgstr ""
 
 msgid "Triple tower"
-msgstr ""
+msgstr "Trojitý stožiar"
 
 msgid "Incomplete tower"
-msgstr ""
+msgstr "Nedokončený stožiar"
 
 msgid "Pole"
 msgstr "Elektrický stĺp"
 
 msgid "Pole with Transformer"
-msgstr ""
+msgstr "Stĺp s transformátorom"
 
 msgid "Pole Attributes:"
-msgstr ""
+msgstr "Vlastnosti stĺpa:"
 
 msgid "Transformer Attributes:"
 msgstr "Vlastnosti transformátora:"
@@ -21433,7 +21511,7 @@ msgstr "Národný park"
 msgid "Protected Area"
 msgstr "Chránené územie"
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr "Stupeň ochrany"
 
 msgid "Title or type of protection"
@@ -21463,15 +21541,21 @@ msgstr "Veľkomesto (city)"
 msgid "Town"
 msgstr "Mesto (town)"
 
-msgid "Suburb"
-msgstr "Mestská štvrť"
-
 msgid "Village"
 msgstr "Dedina (obec)"
 
 msgid "Hamlet"
 msgstr "Malá dedina / osada"
 
+msgid "Isolated Dwelling"
+msgstr "Izolované obydlie"
+
+msgid "Suburb"
+msgstr "Mestská štvrť"
+
+msgid "Neighbourhood"
+msgstr "Okolie"
+
 msgid "Farm"
 msgstr "Farma"
 
@@ -21481,12 +21565,6 @@ msgstr "Farma v rámci väčšieho osídlenia"
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr "(prosím použite \"Izolované obydlie\" pre izolovanú farmu)"
 
-msgid "Isolated Dwelling"
-msgstr "Izolované obydlie"
-
-msgid "Neighbourhood"
-msgstr "Okolie"
-
 msgid "Locality"
 msgstr "Oblasť (neobývaná lokalita)"
 
@@ -22012,6 +22090,41 @@ msgstr "Obrázok"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Kontakt (schéma s predponou \"contact:*\")"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Krátky text s doplňujúcimi informáciami."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Môže byť viditeľný používateľom (napr. pri vyhľadávaní, alebo na mape s "
+"rozbaľovacími údajmi)"
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Podobné, ale odlišné značky:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Poznámka"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr "Dôležitá pomôcka pre iných tvorcov mapy (nie pre používateľa)."
+
+msgid "Fixme"
+msgstr "Opraviť (FIXME)"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Pomôcka pre iných tvorcov mapy (nie pre používateľa), že objekt potrebuje "
+"vylepšiť/opraviť."
+
 msgid "outer segment"
 msgstr "obvodová časť (outer segment)"
 
@@ -22375,17 +22488,14 @@ msgstr "Otestovať"
 msgid "Landsat"
 msgstr "Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Yahoo Sat"
-
-msgid "Bing Sat"
-msgstr "Bing Sat"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr "HDM (Humanitarian OpenStreetMap Team)"
 
-msgid "MapBox Satellite"
-msgstr "MapBox Satelit"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22396,15 +22506,15 @@ msgstr "OpenStreetMap GPS Stopy"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik čiernobiely)"
+msgstr "OpenStreetMap (Mapnik Čiernobiely)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, bez nápisov)"
 
-msgid "skobbler"
-msgstr "skobbler"
-
 msgid "skobbler heatmap"
 msgstr "skobbler heatmap"
 
@@ -22435,6 +22545,54 @@ msgstr "Strava cyklistická heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava bežecká heatmap"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr "Značené trasy: Turistika"
+
+msgid "Waymarked Trails: Cycling"
+msgstr "Značené trasy: Cyklistika"
+
+msgid "Waymarked Trails: MTB"
+msgstr "Značené trasy: Horské bicyklovanie"
+
+msgid "Waymarked Trails: Skating"
+msgstr "Značené trasy: Korčuľovanie"
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr "Značené trasy: Jazda na koni"
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr "Značené trasy: Zimné športy"
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI čiernobiela 2.5m"
 
@@ -22476,10 +22634,13 @@ msgstr "VoGIS: DOM (Povrchový model)"
 
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
-msgstr ""
+msgstr "AGIV(laanderen) letecké snímky (pokrýva aj Brusel) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW(allonie) 2012 letecké snímky"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW(allonie) 2009 letecké snímky"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -22499,6 +22660,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "British Columbia Mosaic"
 
+msgid "Kelowna 2012"
+msgstr "Kelowna 2012"
+
+msgid "Kelowna Roads overlay"
+msgstr "Kelowna cesty"
+
 msgid "Czech CUZK:KM"
 msgstr "Český CUZK:KM"
 
@@ -22618,7 +22785,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Hamburg (40 cm)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Hamburg (20 cm)"
 
 msgid "Hamburg (DK5)"
 msgstr "Hamburg (DK5)"
@@ -22629,8 +22796,8 @@ msgstr "Bavorsko (2 m)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Stuttgart (Letecké foto)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Erlangen 2013 Letecké foto (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Erlangen 2011 Letecké foto (5,0 cm)"
@@ -22714,6 +22881,12 @@ msgstr "PCN 2008 - IT Lazio+Umbria"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Taliansko"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr "Južné Tirolsko Ortofoto 2011"
+
+msgid "South Tyrol Topomap"
+msgstr "Južné Tirolsko, topografická mapa"
+
 msgid "USSR - Latvia"
 msgstr "ZSSR - Lotyšsko"
 
@@ -22930,17 +23103,17 @@ msgstr "MSR Mapy Topo"
 msgid "MSR Maps Urban"
 msgstr "MSR Mapy Urban"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS Skenované topografické mapy"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS Veľké letecké snímky"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012 Cesty"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr ""
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Parcely"
@@ -22948,6 +23121,9 @@ msgstr "MassGIS L3 Parcely"
 msgid "NC Latest Orthoimagery"
 msgstr "NC Latest Orthoimagery"
 
+msgid "U.S. Forest Service roads"
+msgstr "Cesty Lesnej služby U.S.A."
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Ortofotomapy 2012"
 
@@ -23215,6 +23391,9 @@ msgstr "OS Plány miest, Wigtown 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "OS Plány miest, Wigtown 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr "Landsat 233055"
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Klesajúce čísla domov v interpolácii adries"
 
@@ -23315,6 +23494,9 @@ msgstr "{0} na bode. Malo by byť zakreslené ako oblasť."
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* na bode. Malo by byť použité v relácii"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} na ceste. Malo by byť použité na bode."
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} na ceste. Malo by byť použité v relácii"
 
@@ -27494,7 +27676,7 @@ msgid "Transform error: Unsupported orientation"
 msgstr ""
 
 msgid "Finished"
-msgstr ""
+msgstr "Dokončené"
 
 msgid "Prefs"
 msgstr ""
@@ -28793,6 +28975,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Zjednodušiť oblasť"
 
@@ -28853,9 +29050,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "Automatické ukladanie LiveData"
 
diff --git a/i18n/po/sl.po b/i18n/po/sl.po
index 02b8230..1d974e3 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-30 13:06+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\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: 2014-12-29 05:24+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:18+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: sl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Ni ciljne plasti"
 
+msgid "Select"
+msgstr "Izberite"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Dodaj plast zračnih posnetkov {0}"
 
@@ -2050,9 +2057,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "Izberite"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5641,10 +5645,6 @@ msgstr "Razreši"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9096,10 +9096,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9121,6 +9119,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Slike JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11092,7 +11096,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14284,6 +14288,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15276,12 +15286,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Cesta (neznana kategorija)"
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15377,45 +15463,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Krožišče"
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr "hitra cesta"
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr "glavna"
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr "regionalna"
-
-msgid "tertiary"
-msgstr "regionalna (turistična)"
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16250,31 +16298,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "Žičnica"
 
-msgid "Chair Lift"
-msgstr "Sedežnica"
+msgid "Cable Car"
+msgstr "Kabinska žičnica"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Vlečnica"
+msgid "Chair Lift"
+msgstr "Sedežnica"
 
-msgid "Cable Car"
-msgstr "Kabinska žičnica"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16289,16 +16334,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Vlečnica"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16383,6 +16436,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16413,12 +16469,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16614,6 +16673,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Javni prevoz"
 
@@ -16872,6 +16934,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18115,10 +18185,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18139,15 +18205,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18221,6 +18287,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19718,7 +19788,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19748,28 +19818,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr "Vas"
 
 msgid "Hamlet"
 msgstr "Zaselek"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20287,6 +20357,37 @@ msgstr "Slika"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20650,16 +20751,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20671,13 +20769,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20710,6 +20808,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20753,7 +20899,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20774,6 +20923,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20902,7 +21057,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20985,6 +21140,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21201,16 +21362,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21219,6 +21380,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21486,6 +21650,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21578,6 +21745,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26914,6 +27084,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26974,9 +27159,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/sq.po b/i18n/po/sq.po
index d3094f1..02ec372 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-11-04 19:43+0000\n"
 "Last-Translator: StefanPrifti <Unknown>\n"
 "Language-Team: FLOSS Kosova\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 04:32+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 04:32+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/sr.po b/i18n/po/sr.po
index 0e0619b..4b19fb3 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-07-13 07:57+0000\n"
 "Last-Translator: Никола Смоленски <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: 2014-12-29 05:20+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:16+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: sr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Наме одредишних слојева"
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Додај слој за слике {0}"
 
@@ -2037,9 +2044,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5612,10 +5616,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9050,7 +9050,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9071,6 +9071,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11040,7 +11046,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14220,6 +14226,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15212,12 +15224,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15313,45 +15401,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16186,31 +16236,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16225,16 +16272,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16319,6 +16374,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16349,12 +16407,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16550,6 +16611,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16808,6 +16872,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18051,10 +18123,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18075,15 +18143,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18157,6 +18225,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19654,7 +19726,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19684,28 +19756,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20223,6 +20295,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20586,16 +20689,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20607,13 +20707,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20646,6 +20746,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20689,7 +20837,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20710,6 +20861,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20838,7 +20995,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20921,6 +21078,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21137,16 +21300,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21155,6 +21318,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21422,6 +21588,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21514,6 +21683,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26848,6 +27020,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26908,9 +27095,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/sv.po b/i18n/po/sv.po
index 7455fee..71ac496 100644
--- a/i18n/po/sv.po
+++ b/i18n/po/sv.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-12 03:38+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-23 23:37+0000\n"
 "Last-Translator: Niklas Henriksson <fringillus92 at gmail.com>\n"
 "Language-Team: Swedish <sv at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:26+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:20+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: sv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -224,6 +224,14 @@ msgstr ""
 msgid "No target layers"
 msgstr "Inga mållager"
 
+msgid "Select"
+msgstr "Markera"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+"Sätt urval av element på kartan till de valda posterna i listan ovan."
+
 msgid "Add imagery layer {0}"
 msgstr "Lägg till bildlager {0}"
 
@@ -2191,9 +2199,6 @@ msgstr ""
 "Dra spelhuvudet och släpp i närheten av spår för att spela upp ljud "
 "därifrån; SKIFT-släpp för att synkronisera ljud vid den punkten."
 
-msgid "Select"
-msgstr "Markera"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Välj, flytta, skala och rotera objekt"
 
@@ -4950,7 +4955,7 @@ msgid "Toggles the visibility of the edit toolbar (i.e., the vertical tool)"
 msgstr ""
 
 msgid "Preset preferences"
-msgstr ""
+msgstr "Snabbvalsinställningar"
 
 msgid "Click to open the tagging presets tab in the preferences"
 msgstr ""
@@ -5915,11 +5920,6 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 "Öppna en sammanfogningsdialog med alla de valda posterna från listan ovan."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-"Sätt urval av element på kartan till de valda posterna i listan ovan."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9460,10 +9460,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9489,6 +9487,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG-bilder (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11518,7 +11522,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -12210,7 +12214,7 @@ msgid "Search presets"
 msgstr "Sök snabbval"
 
 msgid "Search for objects by preset"
-msgstr ""
+msgstr "Sök objekt efter snabbval"
 
 msgid "Show only applicable to selection"
 msgstr "Visa enbart Nyckel/värde applicerbart på markerade objekt"
@@ -14827,6 +14831,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15044,11 +15054,11 @@ msgid "Width (meters)"
 msgstr "Bredd (meter)"
 
 msgid "Sidewalk"
-msgstr ""
+msgstr "Trottoar"
 
 msgctxt "sidewalk"
 msgid "both"
-msgstr ""
+msgstr "båda"
 
 msgctxt "sidewalk"
 msgid "left"
@@ -15345,7 +15355,7 @@ msgstr ""
 
 msgctxt "sport"
 msgid "horse_racing"
-msgstr ""
+msgstr "hästkapplöpning"
 
 msgctxt "sport"
 msgid "motor"
@@ -15432,15 +15442,15 @@ msgstr ""
 
 msgctxt "parking"
 msgid "multi-storey"
-msgstr ""
+msgstr "flervånings"
 
 msgctxt "parking"
 msgid "surface"
-msgstr ""
+msgstr "ytparkering"
 
 msgctxt "parking"
 msgid "underground"
-msgstr ""
+msgstr "underjordisk"
 
 msgctxt "parking"
 msgid "rooftop"
@@ -15654,7 +15664,7 @@ msgstr "inomhus"
 
 msgctxt "power"
 msgid "underground"
-msgstr ""
+msgstr "underjordisk"
 
 msgctxt "power"
 msgid "platform"
@@ -15822,12 +15832,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Parkeringskorridor"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Väg (okänd typ)"
 
 msgid "Construction"
 msgstr "Under byggnad"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Korsning"
 
@@ -15874,7 +15960,7 @@ msgid "Vehicles per use"
 msgstr "Fordon per användningsområde"
 
 msgid "Agricultural"
-msgstr ""
+msgstr "jordbruksfordon"
 
 msgid "Emergency vehicles"
 msgstr ""
@@ -15906,7 +15992,7 @@ msgstr ""
 
 msgctxt "overtaking"
 msgid "both"
-msgstr ""
+msgstr "båda"
 
 msgctxt "overtaking"
 msgid "forward"
@@ -15923,47 +16009,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Rondell"
 
-msgid "motorway"
-msgstr "motorväg"
-
-msgid "motorway_link"
-msgstr "motorvägslänk"
-
-msgid "trunk"
-msgstr "stamväg"
-
-msgid "trunk_link"
-msgstr "stamvägslänk"
-
-msgid "primary"
-msgstr "primärväg"
-
-msgid "primary_link"
-msgstr "primärvägslänk"
-
-msgid "secondary"
-msgstr "sekundärväg"
-
-msgid "tertiary"
-msgstr "tertiärväg"
-
-msgid "unclassified"
-msgstr "oklassificerad"
-
-msgid "residential"
-msgstr "bostadsområde"
-
-msgid "living_street"
-msgstr "gårdsgata"
-
-msgid "service"
-msgstr "tillfartsväg"
-
-msgid "bus_guideway"
-msgstr "buss_spårväg"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "under byggnad"
+msgstr ""
 
 msgid "Ford"
 msgstr "Vadställe"
@@ -16235,7 +16283,7 @@ msgid "Stop"
 msgstr "Stopp"
 
 msgid "Give Way"
-msgstr ""
+msgstr "Väjningsplikt"
 
 msgid "Mini-Roundabout"
 msgstr ""
@@ -16289,7 +16337,7 @@ msgid "Speed Camera"
 msgstr "Hastighetskamera"
 
 msgid "Traffic Mirror"
-msgstr ""
+msgstr "Trafikspegel"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
@@ -16391,7 +16439,7 @@ msgid "wire"
 msgstr ""
 
 msgid "Guard Rail"
-msgstr ""
+msgstr "Trafikavskiljare"
 
 msgid "Wall"
 msgstr "Mur"
@@ -16510,7 +16558,7 @@ msgstr "Källa"
 msgid ""
 "A point where groundwater naturally flows to the surface of the earth from "
 "underground."
-msgstr ""
+msgstr "En plats där grundvattnet naturligt sipprar till ytan från marken."
 
 msgid "Waterfall"
 msgstr "Vattenfall"
@@ -16796,32 +16844,29 @@ msgstr "Växel"
 msgid "Aerialway"
 msgstr "Linbana"
 
-msgid "Chair Lift"
-msgstr "Stollift"
+msgid "Cable Car"
+msgstr "Linbana"
 
 msgid "Number of people per hour"
 msgstr "Antal personer per timme"
 
-msgid "Number of people per chair"
-msgstr "Antal personer per stol"
+msgid "Number of people per car"
+msgstr "Antal personer per gondol"
 
 msgid "Typical journey time in minutes"
 msgstr "Typisk restid i minuter"
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr "Har uppvärmning?"
 
-msgid "Drag Lift"
-msgstr "Släplift"
+msgid "Chair Lift"
+msgstr "Stollift"
 
-msgid "Cable Car"
-msgstr "Linbana"
+msgid "Number of people per chair"
+msgstr "Antal personer per stol"
 
-msgid "Number of people per car"
-msgstr "Antal personer per gondol"
+msgid "Has bubble?"
+msgstr ""
 
 msgid "Gondola"
 msgstr "Gondol"
@@ -16835,16 +16880,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
-msgstr "T-lift"
+msgid "Drag Lift"
+msgstr "Släplift"
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16864,7 +16917,7 @@ msgid "Parking"
 msgstr "Parkeringsplats"
 
 msgid "Park and Ride"
-msgstr ""
+msgstr "Infartsparkering"
 
 msgid "bus"
 msgstr "buss"
@@ -16897,7 +16950,7 @@ msgid "See the Wiki for other capacity:[types]=*."
 msgstr ""
 
 msgid "Parking Space"
-msgstr ""
+msgstr "Parkeringsruta"
 
 msgid "Capacity"
 msgstr "Kapacitet"
@@ -16929,6 +16982,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -16959,12 +17015,15 @@ msgstr ""
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -17160,6 +17219,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr "Gratis cykeltvätt"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Kollektivtrafik"
 
@@ -17418,6 +17480,14 @@ msgstr ""
 msgid "Hangar"
 msgstr "Hangar"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "hangar"
+
+msgctxt "building"
+msgid "yes"
+msgstr "ja"
+
 msgid "Beacon"
 msgstr "Fyrbåk"
 
@@ -17459,7 +17529,7 @@ msgid "Alpine Hut"
 msgstr "Alphydda"
 
 msgid "Caravan Site/RV Park"
-msgstr ""
+msgstr "Ställplats"
 
 msgid "Number of places"
 msgstr "Antal platser"
@@ -17564,10 +17634,10 @@ msgid "Bar"
 msgstr "Bar"
 
 msgid "Night Club"
-msgstr ""
+msgstr "Nattklubb"
 
 msgid "Strip Club"
-msgstr ""
+msgstr "Strippklubb"
 
 msgid "Tourism"
 msgstr "Turism"
@@ -17690,7 +17760,7 @@ msgid "Closer description"
 msgstr "Detaljerad beskrivning"
 
 msgid "Audio Guide"
-msgstr ""
+msgstr "Ljudguide"
 
 msgid "Information using headphones or a mobile phone."
 msgstr ""
@@ -17708,7 +17778,7 @@ msgid "Leisure"
 msgstr "Nöje"
 
 msgid "Movie Theater/Cinema"
-msgstr ""
+msgstr "Biograf"
 
 msgid "Zoo"
 msgstr "Zoo"
@@ -17723,7 +17793,7 @@ msgid "wall"
 msgstr "mur"
 
 msgid "Amusement/Theme Park"
-msgstr ""
+msgstr "Nöjesfält"
 
 msgid "Water Park"
 msgstr "Badanläggning"
@@ -17732,7 +17802,7 @@ msgid "Sauna"
 msgstr "Bastu"
 
 msgid "Horse Riding"
-msgstr ""
+msgstr "Ridning"
 
 msgid "Brothel"
 msgstr "Bordell"
@@ -17747,7 +17817,7 @@ msgid "Fireplace"
 msgstr "Eldstad"
 
 msgid "Picnic Table"
-msgstr ""
+msgstr "Picknickbord"
 
 msgid "Public Grill"
 msgstr "Allmän grill"
@@ -17760,7 +17830,7 @@ msgid "charcoal"
 msgstr "träkol"
 
 msgid "Firepit"
-msgstr ""
+msgstr "Eldningsplats"
 
 msgid "Fishing"
 msgstr "Fiske"
@@ -17971,7 +18041,7 @@ msgid "Public Building"
 msgstr "Offentlig byggnad"
 
 msgid "Town Hall"
-msgstr ""
+msgstr "Stadshus/kommunsäte"
 
 msgid "Community Centre"
 msgstr ""
@@ -18263,7 +18333,7 @@ msgstr ""
 
 msgctxt "shelter"
 msgid "picnic_shelter"
-msgstr ""
+msgstr "picnic_shelter"
 
 msgctxt "shelter"
 msgid "public_transport"
@@ -18663,10 +18733,6 @@ msgid "Man Made"
 msgstr "Byggnadsverk"
 
 msgctxt "building"
-msgid "yes"
-msgstr "ja"
-
-msgctxt "building"
 msgid "roof"
 msgstr "tak"
 
@@ -18687,15 +18753,15 @@ msgid "school"
 msgstr "skola"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "hangar"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "kommersiell"
 
 msgctxt "building"
-msgid "farm"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18769,6 +18835,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Ingång"
 
@@ -19854,7 +19924,7 @@ msgstr ""
 
 msgctxt "power cable"
 msgid "underground"
-msgstr ""
+msgstr "underjordisk"
 
 msgctxt "power cable"
 msgid "underwater"
@@ -20266,7 +20336,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -20296,15 +20366,21 @@ msgstr "Stad"
 msgid "Town"
 msgstr "Småstad"
 
-msgid "Suburb"
-msgstr "Förort"
-
 msgid "Village"
 msgstr "Mindre tätort"
 
 msgid "Hamlet"
 msgstr "Småort"
 
+msgid "Isolated Dwelling"
+msgstr "Liten by"
+
+msgid "Suburb"
+msgstr "Förort"
+
+msgid "Neighbourhood"
+msgstr "Grannskap"
+
 msgid "Farm"
 msgstr ""
 
@@ -20314,12 +20390,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "Liten by"
-
-msgid "Neighbourhood"
-msgstr "Grannskap"
-
 msgid "Locality"
 msgstr "Plats"
 
@@ -20623,7 +20693,7 @@ msgid "Street name"
 msgstr "Gatunamn"
 
 msgid "Place name"
-msgstr ""
+msgstr "Platsnamn"
 
 msgid "City name"
 msgstr "Stadsnamn"
@@ -20635,7 +20705,7 @@ msgid "House name"
 msgstr "Husnamn"
 
 msgid "Subdistrict"
-msgstr ""
+msgstr "Underdistrikt"
 
 msgid "District"
 msgstr "Distrikt"
@@ -20841,6 +20911,37 @@ msgstr "Bild"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "yttre segement"
 
@@ -21204,16 +21305,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -21225,13 +21323,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -21264,6 +21362,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -21280,7 +21426,7 @@ msgid "Tiris: DGM (Terrain model)"
 msgstr ""
 
 msgid "Tiris: DOM (Surface model)"
-msgstr ""
+msgstr "Tiris: DOM (Surface model)"
 
 msgid "Vienna: Mehrzweckkarte (general purpose)"
 msgstr ""
@@ -21307,7 +21453,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -21328,6 +21477,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -21456,7 +21611,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21539,6 +21694,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21755,16 +21916,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21773,6 +21934,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -22040,6 +22204,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -22132,6 +22299,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -22184,6 +22354,8 @@ msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
 "''{3}'' instead."
 msgstr ""
+"Värdet av ''{0}'' borde vara antingen ''{1}'' eller ''{2}''. För trottoarer, "
+"använd ''{3}'' istället."
 
 msgid "{0} with multiple values"
 msgstr ""
@@ -23734,7 +23906,7 @@ msgid "Sea, rivers, swimming pools."
 msgstr ""
 
 msgid "Buildings, covers, underground constructions."
-msgstr ""
+msgstr "Byggnader, övertäckningar, underjordiska konstruktioner"
 
 msgid "Symbols like cristian cross."
 msgstr ""
@@ -24650,6 +24822,7 @@ msgid ""
 "List of surfaces the vehicle cannot use, values are separated by semicolons "
 "(;)"
 msgstr ""
+"Lista över ytor fordonet inte kan använda. Värden separeras av semikolon (;)"
 
 msgid "max. tracktype grade"
 msgstr ""
@@ -24800,6 +24973,8 @@ msgid ""
 "Surface values must not contain any of the following characters: '','', '' "
 "'{' '',  '' '}' '', ''='', ''|''"
 msgstr ""
+"Ytvärden får ej innehålla någon av följande tecken: '','', '' '{' '', '' '}' "
+"'', ''='', ''|''"
 
 msgid "Imagery XML Files"
 msgstr ""
@@ -27502,6 +27677,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Förenkla yta"
 
@@ -27562,9 +27752,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr "Spara LiveData automatiskt"
 
@@ -29233,10 +29420,10 @@ msgid "Could not read information from walking-papers.org the id \"{0}\""
 msgstr ""
 
 msgid "Walking Papers: {0}"
-msgstr ""
+msgstr "Walking Papers: {0}"
 
 msgid "Walking Papers layer ({0}) in zoom {1}"
-msgstr ""
+msgstr "Walking Papers-lager ({0}) på zoom {1}"
 
 msgid "Way Download"
 msgstr "Sträckhämtning"
diff --git a/i18n/po/ta.po b/i18n/po/ta.po
index c54db84..3e7c689 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-10-03 22:36+0000\n"
 "Last-Translator: நவீன் குமார்(கெம்ளின்) <naveenmtp 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: 2014-12-29 05:27+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:21+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "X-Poedit-Country: INDIA\n"
 "Language: ta\n"
 "X-Poedit-Language: Tamil\n"
@@ -220,6 +220,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "தேவையான அடுக்குகள் இல்லை"
 
+msgid "Select"
+msgstr "தேர்ந்தெடு"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2070,9 +2077,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr "தேர்ந்தெடு"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5645,10 +5649,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9085,7 +9085,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9106,6 +9106,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11075,7 +11081,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14255,6 +14261,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15247,12 +15259,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15348,45 +15436,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16221,31 +16271,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16260,16 +16307,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16354,6 +16409,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16384,12 +16442,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16585,6 +16646,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16843,6 +16907,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18086,10 +18158,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18110,15 +18178,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18192,6 +18260,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19689,7 +19761,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19719,28 +19791,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20258,6 +20330,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20621,16 +20724,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20642,13 +20742,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20681,6 +20781,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20724,7 +20872,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20745,6 +20896,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20873,7 +21030,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20956,6 +21113,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21172,16 +21335,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21190,6 +21353,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21457,6 +21623,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21549,6 +21718,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26889,6 +27061,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26949,9 +27136,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/te.po b/i18n/po/te.po
index c1e3d19..09b8977 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2011-05-13 08:50+0000\n"
 "Last-Translator: Praveen Illa <mail2ipn at gmail.com>\n"
 "Language-Team: Telugu <te at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:28+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:22+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: te\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/th.po b/i18n/po/th.po
index b378410..4f27cab 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2009-03-23 02:34+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Thai <th at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:28+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:23+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: th\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/tr.po b/i18n/po/tr.po
index c8b82ce..7be0233 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-05-16 05:31+0000\n"
 "Last-Translator: katpatuka <email at katpatuka.org>\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: 2014-12-29 05:29+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:24+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -219,6 +219,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Hedef katman yok"
 
+msgid "Select"
+msgstr "Seçiniz"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Haritada seçili elemanları listedede seç."
+
 msgid "Add imagery layer {0}"
 msgstr "Referans görüntü katmanı ekle {0}"
 
@@ -2084,9 +2091,6 @@ msgstr ""
 "Çalan dosyayı sürükle ve bir izin yakınında bırak; SHIFT+bıraksesi "
 "senkronize etmek için."
 
-msgid "Select"
-msgstr "Seçiniz"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5681,10 +5685,6 @@ msgstr "Çözümle"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "Seçili nesneler için birleştime penceresi aç."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Haritada seçili elemanları listedede seç."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9132,10 +9132,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} km/h"
 
 msgid ""
 "\n"
@@ -9155,6 +9153,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG görüntüsü (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11138,7 +11142,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14332,6 +14336,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15324,12 +15334,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "Park alanı"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "yol (tipi bilinmiyor)"
 
 msgid "Construction"
 msgstr "İnşaat"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "Kavşak"
 
@@ -15425,47 +15511,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "Döner Kavşak"
 
-msgid "motorway"
-msgstr "araçyolu"
-
-msgid "motorway_link"
-msgstr "otoyol_hat"
-
-msgid "trunk"
-msgstr "ana_hat"
-
-msgid "trunk_link"
-msgstr "anayol_hat"
-
-msgid "primary"
-msgstr "birincil"
-
-msgid "primary_link"
-msgstr "birincil_hat"
-
-msgid "secondary"
-msgstr "ikincil"
-
-msgid "tertiary"
-msgstr "üçüncül"
-
-msgid "unclassified"
-msgstr "sınıflandırılmamış"
-
-msgid "residential"
-msgstr "yerleşim_alanı"
-
-msgid "living_street"
-msgstr "canlı_sokak"
-
-msgid "service"
-msgstr "servis"
-
-msgid "bus_guideway"
-msgstr "otobüs_hattı"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "inşaat"
+msgstr ""
 
 msgid "Ford"
 msgstr "sığ geçit"
@@ -16298,31 +16346,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "havayolu"
 
-msgid "Chair Lift"
-msgstr "Teleski"
+msgid "Cable Car"
+msgstr "Hava tramvayı"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr "Kayakçı Asansörü"
+msgid "Chair Lift"
+msgstr "Teleski"
 
-msgid "Cable Car"
-msgstr "Hava tramvayı"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16337,16 +16382,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "Kayakçı Asansörü"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16431,6 +16484,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16461,12 +16517,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16662,6 +16721,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "Toplu taşıma"
 
@@ -16920,6 +16982,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "Fener"
 
@@ -18163,10 +18233,6 @@ msgid "Man Made"
 msgstr "İnsan Yapımı"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18187,15 +18253,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18269,6 +18335,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "Giriş"
 
@@ -19766,7 +19836,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19796,28 +19866,28 @@ msgstr "Şehir"
 msgid "Town"
 msgstr "Mahalle"
 
-msgid "Suburb"
-msgstr "Banliyo"
-
 msgid "Village"
 msgstr "Köy"
 
 msgid "Hamlet"
 msgstr "Mezra"
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "Banliyo"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20335,6 +20405,37 @@ msgstr "Görüntü"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20698,16 +20799,13 @@ msgstr "Test"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20719,13 +20817,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20758,6 +20856,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20801,7 +20947,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20822,6 +20971,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20950,7 +21105,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21033,6 +21188,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21249,16 +21410,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21267,6 +21428,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21534,6 +21698,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21626,6 +21793,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26974,6 +27144,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "SeaMap düzenleyici"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "Alanı sadeleştir"
 
@@ -27034,9 +27219,6 @@ msgstr "Mesafe faktörü"
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr "SeaMap düzenleyici"
-
 msgid "AutoSave LiveData"
 msgstr "Canlı veriyi otomatik sakla"
 
diff --git a/i18n/po/ug.po b/i18n/po/ug.po
index 7e2cf9d..ae5e71c 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2012-07-14 16:22+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Uyghur <ug at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:30+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:25+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/uk.po b/i18n/po/uk.po
index 775f591..1f71ba8 100644
--- a/i18n/po/uk.po
+++ b/i18n/po/uk.po
@@ -7,17 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-28 17:18+0000\n"
-"Last-Translator: ~Jhellico <Unknown>\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-20 13:11+0000\n"
+"Last-Translator: andygol <Unknown>\n"
 "Language-Team: Ukrainian <uk at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:31+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:26+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: uk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -237,6 +237,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Шар не обрано"
 
+msgid "Select"
+msgstr "Вибрати"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "Виділити на мапі об’єкти, вибрані у списку вгорі."
+
 msgid "Add imagery layer {0}"
 msgstr "Додати шар з зображенням {0}"
 
@@ -2250,9 +2257,6 @@ msgstr ""
 "Перетягніть повзунок до треку для його програвання з відповідного місця; "
 "Shift: для синхронізування звуку з цією точкою."
 
-msgid "Select"
-msgstr "Вибрати"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "Виділення, переміщення, масштабування та поворот об’єктів"
 
@@ -6195,10 +6199,6 @@ msgstr ""
 "Відкрити діалогове вікно для злиття виділених у вищенаведеному переліку "
 "об’єктів."
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "Виділити на мапі об’єкти, вибрані у списку вгорі."
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "Виявлено {0} конфлікт."
@@ -10039,10 +10039,10 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 "\n"
-"{0} км/год"
+"Швидкість: {0} км/г"
 
 msgid ""
 "\n"
@@ -10068,6 +10068,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "Зображення JPEG (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr "Показувати мініатюри"
+
+msgid "Show image thumbnails instead of icons."
+msgstr "Показувати мініатюри зображень замість значків"
+
 msgid "Choose visible tracks"
 msgstr "Вибрати видимі треки"
 
@@ -12272,8 +12278,8 @@ msgstr "Вбудовані:"
 msgid "Projection bounds (in degrees)"
 msgstr "Межі проекції (у градусах)"
 
-msgid "WMS SRS (EPSG code)"
-msgstr "WMS SRS (код EPSG)"
+msgid "Sets the SRS=... parameter in the WMS request"
+msgstr "Встановіть праметр SRS=… в запиті WMS"
 
 msgid "Gauß-Krüger"
 msgstr "Gauß-Krüger (Гаус-Крюґер)"
@@ -15992,6 +15998,12 @@ msgstr "Надає можливості маршрутизації."
 msgid "Loads data from SDS"
 msgstr "Завантажує дані із різних джерел (Розділених сховищ даних)"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr "Шар фону для Морських мап"
+
+msgid "Edit features for Sea Charts"
+msgstr "Редагування об’єктів для Морських мап"
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -17012,12 +17024,88 @@ msgstr "обслуговування автомобілістів"
 msgid "Parking Aisle"
 msgstr "Проїзд на стоянці"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "Дорога (тип невідомий)"
 
 msgid "Construction"
 msgstr "Будується"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr "автомагістраль"
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr "з’їзд з/на автомагістраль"
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr "шосе"
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr "з’їзд з/на шосе"
+
+msgctxt "Highway"
+msgid "primary"
+msgstr "головна"
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr "з’їзд з/на головну"
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr "другорядна"
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr "з’їзд з/на другорядну"
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr "третина"
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr "з’їзд з/на третину"
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr "рейковий автобус"
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr "для вершників"
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr "житлова зона"
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr "пішохідна зона"
+
+msgctxt "Highway"
+msgid "track"
+msgstr "трек"
+
+msgctxt "Highway"
+msgid "footway"
+msgstr "пішохідна доріжка"
+
+msgctxt "Highway"
+msgid "steps"
+msgstr "сходи"
+
 msgid "Junction"
 msgstr "Перехрестя"
 
@@ -17113,45 +17201,7 @@ msgstr "немає"
 msgid "Roundabout"
 msgstr "Круг"
 
-msgid "motorway"
-msgstr "автомагістраль"
-
-msgid "motorway_link"
-msgstr "з’їзд з/на автомагістраль"
-
-msgid "trunk"
-msgstr "шосе"
-
-msgid "trunk_link"
-msgstr "з’їзд з/на шосе"
-
-msgid "primary"
-msgstr "головна дорога"
-
-msgid "primary_link"
-msgstr "з’їзд з/на головну"
-
-msgid "secondary"
-msgstr "другорядна дорога"
-
-msgid "tertiary"
-msgstr "третинна"
-
-msgid "unclassified"
-msgstr "дорога без класифікації"
-
-msgid "residential"
-msgstr "місцевого значення"
-
-msgid "living_street"
-msgstr "жила зона"
-
-msgid "service"
-msgstr "службова"
-
-msgid "bus_guideway"
-msgstr "моно-рейка"
-
+msgctxt "Highway"
 msgid "construction"
 msgstr "будується"
 
@@ -18004,32 +18054,29 @@ msgstr "Стрілочний перевід"
 msgid "Aerialway"
 msgstr "Канатна дорога"
 
-msgid "Chair Lift"
-msgstr "Крісельний підйомник"
+msgid "Cable Car"
+msgstr "Фунікулер"
 
 msgid "Number of people per hour"
 msgstr "Кількість людей на годину"
 
-msgid "Number of people per chair"
-msgstr "Кількість осіб на крісло"
+msgid "Number of people per car"
+msgstr "Кількість осіб в автівці"
 
 msgid "Typical journey time in minutes"
 msgstr "Час подорожі у хвилинах"
 
-msgid "Has bubble?"
-msgstr "Є навіс?"
-
 msgid "Has heating?"
 msgstr "Є підігрів?"
 
-msgid "Drag Lift"
-msgstr "Бугельний підйомник"
+msgid "Chair Lift"
+msgstr "Крісельний підйомник"
 
-msgid "Cable Car"
-msgstr "Фунікулер"
+msgid "Number of people per chair"
+msgstr "Кількість осіб на крісло"
 
-msgid "Number of people per car"
-msgstr "Кількість осіб в автівці"
+msgid "Has bubble?"
+msgstr "Є навіс?"
 
 msgid "Gondola"
 msgstr "З підвісними кабінами"
@@ -18043,17 +18090,27 @@ msgstr "Змішаний підйомник"
 msgid "Number of people per gondola/chair"
 msgstr "Кількість осіб в гондолі/кріслі"
 
-msgid "T-bar Lift"
-msgstr "Т-подібний підйомник"
+msgid "Drag Lift"
+msgstr "Бугельний підйомник"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+"підйомник (загальний тип – використовується якщо точний тип підйомника (див. "
+"нижче) не відомий)"
 
-msgid "J-bar Lift"
-msgstr "Г-подібний підйомник"
+msgid "t-bar"
+msgstr "T-подібний"
 
-msgid "Platter Lift"
-msgstr "Підйомник з дисковим сидінням"
+msgid "j-bar"
+msgstr "J-подібний"
 
-msgid "Rope Tow"
-msgstr "Бугельний підйомник"
+msgid "platter"
+msgstr "бугельний"
+
+msgid "rope_tow"
+msgstr "рухомий канат"
 
 msgid "Magic Carpet"
 msgstr "Транспортерна стрічка"
@@ -18137,6 +18194,9 @@ msgstr "Шеврон"
 msgid "Citgo"
 msgstr "Citgo"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "Esso"
 
@@ -18167,12 +18227,15 @@ msgstr "Repsol"
 msgid "Shell"
 msgstr "Shell"
 
-msgid "Sunoco"
-msgstr "Sunoco"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "Statoil"
 
+msgid "Sunoco"
+msgstr "Sunoco"
+
 msgid "Tamoil"
 msgstr "Tamoil"
 
@@ -18368,6 +18431,9 @@ msgstr "Інструменти для ремонту власними силам
 msgid "Bicycles are washed (for a fee)"
 msgstr "Мийка для велосипедів (платна)"
 
+msgid "Public Bicycle Repair Station"
+msgstr "Публічна станція ремонту велосипедів"
+
 msgid "Public Transport"
 msgstr "Громадський транспорт"
 
@@ -18626,6 +18692,14 @@ msgstr "Перон"
 msgid "Hangar"
 msgstr "Ангар"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "ангар"
+
+msgctxt "building"
+msgid "yes"
+msgstr "так"
+
 msgid "Beacon"
 msgstr "Сигнальний вогонь"
 
@@ -19869,10 +19943,6 @@ msgid "Man Made"
 msgstr "Штучні об’єкти"
 
 msgctxt "building"
-msgid "yes"
-msgstr "так"
-
-msgctxt "building"
 msgid "roof"
 msgstr "дах"
 
@@ -19893,16 +19963,16 @@ msgid "school"
 msgstr "школа"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "ангар"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "комерційного призначення"
 
 msgctxt "building"
-msgid "farm"
-msgstr "ферма"
+msgid "barn"
+msgstr "амбар"
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr "госп. споруда (ферма)"
 
 msgctxt "building"
 msgid "transportation"
@@ -19975,6 +20045,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "окремо розташована будівля"
 
+msgctxt "building"
+msgid "farm"
+msgstr "ферма"
+
 msgid "Entrance"
 msgstr "Вхід/В’їзд"
 
@@ -21474,8 +21548,8 @@ msgstr "Національний парк"
 msgid "Protected Area"
 msgstr "Охоронювана територія"
 
-msgid "Protected Class"
-msgstr "Клас охорони"
+msgid "Protect Class"
+msgstr "Клас захисту"
 
 msgid "Title or type of protection"
 msgstr "Назва чи тип захисту"
@@ -21504,15 +21578,21 @@ msgstr "Місто (понад 100 000)"
 msgid "Town"
 msgstr "Місто"
 
-msgid "Suburb"
-msgstr "Передмістя"
-
 msgid "Village"
 msgstr "Село"
 
 msgid "Hamlet"
 msgstr "Хутір"
 
+msgid "Isolated Dwelling"
+msgstr "Ізольоване житло"
+
+msgid "Suburb"
+msgstr "Передмістя"
+
+msgid "Neighbourhood"
+msgstr "Сусіди"
+
 msgid "Farm"
 msgstr "Ферма"
 
@@ -21524,12 +21604,6 @@ msgstr ""
 "(будь ласка, використовуйте isolated_dwelling для ізольованного фермерського "
 "господарства)"
 
-msgid "Isolated Dwelling"
-msgstr "Ізольоване житло"
-
-msgid "Neighbourhood"
-msgstr "Сусіди"
-
 msgid "Locality"
 msgstr "Місцевість"
 
@@ -22060,6 +22134,41 @@ msgstr "Зображення"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr "Контакти (з префіксом ''contact:*'')"
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr "Короткий текст з додатковою інформацією."
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+"Він може бути видимим для кінцевого користувача (можливо, за допомогою "
+"системи пошуку або у виринаючих підказках на мапі)."
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr "Схожі, але інші теґи:"
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr "Нотатка"
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr "Важливе зауваження для інших маперів (не для кінцевих користувачів)."
+
+msgid "Fixme"
+msgstr "Fixme"
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+"Важливе зауваження для інших маперів (не для кінцевих користувачів), що "
+"об’єкт потребує доопрацювання."
+
 msgid "outer segment"
 msgstr "зовнішній сегмент"
 
@@ -22423,18 +22532,15 @@ msgstr "Перевірка"
 msgid "Landsat"
 msgstr "Супутникові знімки Landsat"
 
-msgid "Yahoo Sat"
-msgstr "Супутникові знімки Yahoo"
-
-msgid "Bing Sat"
-msgstr "Супутникові знімки Bing"
+msgid "Bing aerial imagery"
+msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 "HDM (команда по створенню мап в OpenStreetMap для гуманітарної допомоги)"
 
-msgid "MapBox Satellite"
-msgstr "OpenStreetMap MapBox"
+msgid "Mapbox Satellite"
+msgstr ""
 
 msgid "MapQuest Open Aerial"
 msgstr "MapQuest Open Aerial"
@@ -22445,14 +22551,14 @@ msgstr "GPS-треки OpenStreetMap"
 msgid "OpenStreetMap (Mapnik)"
 msgstr "OpenStreetMap (Mapnik)"
 
+msgid "skobbler"
+msgstr "skobbler"
+
 msgid "OpenStreetMap (Mapnik Black & White)"
-msgstr "OpenStreetMap (Mapnik чорно-білий)"
+msgstr ""
 
 msgid "OpenStreetMap (Mapnik, no labels)"
-msgstr "OpenStreetMap (Mapnik, без підписів)"
-
-msgid "skobbler"
-msgstr "skobbler"
+msgstr ""
 
 msgid "skobbler heatmap"
 msgstr "skobbler теплова мапа"
@@ -22484,6 +22590,54 @@ msgstr "Strava теплова веломапа"
 msgid "Strava running heatmap"
 msgstr "Strava теплова мапа бігунів"
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI чорно-біла 2,5 м"
 
@@ -22525,10 +22679,13 @@ msgstr "VoGIS: DOM (Модель поверхні)"
 
 msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
-msgstr ""
+msgstr "AGIV (Фландрія) аерофотознімки (покривають Брюссель) (2013)"
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
-msgstr ""
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr "SPW (allonie) 2012 аерофотознімки"
+
+msgid "SPW(allonie) 2009 aerial imagery"
+msgstr "SPW (allonie) 2009 аерофотознімки"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Мапа міських районів"
@@ -22548,6 +22705,12 @@ msgstr "Canvec"
 msgid "British Columbia Mosaic"
 msgstr "Британська Колумбія Мозаїка"
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr "Чехія CUZK:KM"
 
@@ -22665,7 +22828,7 @@ msgid "Hamburg (40 cm)"
 msgstr "Гамбург (40 см)"
 
 msgid "Hamburg (20 cm)"
-msgstr ""
+msgstr "Гамбург (20 см)"
 
 msgid "Hamburg (DK5)"
 msgstr "Гамбург (DK5)"
@@ -22676,8 +22839,8 @@ msgstr "Баварія (2 м)"
 msgid "Stuttgart (Luftbild)"
 msgstr "Штутгарт (вид зверху)"
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
-msgstr "Ерланген 2013 Аерофотозйомка (6,25 см)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
+msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
 msgstr "Ерланген 2011 Аерофотозйомка (5,0 см)"
@@ -22761,6 +22924,12 @@ msgstr "PCN 2008 - IT Лаціо+Умбрія"
 msgid "PCN 2012 - Italy"
 msgstr "PCN 2012 - Італія"
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr "СРСР - Латвія"
 
@@ -22977,17 +23146,17 @@ msgstr "MSR Топомапи"
 msgid "MSR Maps Urban"
 msgstr "MSR Міські мапи"
 
-msgid "USGS Scanned Topographic Maps"
-msgstr "USGS: скановані топографічні мапи"
+msgid "USGS Topographic Maps"
+msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr "USGS: великомасштабні знимки"
 
-msgid "OSM US TIGER 2012 Roads Overlay"
-msgstr "OSM US TIGER 2012: оверлей доріг"
+msgid "TIGER 2012 Roads Overlay"
+msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
-msgstr "Нові та невирівняні дороги TIGER (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
+msgstr ""
 
 msgid "MassGIS L3 Parcels"
 msgstr "MassGIS L3 Ділянки"
@@ -22995,6 +23164,9 @@ msgstr "MassGIS L3 Ділянки"
 msgid "NC Latest Orthoimagery"
 msgstr "Північна Кароліна: останні ортознімки"
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Україна - ортофотоплани 2012"
 
@@ -23262,6 +23434,9 @@ msgstr "Плани міст від OS, Вінгтон 1848 (NLS)"
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr "Плани міст від OS, Вінгтон 1894 (NLS)"
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr "Зменшення номерів будинків під час інтерполяції"
 
@@ -23368,6 +23543,9 @@ msgstr "{0} на точці. Слід застосовувати до поліг
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr "{0}=* на точці. Потрібно використовувати у зв’язку"
 
+msgid "{0} on a way. Should be used on a node."
+msgstr "{0} на лінії, замість точки."
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr "{0} на лінії, а повинен бути на зв’язку"
 
@@ -28059,6 +28237,8 @@ msgid ""
 "Click+drag photo, shift+click to position photo, control+click to set "
 "direction."
 msgstr ""
+"Клацніть + перетягніть фото, Shift + клацніть для встановлення позиції фото, "
+"Ctrl + клацніть, щоб задати напрямок."
 
 msgid "Please load some photos."
 msgstr "Завантажте кілька знімків."
@@ -29107,6 +29287,21 @@ msgstr "Зберегти поточні дані SDS у файл."
 msgid "Save SDS file"
 msgstr "Зберегти файл SDS"
 
+msgid "No object selected"
+msgstr "Немає виділених об’єктів"
+
+msgid "SeaMap Editor"
+msgstr "Редактор морських мап"
+
+msgid "Seamark Inspector"
+msgstr "Перевірка навігаційних знаків"
+
+msgid "Select only one object"
+msgstr "Виділіть тільки один об’єкт"
+
+msgid "Select a map object"
+msgstr "Виділіть об’єкт на мапі"
+
 msgid "Simplify Area"
 msgstr "Спростити полігон"
 
@@ -29181,9 +29376,6 @@ msgstr "Коефіцієнт відстані"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "Поріг злиття найближчих точок"
 
-msgid "SeaMap Editor"
-msgstr "Редактор морських мап"
-
 msgid "AutoSave LiveData"
 msgstr "Автозбереження редагованих даних"
 
diff --git a/i18n/po/ur.po b/i18n/po/ur.po
index ca82f4c..0426e6b 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2010-05-13 04:15+0000\n"
 "Last-Translator: Shoaib Mirza <Unknown>\n"
 "Language-Team: Urdu <ur at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:32+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:27+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: ur\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -215,6 +215,13 @@ msgstr ""
 msgid "No target layers"
 msgstr ""
 
+msgid "Select"
+msgstr ""
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr ""
 
@@ -2036,9 +2043,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr ""
 
-msgid "Select"
-msgstr ""
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5611,10 +5615,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9048,7 +9048,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9069,6 +9069,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11038,7 +11044,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14218,6 +14224,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15210,12 +15222,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15311,45 +15399,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16184,31 +16234,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16223,16 +16270,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16317,6 +16372,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16347,12 +16405,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16548,6 +16609,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16806,6 +16870,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18049,10 +18121,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18073,15 +18141,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18155,6 +18223,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19652,7 +19724,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19682,28 +19754,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20221,6 +20293,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20584,16 +20687,13 @@ msgstr ""
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20605,13 +20705,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20644,6 +20744,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20687,7 +20835,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20708,6 +20859,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20836,7 +20993,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20919,6 +21076,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21135,16 +21298,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21153,6 +21316,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21420,6 +21586,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21512,6 +21681,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26846,6 +27018,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26906,9 +27093,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/vi.po b/i18n/po/vi.po
index fbc2d3a..1e28a80 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2013-03-13 05:33+0000\n"
 "Last-Translator: Minh Nguyễn <mxn at 1ec5.org>\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: 2014-12-29 05:33+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:28+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: vi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -216,6 +216,13 @@ msgstr ""
 msgid "No target layers"
 msgstr "Không có layer đích"
 
+msgid "Select"
+msgstr "Chọn"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr ""
+
 msgid "Add imagery layer {0}"
 msgstr "Thêm lớp ảnh {0}"
 
@@ -2048,9 +2055,6 @@ msgstr ""
 "Thả phần Chơi trước và bỏ ra gần track để chơi tập tin âm thanh từ đó. Nhấn "
 "SHIFT + bỏ ra để đồng bộ hóa âm thanh tại điểm đó"
 
-msgid "Select"
-msgstr "Chọn"
-
 msgid "Select, move, scale and rotate objects"
 msgstr ""
 
@@ -5621,10 +5625,6 @@ msgstr ""
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr ""
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr ""
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] ""
@@ -9068,7 +9068,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
 
 msgid ""
@@ -9089,6 +9089,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr ""
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11058,7 +11064,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14242,6 +14248,12 @@ msgstr ""
 msgid "Loads data from SDS"
 msgstr ""
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15234,12 +15246,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr ""
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr ""
 
 msgid "Construction"
 msgstr ""
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr ""
 
@@ -15335,45 +15423,7 @@ msgstr ""
 msgid "Roundabout"
 msgstr ""
 
-msgid "motorway"
-msgstr ""
-
-msgid "motorway_link"
-msgstr ""
-
-msgid "trunk"
-msgstr ""
-
-msgid "trunk_link"
-msgstr ""
-
-msgid "primary"
-msgstr ""
-
-msgid "primary_link"
-msgstr ""
-
-msgid "secondary"
-msgstr ""
-
-msgid "tertiary"
-msgstr ""
-
-msgid "unclassified"
-msgstr ""
-
-msgid "residential"
-msgstr ""
-
-msgid "living_street"
-msgstr ""
-
-msgid "service"
-msgstr ""
-
-msgid "bus_guideway"
-msgstr ""
-
+msgctxt "Highway"
 msgid "construction"
 msgstr ""
 
@@ -16208,31 +16258,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr ""
 
-msgid "Chair Lift"
+msgid "Cable Car"
 msgstr ""
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
+msgid "Chair Lift"
 msgstr ""
 
-msgid "Cable Car"
+msgid "Number of people per chair"
 msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16247,16 +16294,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16341,6 +16396,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16371,12 +16429,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16572,6 +16633,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr ""
 
@@ -16830,6 +16894,14 @@ msgstr ""
 msgid "Hangar"
 msgstr ""
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr ""
 
@@ -18073,10 +18145,6 @@ msgid "Man Made"
 msgstr ""
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18097,15 +18165,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18179,6 +18247,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr ""
 
@@ -19676,7 +19748,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19706,28 +19778,28 @@ msgstr ""
 msgid "Town"
 msgstr ""
 
-msgid "Suburb"
-msgstr ""
-
 msgid "Village"
 msgstr ""
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "Farm"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "A farm within a bigger settlement"
+msgstr ""
+
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -20245,6 +20317,37 @@ msgstr ""
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr ""
 
@@ -20608,16 +20711,13 @@ msgstr "Kiểm tra"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20629,13 +20729,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20668,6 +20768,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20711,7 +20859,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20732,6 +20883,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20860,7 +21017,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20943,6 +21100,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21159,16 +21322,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21177,6 +21340,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21444,6 +21610,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21536,6 +21705,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26870,6 +27042,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr ""
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr ""
 
@@ -26930,9 +27117,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr ""
-
 msgid "AutoSave LiveData"
 msgstr ""
 
diff --git a/i18n/po/zh_CN.po b/i18n/po/zh_CN.po
index 8843911..2ba95fa 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: 2014-12-29 01:14+0100\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
 "PO-Revision-Date: 2014-12-20 15:38+0000\n"
 "Last-Translator: mmyfl <Unknown>\n"
 "Language-Team: 汉语 <>\n"
@@ -18,8 +18,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2014-12-29 05:38+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:33+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: zh_CN\n"
 
 msgid "yard"
@@ -221,6 +221,13 @@ msgstr "<html>来源图层<br>“{0}”<br>中没有任何图层可合并。</ht
 msgid "No target layers"
 msgstr "没有目标图层"
 
+msgid "Select"
+msgstr "选择"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "在地图上设定选定的元件为上列列表中选定的项目。"
+
 msgid "Add imagery layer {0}"
 msgstr "添加图像层 {0}"
 
@@ -2039,9 +2046,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr "将播放开头拖曳并放至要播放音频的轨迹旁;按SHIFT+释放就会从那一点同步化音频。"
 
-msgid "Select"
-msgstr "选择"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "选择、移动、缩放和旋转对象"
 
@@ -5620,10 +5624,6 @@ msgstr "调解"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "打开上列列表中,所有选定的项目的合并对话框。"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "在地图上设定选定的元件为上列列表中选定的项目。"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "检测到 {0} 个冲突。"
@@ -9110,10 +9110,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} 公里/小时"
 
 msgid ""
 "\n"
@@ -9139,6 +9137,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG 图片(*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr "选择可见的轨迹"
 
@@ -11152,7 +11156,7 @@ msgstr "内置:"
 msgid "Projection bounds (in degrees)"
 msgstr "投影范围(度)"
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14353,6 +14357,12 @@ msgstr "提供路线规划功能。"
 msgid "Loads data from SDS"
 msgstr "从 SDS 加载数据"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15342,12 +15352,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "停车场通道"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "道路(不明的类型)"
 
 msgid "Construction"
 msgstr "施工"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "交叉点"
 
@@ -15443,47 +15529,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "环岛"
 
-msgid "motorway"
-msgstr "高速公路"
-
-msgid "motorway_link"
-msgstr "高速公路连络线"
-
-msgid "trunk"
-msgstr "快速道路"
-
-msgid "trunk_link"
-msgstr "快速道路连络线"
-
-msgid "primary"
-msgstr "一级道路"
-
-msgid "primary_link"
-msgstr "一级道路连络线"
-
-msgid "secondary"
-msgstr "二级道路"
-
-msgid "tertiary"
-msgstr "三级道路"
-
-msgid "unclassified"
-msgstr "未分类道路"
-
-msgid "residential"
-msgstr "居住区道路"
-
-msgid "living_street"
-msgstr "生活街道"
-
-msgid "service"
-msgstr "服务道路"
-
-msgid "bus_guideway"
-msgstr "有轨电车专用道"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "施工"
+msgstr ""
 
 msgid "Ford"
 msgstr "浅滩"
@@ -16316,32 +16364,29 @@ msgstr ""
 msgid "Aerialway"
 msgstr "空中线路"
 
-msgid "Chair Lift"
-msgstr "椅式升降机"
+msgid "Cable Car"
+msgstr "缆车"
 
 msgid "Number of people per hour"
 msgstr "每小时运量"
 
-msgid "Number of people per chair"
-msgstr "每椅子的人数"
+msgid "Number of people per car"
+msgstr "每车的人数"
 
 msgid "Typical journey time in minutes"
 msgstr "典型行程用时(分钟)"
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr "有加热吗?"
 
-msgid "Drag Lift"
-msgstr "拖曳升降机"
+msgid "Chair Lift"
+msgstr "椅式升降机"
 
-msgid "Cable Car"
-msgstr "缆车"
+msgid "Number of people per chair"
+msgstr "每椅子的人数"
 
-msgid "Number of people per car"
-msgstr "每车的人数"
+msgid "Has bubble?"
+msgstr ""
 
 msgid "Gondola"
 msgstr "索道"
@@ -16355,16 +16400,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
+msgstr "拖曳升降机"
+
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
+msgstr ""
+
+msgid "t-bar"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid "j-bar"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "platter"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16449,6 +16502,9 @@ msgstr "雪佛龙(Chevron)"
 msgid "Citgo"
 msgstr "雪铁戈(Citgo)"
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr "埃索(Esso)"
 
@@ -16479,12 +16535,15 @@ msgstr "雷普索尔(Repsol)"
 msgid "Shell"
 msgstr "壳牌(Shell)"
 
-msgid "Sunoco"
-msgstr "太阳(Sunoco)"
+msgid "Socar"
+msgstr ""
 
 msgid "Statoil"
 msgstr "挪威国家石油(Statoil)"
 
+msgid "Sunoco"
+msgstr "太阳(Sunoco)"
+
 msgid "Tamoil"
 msgstr "塔莫尔(Tamoil)"
 
@@ -16680,6 +16739,9 @@ msgstr "自行修理的工具(也许是一个自行车合作社)"
 msgid "Bicycles are washed (for a fee)"
 msgstr "清洗自行车(收费)"
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "公共交通"
 
@@ -16938,6 +17000,14 @@ msgstr "停机坪"
 msgid "Hangar"
 msgstr "飞机库"
 
+msgctxt "building"
+msgid "hangar"
+msgstr "机库"
+
+msgctxt "building"
+msgid "yes"
+msgstr "普通"
+
 msgid "Beacon"
 msgstr "灯标"
 
@@ -18181,10 +18251,6 @@ msgid "Man Made"
 msgstr "人造物"
 
 msgctxt "building"
-msgid "yes"
-msgstr "普通"
-
-msgctxt "building"
 msgid "roof"
 msgstr "屋顶"
 
@@ -18205,16 +18271,16 @@ msgid "school"
 msgstr "学校"
 
 msgctxt "building"
-msgid "hangar"
-msgstr "机库"
-
-msgctxt "building"
 msgid "commercial"
 msgstr "商业"
 
 msgctxt "building"
-msgid "farm"
-msgstr "农场"
+msgid "barn"
+msgstr ""
+
+msgctxt "building"
+msgid "farm_auxiliary"
+msgstr ""
 
 msgctxt "building"
 msgid "transportation"
@@ -18287,6 +18353,10 @@ msgctxt "building"
 msgid "detached"
 msgstr "独立"
 
+msgctxt "building"
+msgid "farm"
+msgstr "农场"
+
 msgid "Entrance"
 msgstr "入口"
 
@@ -19784,7 +19854,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19814,15 +19884,21 @@ msgstr "市"
 msgid "Town"
 msgstr "镇"
 
-msgid "Suburb"
-msgstr "郊区"
-
 msgid "Village"
 msgstr "行政村"
 
 msgid "Hamlet"
 msgstr "自然村"
 
+msgid "Isolated Dwelling"
+msgstr "独立住宅"
+
+msgid "Suburb"
+msgstr "郊区"
+
+msgid "Neighbourhood"
+msgstr "街坊"
+
 msgid "Farm"
 msgstr ""
 
@@ -19832,12 +19908,6 @@ msgstr ""
 msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
-msgid "Isolated Dwelling"
-msgstr "独立住宅"
-
-msgid "Neighbourhood"
-msgstr "街坊"
-
 msgid "Locality"
 msgstr "地区"
 
@@ -20353,6 +20423,37 @@ msgstr "图像"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "外围"
 
@@ -20716,16 +20817,13 @@ msgstr "测试"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20737,13 +20835,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20776,6 +20874,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20819,7 +20965,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20840,6 +20989,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20968,7 +21123,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -21051,6 +21206,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21267,16 +21428,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21285,6 +21446,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21552,6 +21716,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21644,6 +21811,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -27101,6 +27271,21 @@ msgstr "保存当前的独立数据存储信息到文件。"
 msgid "Save SDS file"
 msgstr "保存 SDS 文件"
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "海标编辑器"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "简化区域"
 
@@ -27161,9 +27346,6 @@ msgstr "距离系数"
 msgid "Merge Nearby Nodes Threshold"
 msgstr "合并阈值附近的节点"
 
-msgid "SeaMap Editor"
-msgstr "海标编辑器"
-
 msgid "AutoSave LiveData"
 msgstr "自动保存即时数据"
 
diff --git a/i18n/po/zh_TW.po b/i18n/po/zh_TW.po
index 9b3ea0a..1be9daf 100644
--- a/i18n/po/zh_TW.po
+++ b/i18n/po/zh_TW.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-29 01:14+0100\n"
-"PO-Revision-Date: 2014-12-20 14:53+0000\n"
+"POT-Creation-Date: 2015-02-01 03:39+0100\n"
+"PO-Revision-Date: 2015-01-30 10:41+0000\n"
 "Last-Translator: yellowsoar <Unknown>\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: 2014-12-29 05:37+0000\n"
-"X-Generator: Launchpad (build 17286)\n"
+"X-Launchpad-Export-Date: 2015-02-01 05:32+0000\n"
+"X-Generator: Launchpad (build 17306)\n"
 "Language: zh_TW\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -217,6 +217,13 @@ msgstr "<html>來源圖層<br>''{0}''<br>中沒有任何圖層可合併。</html
 msgid "No target layers"
 msgstr "沒有目標圖層"
 
+msgid "Select"
+msgstr "選擇"
+
+msgid ""
+"Set the selected elements on the map to the selected items in the list above."
+msgstr "在地圖上設定選取的元件為上列清單中選取的項目。"
+
 msgid "Add imagery layer {0}"
 msgstr "加入圖片圖層 {0}"
 
@@ -2033,9 +2040,6 @@ msgid ""
 "SHIFT+release to synchronize audio at that point."
 msgstr "將播放開頭拖曳並放至要播放音效的軌跡旁;按 SHIFT+釋放就會從那一點同步化音效。"
 
-msgid "Select"
-msgstr "選擇"
-
 msgid "Select, move, scale and rotate objects"
 msgstr "選擇、移動、縮放和旋轉物件"
 
@@ -5607,10 +5611,6 @@ msgstr "解決"
 msgid "Open a merge dialog of all selected items in the list above."
 msgstr "開啟上列清單所有選取的項目的合併對話盒。"
 
-msgid ""
-"Set the selected elements on the map to the selected items in the list above."
-msgstr "在地圖上設定選取的元件為上列清單中選取的項目。"
-
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
 msgstr[0] "偵測到 {0} 個衝突。"
@@ -9062,10 +9062,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"{0} km/h"
+"Speed: {0} km/h"
 msgstr ""
-"\n"
-"{0} 公里/小時"
 
 msgid ""
 "\n"
@@ -9087,6 +9085,12 @@ msgstr ""
 msgid "JPEG images (*.jpg)"
 msgstr "JPEG 圖片 (*.jpg)"
 
+msgid "Show thumbnails"
+msgstr ""
+
+msgid "Show image thumbnails instead of icons."
+msgstr ""
+
 msgid "Choose visible tracks"
 msgstr ""
 
@@ -11093,7 +11097,7 @@ msgstr ""
 msgid "Projection bounds (in degrees)"
 msgstr ""
 
-msgid "WMS SRS (EPSG code)"
+msgid "Sets the SRS=... parameter in the WMS request"
 msgstr ""
 
 msgid "Gauß-Krüger"
@@ -14293,6 +14297,12 @@ msgstr "提供路線規畫的功能。"
 msgid "Loads data from SDS"
 msgstr "從 SDS 載入資料"
 
+msgid "Imagery Layer for Sea Charts"
+msgstr ""
+
+msgid "Edit features for Sea Charts"
+msgstr ""
+
 msgid ""
 "Simplify area by removing nodes on very obtuse angles. This can be "
 "constrained by maximum removed area size. Also average nearby nodes."
@@ -15285,12 +15295,88 @@ msgstr ""
 msgid "Parking Aisle"
 msgstr "停車場通道"
 
+msgid "Escape"
+msgstr ""
+
+msgid ""
+"Emergency lane beside long descending slopes for trucks and other vehicles "
+"to stop safely after brake failure."
+msgstr ""
+
 msgid "Road (Unknown Type)"
 msgstr "道路(不明的類型)"
 
 msgid "Construction"
 msgstr "施工"
 
+msgctxt "Highway"
+msgid "motorway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "motorway_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk"
+msgstr ""
+
+msgctxt "Highway"
+msgid "trunk_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "primary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "secondary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary"
+msgstr ""
+
+msgctxt "Highway"
+msgid "tertiary_link"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bus_guideway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "bridleway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "living_street"
+msgstr ""
+
+msgctxt "Highway"
+msgid "pedestrian"
+msgstr ""
+
+msgctxt "Highway"
+msgid "track"
+msgstr ""
+
+msgctxt "Highway"
+msgid "footway"
+msgstr ""
+
+msgctxt "Highway"
+msgid "steps"
+msgstr ""
+
 msgid "Junction"
 msgstr "匯集點"
 
@@ -15386,47 +15472,9 @@ msgstr ""
 msgid "Roundabout"
 msgstr "圓環"
 
-msgid "motorway"
-msgstr "高速公路"
-
-msgid "motorway_link"
-msgstr "高速公路連絡道路"
-
-msgid "trunk"
-msgstr "快速道路"
-
-msgid "trunk_link"
-msgstr "快速道路連絡道路"
-
-msgid "primary"
-msgstr "省道"
-
-msgid "primary_link"
-msgstr "省道連絡道路"
-
-msgid "secondary"
-msgstr "縣道"
-
-msgid "tertiary"
-msgstr "鄉道"
-
-msgid "unclassified"
-msgstr "未分類的"
-
-msgid "residential"
-msgstr "居住的"
-
-msgid "living_street"
-msgstr "生活街道"
-
-msgid "service"
-msgstr "巷/弄"
-
-msgid "bus_guideway"
-msgstr "公車專用道"
-
+msgctxt "Highway"
 msgid "construction"
-msgstr "施工"
+msgstr ""
 
 msgid "Ford"
 msgstr "淺灘"
@@ -16259,31 +16307,28 @@ msgstr ""
 msgid "Aerialway"
 msgstr "空中路線"
 
-msgid "Chair Lift"
-msgstr "滑雪纜車"
+msgid "Cable Car"
+msgstr "大型纜車"
 
 msgid "Number of people per hour"
 msgstr ""
 
-msgid "Number of people per chair"
+msgid "Number of people per car"
 msgstr ""
 
 msgid "Typical journey time in minutes"
 msgstr ""
 
-msgid "Has bubble?"
-msgstr ""
-
 msgid "Has heating?"
 msgstr ""
 
-msgid "Drag Lift"
-msgstr ""
+msgid "Chair Lift"
+msgstr "滑雪纜車"
 
-msgid "Cable Car"
-msgstr "大型纜車"
+msgid "Number of people per chair"
+msgstr ""
 
-msgid "Number of people per car"
+msgid "Has bubble?"
 msgstr ""
 
 msgid "Gondola"
@@ -16298,16 +16343,24 @@ msgstr ""
 msgid "Number of people per gondola/chair"
 msgstr ""
 
-msgid "T-bar Lift"
+msgid "Drag Lift"
 msgstr ""
 
-msgid "J-bar Lift"
+msgid ""
+"drag_lift (general type - use only if exact type (see values below) is "
+"unknown)"
 msgstr ""
 
-msgid "Platter Lift"
+msgid "t-bar"
 msgstr ""
 
-msgid "Rope Tow"
+msgid "j-bar"
+msgstr ""
+
+msgid "platter"
+msgstr ""
+
+msgid "rope_tow"
 msgstr ""
 
 msgid "Magic Carpet"
@@ -16392,6 +16445,9 @@ msgstr ""
 msgid "Citgo"
 msgstr ""
 
+msgid "Eni"
+msgstr ""
+
 msgid "Esso"
 msgstr ""
 
@@ -16422,12 +16478,15 @@ msgstr ""
 msgid "Shell"
 msgstr ""
 
-msgid "Sunoco"
+msgid "Socar"
 msgstr ""
 
 msgid "Statoil"
 msgstr ""
 
+msgid "Sunoco"
+msgstr ""
+
 msgid "Tamoil"
 msgstr ""
 
@@ -16623,6 +16682,9 @@ msgstr ""
 msgid "Bicycles are washed (for a fee)"
 msgstr ""
 
+msgid "Public Bicycle Repair Station"
+msgstr ""
+
 msgid "Public Transport"
 msgstr "大眾運輸"
 
@@ -16881,6 +16943,14 @@ msgstr "停機坪"
 msgid "Hangar"
 msgstr "飛機庫"
 
+msgctxt "building"
+msgid "hangar"
+msgstr ""
+
+msgctxt "building"
+msgid "yes"
+msgstr ""
+
 msgid "Beacon"
 msgstr "信標"
 
@@ -18124,10 +18194,6 @@ msgid "Man Made"
 msgstr "人造物"
 
 msgctxt "building"
-msgid "yes"
-msgstr ""
-
-msgctxt "building"
 msgid "roof"
 msgstr ""
 
@@ -18148,15 +18214,15 @@ msgid "school"
 msgstr ""
 
 msgctxt "building"
-msgid "hangar"
+msgid "commercial"
 msgstr ""
 
 msgctxt "building"
-msgid "commercial"
+msgid "barn"
 msgstr ""
 
 msgctxt "building"
-msgid "farm"
+msgid "farm_auxiliary"
 msgstr ""
 
 msgctxt "building"
@@ -18230,6 +18296,10 @@ msgctxt "building"
 msgid "detached"
 msgstr ""
 
+msgctxt "building"
+msgid "farm"
+msgstr ""
+
 msgid "Entrance"
 msgstr "入口"
 
@@ -19727,7 +19797,7 @@ msgstr ""
 msgid "Protected Area"
 msgstr ""
 
-msgid "Protected Class"
+msgid "Protect Class"
 msgstr ""
 
 msgid "Title or type of protection"
@@ -19757,28 +19827,28 @@ msgstr "市"
 msgid "Town"
 msgstr "鄉/鎮"
 
-msgid "Suburb"
-msgstr "郊區"
-
 msgid "Village"
 msgstr "村/里"
 
 msgid "Hamlet"
 msgstr ""
 
-msgid "Farm"
+msgid "Isolated Dwelling"
 msgstr ""
 
-msgid "A farm within a bigger settlement"
+msgid "Suburb"
+msgstr "郊區"
+
+msgid "Neighbourhood"
 msgstr ""
 
-msgid "(please use isolated_dwelling for an isolated farm)"
+msgid "Farm"
 msgstr ""
 
-msgid "Isolated Dwelling"
+msgid "A farm within a bigger settlement"
 msgstr ""
 
-msgid "Neighbourhood"
+msgid "(please use isolated_dwelling for an isolated farm)"
 msgstr ""
 
 msgid "Locality"
@@ -19853,16 +19923,16 @@ msgid "Tree"
 msgstr "樹"
 
 msgid "A single tree."
-msgstr ""
+msgstr "單獨一棵樹"
 
 msgid "Botanical Name"
 msgstr "植物學名"
 
 msgid "Tree Row"
-msgstr ""
+msgstr "一排樹"
 
 msgid "A line of trees."
-msgstr ""
+msgstr "一排樹"
 
 msgid "Wood"
 msgstr "樹林"
@@ -20296,6 +20366,37 @@ msgstr "圖片"
 msgid "Contact (Schema with ''contact:*'' Prefix)"
 msgstr ""
 
+msgctxt "description=*"
+msgid "A short text with additional information."
+msgstr ""
+
+msgctxt "description=*"
+msgid ""
+"It might be viewable to the end user (perhaps using a search system or a map "
+"with pop-ups)."
+msgstr ""
+
+msgctxt "note=*, fixme=*, description=*"
+msgid "Similar but different tags:"
+msgstr ""
+
+msgctxt "the tag note=*"
+msgid "Note"
+msgstr ""
+
+msgctxt "note=*"
+msgid "An important hint for other mappers (not for the end user)."
+msgstr ""
+
+msgid "Fixme"
+msgstr ""
+
+msgctxt "fixme=*"
+msgid ""
+"A hint for other mappers (not for the end user), that an object needs an "
+"improvement."
+msgstr ""
+
 msgid "outer segment"
 msgstr "外部區段"
 
@@ -20339,7 +20440,7 @@ msgid "Site name"
 msgstr "場所名稱"
 
 msgid "where to place the label"
-msgstr "何處放置這個標籤"
+msgstr "顯示文字的位置"
 
 msgid "perimeter of the site"
 msgstr "場所的週界"
@@ -20659,16 +20760,13 @@ msgstr "測試"
 msgid "Landsat"
 msgstr ""
 
-msgid "Yahoo Sat"
-msgstr ""
-
-msgid "Bing Sat"
+msgid "Bing aerial imagery"
 msgstr ""
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
 msgstr ""
 
-msgid "MapBox Satellite"
+msgid "Mapbox Satellite"
 msgstr ""
 
 msgid "MapQuest Open Aerial"
@@ -20680,13 +20778,13 @@ msgstr ""
 msgid "OpenStreetMap (Mapnik)"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik Black & White)"
+msgid "skobbler"
 msgstr ""
 
-msgid "OpenStreetMap (Mapnik, no labels)"
+msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr ""
 
-msgid "skobbler"
+msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr ""
 
 msgid "skobbler heatmap"
@@ -20719,6 +20817,54 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Locator Overlay"
+msgstr ""
+
+msgid "QA No Address"
+msgstr ""
+
+msgid "Waymarked Trails: Hiking"
+msgstr ""
+
+msgid "Waymarked Trails: Cycling"
+msgstr ""
+
+msgid "Waymarked Trails: MTB"
+msgstr ""
+
+msgid "Waymarked Trails: Skating"
+msgstr ""
+
+msgid "Waymarked Trails: Horse Riding"
+msgstr ""
+
+msgid "Waymarked Trails: Winter Sports"
+msgstr ""
+
+msgid "OSM Inspector: Geometry"
+msgstr ""
+
+msgid "OSM Inspector: Tagging"
+msgstr ""
+
+msgid "OSM Inspector: Places"
+msgstr ""
+
+msgid "OSM Inspector: Highways"
+msgstr ""
+
+msgid "OSM Inspector: Multipolygon"
+msgstr ""
+
+msgid "OSM Inspector: Routing"
+msgstr ""
+
+msgid "OSM Inspector: Addresses"
+msgstr ""
+
+msgid "OSM Inspector: Boundaries (EU)"
+msgstr ""
+
 msgid "AGRI black-and-white 2.5m"
 msgstr ""
 
@@ -20762,7 +20908,10 @@ msgid ""
 "AGIV(laanderen) aerial imagery (covers Brussels region as well) (2013)"
 msgstr ""
 
-msgid "Geoservices Wallonie aerial imagery (2009)"
+msgid "SPW(allonie) 2012 aerial imagery"
+msgstr ""
+
+msgid "SPW(allonie) 2009 aerial imagery"
 msgstr ""
 
 msgid "IBGE Mapa de Setores Urbanos"
@@ -20783,6 +20932,12 @@ msgstr ""
 msgid "British Columbia Mosaic"
 msgstr ""
 
+msgid "Kelowna 2012"
+msgstr ""
+
+msgid "Kelowna Roads overlay"
+msgstr ""
+
 msgid "Czech CUZK:KM"
 msgstr ""
 
@@ -20911,7 +21066,7 @@ msgstr ""
 msgid "Stuttgart (Luftbild)"
 msgstr ""
 
-msgid "Erlangen 2013 Luftbild (6,25 cm)"
+msgid "Erlangen Luftbild (2013 6,25 cm)"
 msgstr ""
 
 msgid "Erlangen 2011 Luftbild (5,0 cm)"
@@ -20994,6 +21149,12 @@ msgstr ""
 msgid "PCN 2012 - Italy"
 msgstr ""
 
+msgid "South Tyrol Orthofoto 2011"
+msgstr ""
+
+msgid "South Tyrol Topomap"
+msgstr ""
+
 msgid "USSR - Latvia"
 msgstr ""
 
@@ -21210,16 +21371,16 @@ msgstr ""
 msgid "MSR Maps Urban"
 msgstr ""
 
-msgid "USGS Scanned Topographic Maps"
+msgid "USGS Topographic Maps"
 msgstr ""
 
 msgid "USGS Large Scale Imagery"
 msgstr ""
 
-msgid "OSM US TIGER 2012 Roads Overlay"
+msgid "TIGER 2012 Roads Overlay"
 msgstr ""
 
-msgid "New & Misaligned TIGER Roads (TIGER 2014)"
+msgid "New & Misaligned TIGER Roads (2014)"
 msgstr ""
 
 msgid "MassGIS L3 Parcels"
@@ -21228,6 +21389,9 @@ msgstr ""
 msgid "NC Latest Orthoimagery"
 msgstr ""
 
+msgid "U.S. Forest Service roads"
+msgstr ""
+
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr ""
 
@@ -21495,6 +21659,9 @@ msgstr ""
 msgid "OS Town Plans, Wigtown 1894 (NLS)"
 msgstr ""
 
+msgid "Landsat 233055"
+msgstr ""
+
 msgid "Decreasing house numbers in addresses interpolation"
 msgstr ""
 
@@ -21587,6 +21754,9 @@ msgstr ""
 msgid "{0}=* on a node. Should be used in a relation"
 msgstr ""
 
+msgid "{0} on a way. Should be used on a node."
+msgstr ""
+
 msgid "{0} on a way. Should be used in a relation"
 msgstr ""
 
@@ -26995,6 +27165,21 @@ msgstr ""
 msgid "Save SDS file"
 msgstr ""
 
+msgid "No object selected"
+msgstr ""
+
+msgid "SeaMap Editor"
+msgstr "海圖編輯器"
+
+msgid "Seamark Inspector"
+msgstr ""
+
+msgid "Select only one object"
+msgstr ""
+
+msgid "Select a map object"
+msgstr ""
+
 msgid "Simplify Area"
 msgstr "簡化區域"
 
@@ -27055,9 +27240,6 @@ msgstr ""
 msgid "Merge Nearby Nodes Threshold"
 msgstr ""
 
-msgid "SeaMap Editor"
-msgstr "海圖編輯器"
-
 msgid "AutoSave LiveData"
 msgstr "自動儲存即時資料"
 
diff --git a/images/dialogs/geoimage/togglegit.png b/images/dialogs/geoimage/togglegit.png
new file mode 100644
index 0000000..58c6a6b
Binary files /dev/null and b/images/dialogs/geoimage/togglegit.png differ
diff --git a/images/icons/power_tower_high2.n.16.png b/images/icons/power_tower_high2.n.16.png
deleted file mode 100644
index 93ebbf6..0000000
Binary files a/images/icons/power_tower_high2.n.16.png and /dev/null differ
diff --git a/images/icons/power_tower_low.n.16.png b/images/icons/power_tower_low.n.16.png
deleted file mode 100644
index 8073706..0000000
Binary files a/images/icons/power_tower_low.n.16.png and /dev/null differ
diff --git a/images/presets/State_Public.png b/images/presets/State_Public.png
deleted file mode 100644
index 195b0e3..0000000
Binary files a/images/presets/State_Public.png and /dev/null differ
diff --git a/images/presets/State_Tourist.png b/images/presets/State_Tourist.png
deleted file mode 100644
index db04730..0000000
Binary files a/images/presets/State_Tourist.png and /dev/null differ
diff --git a/images/presets/aeroway_gate.png b/images/presets/aeroway_gate.png
index fa7cf03..f5fb915 100644
Binary files a/images/presets/aeroway_gate.png and b/images/presets/aeroway_gate.png differ
diff --git a/images/presets/bar.png b/images/presets/bar.png
deleted file mode 100644
index d1876da..0000000
Binary files a/images/presets/bar.png and /dev/null differ
diff --git a/images/presets/book.png b/images/presets/book.png
deleted file mode 100644
index 70b9635..0000000
Binary files a/images/presets/book.png and /dev/null differ
diff --git a/images/presets/caravan2.png b/images/presets/caravan2.png
deleted file mode 100644
index 37d4e5c..0000000
Binary files a/images/presets/caravan2.png and /dev/null differ
diff --git a/images/presets/cow.png b/images/presets/cow.png
deleted file mode 100644
index 7a499f1..0000000
Binary files a/images/presets/cow.png and /dev/null differ
diff --git a/images/presets/crossing.png b/images/presets/crossing.png
deleted file mode 100644
index 4109e2e..0000000
Binary files a/images/presets/crossing.png and /dev/null differ
diff --git a/images/presets/fishing.png b/images/presets/fishing.png
deleted file mode 100644
index 244093d..0000000
Binary files a/images/presets/fishing.png and /dev/null differ
diff --git a/images/presets/gasometer.png b/images/presets/gasometer.png
index b1af599..7df4fd4 100644
Binary files a/images/presets/gasometer.png and b/images/presets/gasometer.png differ
diff --git a/images/presets/gate.png b/images/presets/gate.png
deleted file mode 100644
index f2376a5..0000000
Binary files a/images/presets/gate.png and /dev/null differ
diff --git a/images/presets/hostel.png b/images/presets/hostel.png
deleted file mode 100644
index e6bec9a..0000000
Binary files a/images/presets/hostel.png and /dev/null differ
diff --git a/images/presets/information.png b/images/presets/information.png
deleted file mode 100644
index c0daf84..0000000
Binary files a/images/presets/information.png and /dev/null differ
diff --git a/images/presets/marina.png b/images/presets/marina.png
deleted file mode 100644
index 1585743..0000000
Binary files a/images/presets/marina.png and /dev/null differ
diff --git a/images/presets/picnic.png b/images/presets/picnic.png
deleted file mode 100644
index 996f1d5..0000000
Binary files a/images/presets/picnic.png and /dev/null differ
diff --git a/images/presets/places.png b/images/presets/places.png
deleted file mode 100644
index 3aaccfe..0000000
Binary files a/images/presets/places.png and /dev/null differ
diff --git a/images/presets/power_tower.png b/images/presets/power_tower.png
deleted file mode 100644
index d7bbd2b..0000000
Binary files a/images/presets/power_tower.png and /dev/null differ
diff --git a/images/presets/shelter.png b/images/presets/shelter.png
deleted file mode 100644
index 80d2739..0000000
Binary files a/images/presets/shelter.png and /dev/null differ
diff --git a/images/presets/survey_point.png b/images/presets/survey_point.png
deleted file mode 100644
index 935c4ff..0000000
Binary files a/images/presets/survey_point.png and /dev/null differ
diff --git a/images/presets/swimming.png b/images/presets/swimming.png
deleted file mode 100644
index 39bafd4..0000000
Binary files a/images/presets/swimming.png and /dev/null differ
diff --git a/images/presets/tent.png b/images/presets/tent.png
deleted file mode 100644
index 70f3143..0000000
Binary files a/images/presets/tent.png and /dev/null differ
diff --git a/images/presets/theater.png b/images/presets/theater.png
index c3d94bb..a123004 100644
Binary files a/images/presets/theater.png and b/images/presets/theater.png differ
diff --git a/images/presets/tower.png b/images/presets/tower.png
deleted file mode 100644
index d241694..0000000
Binary files a/images/presets/tower.png and /dev/null differ
diff --git a/images/presets/tree.png b/images/presets/tree.png
deleted file mode 100644
index e94095b..0000000
Binary files a/images/presets/tree.png and /dev/null differ
diff --git a/images/presets/vending_machine.png b/images/presets/vending_machine.png
deleted file mode 100644
index 19f5af5..0000000
Binary files a/images/presets/vending_machine.png and /dev/null differ
diff --git a/images/presets/viewpoint.png b/images/presets/viewpoint.png
deleted file mode 100644
index 6c80251..0000000
Binary files a/images/presets/viewpoint.png and /dev/null differ
diff --git a/images/presets/water_tower.png b/images/presets/water_tower.png
deleted file mode 100644
index 70b3ae0..0000000
Binary files a/images/presets/water_tower.png and /dev/null differ
diff --git a/images/presets/windmill.png b/images/presets/windmill.png
deleted file mode 100644
index b900624..0000000
Binary files a/images/presets/windmill.png and /dev/null differ
diff --git a/netbeans/nbproject/genfiles.properties b/netbeans/nbproject/genfiles.properties
index 9a043e2..3e84e16 100644
--- a/netbeans/nbproject/genfiles.properties
+++ b/netbeans/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-nbbuild.xml.data.CRC32=2a1d7942
-nbbuild.xml.script.CRC32=cf6b78f3
-nbbuild.xml.stylesheet.CRC32=28e38971 at 1.38.2.45
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=e047155d
-nbproject/build-impl.xml.script.CRC32=63445536
-nbproject/build-impl.xml.stylesheet.CRC32=5a01deb7 at 1.68.1.46
+nbbuild.xml.data.CRC32=2a1d7942
+nbbuild.xml.script.CRC32=cf6b78f3
+nbbuild.xml.stylesheet.CRC32=28e38971 at 1.38.2.45
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=e047155d
+nbproject/build-impl.xml.script.CRC32=63445536
+nbproject/build-impl.xml.stylesheet.CRC32=5a01deb7 at 1.68.1.46
diff --git a/netbeans/nbproject/project.properties b/netbeans/nbproject/project.properties
index a09aec2..81dc6c8 100644
--- a/netbeans/nbproject/project.properties
+++ b/netbeans/nbproject/project.properties
@@ -1,88 +1,88 @@
-annotation.processing.enabled=false
-annotation.processing.enabled.in.editor=false
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-application.homepage=http://josm.openstreetmap.de/
-application.title=josm
-application.vendor=
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-buildfile=nbbuild.xml
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
-    ${run.classpath}
-debug.test.classpath=\
-    ${run.test.classpath}
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/josm.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-endorsed.classpath=
-excludes=
-file.reference.core-src=../src
-file.reference.core=..
-file.reference.test-unit=../test/unit
-includes=org/**/*.java,gnu/**/*.java,javax/**/*.java,oauth/**/*.java,com/**/*.java,images/**,org/openstreetmap/gui/**/*.png,data/**,styles/**,LICENSE,README,CONTRIBUTION,gpl-2.0.txt,gpl-3.0.txt
-jar.archive.disabled=${jnlp.enabled}
-jar.compress=false
-jar.index=${jnlp.enabled}
-javac.classpath=
-# Space-separated list of extra javac options
-javac.compilerargs=-Xlint:unchecked -Xlint:cast -Xlint:dep-ann -Xlint:divzero -Xlint:empty -Xlint:finally -Xlint:overrides -Xlint:static -Xlint:try  -Xlint:deprecation  
-javac.deprecation=true
-javac.processorpath=\
-    ${javac.classpath}
-javac.source=1.7
-javac.target=1.7
-javac.test.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}:\
-    ${libs.junit.classpath}:\
-    ${libs.junit_4.classpath}
-javac.test.processorpath=\
-    ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-jnlp.codebase.type=no.codebase
-jnlp.descriptor=application
-jnlp.enabled=false
-jnlp.mixed.code=default
-jnlp.offline-allowed=false
-jnlp.signed=false
-jnlp.signing=
-jnlp.signing.alias=
-jnlp.signing.keystore=
-main.class=org.openstreetmap.josm.gui.MainApplication
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=false
-platform.active=default_platform
-run.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}
-run.test.classpath=\
-    ${javac.test.classpath}:\
-    ${build.test.classes.dir}
-source.encoding=UTF-8
-src.core.dir=${file.reference.core}
-src.dir=${file.reference.core-src}
-test.unit.dir=${file.reference.test-unit}
+annotation.processing.enabled=false
+annotation.processing.enabled.in.editor=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+application.homepage=http://josm.openstreetmap.de/
+application.title=josm
+application.vendor=
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+buildfile=nbbuild.xml
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/josm.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=org/apache/commons/compress/compressors/CompressorStreamFactory.java
+file.reference.core-src=../src
+file.reference.core=..
+file.reference.test-unit=../test/unit
+includes=org/apache/commons/compress/compressors/*.java,org/apache/commons/compress/compressors/bzip2/*.java,org/apache/commons/codec/**/*.java,org/glassfish/**/*.java,org/jdesktop/**/*.java,org/openstreetmap/**/*.java,org/w3/**/*.java,gnu/**/*.java,javax/**/*.java,oauth/**/*.java,com/**/*.java,images/**,org/openstreetmap/gui/**/*.png,data/**,styles/**,LICENSE,README,CONTRIBUTION,gpl-2.0.txt,gpl-3.0.txt
+jar.archive.disabled=${jnlp.enabled}
+jar.compress=false
+jar.index=${jnlp.enabled}
+javac.classpath=
+# Space-separated list of extra javac options
+javac.compilerargs=-Xlint:unchecked -Xlint:cast -Xlint:dep-ann -Xlint:divzero -Xlint:empty -Xlint:finally -Xlint:overrides -Xlint:static -Xlint:try  -Xlint:deprecation  
+javac.deprecation=true
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=1.7
+javac.target=1.7
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit.classpath}:\
+    ${libs.junit_4.classpath}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+jnlp.codebase.type=no.codebase
+jnlp.descriptor=application
+jnlp.enabled=false
+jnlp.mixed.code=default
+jnlp.offline-allowed=false
+jnlp.signed=false
+jnlp.signing=
+jnlp.signing.alias=
+jnlp.signing.keystore=
+main.class=org.openstreetmap.josm.gui.MainApplication
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.core.dir=${file.reference.core}
+src.dir=${file.reference.core-src}
+test.unit.dir=${file.reference.test-unit}
diff --git a/netbeans/nbproject/project.xml b/netbeans/nbproject/project.xml
index 139059f..f69bfcc 100644
--- a/netbeans/nbproject/project.xml
+++ b/netbeans/nbproject/project.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.java.j2seproject</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>josm</name>
-            <source-roots>
-                <root id="src.dir"/>
-                <root id="src.core.dir"/>
-            </source-roots>
-            <test-roots>
-                <root id="test.unit.dir"/>
-            </test-roots>
-        </data>
-    </configuration>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>josm</name>
+            <source-roots>
+                <root id="src.dir"/>
+                <root id="src.core.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.unit.dir"/>
+            </test-roots>
+        </data>
+    </configuration>
+</project>
diff --git a/src/org/openstreetmap/josm/actions/AbstractSelectAction.java b/src/org/openstreetmap/josm/actions/AbstractSelectAction.java
new file mode 100644
index 0000000..7f0e6e5
--- /dev/null
+++ b/src/org/openstreetmap/josm/actions/AbstractSelectAction.java
@@ -0,0 +1,24 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Superclass of "Select" actions in various parts of JOSM.
+ * @since 7949
+ */
+public abstract class AbstractSelectAction extends AbstractAction {
+
+    /**
+     * Constructs a new {@code AbstractSelectAction}.
+     */
+    public AbstractSelectAction() {
+        putValue(NAME, tr("Select"));
+        putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
index 948a7b5..600d485 100644
--- a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
@@ -21,6 +21,7 @@ import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
@@ -33,8 +34,10 @@ 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.Notification;
+import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
@@ -83,7 +86,7 @@ public class CreateMultipolygonAction extends JosmAction {
         private final Collection<Way> selectedWays;
         private final Relation multipolygonRelation;
 
-        public CreateUpdateMultipolygonTask(Collection<Way> selectedWays, Relation multipolygonRelation) {
+        private CreateUpdateMultipolygonTask(Collection<Way> selectedWays, Relation multipolygonRelation) {
             this.selectedWays = selectedWays;
             this.multipolygonRelation = multipolygonRelation;
         }
@@ -139,7 +142,7 @@ public class CreateMultipolygonAction extends JosmAction {
         final Collection<Way> selectedWays = Main.main.getCurrentDataSet().getSelectedWays();
         final Collection<Relation> selectedRelations = Main.main.getCurrentDataSet().getSelectedRelations();
 
-        if (selectedWays.size() < 1) {
+        if (selectedWays.isEmpty()) {
             // Sometimes it make sense creating multipoly of only one way (so it will form outer way)
             // and then splitting the way later (so there are multiple ways forming outer way)
             new Notification(
@@ -154,13 +157,18 @@ public class CreateMultipolygonAction extends JosmAction {
                 ? getSelectedMultipolygonRelation(selectedWays, selectedRelations)
                 : null;
 
-        // download incomplete relation if necessary
-        if (multipolygonRelation != null && (multipolygonRelation.isIncomplete() || multipolygonRelation.hasIncompleteMembers())) {
-            Main.worker.submit(new DownloadRelationTask(Collections.singleton(multipolygonRelation), Main.main.getEditLayer()));
+        // download incomplete relation or incomplete members if necessary
+        if (multipolygonRelation != null) {
+            if (!multipolygonRelation.isNew() && multipolygonRelation.isIncomplete()) {
+                Main.worker.submit(new DownloadRelationTask(Collections.singleton(multipolygonRelation), Main.main.getEditLayer()));
+            } else if (multipolygonRelation.hasIncompleteMembers()) {
+                Main.worker.submit(new DownloadRelationMemberTask(multipolygonRelation,
+                        DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(Collections.singleton(multipolygonRelation)),
+                        Main.main.getEditLayer()));
+            }
         }
         // create/update multipolygon relation
         Main.worker.submit(new CreateUpdateMultipolygonTask(selectedWays, multipolygonRelation));
-
     }
 
     private Relation getSelectedMultipolygonRelation() {
@@ -171,7 +179,7 @@ public class CreateMultipolygonAction extends JosmAction {
         if (selectedRelations.size() == 1 && "multipolygon".equals(selectedRelations.iterator().next().get("type"))) {
             return selectedRelations.iterator().next();
         } else {
-            final HashSet<Relation> relatedRelations = new HashSet<>();
+            final Set<Relation> relatedRelations = new HashSet<>();
             for (final Way w : selectedWays) {
                 relatedRelations.addAll(Utils.filteredCollection(w.getReferrers(), Relation.class));
             }
@@ -267,13 +275,18 @@ public class CreateMultipolygonAction extends JosmAction {
     private static MultipolygonBuilder analyzeWays(Collection<Way> selectedWays, boolean showNotif) {
 
         MultipolygonBuilder pol = new MultipolygonBuilder();
-        String error = pol.makeFromWays(selectedWays);
+        final String error = pol.makeFromWays(selectedWays);
 
         if (error != null) {
             if (showNotif) {
-                new Notification(error)
+                GuiHelper.runInEDT(new Runnable() {
+                    @Override
+                    public void run() {
+                        new Notification(error)
                         .setIcon(JOptionPane.INFORMATION_MESSAGE)
                         .show();
+                    }
+                });
             }
             return null;
         } else {
@@ -302,7 +315,7 @@ public class CreateMultipolygonAction extends JosmAction {
 
     private static void addMembers(JoinedPolygon polygon, Relation rel, String role) {
         final int count = rel.getMembersCount();
-        final HashSet<Way> ways = new HashSet<>(polygon.ways);
+        final Set<Way> ways = new HashSet<>(polygon.ways);
         for (int i = 0; i < count; i++) {
             final RelationMember m = rel.getMember(i);
             if (ways.contains(m.getMember()) && !role.equals(m.getRole())) {
diff --git a/src/org/openstreetmap/josm/actions/DownloadAlongAction.java b/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
index bdfe23c..70bff88 100644
--- a/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
@@ -1,120 +1,120 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.GridBagLayout;
-import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Future;
-
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadTaskList;
-import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- * Abstract superclass of DownloadAlongTrackAction and DownloadAlongWayAction
- * @since 6054
- */
-public abstract class DownloadAlongAction extends JosmAction {
-
-    /**
-     * Constructs a new {@code DownloadAlongAction}
-     * @param name the action's text as displayed in the menu
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     */
-    public DownloadAlongAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
-    }
-    
-    protected static void addToDownload(Area a, Rectangle2D r, Collection<Rectangle2D> results, double maxArea) {
-        Area tmp = new Area(r);
-        // intersect with sought-after area
-        tmp.intersect(a);
-        if (tmp.isEmpty()) {
-            return;
-        }
-        Rectangle2D bounds = tmp.getBounds2D();
-        if (bounds.getWidth() * bounds.getHeight() > maxArea) {
-            // the rectangle gets too large; split it and make recursive call.
-            Rectangle2D r1;
-            Rectangle2D r2;
-            if (bounds.getWidth() > bounds.getHeight()) {
-                // rectangles that are wider than high are split into a left and right half,
-                r1 = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth() / 2, bounds.getHeight());
-                r2 = new Rectangle2D.Double(bounds.getX() + bounds.getWidth() / 2, bounds.getY(),
-                        bounds.getWidth() / 2, bounds.getHeight());
-            } else {
-                // others into a top and bottom half.
-                r1 = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight() / 2);
-                r2 = new Rectangle2D.Double(bounds.getX(), bounds.getY() + bounds.getHeight() / 2, bounds.getWidth(),
-                        bounds.getHeight() / 2);
-            }
-            addToDownload(a, r1, results, maxArea);
-            addToDownload(a, r2, results, maxArea);
-        } else {
-            results.add(bounds);
-        }
-    }
-    
-    /**
-     * Area "a" contains the hull that we would like to download data for. however we
-     * can only download rectangles, so the following is an attempt at finding a number of
-     * rectangles to download.
-     *
-     * The idea is simply: Start out with the full bounding box. If it is too large, then
-     * split it in half and repeat recursively for each half until you arrive at something
-     * small enough to download. The algorithm is improved by always using the intersection
-     * between the rectangle and the actual desired area. For example, if you have a track
-     * that goes like this: +----+ | /| | / | | / | |/ | +----+ then we would first look at
-     * downloading the whole rectangle (assume it's too big), after that we split it in half
-     * (upper and lower half), but we donot request the full upper and lower rectangle, only
-     * the part of the upper/lower rectangle that actually has something in it.
-     *
-     * This functions calculates the rectangles, asks the user to continue and downloads
-     * the areas if applicable.
-     */
-    protected static void confirmAndDownloadAreas(Area a, double maxArea, boolean osmDownload, boolean gpxDownload, String title, ProgressMonitor progressMonitor) {
-        List<Rectangle2D> toDownload = new ArrayList<>();
-        addToDownload(a, a.getBounds(), toDownload, maxArea);
-        if (toDownload.isEmpty()) {
-            return;
-        }
-        JPanel msg = new JPanel(new GridBagLayout());
-        msg.add(new JLabel(tr("<html>This action will require {0} individual<br>" + "download requests. Do you wish<br>to continue?</html>", toDownload.size())), GBC.eol());
-        if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent, msg, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE)) {
-            return;
-        }
-        final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(tr("Download data"));
-        final Future<?> future = new DownloadTaskList().download(false, toDownload, osmDownload, gpxDownload, monitor);
-        Main.worker.submit(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    future.get();
-                } catch (Exception e) {
-                    Main.error(e);
-                    return;
-                }
-                monitor.close();
-            }
-        });
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagLayout;
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Future;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadTaskList;
+import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Abstract superclass of DownloadAlongTrackAction and DownloadAlongWayAction
+ * @since 6054
+ */
+public abstract class DownloadAlongAction extends JosmAction {
+
+    /**
+     * Constructs a new {@code DownloadAlongAction}
+     * @param name the action's text as displayed in the menu
+     * @param iconName the filename of the icon to use
+     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
+     *           that html is not supported for menu actions on some platforms.
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *            do want a shortcut, remember you can always register it with group=none, so you
+     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *            the user CANNOT configure a shortcut for your action.
+     * @param registerInToolbar register this action for the toolbar preferences?
+     */
+    public DownloadAlongAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
+        super(name, iconName, tooltip, shortcut, registerInToolbar);
+    }
+    
+    protected static void addToDownload(Area a, Rectangle2D r, Collection<Rectangle2D> results, double maxArea) {
+        Area tmp = new Area(r);
+        // intersect with sought-after area
+        tmp.intersect(a);
+        if (tmp.isEmpty()) {
+            return;
+        }
+        Rectangle2D bounds = tmp.getBounds2D();
+        if (bounds.getWidth() * bounds.getHeight() > maxArea) {
+            // the rectangle gets too large; split it and make recursive call.
+            Rectangle2D r1;
+            Rectangle2D r2;
+            if (bounds.getWidth() > bounds.getHeight()) {
+                // rectangles that are wider than high are split into a left and right half,
+                r1 = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth() / 2, bounds.getHeight());
+                r2 = new Rectangle2D.Double(bounds.getX() + bounds.getWidth() / 2, bounds.getY(),
+                        bounds.getWidth() / 2, bounds.getHeight());
+            } else {
+                // others into a top and bottom half.
+                r1 = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight() / 2);
+                r2 = new Rectangle2D.Double(bounds.getX(), bounds.getY() + bounds.getHeight() / 2, bounds.getWidth(),
+                        bounds.getHeight() / 2);
+            }
+            addToDownload(a, r1, results, maxArea);
+            addToDownload(a, r2, results, maxArea);
+        } else {
+            results.add(bounds);
+        }
+    }
+    
+    /**
+     * Area "a" contains the hull that we would like to download data for. however we
+     * can only download rectangles, so the following is an attempt at finding a number of
+     * rectangles to download.
+     *
+     * The idea is simply: Start out with the full bounding box. If it is too large, then
+     * split it in half and repeat recursively for each half until you arrive at something
+     * small enough to download. The algorithm is improved by always using the intersection
+     * between the rectangle and the actual desired area. For example, if you have a track
+     * that goes like this: +----+ | /| | / | | / | |/ | +----+ then we would first look at
+     * downloading the whole rectangle (assume it's too big), after that we split it in half
+     * (upper and lower half), but we donot request the full upper and lower rectangle, only
+     * the part of the upper/lower rectangle that actually has something in it.
+     *
+     * This functions calculates the rectangles, asks the user to continue and downloads
+     * the areas if applicable.
+     */
+    protected static void confirmAndDownloadAreas(Area a, double maxArea, boolean osmDownload, boolean gpxDownload, String title, ProgressMonitor progressMonitor) {
+        List<Rectangle2D> toDownload = new ArrayList<>();
+        addToDownload(a, a.getBounds(), toDownload, maxArea);
+        if (toDownload.isEmpty()) {
+            return;
+        }
+        JPanel msg = new JPanel(new GridBagLayout());
+        msg.add(new JLabel(tr("<html>This action will require {0} individual<br>" + "download requests. Do you wish<br>to continue?</html>", toDownload.size())), GBC.eol());
+        if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent, msg, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE)) {
+            return;
+        }
+        final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(tr("Download data"));
+        final Future<?> future = new DownloadTaskList().download(false, toDownload, osmDownload, gpxDownload, monitor);
+        Main.worker.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    future.get();
+                } catch (Exception e) {
+                    Main.error(e);
+                    return;
+                }
+                monitor.close();
+            }
+        });
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index 72b4a6a..0bba0ed 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -462,6 +462,12 @@ public class JoinAreasAction extends JosmAction {
         //user canceled, do nothing.
 
         try {
+            // see #11026 - Because <ways> is a dynamic filtered (on ways) of a filtered (on selected objects) collection,
+            // retrieve effective dataset before joining the ways (which affects the selection, thus, the <ways> collection)
+            // Dataset retrieving allows to call this code without relying on Main.getCurrentDataSet(), thus, on a mapview instance
+            DataSet ds = ways.iterator().next().getDataSet();
+
+            // Do the job of joining areas
             JoinAreasResult result = joinAreas(areas);
 
             if (result.hasChanges) {
@@ -477,7 +483,6 @@ public class JoinAreasAction extends JosmAction {
                     allWays.add(pol.outerWay);
                     allWays.addAll(pol.innerWays);
                 }
-                DataSet ds = Main.main.getCurrentDataSet();
                 if (ds != null) {
                     ds.setSelected(allWays);
                     Main.map.mapView.repaint();
diff --git a/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java b/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java
index 515c893..1655936 100644
--- a/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java
+++ b/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java
@@ -1,21 +1,21 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import java.util.Collection;
-
-import javax.swing.Action;
-
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-
-/**
- * Interface used to enable/disable all primitive-related actions, even those registered by plugins.
- * @since 5821
- */
-public interface OsmPrimitiveAction extends Action {
-
-    /**
-     * Specifies the working set of primitives.
-     * @param primitives The new working set of primitives. Can be null or empty
-     */
-    public abstract void setPrimitives(Collection<? extends OsmPrimitive> primitives);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import java.util.Collection;
+
+import javax.swing.Action;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Interface used to enable/disable all primitive-related actions, even those registered by plugins.
+ * @since 5821
+ */
+public interface OsmPrimitiveAction extends Action {
+
+    /**
+     * Specifies the working set of primitives.
+     * @param primitives The new working set of primitives. Can be null or empty
+     */
+    public abstract void setPrimitives(Collection<? extends OsmPrimitive> primitives);
+}
diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
index b1a4fc9..913752b 100644
--- a/src/org/openstreetmap/josm/actions/PasteAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAction.java
@@ -92,7 +92,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
         // We previously checked for modifier to know if the action has been trigerred via shortcut or via menu
         // But this does not work if the shortcut is changed to a single key (see #9055)
         // Observed behaviour: getActionCommand() returns Action.NAME when triggered via menu, but shortcut text when triggered with it
-        if (!getValue(NAME).equals(e.getActionCommand())) {
+        if (e != null && !getValue(NAME).equals(e.getActionCommand())) {
             final Point mp = MouseInfo.getPointerInfo().getLocation();
             final Point tl = Main.map.mapView.getLocationOnScreen();
             final Point pos = new Point(mp.x-tl.x, mp.y-tl.y);
diff --git a/src/org/openstreetmap/josm/actions/ReportBugAction.java b/src/org/openstreetmap/josm/actions/ReportBugAction.java
index 7d86663..9bececa 100644
--- a/src/org/openstreetmap/josm/actions/ReportBugAction.java
+++ b/src/org/openstreetmap/josm/actions/ReportBugAction.java
@@ -1,49 +1,49 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-import org.openstreetmap.josm.tools.BugReportExceptionHandler;
-import org.openstreetmap.josm.tools.OpenBrowser;
-import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Reports a ticket to JOSM bugtracker.
- * @since 7624
- */
-public class ReportBugAction extends JosmAction {
-
-    /**
-     * Constructs a new {@code ReportBugAction}.
-     */
-    public ReportBugAction() {
-        super(tr("Report bug"), "bug.png", tr("Report a ticket to JOSM bugtracker"),
-                Shortcut.registerShortcut("reportbug", tr("Report a ticket to JOSM bugtracker"),
-                        KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), true);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        reportBug();
-    }
-
-    /**
-     * Reports a ticket to JOSM bugtracker.
-     */
-    public static void reportBug() {
-        reportBug(ShowStatusReportAction.getReportHeader());
-    }
-
-    /**
-     * Reports a ticket to JOSM bugtracker with given status report.
-     * @param report Status report header containing technical, non-personal information
-     */
-    public static void reportBug(String report) {
-        OpenBrowser.displayUrl(BugReportExceptionHandler.getBugReportUrl(
-                Utils.strip(report)).toExternalForm());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.tools.BugReportExceptionHandler;
+import org.openstreetmap.josm.tools.OpenBrowser;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Reports a ticket to JOSM bugtracker.
+ * @since 7624
+ */
+public class ReportBugAction extends JosmAction {
+
+    /**
+     * Constructs a new {@code ReportBugAction}.
+     */
+    public ReportBugAction() {
+        super(tr("Report bug"), "bug.png", tr("Report a ticket to JOSM bugtracker"),
+                Shortcut.registerShortcut("reportbug", tr("Report a ticket to JOSM bugtracker"),
+                        KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        reportBug();
+    }
+
+    /**
+     * Reports a ticket to JOSM bugtracker.
+     */
+    public static void reportBug() {
+        reportBug(ShowStatusReportAction.getReportHeader());
+    }
+
+    /**
+     * Reports a ticket to JOSM bugtracker with given status report.
+     * @param report Status report header containing technical, non-personal information
+     */
+    public static void reportBug(String report) {
+        OpenBrowser.displayUrl(BugReportExceptionHandler.getBugReportUrl(
+                Utils.strip(report)).toExternalForm());
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java b/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
index 016ad44..d32bd8f 100644
--- a/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
@@ -4,11 +4,13 @@ package org.openstreetmap.josm.actions;
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.TreeMap;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.BBox;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -29,16 +31,20 @@ public class SelectByInternalPointAction extends JosmAction {
      * @param internalPoint the internal point.
      */
     public static Collection<OsmPrimitive> getSurroundingObjects(EastNorth internalPoint) {
+        final DataSet ds = getCurrentDataSet();
+        if (ds == null) {
+            return Collections.emptySet();
+        }
         final Node n = new Node(internalPoint);
         final TreeMap<Double, OsmPrimitive> found = new TreeMap<>();
-        for (Way w : getCurrentDataSet().getWays()) {
+        for (Way w : ds.getWays()) {
             if (w.isUsable() && w.isClosed()) {
                 if (Geometry.nodeInsidePolygon(n, w.getNodes())) {
                     found.put(Geometry.closedWayArea(w), w);
                 }
             }
         }
-        for (Relation r : getCurrentDataSet().getRelations()) {
+        for (Relation r : ds.getRelations()) {
             if (r.isUsable() && r.isMultipolygon()) {
                 if (Geometry.isNodeInsideMultiPolygon(n, r, null)) {
                     for (RelationMember m : r.getMembers()) {
diff --git a/src/org/openstreetmap/josm/actions/ToggleAction.java b/src/org/openstreetmap/josm/actions/ToggleAction.java
index 608ff23..b8c4214 100644
--- a/src/org/openstreetmap/josm/actions/ToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ToggleAction.java
@@ -1,132 +1,132 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ButtonModel;
-import javax.swing.JCheckBox;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JRadioButton;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JToggleButton;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- * Abtract class for Toggle Actions.
- * @since 6220
- */
-public abstract class ToggleAction extends JosmAction {
-
-    private final List<ButtonModel> buttonModels = new ArrayList<>();
-
-    /**
-     * Constructs a {@code ToggleAction}.
-     *
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param icon the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
-     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
-     */
-    public ToggleAction(String name, ImageProvider icon, String tooltip, Shortcut shortcut, boolean registerInToolbar, String toolbarId, boolean installAdapters) {
-        super(name, icon, tooltip, shortcut, registerInToolbar, toolbarId, installAdapters);
-        // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
-        setSelected(false);
-    }
-
-    /**
-     * Constructs a {@code ToggleAction}.
-     *
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the name of icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     */
-    public ToggleAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
-        // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
-        setSelected(false);
-    }
-
-    protected final void setSelected(boolean selected) {
-        putValue(SELECTED_KEY, selected);
-    }
-
-    /**
-     * Determines if this action is currently being selected.
-     * @return {@code true} if this action is currently being selected, {@code false} otherwise
-     */
-    public final boolean isSelected() {
-        Object selected = getValue(SELECTED_KEY);
-        if (selected instanceof Boolean) {
-            return (Boolean) selected;
-        } else {
-            Main.warn(getClass().getName()+" does not define a boolean for SELECTED_KEY but "+selected+". You should report it to JOSM developers.");
-            return false;
-        }
-    }
-
-    /**
-     * Adds a button model
-     * @param model The button model to add
-     */
-    public final void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-            model.setSelected(isSelected());
-        }
-    }
-
-    /**
-     * Removes a button model
-     * @param model The button model to remove
-     */
-    public final void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        boolean selected = isSelected();
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    /**
-     * Toggles the selcted action state, if needed according to the ActionEvent that trigerred the action.
-     * This method will do nothing if the action event comes from a Swing component supporting the SELECTED_KEY property because the component already set the selected state.
-     * This method needs to be called especially if the action is associated with a keyboard shortcut to ensure correct selected state.
-     * @see <a href="https://weblogs.java.net/blog/zixle/archive/2005/11/changes_to_acti.html">Changes to Actions in 1.6</a>
-     * @see <a href="http://docs.oracle.com/javase/6/docs/api/javax/swing/Action.html">Interface Action</a>
-     */
-    protected final void toggleSelectedState(ActionEvent e) {
-        if (e == null || !(e.getSource() instanceof JToggleButton ||
-                           e.getSource() instanceof JCheckBox ||
-                           e.getSource() instanceof JRadioButton ||
-                           e.getSource() instanceof JCheckBoxMenuItem ||
-                           e.getSource() instanceof JRadioButtonMenuItem
-                           )) {
-            setSelected(!isSelected());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.ButtonModel;
+import javax.swing.JCheckBox;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JRadioButton;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JToggleButton;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Abtract class for Toggle Actions.
+ * @since 6220
+ */
+public abstract class ToggleAction extends JosmAction {
+
+    private final List<ButtonModel> buttonModels = new ArrayList<>();
+
+    /**
+     * Constructs a {@code ToggleAction}.
+     *
+     * @param name the action's text as displayed on the menu (if it is added to a menu)
+     * @param icon the icon to use
+     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
+     *           that html is not supported for menu actions on some platforms.
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *            do want a shortcut, remember you can always register it with group=none, so you
+     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *            the user CANNOT configure a shortcut for your action.
+     * @param registerInToolbar register this action for the toolbar preferences?
+     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
+     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     */
+    public ToggleAction(String name, ImageProvider icon, String tooltip, Shortcut shortcut, boolean registerInToolbar, String toolbarId, boolean installAdapters) {
+        super(name, icon, tooltip, shortcut, registerInToolbar, toolbarId, installAdapters);
+        // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
+        setSelected(false);
+    }
+
+    /**
+     * Constructs a {@code ToggleAction}.
+     *
+     * @param name the action's text as displayed on the menu (if it is added to a menu)
+     * @param iconName the name of icon to use
+     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
+     *           that html is not supported for menu actions on some platforms.
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *            do want a shortcut, remember you can always register it with group=none, so you
+     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *            the user CANNOT configure a shortcut for your action.
+     * @param registerInToolbar register this action for the toolbar preferences?
+     */
+    public ToggleAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
+        super(name, iconName, tooltip, shortcut, registerInToolbar);
+        // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
+        setSelected(false);
+    }
+
+    protected final void setSelected(boolean selected) {
+        putValue(SELECTED_KEY, selected);
+    }
+
+    /**
+     * Determines if this action is currently being selected.
+     * @return {@code true} if this action is currently being selected, {@code false} otherwise
+     */
+    public final boolean isSelected() {
+        Object selected = getValue(SELECTED_KEY);
+        if (selected instanceof Boolean) {
+            return (Boolean) selected;
+        } else {
+            Main.warn(getClass().getName()+" does not define a boolean for SELECTED_KEY but "+selected+". You should report it to JOSM developers.");
+            return false;
+        }
+    }
+
+    /**
+     * Adds a button model
+     * @param model The button model to add
+     */
+    public final void addButtonModel(ButtonModel model) {
+        if (model != null && !buttonModels.contains(model)) {
+            buttonModels.add(model);
+            model.setSelected(isSelected());
+        }
+    }
+
+    /**
+     * Removes a button model
+     * @param model The button model to remove
+     */
+    public final void removeButtonModel(ButtonModel model) {
+        if (model != null && buttonModels.contains(model)) {
+            buttonModels.remove(model);
+        }
+    }
+
+    protected void notifySelectedState() {
+        boolean selected = isSelected();
+        for (ButtonModel model: buttonModels) {
+            if (model.isSelected() != selected) {
+                model.setSelected(selected);
+            }
+        }
+    }
+
+    /**
+     * Toggles the selcted action state, if needed according to the ActionEvent that trigerred the action.
+     * This method will do nothing if the action event comes from a Swing component supporting the SELECTED_KEY property because the component already set the selected state.
+     * This method needs to be called especially if the action is associated with a keyboard shortcut to ensure correct selected state.
+     * @see <a href="https://weblogs.java.net/blog/zixle/archive/2005/11/changes_to_acti.html">Changes to Actions in 1.6</a>
+     * @see <a href="http://docs.oracle.com/javase/6/docs/api/javax/swing/Action.html">Interface Action</a>
+     */
+    protected final void toggleSelectedState(ActionEvent e) {
+        if (e == null || !(e.getSource() instanceof JToggleButton ||
+                           e.getSource() instanceof JCheckBox ||
+                           e.getSource() instanceof JRadioButton ||
+                           e.getSource() instanceof JCheckBoxMenuItem ||
+                           e.getSource() instanceof JRadioButtonMenuItem
+                           )) {
+            setSelected(!isSelected());
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java b/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java
index 9079879..d25e460 100644
--- a/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java
@@ -1,25 +1,25 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-
-public class ToggleUploadDiscouragedLayerAction extends JosmAction {
-
-    private OsmDataLayer layer;
-    
-    public ToggleUploadDiscouragedLayerAction(OsmDataLayer layer) {
-        super(tr("Encourage/discourage upload"), null, null, null, false);
-        this.layer = layer;
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        layer.setUploadDiscouraged(!layer.isUploadDiscouraged());
-        LayerListDialog.getInstance().repaint();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+public class ToggleUploadDiscouragedLayerAction extends JosmAction {
+
+    private OsmDataLayer layer;
+    
+    public ToggleUploadDiscouragedLayerAction(OsmDataLayer layer) {
+        super(tr("Encourage/discourage upload"), null, null, null, false);
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        layer.setUploadDiscouraged(!layer.isUploadDiscouraged());
+        LayerListDialog.getInstance().repaint();
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/ZoomToAction.java b/src/org/openstreetmap/josm/actions/ZoomToAction.java
index 125c8f7..c76a2e0 100644
--- a/src/org/openstreetmap/josm/actions/ZoomToAction.java
+++ b/src/org/openstreetmap/josm/actions/ZoomToAction.java
@@ -1,113 +1,113 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListTable;
-import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-
-public class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
-
-    private final OsmPrimitivesTable table;
-    
-    private final String descriptionNominal;
-    private final String descriptionInactiveLayer;
-    private final String descriptionNoSelection;
-    
-    public ZoomToAction(OsmPrimitivesTable table, String descriptionNominal, String descriptionInactiveLayer, String descriptionNoSelection) {
-        CheckParameterUtil.ensureParameterNotNull(table);
-        this.table = table;
-        this.descriptionNominal = descriptionNominal;
-        this.descriptionInactiveLayer = descriptionInactiveLayer;
-        this.descriptionNoSelection = descriptionNoSelection;
-        putValue(NAME, tr("Zoom to"));
-        putValue(SHORT_DESCRIPTION, descriptionNominal);
-        updateEnabledState();
-    }
-    
-    public ZoomToAction(MemberTable table) {
-        this(table, 
-                tr("Zoom to the object the first selected member refers to"),
-                tr("Zooming disabled because layer of this relation is not active"),
-                tr("Zooming disabled because there is no selected member"));
-    }
-    
-    public ZoomToAction(RelationMemberTable table) {
-        this(table, 
-                tr("Zoom to the object the first selected member refers to"),
-                tr("Zooming disabled because layer of this relation is not active"),
-                tr("Zooming disabled because there is no selected member"));
-    }
-    
-    public ZoomToAction(NodeListTable table) {
-        this(table, 
-                tr("Zoom to the first selected node"),
-                tr("Zooming disabled because layer of this way is not active"),
-                tr("Zooming disabled because there is no selected node"));
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (! isEnabled())
-            return;
-        int[] rows = this.table.getSelectedRows();
-        if (rows == null || rows.length == 0)
-            return;
-        int row = rows[0];
-        OsmDataLayer layer = this.table.getLayer();
-        OsmPrimitive primitive = this.table.getPrimitiveInLayer(row, layer);
-        if (layer != null && primitive != null) {
-            layer.data.setSelected(primitive);
-            AutoScaleAction.autoScale("selection");
-        }
-    }
-
-    protected final void updateEnabledState() {
-        if (Main.main == null || Main.main.getEditLayer() != this.table.getLayer()) {
-            setEnabled(false);
-            putValue(SHORT_DESCRIPTION, descriptionInactiveLayer);
-            return;
-        }
-        if (this.table.getSelectedRowCount() == 0) {
-            setEnabled(false);
-            putValue(SHORT_DESCRIPTION, descriptionNoSelection);
-            return;
-        }
-        setEnabled(true);
-        putValue(SHORT_DESCRIPTION, descriptionNominal);
-    }
-
-    @Override
-    public void valueChanged(ListSelectionEvent e) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        updateEnabledState();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListTable;
+import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
+public class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+
+    private final OsmPrimitivesTable table;
+    
+    private final String descriptionNominal;
+    private final String descriptionInactiveLayer;
+    private final String descriptionNoSelection;
+    
+    public ZoomToAction(OsmPrimitivesTable table, String descriptionNominal, String descriptionInactiveLayer, String descriptionNoSelection) {
+        CheckParameterUtil.ensureParameterNotNull(table);
+        this.table = table;
+        this.descriptionNominal = descriptionNominal;
+        this.descriptionInactiveLayer = descriptionInactiveLayer;
+        this.descriptionNoSelection = descriptionNoSelection;
+        putValue(NAME, tr("Zoom to"));
+        putValue(SHORT_DESCRIPTION, descriptionNominal);
+        updateEnabledState();
+    }
+    
+    public ZoomToAction(MemberTable table) {
+        this(table, 
+                tr("Zoom to the object the first selected member refers to"),
+                tr("Zooming disabled because layer of this relation is not active"),
+                tr("Zooming disabled because there is no selected member"));
+    }
+    
+    public ZoomToAction(RelationMemberTable table) {
+        this(table, 
+                tr("Zoom to the object the first selected member refers to"),
+                tr("Zooming disabled because layer of this relation is not active"),
+                tr("Zooming disabled because there is no selected member"));
+    }
+    
+    public ZoomToAction(NodeListTable table) {
+        this(table, 
+                tr("Zoom to the first selected node"),
+                tr("Zooming disabled because layer of this way is not active"),
+                tr("Zooming disabled because there is no selected node"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (! isEnabled())
+            return;
+        int[] rows = this.table.getSelectedRows();
+        if (rows == null || rows.length == 0)
+            return;
+        int row = rows[0];
+        OsmDataLayer layer = this.table.getLayer();
+        OsmPrimitive primitive = this.table.getPrimitiveInLayer(row, layer);
+        if (layer != null && primitive != null) {
+            layer.data.setSelected(primitive);
+            AutoScaleAction.autoScale("selection");
+        }
+    }
+
+    protected final void updateEnabledState() {
+        if (Main.main == null || Main.main.getEditLayer() != this.table.getLayer()) {
+            setEnabled(false);
+            putValue(SHORT_DESCRIPTION, descriptionInactiveLayer);
+            return;
+        }
+        if (this.table.getSelectedRowCount() == 0) {
+            setEnabled(false);
+            putValue(SHORT_DESCRIPTION, descriptionNoSelection);
+            return;
+        }
+        setEnabled(true);
+        putValue(SHORT_DESCRIPTION, descriptionNominal);
+    }
+
+    @Override
+    public void valueChanged(ListSelectionEvent e) {
+        updateEnabledState();
+    }
+
+    @Override
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        updateEnabledState();
+    }
+
+    @Override
+    public void layerAdded(Layer newLayer) {
+        updateEnabledState();
+    }
+
+    @Override
+    public void layerRemoved(Layer oldLayer) {
+        updateEnabledState();
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java
index b488c3c..636e634 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java
@@ -1,54 +1,54 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.downloadtasks;
-
-import java.util.concurrent.Future;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerLocationReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-
-/**
- * Task allowing to download compressed OSM-Change files (gzip and bzip2)
- * @since 5361
- */
-public class DownloadOsmChangeCompressedTask extends DownloadOsmChangeTask {
-
-    @Override
-    public String[] getPatterns() {
-        return new String[]{"https?://.*/.*\\.osc.(gz|bz2?)"};
-    }
-
-    @Override
-    public String getTitle() {
-        return tr("Download Compressed OSM Change");
-    }
-    
-    /**
-     * Loads a given URL
-     * @param new_layer {@code true} if the data should be saved to a new layer
-     * @param url The URL as String
-     * @param progressMonitor progress monitor for user interaction
-     */
-    @Override
-    public Future<?> loadUrl(boolean new_layer, final String url, ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor) {
-            @Override
-            protected DataSet parseDataSet() throws OsmTransferException {
-                ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
-                if (url.matches("https?://.*/.*\\.osc.bz2?")) {
-                    return reader.parseOsmChangeBzip2(subTaskMonitor);
-                } else {
-                    return reader.parseOsmChangeGzip(subTaskMonitor);
-                }
-            }
-        };
-        currentBounds = null;
-        // Extract .osc.gz/bz/bz2 filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osc.(gz|bz2?))", url);
-        return Main.worker.submit(downloadTask);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import java.util.concurrent.Future;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.OsmServerLocationReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+/**
+ * Task allowing to download compressed OSM-Change files (gzip and bzip2)
+ * @since 5361
+ */
+public class DownloadOsmChangeCompressedTask extends DownloadOsmChangeTask {
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{"https?://.*/.*\\.osc.(gz|bz2?)"};
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download Compressed OSM Change");
+    }
+    
+    /**
+     * Loads a given URL
+     * @param new_layer {@code true} if the data should be saved to a new layer
+     * @param url The URL as String
+     * @param progressMonitor progress monitor for user interaction
+     */
+    @Override
+    public Future<?> loadUrl(boolean new_layer, final String url, ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor) {
+            @Override
+            protected DataSet parseDataSet() throws OsmTransferException {
+                ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
+                if (url.matches("https?://.*/.*\\.osc.bz2?")) {
+                    return reader.parseOsmChangeBzip2(subTaskMonitor);
+                } else {
+                    return reader.parseOsmChangeGzip(subTaskMonitor);
+                }
+            }
+        };
+        currentBounds = null;
+        // Extract .osc.gz/bz/bz2 filename from URL to set the new layer name
+        extractOsmFilename("https?://.*/(.*\\.osc.(gz|bz2?))", url);
+        return Main.worker.submit(downloadTask);
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
index a0c52d7..491fb18 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
@@ -1,207 +1,207 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.downloadtasks;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Future;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.NodeData;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.PrimitiveData;
-import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.RelationData;
-import org.openstreetmap.josm.data.osm.RelationMemberData;
-import org.openstreetmap.josm.data.osm.WayData;
-import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
-import org.openstreetmap.josm.data.osm.history.HistoryNode;
-import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.data.osm.history.HistoryRelation;
-import org.openstreetmap.josm.data.osm.history.HistoryWay;
-import org.openstreetmap.josm.gui.history.HistoryLoadTask;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerLocationReader;
-import org.openstreetmap.josm.io.OsmServerReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-
-/**
- * Task allowing to download OsmChange data (http://wiki.openstreetmap.org/wiki/OsmChange).
- * @since 4530
- */
-public class DownloadOsmChangeTask extends DownloadOsmTask {
-
-    @Override
-    public String[] getPatterns() {
-        return new String[]{"https?://.*/api/0.6/changeset/\\p{Digit}+/download", // OSM API 0.6 changesets
-            "https?://.*/.*\\.osc" // Remote .osc files
-        };
-    }
-
-    @Override
-    public String getTitle() {
-        return tr("Download OSM Change");
-    }
-
-    @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea,
-            ProgressMonitor progressMonitor) {
-        return null;
-    }
-
-    @Override
-    public Future<?> loadUrl(boolean new_layer, String url,
-            ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(new_layer,
-                new OsmServerLocationReader(url),
-                progressMonitor);
-        // Extract .osc filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osc)", url);
-        return Main.worker.submit(downloadTask);
-    }
-
-    protected class DownloadTask extends DownloadOsmTask.DownloadTask {
-
-        public DownloadTask(boolean newLayer, OsmServerReader reader,
-                ProgressMonitor progressMonitor) {
-            super(newLayer, reader, progressMonitor);
-        }
-
-        @Override
-        protected DataSet parseDataSet() throws OsmTransferException {
-            return reader.parseOsmChange(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
-        }
-
-        @Override
-        protected void finish() {
-            super.finish();
-            if (isFailed() || isCanceled() || downloadedData == null)
-                return; // user canceled download or error occurred
-            try {
-                // A changeset does not contain all referred primitives, this is the map of incomplete ones
-                // For each incomplete primitive, we'll have to get its state at date it was referred
-                Map<OsmPrimitive, Date> toLoad = new HashMap<>();
-                for (OsmPrimitive p : downloadedData.allNonDeletedPrimitives()) {
-                    if (p.isIncomplete()) {
-                        Date timestamp = null;
-                        for (OsmPrimitive ref : p.getReferrers()) {
-                            if (!ref.isTimestampEmpty()) {
-                                timestamp = ref.getTimestamp();
-                                break;
-                            }
-                        }
-                        toLoad.put(p, timestamp);
-                    }
-                }
-                if (isCanceled()) return;
-                // Let's load all required history
-                Main.worker.submit(new HistoryLoaderAndListener(toLoad));
-            } catch (Exception e) {
-                rememberException(e);
-                setFailed(true);
-            }
-        }
-    }
-
-    /**
-     * Loads history and updates incomplete primitives.
-     */
-    private static class HistoryLoaderAndListener extends HistoryLoadTask implements HistoryDataSetListener {
-
-        private final Map<OsmPrimitive, Date> toLoad;
-
-        public HistoryLoaderAndListener(Map<OsmPrimitive, Date> toLoad) {
-            this.toLoad = toLoad;
-            add(toLoad.keySet());
-            // Updating process is done after all history requests have been made
-            HistoryDataSet.getInstance().addHistoryDataSetListener(this);
-        }
-
-        @Override
-        public void historyUpdated(HistoryDataSet source, PrimitiveId id) {
-            Map<OsmPrimitive, Date> toLoadNext = new HashMap<>();
-            for (Iterator<OsmPrimitive> it = toLoad.keySet().iterator(); it.hasNext();) {
-                OsmPrimitive p = it.next();
-                History history = source.getHistory(p.getPrimitiveId());
-                Date date = toLoad.get(p);
-                // If the history has been loaded and a timestamp is known
-                if (history != null && date != null) {
-                    // Lookup for the primitive version at the specified timestamp
-                    HistoryOsmPrimitive hp = history.getByDate(date);
-                    if (hp != null) {
-                        PrimitiveData data = null;
-
-                        switch (p.getType()) {
-                        case NODE:
-                            data = new NodeData();
-                            ((NodeData)data).setCoor(((HistoryNode)hp).getCoords());
-                            break;
-                        case WAY:
-                            data = new WayData();
-                            List<Long> nodeIds = ((HistoryWay)hp).getNodes();
-                            ((WayData)data).setNodes(nodeIds);
-                            // Find incomplete nodes to load at next run
-                            for (Long nodeId : nodeIds) {
-                                if (p.getDataSet().getPrimitiveById(nodeId, OsmPrimitiveType.NODE) == null) {
-                                    Node n = new Node(nodeId);
-                                    p.getDataSet().addPrimitive(n);
-                                    toLoadNext.put(n, date);
-                                }
-                            }
-                            break;
-                        case RELATION:
-                            data = new RelationData();
-                            List<RelationMemberData> members = ((HistoryRelation)hp).getMembers();
-                            ((RelationData)data).setMembers(members);
-                            break;
-                        default: throw new AssertionError("Unknown primitive type");
-                        }
-
-                        data.setUser(hp.getUser());
-                        try {
-                            data.setVisible(hp.isVisible());
-                        } catch (IllegalStateException e) {
-                            Main.error("Cannot change visibility for "+p+": "+e.getMessage());
-                        }
-                        data.setTimestamp(hp.getTimestamp());
-                        data.setKeys(hp.getTags());
-                        data.setOsmId(hp.getId(), (int) hp.getVersion());
-
-                        // Load the history data
-                        try {
-                            p.load(data);
-                            // Forget this primitive
-                            it.remove();
-                        } catch (AssertionError e) {
-                            Main.error("Cannot load "+p + ": " + e.getMessage());
-                        }
-                    }
-                }
-            }
-            source.removeHistoryDataSetListener(this);
-            if (toLoadNext.isEmpty()) {
-                // No more primitive to update. Processing is finished
-                // Be sure all updated primitives are correctly drawn
-                Main.map.repaint();
-            } else {
-                // Some primitives still need to be loaded
-                // Let's load all required history
-                Main.worker.submit(new HistoryLoaderAndListener(toLoadNext));
-            }
-        }
-
-        @Override
-        public void historyDataSetCleared(HistoryDataSet source) {
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.NodeData;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.RelationData;
+import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.WayData;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
+import org.openstreetmap.josm.data.osm.history.HistoryNode;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryRelation;
+import org.openstreetmap.josm.data.osm.history.HistoryWay;
+import org.openstreetmap.josm.gui.history.HistoryLoadTask;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.OsmServerLocationReader;
+import org.openstreetmap.josm.io.OsmServerReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+/**
+ * Task allowing to download OsmChange data (http://wiki.openstreetmap.org/wiki/OsmChange).
+ * @since 4530
+ */
+public class DownloadOsmChangeTask extends DownloadOsmTask {
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{"https?://.*/api/0.6/changeset/\\p{Digit}+/download", // OSM API 0.6 changesets
+            "https?://.*/.*\\.osc" // Remote .osc files
+        };
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download OSM Change");
+    }
+
+    @Override
+    public Future<?> download(boolean newLayer, Bounds downloadArea,
+            ProgressMonitor progressMonitor) {
+        return null;
+    }
+
+    @Override
+    public Future<?> loadUrl(boolean new_layer, String url,
+            ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(new_layer,
+                new OsmServerLocationReader(url),
+                progressMonitor);
+        // Extract .osc filename from URL to set the new layer name
+        extractOsmFilename("https?://.*/(.*\\.osc)", url);
+        return Main.worker.submit(downloadTask);
+    }
+
+    protected class DownloadTask extends DownloadOsmTask.DownloadTask {
+
+        public DownloadTask(boolean newLayer, OsmServerReader reader,
+                ProgressMonitor progressMonitor) {
+            super(newLayer, reader, progressMonitor);
+        }
+
+        @Override
+        protected DataSet parseDataSet() throws OsmTransferException {
+            return reader.parseOsmChange(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
+        }
+
+        @Override
+        protected void finish() {
+            super.finish();
+            if (isFailed() || isCanceled() || downloadedData == null)
+                return; // user canceled download or error occurred
+            try {
+                // A changeset does not contain all referred primitives, this is the map of incomplete ones
+                // For each incomplete primitive, we'll have to get its state at date it was referred
+                Map<OsmPrimitive, Date> toLoad = new HashMap<>();
+                for (OsmPrimitive p : downloadedData.allNonDeletedPrimitives()) {
+                    if (p.isIncomplete()) {
+                        Date timestamp = null;
+                        for (OsmPrimitive ref : p.getReferrers()) {
+                            if (!ref.isTimestampEmpty()) {
+                                timestamp = ref.getTimestamp();
+                                break;
+                            }
+                        }
+                        toLoad.put(p, timestamp);
+                    }
+                }
+                if (isCanceled()) return;
+                // Let's load all required history
+                Main.worker.submit(new HistoryLoaderAndListener(toLoad));
+            } catch (Exception e) {
+                rememberException(e);
+                setFailed(true);
+            }
+        }
+    }
+
+    /**
+     * Loads history and updates incomplete primitives.
+     */
+    private static class HistoryLoaderAndListener extends HistoryLoadTask implements HistoryDataSetListener {
+
+        private final Map<OsmPrimitive, Date> toLoad;
+
+        public HistoryLoaderAndListener(Map<OsmPrimitive, Date> toLoad) {
+            this.toLoad = toLoad;
+            add(toLoad.keySet());
+            // Updating process is done after all history requests have been made
+            HistoryDataSet.getInstance().addHistoryDataSetListener(this);
+        }
+
+        @Override
+        public void historyUpdated(HistoryDataSet source, PrimitiveId id) {
+            Map<OsmPrimitive, Date> toLoadNext = new HashMap<>();
+            for (Iterator<OsmPrimitive> it = toLoad.keySet().iterator(); it.hasNext();) {
+                OsmPrimitive p = it.next();
+                History history = source.getHistory(p.getPrimitiveId());
+                Date date = toLoad.get(p);
+                // If the history has been loaded and a timestamp is known
+                if (history != null && date != null) {
+                    // Lookup for the primitive version at the specified timestamp
+                    HistoryOsmPrimitive hp = history.getByDate(date);
+                    if (hp != null) {
+                        PrimitiveData data = null;
+
+                        switch (p.getType()) {
+                        case NODE:
+                            data = new NodeData();
+                            ((NodeData)data).setCoor(((HistoryNode)hp).getCoords());
+                            break;
+                        case WAY:
+                            data = new WayData();
+                            List<Long> nodeIds = ((HistoryWay)hp).getNodes();
+                            ((WayData)data).setNodes(nodeIds);
+                            // Find incomplete nodes to load at next run
+                            for (Long nodeId : nodeIds) {
+                                if (p.getDataSet().getPrimitiveById(nodeId, OsmPrimitiveType.NODE) == null) {
+                                    Node n = new Node(nodeId);
+                                    p.getDataSet().addPrimitive(n);
+                                    toLoadNext.put(n, date);
+                                }
+                            }
+                            break;
+                        case RELATION:
+                            data = new RelationData();
+                            List<RelationMemberData> members = ((HistoryRelation)hp).getMembers();
+                            ((RelationData)data).setMembers(members);
+                            break;
+                        default: throw new AssertionError("Unknown primitive type");
+                        }
+
+                        data.setUser(hp.getUser());
+                        try {
+                            data.setVisible(hp.isVisible());
+                        } catch (IllegalStateException e) {
+                            Main.error("Cannot change visibility for "+p+": "+e.getMessage());
+                        }
+                        data.setTimestamp(hp.getTimestamp());
+                        data.setKeys(hp.getTags());
+                        data.setOsmId(hp.getId(), (int) hp.getVersion());
+
+                        // Load the history data
+                        try {
+                            p.load(data);
+                            // Forget this primitive
+                            it.remove();
+                        } catch (AssertionError e) {
+                            Main.error("Cannot load "+p + ": " + e.getMessage());
+                        }
+                    }
+                }
+            }
+            source.removeHistoryDataSetListener(this);
+            if (toLoadNext.isEmpty()) {
+                // No more primitive to update. Processing is finished
+                // Be sure all updated primitives are correctly drawn
+                Main.map.repaint();
+            } else {
+                // Some primitives still need to be loaded
+                // Let's load all required history
+                Main.worker.submit(new HistoryLoaderAndListener(toLoadNext));
+            }
+        }
+
+        @Override
+        public void historyDataSetCleared(HistoryDataSet source) {
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
index bd67997..cbb1a72 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
@@ -1,65 +1,65 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.downloadtasks;
-
-import java.util.concurrent.Future;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerLocationReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-
-/**
- * Task allowing to download compressed OSM files (gzip and bzip2)
- * @since 5317
- */
-public class DownloadOsmCompressedTask extends DownloadOsmTask {
-
-    static final String PATTERN_COMPRESS =  "https?://.*/.*\\.osm.(gz|bz2?|zip)";
-
-    @Override
-    public String[] getPatterns() {
-        return new String[]{PATTERN_COMPRESS};
-    }
-
-    @Override
-    public String getTitle() {
-        return tr("Download Compressed OSM");
-    }
-    
-    @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea,
-            ProgressMonitor progressMonitor) {
-        return null;
-    }
-    
-    /**
-     * Loads a given URL
-     * @param new_layer {@code true} if the data should be saved to a new layer
-     * @param url The URL as String
-     * @param progressMonitor progress monitor for user interaction
-     */
-    @Override
-    public Future<?> loadUrl(boolean new_layer, final String url, ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor) {
-            @Override
-            protected DataSet parseDataSet() throws OsmTransferException {
-                ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
-                if (url.matches("https?://.*/.*\\.osm.bz2?")) {
-                    return reader.parseOsmBzip2(subTaskMonitor);
-                } else if (url.matches("https?://.*/.*\\.osm.gz")) {
-                    return reader.parseOsmGzip(subTaskMonitor);
-                } else {
-                    return reader.parseOsmZip(subTaskMonitor);
-                }
-            }
-        };
-        currentBounds = null;
-        // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?|zip))", url);
-        return Main.worker.submit(downloadTask);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import java.util.concurrent.Future;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.OsmServerLocationReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+/**
+ * Task allowing to download compressed OSM files (gzip and bzip2)
+ * @since 5317
+ */
+public class DownloadOsmCompressedTask extends DownloadOsmTask {
+
+    static final String PATTERN_COMPRESS =  "https?://.*/.*\\.osm.(gz|bz2?|zip)";
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{PATTERN_COMPRESS};
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download Compressed OSM");
+    }
+    
+    @Override
+    public Future<?> download(boolean newLayer, Bounds downloadArea,
+            ProgressMonitor progressMonitor) {
+        return null;
+    }
+    
+    /**
+     * Loads a given URL
+     * @param new_layer {@code true} if the data should be saved to a new layer
+     * @param url The URL as String
+     * @param progressMonitor progress monitor for user interaction
+     */
+    @Override
+    public Future<?> loadUrl(boolean new_layer, final String url, ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor) {
+            @Override
+            protected DataSet parseDataSet() throws OsmTransferException {
+                ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
+                if (url.matches("https?://.*/.*\\.osm.bz2?")) {
+                    return reader.parseOsmBzip2(subTaskMonitor);
+                } else if (url.matches("https?://.*/.*\\.osm.gz")) {
+                    return reader.parseOsmGzip(subTaskMonitor);
+                } else {
+                    return reader.parseOsmZip(subTaskMonitor);
+                }
+            }
+        };
+        currentBounds = null;
+        // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name
+        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?|zip))", url);
+        return Main.worker.submit(downloadTask);
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java
index c310296..3424a8a 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java
@@ -1,33 +1,33 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.downloadtasks;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.concurrent.Future;
-
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.tools.OsmUrlToBounds;
-
-/**
- * Task allowing to download an OSM url containing coordinates
- * @since 4996
- */
-public class DownloadOsmUrlTask extends DownloadOsmTask {
-
-    @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        return download(newLayer, OsmUrlToBounds.parse(url), null);
-    }
-
-    @Override
-    public String[] getPatterns() {
-        return new String[]{
-                "https?://www\\.(osm|openstreetmap)\\.org/\\?lat=.*&lon=.*",
-                "https?://www\\.(osm|openstreetmap)\\.org/(.*)?#map=\\p{Digit}+/.*/.*"};
-    }
-
-    @Override
-    public String getTitle() {
-        return tr("Download OSM URL");
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.concurrent.Future;
+
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
+
+/**
+ * Task allowing to download an OSM url containing coordinates
+ * @since 4996
+ */
+public class DownloadOsmUrlTask extends DownloadOsmTask {
+
+    @Override
+    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+        return download(newLayer, OsmUrlToBounds.parse(url), null);
+    }
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{
+                "https?://www\\.(osm|openstreetmap)\\.org/\\?lat=.*&lon=.*",
+                "https?://www\\.(osm|openstreetmap)\\.org/(.*)?#map=\\p{Digit}+/.*/.*"};
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download OSM URL");
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
index 2bd533c..2ea4043 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
@@ -1,86 +1,86 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.downloadtasks;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.concurrent.Future;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.SessionLoadAction.Loader;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Task allowing to download JOSM session (*.jos, *.joz file).
- * @since 6215
- */
-public class DownloadSessionTask extends AbstractDownloadTask {
-
-    private static final String PATTERN_SESSION =  "https?://.*/.*\\.jo(s|z)";
-    
-    private Loader loader;
-    
-    /**
-     * Constructs a new {@code DownloadSessionTask}.
-     */
-    public DownloadSessionTask() {
-    }
-
-    @Override
-    public String getTitle() {
-        return tr("Download session");
-    }
-
-    @Override
-    public String[] getPatterns() {
-        return new String[]{PATTERN_SESSION};
-    }
-
-    @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
-        return null;
-    }
-
-    @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        if (url != null && (url.matches(PATTERN_SESSION))) {
-            try {
-                URL u = new URL(url);
-                loader = new Loader(Utils.openURL(u), u.toURI(), url.endsWith(".joz"));
-                return Main.worker.submit(loader);
-            } catch (URISyntaxException | IOException e) {
-                Main.error(e);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void cancel() {
-        if (loader != null) {
-            loader.cancel();
-        }
-    }
-
-    @Override
-    public String getConfirmationMessage(URL url) {
-        // TODO
-        return null;
-    }
-
-    /**
-     * Do not allow to load a session file via remotecontrol.
-     * 
-     * Session importers can be added by plugins and there is currently
-     * no way to ensure that these are safe for remotecontol.
-     * @return 
-     */
-    @Override
-    public boolean isSafeForRemotecontrolRequests() {
-        return Main.pref.getBoolean("remotecontrol.import.allow_session", false);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.concurrent.Future;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.SessionLoadAction.Loader;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Task allowing to download JOSM session (*.jos, *.joz file).
+ * @since 6215
+ */
+public class DownloadSessionTask extends AbstractDownloadTask {
+
+    private static final String PATTERN_SESSION =  "https?://.*/.*\\.jo(s|z)";
+    
+    private Loader loader;
+    
+    /**
+     * Constructs a new {@code DownloadSessionTask}.
+     */
+    public DownloadSessionTask() {
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download session");
+    }
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{PATTERN_SESSION};
+    }
+
+    @Override
+    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+        return null;
+    }
+
+    @Override
+    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+        if (url != null && (url.matches(PATTERN_SESSION))) {
+            try {
+                URL u = new URL(url);
+                loader = new Loader(Utils.openURL(u), u.toURI(), url.endsWith(".joz"));
+                return Main.worker.submit(loader);
+            } catch (URISyntaxException | IOException e) {
+                Main.error(e);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void cancel() {
+        if (loader != null) {
+            loader.cancel();
+        }
+    }
+
+    @Override
+    public String getConfirmationMessage(URL url) {
+        // TODO
+        return null;
+    }
+
+    /**
+     * Do not allow to load a session file via remotecontrol.
+     * 
+     * Session importers can be added by plugins and there is currently
+     * no way to ensure that these are safe for remotecontol.
+     * @return 
+     */
+    @Override
+    public boolean isSafeForRemotecontrolRequests() {
+        return Main.pref.getBoolean("remotecontrol.import.allow_session", false);
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java b/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
index 96116aa..8f9653f 100644
--- a/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
@@ -1,40 +1,40 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import javax.swing.AbstractAction;
-
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.tools.SubclassFilteredCollection;
-
-/**
- * Ancestor for all actions that want to work with relation collection and 
- * to be disabled if the collection is empty
- * @since 5793
- */
-public abstract class AbstractRelationAction extends AbstractAction implements OsmPrimitiveAction {
-    protected Collection<Relation> relations = Collections.<Relation>emptySet();
-
-    protected static final Collection<Relation> getRelations(Collection<? extends OsmPrimitive> primitives) {
-        if (primitives == null || primitives.isEmpty()) {
-            return Collections.<Relation>emptySet();
-        } else {
-            return new SubclassFilteredCollection<>(
-                    primitives, OsmPrimitive.relationPredicate);
-        }
-    }
-    
-    @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
-        this.relations = getRelations(primitives);
-        updateEnabledState();
-    }
-    
-    protected void updateEnabledState() {
-        setEnabled(!relations.isEmpty());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.actions.OsmPrimitiveAction;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+
+/**
+ * Ancestor for all actions that want to work with relation collection and 
+ * to be disabled if the collection is empty
+ * @since 5793
+ */
+public abstract class AbstractRelationAction extends AbstractAction implements OsmPrimitiveAction {
+    protected Collection<Relation> relations = Collections.<Relation>emptySet();
+
+    protected static final Collection<Relation> getRelations(Collection<? extends OsmPrimitive> primitives) {
+        if (primitives == null || primitives.isEmpty()) {
+            return Collections.<Relation>emptySet();
+        } else {
+            return new SubclassFilteredCollection<>(
+                    primitives, OsmPrimitive.relationPredicate);
+        }
+    }
+    
+    @Override
+    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+        this.relations = getRelations(primitives);
+        updateEnabledState();
+    }
+    
+    protected void updateEnabledState() {
+        setEnabled(!relations.isEmpty());
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java b/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
index 56db047..e33d79c 100644
--- a/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
+++ b/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
@@ -1,63 +1,63 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import java.util.LinkedList;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Add all objects selected in the current dataset after the last member of relation(s).
- * @since 5799
- */
-public class AddSelectionToRelations extends AbstractRelationAction implements SelectionChangedListener {
-    /**
-    * Constructs a new <code>AddSelectionToRelation</code>.
-    */
-    public AddSelectionToRelations() {
-        putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copyendright"));
-        putValue(SHORT_DESCRIPTION, tr("Add all objects selected in the current dataset after the last member"));
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        Collection<Command> cmds = new LinkedList<>();
-        for (Relation orig : relations) {
-            Command c = GenericRelationEditor.addPrimitivesToRelation(orig, Main.main.getCurrentDataSet().getSelected());
-            if (c != null) {
-                cmds.add(c);
-            }
-        }
-        if (!cmds.isEmpty()) {
-            Main.main.undoRedo.add(new SequenceCommand(tr("Add selection to relation"), cmds));
-        }
-    }
-
-    @Override
-    public void updateEnabledState() {
-        putValue(NAME, trn("Add selection to {0} relation", "Add selection to {0} relations",
-                relations.size(), relations.size()));
-    }
-
-    @Override
-    public void selectionChanged(final Collection<? extends OsmPrimitive> newSelection) {
-        GuiHelper.runInEDT(new Runnable() {
-            @Override
-            public void run() {
-                setEnabled(newSelection != null && !newSelection.isEmpty());
-            }
-        });
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.LinkedList;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Add all objects selected in the current dataset after the last member of relation(s).
+ * @since 5799
+ */
+public class AddSelectionToRelations extends AbstractRelationAction implements SelectionChangedListener {
+    /**
+    * Constructs a new <code>AddSelectionToRelation</code>.
+    */
+    public AddSelectionToRelations() {
+        putValue(SMALL_ICON, ImageProvider.get("dialogs/conflict", "copyendright"));
+        putValue(SHORT_DESCRIPTION, tr("Add all objects selected in the current dataset after the last member"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        Collection<Command> cmds = new LinkedList<>();
+        for (Relation orig : relations) {
+            Command c = GenericRelationEditor.addPrimitivesToRelation(orig, Main.main.getCurrentDataSet().getSelected());
+            if (c != null) {
+                cmds.add(c);
+            }
+        }
+        if (!cmds.isEmpty()) {
+            Main.main.undoRedo.add(new SequenceCommand(tr("Add selection to relation"), cmds));
+        }
+    }
+
+    @Override
+    public void updateEnabledState() {
+        putValue(NAME, trn("Add selection to {0} relation", "Add selection to {0} relations",
+                relations.size(), relations.size()));
+    }
+
+    @Override
+    public void selectionChanged(final Collection<? extends OsmPrimitive> newSelection) {
+        GuiHelper.runInEDT(new Runnable() {
+            @Override
+            public void run() {
+                setEnabled(newSelection != null && !newSelection.isEmpty());
+            }
+        });
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java b/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
index 13fdefe..d342d79 100644
--- a/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
@@ -1,47 +1,47 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Action that delete relations
- * @since 5799
- */
-public class DeleteRelationsAction extends AbstractRelationAction {
-    static class AbortException extends Exception {}
-
-    /**
-     * Constructs a new <code>DeleteRelationsAction</code>.
-     */
-    public DeleteRelationsAction() {
-        putValue(SHORT_DESCRIPTION,tr("Delete the selected relation"));
-        putValue(NAME, tr("Delete"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
-    }
-
-    protected void deleteRelation(Relation toDelete) {
-        if (toDelete == null)
-            return;
-        org.openstreetmap.josm.actions.mapmode.DeleteAction
-                .deleteRelation( Main.main.getEditLayer(), toDelete );
-        // clear selection after deletion
-        if (Main.map.relationListDialog!=null)
-                Main.map.relationListDialog.selectRelations(null);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || !Main.main.hasEditLayer())
-            return;
-        for (Relation r : relations) {
-            deleteRelation(r);
-        }
-    }
-}
-
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Action that delete relations
+ * @since 5799
+ */
+public class DeleteRelationsAction extends AbstractRelationAction {
+    static class AbortException extends Exception {}
+
+    /**
+     * Constructs a new <code>DeleteRelationsAction</code>.
+     */
+    public DeleteRelationsAction() {
+        putValue(SHORT_DESCRIPTION,tr("Delete the selected relation"));
+        putValue(NAME, tr("Delete"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+    }
+
+    protected void deleteRelation(Relation toDelete) {
+        if (toDelete == null)
+            return;
+        org.openstreetmap.josm.actions.mapmode.DeleteAction
+                .deleteRelation( Main.main.getEditLayer(), toDelete );
+        // clear selection after deletion
+        if (Main.map.relationListDialog!=null)
+                Main.map.relationListDialog.selectRelations(null);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || !Main.main.hasEditLayer())
+            return;
+        for (Relation r : relations) {
+            deleteRelation(r);
+        }
+    }
+}
+
diff --git a/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java b/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
index 22f1224..4fbe9a3 100644
--- a/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
@@ -1,55 +1,55 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
-import org.openstreetmap.josm.io.OnlineResource;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.Predicate;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * The action for downloading members of relations
- * @since 5793
- */
-public class DownloadMembersAction extends AbstractRelationAction {
-
-    /**
-     * Constructs a new <code>DownloadMembersAction</code>.
-     */
-    public DownloadMembersAction() {
-        putValue(SHORT_DESCRIPTION, tr("Download all members of the selected relations"));
-        putValue(NAME, tr("Download members"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete"));
-        putValue("help", ht("/Dialog/RelationList#DownloadMembers"));
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
-        Main.worker.submit(new DownloadRelationTask(relations, Main.main.getEditLayer()));
-    }
-
-    @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
-        // selected non-new relations
-        this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>(){
-            @Override public boolean evaluate(Relation r) {
-                return !r.isNew();
-            }});
-        updateEnabledState();
-    }
-
-    @Override
-    protected void updateEnabledState() {
-        setEnabled(!relations.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
+import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * The action for downloading members of relations
+ * @since 5793
+ */
+public class DownloadMembersAction extends AbstractRelationAction {
+
+    /**
+     * Constructs a new <code>DownloadMembersAction</code>.
+     */
+    public DownloadMembersAction() {
+        putValue(SHORT_DESCRIPTION, tr("Download all members of the selected relations"));
+        putValue(NAME, tr("Download members"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete"));
+        putValue("help", ht("/Dialog/RelationList#DownloadMembers"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
+        Main.worker.submit(new DownloadRelationTask(relations, Main.main.getEditLayer()));
+    }
+
+    @Override
+    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+        // selected non-new relations
+        this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>(){
+            @Override public boolean evaluate(Relation r) {
+                return !r.isNew();
+            }});
+        updateEnabledState();
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(!relations.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java b/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
index 78d1ea6..edfa691 100644
--- a/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
@@ -1,71 +1,80 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
-import org.openstreetmap.josm.io.OnlineResource;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.Predicate;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Action for downloading incomplete members of selected relations
- * @since 5793
- */
-public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
-
-    /**
-     * Constructs a new <code>DownloadSelectedIncompleteMembersAction</code>.
-     */
-    public DownloadSelectedIncompleteMembersAction() {
-        putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
-        putValue(NAME, tr("Download incomplete members"));
-    }
-
-    /**
-     * Returns the set of incomplete members of the given relations.
-     * @param rels The relations to inspect.
-     * @return The set of incomplete members of the given relations.
-     */
-    public Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
-        Set<OsmPrimitive> ret = new HashSet<>();
-        for (Relation r : rels) {
-            ret.addAll(r.getIncompleteMembers());
-        }
-        return ret;
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
-        Main.worker.submit(new DownloadRelationMemberTask(
-                relations,
-                buildSetOfIncompleteMembers(relations),
-                Main.main.getEditLayer()));
-    }
-
-    @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
-        // selected relations with incomplete members
-        this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>(){
-            @Override public boolean evaluate(Relation r) {
-                return !r.isNew() && r.hasIncompleteMembers();
-            }});
-        updateEnabledState();
-    }
-
-    @Override
-    protected void updateEnabledState() {
-        setEnabled(!relations.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
+import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Action for downloading incomplete members of selected relations
+ * @since 5793
+ */
+public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
+
+    private Collection<OsmPrimitive> incompleteMembers;
+
+    /**
+     * Constructs a new <code>DownloadSelectedIncompleteMembersAction</code>.
+     */
+    public DownloadSelectedIncompleteMembersAction() {
+        putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
+        putValue(NAME, tr("Download incomplete members"));
+    }
+
+    /**
+     * Returns the set of incomplete members of the given relations.
+     * @param rels The relations to inspect.
+     * @return The set of incomplete members of the given relations.
+     */
+    public static Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
+        Set<OsmPrimitive> ret = new HashSet<>();
+        for (Relation r : rels) {
+            ret.addAll(Utils.filter(r.getIncompleteMembers(), new Predicate<OsmPrimitive>() {
+                @Override
+                public boolean evaluate(OsmPrimitive osm) {
+                    return !osm.isNew();
+                }
+            }));
+        }
+        return ret;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
+        Main.worker.submit(new DownloadRelationMemberTask(
+                relations,
+                incompleteMembers,
+                Main.main.getEditLayer()));
+    }
+
+    @Override
+    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+        // selected relations with incomplete members
+        this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>(){
+            @Override
+            public boolean evaluate(Relation r) {
+                return r.hasIncompleteMembers();
+            }});
+        this.incompleteMembers = buildSetOfIncompleteMembers(relations);
+        updateEnabledState();
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(!relations.isEmpty() &&!incompleteMembers.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java b/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
index fcb4819..739ba25 100644
--- a/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
@@ -1,56 +1,56 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Creates a new relation with a copy of the current editor state
- * @since 5799
- */
-public class DuplicateRelationAction extends AbstractRelationAction {
-
-    /**
-     * Constructs a new {@code DuplicateRelationAction}.
-     */
-    public DuplicateRelationAction() {
-        putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
-        putValue(SMALL_ICON, ImageProvider.get("duplicate"));
-        putValue(NAME, tr("Duplicate"));
-    }
-
-    /**
-     * Duplicates the given relation and launches the relation editor for the created copy.
-     * @param original The relation to duplicate
-     */
-    public static void duplicateRelationAndLaunchEditor(Relation original) {
-        Relation copy = new Relation(original, true);
-        copy.setModified(true);
-        RelationEditor editor = RelationEditor.getEditor(
-                Main.main.getEditLayer(),
-                copy,
-                null /* no selected members */
-                );
-        editor.setVisible(true);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty())
-            return;
-        Relation r = relations.iterator().next();
-        duplicateRelationAndLaunchEditor(r);
-    }
-
-    @Override
-    protected void updateEnabledState() {
-        // only one selected relation can be edited
-        setEnabled( relations.size()==1 );
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Creates a new relation with a copy of the current editor state
+ * @since 5799
+ */
+public class DuplicateRelationAction extends AbstractRelationAction {
+
+    /**
+     * Constructs a new {@code DuplicateRelationAction}.
+     */
+    public DuplicateRelationAction() {
+        putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
+        putValue(SMALL_ICON, ImageProvider.get("duplicate"));
+        putValue(NAME, tr("Duplicate"));
+    }
+
+    /**
+     * Duplicates the given relation and launches the relation editor for the created copy.
+     * @param original The relation to duplicate
+     */
+    public static void duplicateRelationAndLaunchEditor(Relation original) {
+        Relation copy = new Relation(original, true);
+        copy.setModified(true);
+        RelationEditor editor = RelationEditor.getEditor(
+                Main.main.getEditLayer(),
+                copy,
+                null /* no selected members */
+                );
+        editor.setVisible(true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty())
+            return;
+        Relation r = relations.iterator().next();
+        duplicateRelationAndLaunchEditor(r);
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        // only one selected relation can be edited
+        setEnabled( relations.size()==1 );
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java b/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
index fa229ec..7cd59ff 100644
--- a/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
@@ -1,89 +1,96 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-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.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * The action for editing a relation 
- * @since 5793
- */
-public class EditRelationAction extends AbstractRelationAction  {
-
-    /**
-     * Constructs a new <code>EditRelationAction</code>.
-     */
-    public EditRelationAction() {
-        putValue(NAME, tr("Edit"));
-        putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
-    }
-
-    /**
-     * Returns the set of currently selected relation members for the given relation. 
-     * @param r The relation to inspect
-     * @return The set of currently selected relation members for the given relation.
-     */
-    public static Set<RelationMember> getMembersForCurrentSelection(Relation r) {
-        Set<RelationMember> members = new HashSet<>();
-        if (Main.isDisplayingMapView()) {
-            OsmDataLayer editLayer = Main.main.getEditLayer();
-            if (editLayer != null && editLayer.data != null) {
-                Collection<OsmPrimitive> selection = editLayer.data.getSelected();
-                for (RelationMember member: r.getMembers()) {
-                    if (selection.contains(member.getMember())) {
-                        members.add(member);
-                    }
-                }
-            }
-        }
-        return members;
-    }
-
-    /**
-     * Launches relation editor for the given relation.
-     * @param toEdit The relation to edit
-     */
-    public static void launchEditor(Relation toEdit) {
-        if (toEdit == null || !Main.isDisplayingMapView()) return;
-        RelationEditor.getEditor(Main.main.getEditLayer(), toEdit,
-                getMembersForCurrentSelection(toEdit)).setVisible(true);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty()) return;
-        if (relations.size() > Main.pref.getInteger("warn.open.maxrelations", 5) &&
-            /* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */
-            JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent, 
-                    "<html>"+trn("You are about to open <b>{0}</b> different relation editor simultaneously.<br/>Do you want to continue?",
-                            "You are about to open <b>{0}</b> different relation editors simultaneously.<br/>Do you want to continue?",
-                            relations.size(), relations.size())+"</html>", 
-                    tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) {
-            return;
-        }
-        for (Relation r : relations) {
-            launchEditor(r);
-        }
-    }
-
-    @Override
-    protected void updateEnabledState() {
-        setEnabled( !relations.isEmpty() );
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+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.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * The action for editing a relation.
+ * @since 5793
+ */
+public class EditRelationAction extends AbstractRelationAction  {
+
+    /**
+     * Constructs a new <code>EditRelationAction</code>.
+     */
+    public EditRelationAction() {
+        putValue(NAME, tr("Edit"));
+        putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+    }
+
+    /**
+     * Returns the set of currently selected relation members for the given relation.
+     * @param r The relation to inspect
+     * @return The set of currently selected relation members for the given relation.
+     */
+    public static Set<RelationMember> getMembersForCurrentSelection(Relation r) {
+        Set<RelationMember> members = new HashSet<>();
+        if (Main.isDisplayingMapView()) {
+            OsmDataLayer editLayer = Main.main.getEditLayer();
+            if (editLayer != null && editLayer.data != null) {
+                Collection<OsmPrimitive> selection = editLayer.data.getSelected();
+                for (RelationMember member: r.getMembers()) {
+                    if (selection.contains(member.getMember())) {
+                        members.add(member);
+                    }
+                }
+            }
+        }
+        return members;
+    }
+
+    /**
+     * Launches relation editor for the given relation.
+     * @param toEdit The relation to edit
+     */
+    public static void launchEditor(Relation toEdit) {
+        if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return;
+        RelationEditor.getEditor(Main.main.getEditLayer(), toEdit,
+                getMembersForCurrentSelection(toEdit)).setVisible(true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        if (relations.size() > Main.pref.getInteger("warn.open.maxrelations", 5) &&
+            /* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */
+            JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent,
+                    "<html>"+trn("You are about to open <b>{0}</b> different relation editor simultaneously.<br/>Do you want to continue?",
+                            "You are about to open <b>{0}</b> different relation editors simultaneously.<br/>Do you want to continue?",
+                            relations.size(), relations.size())+"</html>",
+                    tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) {
+            return;
+        }
+        for (Relation r : relations) {
+            launchEditor(r);
+        }
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        boolean enabled = false;
+        for (Relation r : relations) {
+            if (!r.isDeleted()) {
+                enabled = true;
+                break;
+            }
+        }
+        setEnabled(enabled);
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java b/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java
index ca01e53..b69eebb 100644
--- a/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java
@@ -1,32 +1,32 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * The action for activating a relation in relation list dialog
- * @since 5793
- */
-public class SelectInRelationListAction extends AbstractRelationAction {
-
-    /**
-     * Constructs a new <code>SelectInRelationListAction</code>.
-     */
-    public SelectInRelationListAction() {
-        putValue(NAME, tr("Select in relation list"));
-        putValue(SHORT_DESCRIPTION, tr("Select relation in relation list."));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "selectionlist"));
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty() || Main.map==null || Main.map.relationListDialog==null) return;
-        Main.map.relationListDialog.unfurlDialog();
-        Main.map.relationListDialog.selectRelations(relations);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * The action for activating a relation in relation list dialog
+ * @since 5793
+ */
+public class SelectInRelationListAction extends AbstractRelationAction {
+
+    /**
+     * Constructs a new <code>SelectInRelationListAction</code>.
+     */
+    public SelectInRelationListAction() {
+        putValue(NAME, tr("Select in relation list"));
+        putValue(SHORT_DESCRIPTION, tr("Select relation in relation list."));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "selectionlist"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty() || Main.map==null || Main.map.relationListDialog==null) return;
+        Main.map.relationListDialog.unfurlDialog();
+        Main.map.relationListDialog.selectRelations(relations);
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java b/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
index dba38a6..de7e3da 100644
--- a/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
@@ -1,48 +1,48 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions.relation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.util.HashSet;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Sets the current selection to the list of relations selected in this dialog
- * @since 5793
- */
-public class SelectMembersAction extends AbstractRelationAction {
-    
-    private final boolean add;
-
-    /**
-     * Constructs a new <code>SelectMembersAction</code>.
-     * @param add if <code>true</code>, the members will be added to current selection. If <code>false</code>, the members will replace the current selection.
-     */
-    public SelectMembersAction(boolean add) {
-        putValue(SHORT_DESCRIPTION,add ? tr("Add the members of all selected relations to current selection")
-                : tr("Select the members of all selected relations"));
-        putValue(SMALL_ICON, ImageProvider.get("selectall"));
-        putValue(NAME, add ? tr("Select members (add)") : tr("Select members"));
-        this.add = add;
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
-        
-        HashSet<OsmPrimitive> members = new HashSet<>();
-        for (Relation r: relations) {
-            members.addAll(r.getMemberPrimitives());
-        }
-        if (add) {
-            Main.main.getEditLayer().data.addSelected(members);
-        } else {
-            Main.main.getEditLayer().data.setSelected(members);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Sets the current selection to the list of relations selected in this dialog
+ * @since 5793
+ */
+public class SelectMembersAction extends AbstractRelationAction {
+    
+    private final boolean add;
+
+    /**
+     * Constructs a new <code>SelectMembersAction</code>.
+     * @param add if <code>true</code>, the members will be added to current selection. If <code>false</code>, the members will replace the current selection.
+     */
+    public SelectMembersAction(boolean add) {
+        putValue(SHORT_DESCRIPTION,add ? tr("Add the members of all selected relations to current selection")
+                : tr("Select the members of all selected relations"));
+        putValue(SMALL_ICON, ImageProvider.get("selectall"));
+        putValue(NAME, add ? tr("Select members (add)") : tr("Select members"));
+        this.add = add;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
+        
+        HashSet<OsmPrimitive> members = new HashSet<>();
+        for (Relation r: relations) {
+            members.addAll(r.getMemberPrimitives());
+        }
+        if (add) {
+            Main.main.getEditLayer().data.addSelected(members);
+        } else {
+            Main.main.getEditLayer().data.setSelected(members);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/command/conflict/package-info.java b/src/org/openstreetmap/josm/command/conflict/package-info.java
index 867bb76..ddb4daf 100644
--- a/src/org/openstreetmap/josm/command/conflict/package-info.java
+++ b/src/org/openstreetmap/josm/command/conflict/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides commands for handling conflicts.
- */
-package org.openstreetmap.josm.command.conflict;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides commands for handling conflicts.
+ */
+package org.openstreetmap.josm.command.conflict;
diff --git a/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java b/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java
index 6fc84cf..dee6353 100644
--- a/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java
+++ b/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java
@@ -1,121 +1,121 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.corrector;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.util.Arrays;
-
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.data.osm.TagCollection;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
-import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * A ReverseWayNoTagCorrector warns about ways that should not be reversed
- * because their semantic meaning cannot be preserved in that case.
- * E.g. natural=coastline, natural=cliff, barrier=retaining_wall cannot be changed.
- * @see ReverseWayTagCorrector for handling of tags that can be modified (oneway=yes, etc.)
- * @since 5724
- */
-public final class ReverseWayNoTagCorrector {
-
-    private ReverseWayNoTagCorrector() {
-        // Hide default constructor for utils classes
-    }
-
-    /**
-     * Tags that imply a semantic meaning from the way direction and cannot be changed.
-     */
-    public static final TagCollection directionalTags = new TagCollection(Arrays.asList(new Tag[]{
-            new Tag("natural", "coastline"),
-            new Tag("natural", "cliff"),
-            new Tag("barrier", "guard_rail"),
-            new Tag("barrier", "kerb"),
-            new Tag("barrier", "retaining_wall"),
-            new Tag("waterway", "stream"),
-            new Tag("waterway", "river"),
-            new Tag("waterway", "ditch"),
-            new Tag("waterway", "drain"),
-            new Tag("waterway", "canal")
-    }));
-
-    /**
-     * Replies the tags that imply a semantic meaning from <code>way</code> direction and cannot be changed.
-     * @param way The way to look for
-     * @return tags that imply a semantic meaning from <code>way</code> direction and cannot be changed
-     */
-    public static final TagCollection getDirectionalTags(Way way) {
-        return directionalTags.intersect(TagCollection.from(way));
-    }
-
-    /**
-     * Tests whether way can be reversed without semantic change.
-     * Looks for tags like natural=cliff, barrier=retaining_wall.
-     * @param way The way to check
-     * @return false if the semantic meaning change if the way is reversed, true otherwise.
-     */
-    public static boolean isReversible(Way way) {
-        return getDirectionalTags(way).isEmpty();
-    }
-
-    protected static String getHTML(TagCollection tags) {
-        if (tags.size() == 1) {
-            return tags.iterator().next().toString();
-        } else if (tags.size() > 1) {
-            return Utils.joinAsHtmlUnorderedList(tags);
-        } else {
-            return "";
-        }
-    }
-
-    protected static boolean confirmReverseWay(Way way, TagCollection tags) {
-        String msg = trn(
-                // Singular, if a single tag is impacted
-                "<html>You are going to reverse the way ''{0}'',"
-                + "<br/> whose semantic meaning of its tag ''{1}'' is defined by its direction.<br/>"
-                + "Do you really want to change the way direction, thus its semantic meaning?</html>",
-                // Plural, if several tags are impacted
-                "<html>You are going to reverse the way ''{0}'',"
-                + "<br/> whose semantic meaning of these tags are defined by its direction:<br/>{1}"
-                + "Do you really want to change the way direction, thus its semantic meaning?</html>",
-                tags.size(),
-                way.getDisplayName(DefaultNameFormatter.getInstance()),
-                getHTML(tags)
-            );
-        int ret = ConditionalOptionPaneUtil.showOptionDialog(
-                "reverse_directional_way",
-                Main.parent,
-                msg,
-                tr("Reverse directional way."),
-                JOptionPane.YES_NO_CANCEL_OPTION,
-                JOptionPane.WARNING_MESSAGE,
-                null,
-                null
-        );
-        switch(ret) {
-            case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION:
-            case JOptionPane.YES_OPTION:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Checks the given way can be safely reversed and asks user to confirm the operation if it not the case.
-     * @param way The way to check
-     * @throws UserCancelException If the user cancels the operation
-     */
-    public static void checkAndConfirmReverseWay(Way way) throws UserCancelException {
-        TagCollection tags = getDirectionalTags(way);
-        if (!tags.isEmpty() && !confirmReverseWay(way, tags)) {
-            throw new UserCancelException();
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.corrector;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.util.Arrays;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.TagCollection;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * A ReverseWayNoTagCorrector warns about ways that should not be reversed
+ * because their semantic meaning cannot be preserved in that case.
+ * E.g. natural=coastline, natural=cliff, barrier=retaining_wall cannot be changed.
+ * @see ReverseWayTagCorrector for handling of tags that can be modified (oneway=yes, etc.)
+ * @since 5724
+ */
+public final class ReverseWayNoTagCorrector {
+
+    private ReverseWayNoTagCorrector() {
+        // Hide default constructor for utils classes
+    }
+
+    /**
+     * Tags that imply a semantic meaning from the way direction and cannot be changed.
+     */
+    public static final TagCollection directionalTags = new TagCollection(Arrays.asList(new Tag[]{
+            new Tag("natural", "coastline"),
+            new Tag("natural", "cliff"),
+            new Tag("barrier", "guard_rail"),
+            new Tag("barrier", "kerb"),
+            new Tag("barrier", "retaining_wall"),
+            new Tag("waterway", "stream"),
+            new Tag("waterway", "river"),
+            new Tag("waterway", "ditch"),
+            new Tag("waterway", "drain"),
+            new Tag("waterway", "canal")
+    }));
+
+    /**
+     * Replies the tags that imply a semantic meaning from <code>way</code> direction and cannot be changed.
+     * @param way The way to look for
+     * @return tags that imply a semantic meaning from <code>way</code> direction and cannot be changed
+     */
+    public static final TagCollection getDirectionalTags(Way way) {
+        return directionalTags.intersect(TagCollection.from(way));
+    }
+
+    /**
+     * Tests whether way can be reversed without semantic change.
+     * Looks for tags like natural=cliff, barrier=retaining_wall.
+     * @param way The way to check
+     * @return false if the semantic meaning change if the way is reversed, true otherwise.
+     */
+    public static boolean isReversible(Way way) {
+        return getDirectionalTags(way).isEmpty();
+    }
+
+    protected static String getHTML(TagCollection tags) {
+        if (tags.size() == 1) {
+            return tags.iterator().next().toString();
+        } else if (tags.size() > 1) {
+            return Utils.joinAsHtmlUnorderedList(tags);
+        } else {
+            return "";
+        }
+    }
+
+    protected static boolean confirmReverseWay(Way way, TagCollection tags) {
+        String msg = trn(
+                // Singular, if a single tag is impacted
+                "<html>You are going to reverse the way ''{0}'',"
+                + "<br/> whose semantic meaning of its tag ''{1}'' is defined by its direction.<br/>"
+                + "Do you really want to change the way direction, thus its semantic meaning?</html>",
+                // Plural, if several tags are impacted
+                "<html>You are going to reverse the way ''{0}'',"
+                + "<br/> whose semantic meaning of these tags are defined by its direction:<br/>{1}"
+                + "Do you really want to change the way direction, thus its semantic meaning?</html>",
+                tags.size(),
+                way.getDisplayName(DefaultNameFormatter.getInstance()),
+                getHTML(tags)
+            );
+        int ret = ConditionalOptionPaneUtil.showOptionDialog(
+                "reverse_directional_way",
+                Main.parent,
+                msg,
+                tr("Reverse directional way."),
+                JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                null
+        );
+        switch(ret) {
+            case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION:
+            case JOptionPane.YES_OPTION:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Checks the given way can be safely reversed and asks user to confirm the operation if it not the case.
+     * @param way The way to check
+     * @throws UserCancelException If the user cancels the operation
+     */
+    public static void checkAndConfirmReverseWay(Way way) throws UserCancelException {
+        TagCollection tags = getDirectionalTags(way);
+        if (!tags.isEmpty() && !confirmReverseWay(way, tags)) {
+            throw new UserCancelException();
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/AutosaveTask.java b/src/org/openstreetmap/josm/data/AutosaveTask.java
index 6e8cc08..a45c3ea 100644
--- a/src/org/openstreetmap/josm/data/AutosaveTask.java
+++ b/src/org/openstreetmap/josm/data/AutosaveTask.java
@@ -104,7 +104,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
             }
 
             timer = new Timer(true);
-            timer.schedule(this, 1000, PROP_INTERVAL.get() * 1000);
+            timer.schedule(this, 1000L, PROP_INTERVAL.get() * 1000L);
             MapView.addLayerChangeListener(this);
             if (Main.isDisplayingMapView()) {
                 for (OsmDataLayer l: Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
@@ -151,7 +151,8 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         int index = 0;
         Date now = new Date();
         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);
+            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+".osm");
             try {
                 if (result.createNewFile()) {
@@ -373,8 +374,8 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
             // we cannot move to deleted folder, so just try to delete it directly
             if (!f.delete()) {
                 Main.warn(String.format("Could not delete backup file %s", f));
-            } else {
-                pidFile.delete();
+            } else if (!pidFile.delete()) {
+                Main.warn(String.format("Could not delete PID file %s", pidFile));
             }
         }
         while (deletedLayers.size() > PROP_DELETED_LAYERS.get()) {
diff --git a/src/org/openstreetmap/josm/data/Data.java b/src/org/openstreetmap/josm/data/Data.java
index 3775301..32bfeeb 100644
--- a/src/org/openstreetmap/josm/data/Data.java
+++ b/src/org/openstreetmap/josm/data/Data.java
@@ -1,39 +1,39 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data;
-
-import java.awt.geom.Area;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Generic data, holding data downloaded from various data sources.
- * @since 7575
- */
-public interface Data {
-
-    /**
-     * Returns the collection of data sources.
-     * @return the collection of data sources.
-     */
-    public Collection<DataSource> getDataSources();
-
-    /**
-     * Returns the total area of downloaded data (the "yellow rectangles").
-     * @return Area object encompassing downloaded data.
-     */
-    public Area getDataSourceArea();
-
-    /**
-     * <p>Replies the list of data source bounds.</p>
-     *
-     * <p>Dataset maintains a list of data sources which have been merged into the
-     * data set. Each of these sources can optionally declare a bounding box of the
-     * data it supplied to the dataset.</p>
-     *
-     * <p>This method replies the list of defined (non {@code null}) bounding boxes.</p>
-     *
-     * @return the list of data source bounds. An empty list, if no non-null data source
-     * bounds are defined.
-     */
-    public List<Bounds> getDataSourceBounds();
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import java.awt.geom.Area;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Generic data, holding data downloaded from various data sources.
+ * @since 7575
+ */
+public interface Data {
+
+    /**
+     * Returns the collection of data sources.
+     * @return the collection of data sources.
+     */
+    public Collection<DataSource> getDataSources();
+
+    /**
+     * Returns the total area of downloaded data (the "yellow rectangles").
+     * @return Area object encompassing downloaded data.
+     */
+    public Area getDataSourceArea();
+
+    /**
+     * <p>Replies the list of data source bounds.</p>
+     *
+     * <p>Dataset maintains a list of data sources which have been merged into the
+     * data set. Each of these sources can optionally declare a bounding box of the
+     * data it supplied to the dataset.</p>
+     *
+     * <p>This method replies the list of defined (non {@code null}) bounding boxes.</p>
+     *
+     * @return the list of data source bounds. An empty list, if no non-null data source
+     * bounds are defined.
+     */
+    public List<Bounds> getDataSourceBounds();
+}
diff --git a/src/org/openstreetmap/josm/data/Preferences.java b/src/org/openstreetmap/josm/data/Preferences.java
index 77e57fc..303347b 100644
--- a/src/org/openstreetmap/josm/data/Preferences.java
+++ b/src/org/openstreetmap/josm/data/Preferences.java
@@ -1683,13 +1683,6 @@ public class Preferences {
         }
 
         String[] obsolete = {
-                "validator.tests",                             // 01/2014 - can be removed end-2014. Replaced by validator.skip
-                "validator.testsBeforeUpload",                 // 01/2014 - can be removed end-2014. Replaced by validator.skipBeforeUpload
-                "validator.TagChecker.sources",                // 01/2014 - can be removed end-2014. Replaced by validator.TagChecker.source
-                "validator.TagChecker.usedatafile",            // 01/2014 - can be removed end-2014. Replaced by validator.TagChecker.source
-                "validator.TagChecker.useignorefile",          // 01/2014 - can be removed end-2014. Replaced by validator.TagChecker.source
-                "validator.TagChecker.usespellfile",           // 01/2014 - can be removed end-2014. Replaced by validator.TagChecker.source
-                "validator.org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.sources" // 01/2014 - can be removed end-2014. Replaced by validator.org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.entries
         };
         for (String key : obsolete) {
             if (settingsMap.containsKey(key)) {
diff --git a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
index b6422ff..076572e 100644
--- a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
+++ b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
@@ -1,177 +1,177 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-
-import java.text.NumberFormat;
-import java.util.LinkedHashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * A system of units used to express length and area measurements.
- * @since 3406 (creation)
- * @since 6992 (extraction in this package) 
- */
-public class SystemOfMeasurement {
-
-    /**
-     * Metric system (international standard).
-     * @since 3406
-     */
-    public static final SystemOfMeasurement METRIC = new SystemOfMeasurement(1, "m", 1000, "km", 10000, "ha");
-
-    /**
-     * Chinese system.
-     * @since 3406
-     */
-    public static final SystemOfMeasurement CHINESE = new SystemOfMeasurement(1.0/3.0, "\u5e02\u5c3a" /* chi */, 500, "\u5e02\u91cc" /* li */);
-
-    /**
-     * 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");
-
-    /**
-     * Nautical mile system (navigation, polar exploration).
-     * @since 5549
-     */
-    public static final SystemOfMeasurement NAUTICAL_MILE = new SystemOfMeasurement(185.2, "kbl", 1852, "NM");
-    
-    /**
-     * Known systems of measurement.
-     * @since 3406
-     */
-    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);
-    }
-    
-    /** First value, in meters, used to translate unit according to above formula. */
-    public final double aValue;
-    /** Second value, in meters, used to translate unit according to above formula. */
-    public final double bValue;
-    /** First unit used to format text. */
-    public final String aName;
-    /** Second unit used to format text. */
-    public final String bName;
-    /** 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;
-    /** Specific optional area unit. Set to {@code null} if not used.
-     *  @since 5870 */
-    public final String areaCustomName;
-
-    /**
-     * System of measurement. Currently covers only length (and area) units.
-     *
-     * If a quantity x is given in m (x_m) and in unit a (x_a) then it translates as
-     * x_a == x_m / aValue
-     *
-     * @param aValue First value, in meters, used to translate unit according to above formula.
-     * @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.
-     */
-    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName) {
-        this(aValue, aName, bValue, bName, -1, null);
-    }
-
-    /**
-     * System of measurement. Currently covers only length (and area) units.
-     *
-     * If a quantity x is given in m (x_m) and in unit a (x_a) then it translates as
-     * x_a == x_m / aValue
-     *
-     * @param aValue First value, in meters, used to translate unit according to above formula.
-     * @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 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
-     */
-    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName, double areaCustomValue, String areaCustomName) {
-        this.aValue = aValue;
-        this.aName = aName;
-        this.bValue = bValue;
-        this.bName = bName;
-        this.areaCustomValue = areaCustomValue;
-        this.areaCustomName = areaCustomName;
-    }
-
-    /**
-     * Returns the text describing the given distance in this system of measurement.
-     * @param dist The distance in metres
-     * @return The text describing the given distance in this system of measurement.
-     */
-    public String getDistText(double dist) {
-        return getDistText(dist, null, 0.01);
-    }
-
-    /**
-     * Returns the text describing the given distance in this system of measurement.
-     * @param dist The distance in metres
-     * @param format A {@link NumberFormat} to format the area value
-     * @param threshold Values lower than this {@code threshold} are displayed as {@code "< [threshold]"}
-     * @return The text describing the given distance in this system of measurement.
-     * @since 6422
-     */
-    public String getDistText(final double dist, final NumberFormat format, final double threshold) {
-        double a = dist / aValue;
-        if (!Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false) && a > bValue / aValue)
-            return formatText(dist / bValue, bName, format);
-        else if (a < threshold)
-            return "< " + formatText(threshold, aName, format);
-        else
-            return formatText(a, aName, format);
-    }
-
-    /**
-     * Returns the text describing the given area in this system of measurement.
-     * @param area The area in square metres
-     * @return The text describing the given area in this system of measurement.
-     * @since 5560
-     */
-    public String getAreaText(double area) {
-        return getAreaText(area, null, 0.01);
-    }
-
-    /**
-     * Returns the text describing the given area in this system of measurement.
-     * @param area The area in square metres
-     * @param format A {@link NumberFormat} to format the area value
-     * @param threshold Values lower than this {@code threshold} are displayed as {@code "< [threshold]"}
-     * @return The text describing the given area in this system of measurement.
-     * @since 6422
-     */
-    public String getAreaText(final double area, final NumberFormat format, final double threshold) {
-        double a = area / (aValue*aValue);
-        boolean lowerOnly = Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false);
-        boolean customAreaOnly = Main.pref.getBoolean("system_of_measurement.use_only_custom_area_unit", false);
-        if ((!lowerOnly && areaCustomValue > 0 && a > areaCustomValue / (aValue*aValue) && a < (bValue*bValue) / (aValue*aValue)) || customAreaOnly)
-            return formatText(area / areaCustomValue, areaCustomName, format);
-        else if (!lowerOnly && a >= (bValue*bValue) / (aValue*aValue))
-            return formatText(area / (bValue * bValue), bName + "\u00b2", format);
-        else if (a < threshold)
-            return "< " + formatText(threshold, aName + "\u00b2", format);
-        else
-            return formatText(a, aName + "\u00b2", format);
-    }
-
-    private static String formatText(double v, String unit, NumberFormat format) {
-        if (format != null) {
-            return format.format(v) + " " + unit;
-        }
-        return String.format(Locale.US, "%." + (v<9.999999 ? 2 : 1) + "f %s", v, unit);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+
+import java.text.NumberFormat;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * A system of units used to express length and area measurements.
+ * @since 3406 (creation)
+ * @since 6992 (extraction in this package) 
+ */
+public class SystemOfMeasurement {
+
+    /**
+     * Metric system (international standard).
+     * @since 3406
+     */
+    public static final SystemOfMeasurement METRIC = new SystemOfMeasurement(1, "m", 1000, "km", 10000, "ha");
+
+    /**
+     * Chinese system.
+     * @since 3406
+     */
+    public static final SystemOfMeasurement CHINESE = new SystemOfMeasurement(1.0/3.0, "\u5e02\u5c3a" /* chi */, 500, "\u5e02\u91cc" /* li */);
+
+    /**
+     * 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");
+
+    /**
+     * Nautical mile system (navigation, polar exploration).
+     * @since 5549
+     */
+    public static final SystemOfMeasurement NAUTICAL_MILE = new SystemOfMeasurement(185.2, "kbl", 1852, "NM");
+    
+    /**
+     * Known systems of measurement.
+     * @since 3406
+     */
+    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);
+    }
+    
+    /** First value, in meters, used to translate unit according to above formula. */
+    public final double aValue;
+    /** Second value, in meters, used to translate unit according to above formula. */
+    public final double bValue;
+    /** First unit used to format text. */
+    public final String aName;
+    /** Second unit used to format text. */
+    public final String bName;
+    /** 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;
+    /** Specific optional area unit. Set to {@code null} if not used.
+     *  @since 5870 */
+    public final String areaCustomName;
+
+    /**
+     * System of measurement. Currently covers only length (and area) units.
+     *
+     * If a quantity x is given in m (x_m) and in unit a (x_a) then it translates as
+     * x_a == x_m / aValue
+     *
+     * @param aValue First value, in meters, used to translate unit according to above formula.
+     * @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.
+     */
+    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName) {
+        this(aValue, aName, bValue, bName, -1, null);
+    }
+
+    /**
+     * System of measurement. Currently covers only length (and area) units.
+     *
+     * If a quantity x is given in m (x_m) and in unit a (x_a) then it translates as
+     * x_a == x_m / aValue
+     *
+     * @param aValue First value, in meters, used to translate unit according to above formula.
+     * @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 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
+     */
+    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName, double areaCustomValue, String areaCustomName) {
+        this.aValue = aValue;
+        this.aName = aName;
+        this.bValue = bValue;
+        this.bName = bName;
+        this.areaCustomValue = areaCustomValue;
+        this.areaCustomName = areaCustomName;
+    }
+
+    /**
+     * Returns the text describing the given distance in this system of measurement.
+     * @param dist The distance in metres
+     * @return The text describing the given distance in this system of measurement.
+     */
+    public String getDistText(double dist) {
+        return getDistText(dist, null, 0.01);
+    }
+
+    /**
+     * Returns the text describing the given distance in this system of measurement.
+     * @param dist The distance in metres
+     * @param format A {@link NumberFormat} to format the area value
+     * @param threshold Values lower than this {@code threshold} are displayed as {@code "< [threshold]"}
+     * @return The text describing the given distance in this system of measurement.
+     * @since 6422
+     */
+    public String getDistText(final double dist, final NumberFormat format, final double threshold) {
+        double a = dist / aValue;
+        if (!Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false) && a > bValue / aValue)
+            return formatText(dist / bValue, bName, format);
+        else if (a < threshold)
+            return "< " + formatText(threshold, aName, format);
+        else
+            return formatText(a, aName, format);
+    }
+
+    /**
+     * Returns the text describing the given area in this system of measurement.
+     * @param area The area in square metres
+     * @return The text describing the given area in this system of measurement.
+     * @since 5560
+     */
+    public String getAreaText(double area) {
+        return getAreaText(area, null, 0.01);
+    }
+
+    /**
+     * Returns the text describing the given area in this system of measurement.
+     * @param area The area in square metres
+     * @param format A {@link NumberFormat} to format the area value
+     * @param threshold Values lower than this {@code threshold} are displayed as {@code "< [threshold]"}
+     * @return The text describing the given area in this system of measurement.
+     * @since 6422
+     */
+    public String getAreaText(final double area, final NumberFormat format, final double threshold) {
+        double a = area / (aValue*aValue);
+        boolean lowerOnly = Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false);
+        boolean customAreaOnly = Main.pref.getBoolean("system_of_measurement.use_only_custom_area_unit", false);
+        if ((!lowerOnly && areaCustomValue > 0 && a > areaCustomValue / (aValue*aValue) && a < (bValue*bValue) / (aValue*aValue)) || customAreaOnly)
+            return formatText(area / areaCustomValue, areaCustomName, format);
+        else if (!lowerOnly && a >= (bValue*bValue) / (aValue*aValue))
+            return formatText(area / (bValue * bValue), bName + "\u00b2", format);
+        else if (a < threshold)
+            return "< " + formatText(threshold, aName + "\u00b2", format);
+        else
+            return formatText(a, aName + "\u00b2", format);
+    }
+
+    private static String formatText(double v, String unit, NumberFormat format) {
+        if (format != null) {
+            return format.format(v) + " " + unit;
+        }
+        return String.format(Locale.US, "%." + (v<9.999999 ? 2 : 1) + "f %s", v, unit);
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/ViewportData.java b/src/org/openstreetmap/josm/data/ViewportData.java
index d31ee19..dee6a4f 100644
--- a/src/org/openstreetmap/josm/data/ViewportData.java
+++ b/src/org/openstreetmap/josm/data/ViewportData.java
@@ -1,68 +1,68 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data;
-
-import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-
-/**
- * Data class to keep viewport information.
- *
- * This can be either a combination of map center and map scale or
- * a rectangle in east-north coordinate space.
- *
- * Either of those will be null, so the consumer of the ViewportData
- * object has to check, which one is set.
- *
- * @since 5670 (creation)
- * @since 6992 (extraction in this package)
- */
-public class ViewportData {
-    private final EastNorth center;
-    private final Double scale;
-
-    private final ProjectionBounds bounds;
-
-    /**
-     * Constructs a new {@code ViewportData}.
-     * @param center Projected coordinates of the map center
-     * @param scale Scale factor in east-/north-units per pixel
-     */
-    public ViewportData(EastNorth center, Double scale) {
-        CheckParameterUtil.ensureParameterNotNull(center);
-        CheckParameterUtil.ensureParameterNotNull(scale);
-        this.center = center;
-        this.scale = scale;
-        this.bounds = null;
-    }
-
-    public ViewportData(ProjectionBounds bounds) {
-        CheckParameterUtil.ensureParameterNotNull(bounds);
-        this.center = null;
-        this.scale = null;
-        this.bounds = bounds;
-    }
-
-    /**
-     * Return the projected coordinates of the map center
-     * @return the center
-     */
-    public EastNorth getCenter() {
-        return center;
-    }
-
-    /**
-     * Return the scale factor in east-/north-units per pixel.
-     * @return the scale
-     */
-    public Double getScale() {
-        return scale;
-    }
-
-    /**
-     * Return the bounds in east-north coordinate space.
-     * @return the bounds
-     */
-    public ProjectionBounds getBounds() {
-        return bounds;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
+/**
+ * Data class to keep viewport information.
+ *
+ * This can be either a combination of map center and map scale or
+ * a rectangle in east-north coordinate space.
+ *
+ * Either of those will be null, so the consumer of the ViewportData
+ * object has to check, which one is set.
+ *
+ * @since 5670 (creation)
+ * @since 6992 (extraction in this package)
+ */
+public class ViewportData {
+    private final EastNorth center;
+    private final Double scale;
+
+    private final ProjectionBounds bounds;
+
+    /**
+     * Constructs a new {@code ViewportData}.
+     * @param center Projected coordinates of the map center
+     * @param scale Scale factor in east-/north-units per pixel
+     */
+    public ViewportData(EastNorth center, Double scale) {
+        CheckParameterUtil.ensureParameterNotNull(center);
+        CheckParameterUtil.ensureParameterNotNull(scale);
+        this.center = center;
+        this.scale = scale;
+        this.bounds = null;
+    }
+
+    public ViewportData(ProjectionBounds bounds) {
+        CheckParameterUtil.ensureParameterNotNull(bounds);
+        this.center = null;
+        this.scale = null;
+        this.bounds = bounds;
+    }
+
+    /**
+     * Return the projected coordinates of the map center
+     * @return the center
+     */
+    public EastNorth getCenter() {
+        return center;
+    }
+
+    /**
+     * Return the scale factor in east-/north-units per pixel.
+     * @return the scale
+     */
+    public Double getScale() {
+        return scale;
+    }
+
+    /**
+     * Return the bounds in east-north coordinate space.
+     * @return the bounds
+     */
+    public ProjectionBounds getBounds() {
+        return bounds;
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/osm/Changeset.java b/src/org/openstreetmap/josm/data/osm/Changeset.java
index 79e2b88..5ee09a0 100644
--- a/src/org/openstreetmap/josm/data/osm/Changeset.java
+++ b/src/org/openstreetmap/josm/data/osm/Changeset.java
@@ -12,6 +12,7 @@ import java.util.Map;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * Represents a single changeset in JOSM. For now its only used during
@@ -20,8 +21,8 @@ import org.openstreetmap.josm.data.osm.visitor.Visitor;
  */
 public final class Changeset implements Tagged {
 
-    /** The maximum changeset comment text length allowed by API 0.6 **/
-    public static final int MAX_COMMENT_LENGTH = 255;
+    /** The maximum changeset tag length allowed by API 0.6 **/
+    public static final int MAX_CHANGESET_TAG_LENGTH = 255;
 
     /** the changeset id */
     private int id;
@@ -190,6 +191,12 @@ public final class Changeset implements Tagged {
 
     @Override
     public void setKeys(Map<String, String> keys) {
+        CheckParameterUtil.ensureParameterNotNull(keys, "keys");
+        for (String value : keys.values()) {
+            if (value != null && value.length() > MAX_CHANGESET_TAG_LENGTH) {
+                throw new IllegalArgumentException("Changeset tag value is too long: "+value);
+            }
+        }
         this.tags = keys;
     }
 
@@ -203,6 +210,10 @@ public final class Changeset implements Tagged {
 
     @Override
     public void put(String key, String value) {
+        CheckParameterUtil.ensureParameterNotNull(key, "key");
+        if (value != null && value.length() > MAX_CHANGESET_TAG_LENGTH) {
+            throw new IllegalArgumentException("Changeset tag value is too long: "+value);
+        }
         this.tags.put(key, value);
     }
 
diff --git a/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java b/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java
index c9f5a66..c58e96b 100644
--- a/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java
+++ b/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java
@@ -1,65 +1,65 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import java.util.Date;
-
-/**
- * A comment in a public changeset discussion.
- * @since 7704
- */
-public class ChangesetDiscussionComment {
-
-    /** date this comment was posted at */
-    private final Date date;
-    /** the user who posted the comment */
-    private final User user;
-    /** comment text */
-    private String text;
-
-    /**
-     * Constructs a new {@code ChangesetDiscussionComment}.
-     * @param date date this comment was posted at
-     * @param user the user who posted the comment
-     */
-    public ChangesetDiscussionComment(Date date, User user) {
-        this.date = date;
-        this.user = user;
-    }
-
-    /**
-     * Replies comment text.
-     * @return comment text
-     */
-    public final String getText() {
-        return text;
-    }
-
-    /**
-     * Sets comment text.
-     * @param text comment text
-     */
-    public final void setText(String text) {
-        this.text = text;
-    }
-
-    /**
-     * Replies date this comment was posted at.
-     * @return date this comment was posted at
-     */
-    public final Date getDate() {
-        return date;
-    }
-
-    /**
-     * Replies the user who posted the comment.
-     * @return the user who posted the comment
-     */
-    public final User getUser() {
-        return user;
-    }
-
-    @Override
-    public String toString() {
-        return "ChangesetDiscussionComment [date=" + date + ", user=" + user + ", text='" + text + "']";
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.util.Date;
+
+/**
+ * A comment in a public changeset discussion.
+ * @since 7704
+ */
+public class ChangesetDiscussionComment {
+
+    /** date this comment was posted at */
+    private final Date date;
+    /** the user who posted the comment */
+    private final User user;
+    /** comment text */
+    private String text;
+
+    /**
+     * Constructs a new {@code ChangesetDiscussionComment}.
+     * @param date date this comment was posted at
+     * @param user the user who posted the comment
+     */
+    public ChangesetDiscussionComment(Date date, User user) {
+        this.date = date;
+        this.user = user;
+    }
+
+    /**
+     * Replies comment text.
+     * @return comment text
+     */
+    public final String getText() {
+        return text;
+    }
+
+    /**
+     * Sets comment text.
+     * @param text comment text
+     */
+    public final void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * Replies date this comment was posted at.
+     * @return date this comment was posted at
+     */
+    public final Date getDate() {
+        return date;
+    }
+
+    /**
+     * Replies the user who posted the comment.
+     * @return the user who posted the comment
+     */
+    public final User getUser() {
+        return user;
+    }
+
+    @Override
+    public String toString() {
+        return "ChangesetDiscussionComment [date=" + date + ", user=" + user + ", text='" + text + "']";
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/osm/PrimitiveDeepCopy.java b/src/org/openstreetmap/josm/data/osm/PrimitiveDeepCopy.java
index 4dbd81b..e8121ad 100644
--- a/src/org/openstreetmap/josm/data/osm/PrimitiveDeepCopy.java
+++ b/src/org/openstreetmap/josm/data/osm/PrimitiveDeepCopy.java
@@ -13,7 +13,7 @@ import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 /**
  * This class allows to create and keep a deep copy of primitives. Provides methods to access directly added
  * primitives and reference primitives
- *
+ * @since 2305
  */
 public class PrimitiveDeepCopy {
 
@@ -25,19 +25,28 @@ public class PrimitiveDeepCopy {
     private final List<PrimitiveData> referenced = new ArrayList<>();
     private final CopyOnWriteArrayList<PasteBufferChangedListener> listeners = new CopyOnWriteArrayList<>();
 
+    /**
+     * Constructs a new {@code PrimitiveDeepCopy} without data. Use {@link #makeCopy(Collection)} after that.
+     */
     public PrimitiveDeepCopy() {
-
+        // Do nothing
     }
 
-    public PrimitiveDeepCopy(final Collection<OsmPrimitive> primitives) {
+    /**
+     * Constructs a new {@code PrimitiveDeepCopy} of given OSM primitives.
+     * @param primitives OSM primitives to copy
+     * @since 7961
+     */
+    public PrimitiveDeepCopy(final Collection<? extends OsmPrimitive> primitives) {
         makeCopy(primitives);
     }
 
     /**
-     * Replace content of the object with copy of provided primitives
-     * @param primitives
+     * Replace content of the object with copy of provided primitives.
+     * @param primitives OSM primitives to copy
+     * @since 7961
      */
-    public final void makeCopy(final Collection<OsmPrimitive> primitives) {
+    public final void makeCopy(final Collection<? extends OsmPrimitive> primitives) {
         directlyAdded.clear();
         referenced.clear();
 
@@ -118,5 +127,4 @@ public class PrimitiveDeepCopy {
     public void removePasteBufferChangedListener(PasteBufferChangedListener listener) {
         listeners.remove(listener);
     }
-
 }
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 8780f0e..063f045 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
@@ -1,344 +1,344 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm.visitor.paint.relations;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-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;
-import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
-import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
-import org.openstreetmap.josm.data.osm.event.DataSetListener;
-import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
-import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
-import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
-import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
-import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
-import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
-import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
-import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-
-/**
- * A memory cache for {@link Multipolygon} objects.
- * @since 4623
- */
-public final class MultipolygonCache implements DataSetListener, LayerChangeListener, ProjectionChangeListener, SelectionChangedListener {
-
-    private static final MultipolygonCache INSTANCE = new MultipolygonCache();
-
-    private final Map<NavigatableComponent, Map<DataSet, Map<Relation, Multipolygon>>> cache;
-
-    private final Collection<PolyData> selectedPolyData;
-
-    private MultipolygonCache() {
-        this.cache = new HashMap<>();
-        this.selectedPolyData = new ArrayList<>();
-        Main.addProjectionChangeListener(this);
-        DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
-    }
-
-    /**
-     * Replies the unique instance.
-     * @return the unique instance
-     */
-    public static final MultipolygonCache getInstance() {
-        return INSTANCE;
-    }
-
-    /**
-     * Gets a multipolygon from cache.
-     * @param nc The navigatable component
-     * @param r The multipolygon relation
-     * @return A multipolygon object for the given relation, or {@code null}
-     */
-    public final Multipolygon get(NavigatableComponent nc, Relation r) {
-        return get(nc, r, false);
-    }
-
-    /**
-     * Gets a multipolygon from cache.
-     * @param nc The navigatable component
-     * @param r The multipolygon relation
-     * @param forceRefresh if {@code true}, a new object will be created even of present in cache
-     * @return A multipolygon object for the given relation, or {@code null}
-     */
-    public final Multipolygon get(NavigatableComponent nc, Relation r, boolean forceRefresh) {
-        Multipolygon multipolygon = null;
-        if (nc != null && r != null) {
-            Map<DataSet, Map<Relation, Multipolygon>> map1 = cache.get(nc);
-            if (map1 == null) {
-                cache.put(nc, map1 = new HashMap<>());
-            }
-            Map<Relation, Multipolygon> map2 = map1.get(r.getDataSet());
-            if (map2 == null) {
-                map1.put(r.getDataSet(), map2 = new HashMap<>());
-            }
-            multipolygon = map2.get(r);
-            if (multipolygon == null || forceRefresh) {
-                map2.put(r, multipolygon = new Multipolygon(r));
-                for (PolyData pd : multipolygon.getCombinedPolygons()) {
-                    if (pd.selected) {
-                        selectedPolyData.add(pd);
-                    }
-                }
-            }
-        }
-        return multipolygon;
-    }
-
-    /**
-     * Clears the cache for the given navigatable component.
-     * @param nc the navigatable component
-     */
-    public final void clear(NavigatableComponent nc) {
-        Map<DataSet, Map<Relation, Multipolygon>> map = cache.remove(nc);
-        if (map != null) {
-            map.clear();
-            map = null;
-        }
-    }
-
-    /**
-     * Clears the cache for the given dataset.
-     * @param ds the data set
-     */
-    public final void clear(DataSet ds) {
-        for (Map<DataSet, Map<Relation, Multipolygon>> map1 : cache.values()) {
-            Map<Relation, Multipolygon> map2 = map1.remove(ds);
-            if (map2 != null) {
-                map2.clear();
-                map2 = null;
-            }
-        }
-    }
-
-    /**
-     * Clears the whole cache.
-     */
-    public final void clear() {
-        cache.clear();
-    }
-
-    private final Collection<Map<Relation, Multipolygon>> getMapsFor(DataSet ds) {
-        List<Map<Relation, Multipolygon>> result = new ArrayList<>();
-        for (Map<DataSet, Map<Relation, Multipolygon>> map : cache.values()) {
-            Map<Relation, Multipolygon> map2 = map.get(ds);
-            if (map2 != null) {
-                result.add(map2);
-            }
-        }
-        return result;
-    }
-
-    private static final boolean isMultipolygon(OsmPrimitive p) {
-        return p instanceof Relation && ((Relation) p).isMultipolygon();
-    }
-
-    private final void updateMultipolygonsReferringTo(AbstractDatasetChangedEvent event) {
-        updateMultipolygonsReferringTo(event, event.getPrimitives(), event.getDataset());
-    }
-
-    private final void updateMultipolygonsReferringTo(
-            final AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives, DataSet ds) {
-        updateMultipolygonsReferringTo(event, primitives, ds, null);
-    }
-
-    private final Collection<Map<Relation, Multipolygon>> updateMultipolygonsReferringTo(
-            AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives,
-            DataSet ds, Collection<Map<Relation, Multipolygon>> initialMaps) {
-        Collection<Map<Relation, Multipolygon>> maps = initialMaps;
-        if (primitives != null) {
-            for (OsmPrimitive p : primitives) {
-                if (isMultipolygon(p)) {
-                    if (maps == null) {
-                        maps = getMapsFor(ds);
-                    }
-                    processEvent(event, (Relation) p, maps);
-
-                } else if (p instanceof Way && p.getDataSet() != null) {
-                    for (OsmPrimitive ref : p.getReferrers()) {
-                        if (isMultipolygon(ref)) {
-                            if (maps == null) {
-                                maps = getMapsFor(ds);
-                            }
-                            processEvent(event, (Relation) ref, maps);
-                        }
-                    }
-                } else if (p instanceof Node && p.getDataSet() != null) {
-                    maps = updateMultipolygonsReferringTo(event, p.getReferrers(), ds, maps);
-                }
-            }
-        }
-        return maps;
-    }
-
-    private final void processEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) {
-        if (event instanceof NodeMovedEvent || event instanceof WayNodesChangedEvent) {
-            dispatchEvent(event, r, maps);
-        } else if (event instanceof PrimitivesRemovedEvent) {
-            if (event.getPrimitives().contains(r)) {
-                removeMultipolygonFrom(r, maps);
-            }
-        } else {
-            // Default (non-optimal) action: remove multipolygon from cache
-            removeMultipolygonFrom(r, maps);
-        }
-    }
-
-    private final void dispatchEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) {
-        for (Map<Relation, Multipolygon> map : maps) {
-            Multipolygon m = map.get(r);
-            if (m != null) {
-                for (PolyData pd : m.getCombinedPolygons()) {
-                    if (event instanceof NodeMovedEvent) {
-                        pd.nodeMoved((NodeMovedEvent) event);
-                    } else if (event instanceof WayNodesChangedEvent) {
-                        pd.wayNodesChanged((WayNodesChangedEvent)event);
-                    }
-                }
-            }
-        }
-    }
-
-    private final void removeMultipolygonFrom(Relation r, Collection<Map<Relation, Multipolygon>> maps) {
-        for (Map<Relation, Multipolygon> map : maps) {
-            map.remove(r);
-        }
-        // Erase style cache for polygon members
-        for (OsmPrimitive member : r.getMemberPrimitives()) {
-            member.clearCachedStyle();
-        }
-    }
-
-    @Override
-    public void primitivesAdded(PrimitivesAddedEvent event) {
-        // Do nothing
-    }
-
-    @Override
-    public void primitivesRemoved(PrimitivesRemovedEvent event) {
-        updateMultipolygonsReferringTo(event);
-    }
-
-    @Override
-    public void tagsChanged(TagsChangedEvent event) {
-        updateMultipolygonsReferringTo(event);
-    }
-
-    @Override
-    public void nodeMoved(NodeMovedEvent event) {
-        updateMultipolygonsReferringTo(event);
-    }
-
-    @Override
-    public void wayNodesChanged(WayNodesChangedEvent event) {
-        updateMultipolygonsReferringTo(event);
-    }
-
-    @Override
-    public void relationMembersChanged(RelationMembersChangedEvent event) {
-        updateMultipolygonsReferringTo(event);
-    }
-
-    @Override
-    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
-        // Do nothing
-    }
-
-    @Override
-    public void dataChanged(DataChangedEvent event) {
-        // Do not call updateMultipolygonsReferringTo as getPrimitives()
-        // can return all the data set primitives for this event
-        Collection<Map<Relation, Multipolygon>> maps = null;
-        for (OsmPrimitive p : event.getPrimitives()) {
-            if (isMultipolygon(p)) {
-                if (maps == null) {
-                    maps = getMapsFor(event.getDataset());
-                }
-                for (Map<Relation, Multipolygon> map : maps) {
-                    // DataChangedEvent is sent after downloading incomplete members (see #7131),
-                    // without having received RelationMembersChangedEvent or PrimitivesAddedEvent
-                    // OR when undoing a move of a large number of nodes (see #7195),
-                    // without having received NodeMovedEvent
-                    // This ensures concerned multipolygons will be correctly redrawn
-                    map.remove(p);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof OsmDataLayer) {
-            clear(((OsmDataLayer) oldLayer).data);
-        }
-    }
-
-    @Override
-    public void projectionChanged(Projection oldValue, Projection newValue) {
-        clear();
-    }
-
-    @Override
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-
-        for (Iterator<PolyData> it = selectedPolyData.iterator(); it.hasNext();) {
-            it.next().selected = false;
-            it.remove();
-        }
-
-        DataSet ds = null;
-        Collection<Map<Relation, Multipolygon>> maps = null;
-        for (OsmPrimitive p : newSelection) {
-            if (p instanceof Way && p.getDataSet() != null) {
-                if (ds == null) {
-                    ds = p.getDataSet();
-                }
-                for (OsmPrimitive ref : p.getReferrers()) {
-                    if (isMultipolygon(ref)) {
-                        if (maps == null) {
-                            maps = getMapsFor(ds);
-                        }
-                        for (Map<Relation, Multipolygon> map : maps) {
-                            Multipolygon multipolygon = map.get(ref);
-                            if (multipolygon != null) {
-                                for (PolyData pd : multipolygon.getCombinedPolygons()) {
-                                    if (pd.getWayIds().contains(p.getUniqueId())) {
-                                        pd.selected = true;
-                                        selectedPolyData.add(pd);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.visitor.paint.relations;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+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;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
+import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
+import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
+import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * A memory cache for {@link Multipolygon} objects.
+ * @since 4623
+ */
+public final class MultipolygonCache implements DataSetListener, LayerChangeListener, ProjectionChangeListener, SelectionChangedListener {
+
+    private static final MultipolygonCache INSTANCE = new MultipolygonCache();
+
+    private final Map<NavigatableComponent, Map<DataSet, Map<Relation, Multipolygon>>> cache;
+
+    private final Collection<PolyData> selectedPolyData;
+
+    private MultipolygonCache() {
+        this.cache = new HashMap<>();
+        this.selectedPolyData = new ArrayList<>();
+        Main.addProjectionChangeListener(this);
+        DataSet.addSelectionListener(this);
+        MapView.addLayerChangeListener(this);
+    }
+
+    /**
+     * Replies the unique instance.
+     * @return the unique instance
+     */
+    public static final MultipolygonCache getInstance() {
+        return INSTANCE;
+    }
+
+    /**
+     * Gets a multipolygon from cache.
+     * @param nc The navigatable component
+     * @param r The multipolygon relation
+     * @return A multipolygon object for the given relation, or {@code null}
+     */
+    public final Multipolygon get(NavigatableComponent nc, Relation r) {
+        return get(nc, r, false);
+    }
+
+    /**
+     * Gets a multipolygon from cache.
+     * @param nc The navigatable component
+     * @param r The multipolygon relation
+     * @param forceRefresh if {@code true}, a new object will be created even of present in cache
+     * @return A multipolygon object for the given relation, or {@code null}
+     */
+    public final Multipolygon get(NavigatableComponent nc, Relation r, boolean forceRefresh) {
+        Multipolygon multipolygon = null;
+        if (nc != null && r != null) {
+            Map<DataSet, Map<Relation, Multipolygon>> map1 = cache.get(nc);
+            if (map1 == null) {
+                cache.put(nc, map1 = new HashMap<>());
+            }
+            Map<Relation, Multipolygon> map2 = map1.get(r.getDataSet());
+            if (map2 == null) {
+                map1.put(r.getDataSet(), map2 = new HashMap<>());
+            }
+            multipolygon = map2.get(r);
+            if (multipolygon == null || forceRefresh) {
+                map2.put(r, multipolygon = new Multipolygon(r));
+                for (PolyData pd : multipolygon.getCombinedPolygons()) {
+                    if (pd.selected) {
+                        selectedPolyData.add(pd);
+                    }
+                }
+            }
+        }
+        return multipolygon;
+    }
+
+    /**
+     * Clears the cache for the given navigatable component.
+     * @param nc the navigatable component
+     */
+    public final void clear(NavigatableComponent nc) {
+        Map<DataSet, Map<Relation, Multipolygon>> map = cache.remove(nc);
+        if (map != null) {
+            map.clear();
+            map = null;
+        }
+    }
+
+    /**
+     * Clears the cache for the given dataset.
+     * @param ds the data set
+     */
+    public final void clear(DataSet ds) {
+        for (Map<DataSet, Map<Relation, Multipolygon>> map1 : cache.values()) {
+            Map<Relation, Multipolygon> map2 = map1.remove(ds);
+            if (map2 != null) {
+                map2.clear();
+                map2 = null;
+            }
+        }
+    }
+
+    /**
+     * Clears the whole cache.
+     */
+    public final void clear() {
+        cache.clear();
+    }
+
+    private final Collection<Map<Relation, Multipolygon>> getMapsFor(DataSet ds) {
+        List<Map<Relation, Multipolygon>> result = new ArrayList<>();
+        for (Map<DataSet, Map<Relation, Multipolygon>> map : cache.values()) {
+            Map<Relation, Multipolygon> map2 = map.get(ds);
+            if (map2 != null) {
+                result.add(map2);
+            }
+        }
+        return result;
+    }
+
+    private static final boolean isMultipolygon(OsmPrimitive p) {
+        return p instanceof Relation && ((Relation) p).isMultipolygon();
+    }
+
+    private final void updateMultipolygonsReferringTo(AbstractDatasetChangedEvent event) {
+        updateMultipolygonsReferringTo(event, event.getPrimitives(), event.getDataset());
+    }
+
+    private final void updateMultipolygonsReferringTo(
+            final AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives, DataSet ds) {
+        updateMultipolygonsReferringTo(event, primitives, ds, null);
+    }
+
+    private final Collection<Map<Relation, Multipolygon>> updateMultipolygonsReferringTo(
+            AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives,
+            DataSet ds, Collection<Map<Relation, Multipolygon>> initialMaps) {
+        Collection<Map<Relation, Multipolygon>> maps = initialMaps;
+        if (primitives != null) {
+            for (OsmPrimitive p : primitives) {
+                if (isMultipolygon(p)) {
+                    if (maps == null) {
+                        maps = getMapsFor(ds);
+                    }
+                    processEvent(event, (Relation) p, maps);
+
+                } else if (p instanceof Way && p.getDataSet() != null) {
+                    for (OsmPrimitive ref : p.getReferrers()) {
+                        if (isMultipolygon(ref)) {
+                            if (maps == null) {
+                                maps = getMapsFor(ds);
+                            }
+                            processEvent(event, (Relation) ref, maps);
+                        }
+                    }
+                } else if (p instanceof Node && p.getDataSet() != null) {
+                    maps = updateMultipolygonsReferringTo(event, p.getReferrers(), ds, maps);
+                }
+            }
+        }
+        return maps;
+    }
+
+    private final void processEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) {
+        if (event instanceof NodeMovedEvent || event instanceof WayNodesChangedEvent) {
+            dispatchEvent(event, r, maps);
+        } else if (event instanceof PrimitivesRemovedEvent) {
+            if (event.getPrimitives().contains(r)) {
+                removeMultipolygonFrom(r, maps);
+            }
+        } else {
+            // Default (non-optimal) action: remove multipolygon from cache
+            removeMultipolygonFrom(r, maps);
+        }
+    }
+
+    private final void dispatchEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) {
+        for (Map<Relation, Multipolygon> map : maps) {
+            Multipolygon m = map.get(r);
+            if (m != null) {
+                for (PolyData pd : m.getCombinedPolygons()) {
+                    if (event instanceof NodeMovedEvent) {
+                        pd.nodeMoved((NodeMovedEvent) event);
+                    } else if (event instanceof WayNodesChangedEvent) {
+                        pd.wayNodesChanged((WayNodesChangedEvent)event);
+                    }
+                }
+            }
+        }
+    }
+
+    private final void removeMultipolygonFrom(Relation r, Collection<Map<Relation, Multipolygon>> maps) {
+        for (Map<Relation, Multipolygon> map : maps) {
+            map.remove(r);
+        }
+        // Erase style cache for polygon members
+        for (OsmPrimitive member : r.getMemberPrimitives()) {
+            member.clearCachedStyle();
+        }
+    }
+
+    @Override
+    public void primitivesAdded(PrimitivesAddedEvent event) {
+        // Do nothing
+    }
+
+    @Override
+    public void primitivesRemoved(PrimitivesRemovedEvent event) {
+        updateMultipolygonsReferringTo(event);
+    }
+
+    @Override
+    public void tagsChanged(TagsChangedEvent event) {
+        updateMultipolygonsReferringTo(event);
+    }
+
+    @Override
+    public void nodeMoved(NodeMovedEvent event) {
+        updateMultipolygonsReferringTo(event);
+    }
+
+    @Override
+    public void wayNodesChanged(WayNodesChangedEvent event) {
+        updateMultipolygonsReferringTo(event);
+    }
+
+    @Override
+    public void relationMembersChanged(RelationMembersChangedEvent event) {
+        updateMultipolygonsReferringTo(event);
+    }
+
+    @Override
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        // Do nothing
+    }
+
+    @Override
+    public void dataChanged(DataChangedEvent event) {
+        // Do not call updateMultipolygonsReferringTo as getPrimitives()
+        // can return all the data set primitives for this event
+        Collection<Map<Relation, Multipolygon>> maps = null;
+        for (OsmPrimitive p : event.getPrimitives()) {
+            if (isMultipolygon(p)) {
+                if (maps == null) {
+                    maps = getMapsFor(event.getDataset());
+                }
+                for (Map<Relation, Multipolygon> map : maps) {
+                    // DataChangedEvent is sent after downloading incomplete members (see #7131),
+                    // without having received RelationMembersChangedEvent or PrimitivesAddedEvent
+                    // OR when undoing a move of a large number of nodes (see #7195),
+                    // without having received NodeMovedEvent
+                    // This ensures concerned multipolygons will be correctly redrawn
+                    map.remove(p);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        // Do nothing
+    }
+
+    @Override
+    public void layerAdded(Layer newLayer) {
+        // Do nothing
+    }
+
+    @Override
+    public void layerRemoved(Layer oldLayer) {
+        if (oldLayer instanceof OsmDataLayer) {
+            clear(((OsmDataLayer) oldLayer).data);
+        }
+    }
+
+    @Override
+    public void projectionChanged(Projection oldValue, Projection newValue) {
+        clear();
+    }
+
+    @Override
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+
+        for (Iterator<PolyData> it = selectedPolyData.iterator(); it.hasNext();) {
+            it.next().selected = false;
+            it.remove();
+        }
+
+        DataSet ds = null;
+        Collection<Map<Relation, Multipolygon>> maps = null;
+        for (OsmPrimitive p : newSelection) {
+            if (p instanceof Way && p.getDataSet() != null) {
+                if (ds == null) {
+                    ds = p.getDataSet();
+                }
+                for (OsmPrimitive ref : p.getReferrers()) {
+                    if (isMultipolygon(ref)) {
+                        if (maps == null) {
+                            maps = getMapsFor(ds);
+                        }
+                        for (Map<Relation, Multipolygon> map : maps) {
+                            Multipolygon multipolygon = map.get(ref);
+                            if (multipolygon != null) {
+                                for (PolyData pd : multipolygon.getCombinedPolygons()) {
+                                    if (pd.getWayIds().contains(p.getUniqueId())) {
+                                        pd.selected = true;
+                                        selectedPolyData.add(pd);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/preferences/ColorProperty.java b/src/org/openstreetmap/josm/data/preferences/ColorProperty.java
index 7a9ee64..fbdf3ae 100644
--- a/src/org/openstreetmap/josm/data/preferences/ColorProperty.java
+++ b/src/org/openstreetmap/josm/data/preferences/ColorProperty.java
@@ -1,55 +1,55 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.preferences;
-
-import java.awt.Color;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Preferences.ColorKey;
-
-/**
- * A property containing a {@link Color} value.
- * @since 5464
- */
-public class ColorProperty extends AbstractProperty<Color> implements ColorKey {
-
-    private final String name;
-    
-    /**
-     * Constructs a new {@code ColorProperty}.
-     * @param colName The color name
-     * @param defaultValue The default value
-     */
-    public ColorProperty(String colName, Color defaultValue) {
-        super(getColorKey(colName), defaultValue);
-        this.name = colName;
-    }
-    
-    @Override
-    public Color get() {
-        return Main.pref.getColor(this);
-    }
-
-    @Override
-    public boolean put(Color value) {
-        return Main.pref.putColor(getColorKey(name), value);
-    }
-    
-    /**
-     * Replies the color key used in JOSM preferences for this property.
-     * @param colName The color name
-     * @return The color key for this property
-     */
-    public static String getColorKey(String colName) {
-        return colName == null ? null : colName.toLowerCase().replaceAll("[^a-z0-9]+",".");
-    }
-
-    @Override
-    public String getColorName() {
-        return name;
-    }
-
-    @Override
-    public String getSpecialName() {
-        return null;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.awt.Color;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.ColorKey;
+
+/**
+ * A property containing a {@link Color} value.
+ * @since 5464
+ */
+public class ColorProperty extends AbstractProperty<Color> implements ColorKey {
+
+    private final String name;
+    
+    /**
+     * Constructs a new {@code ColorProperty}.
+     * @param colName The color name
+     * @param defaultValue The default value
+     */
+    public ColorProperty(String colName, Color defaultValue) {
+        super(getColorKey(colName), defaultValue);
+        this.name = colName;
+    }
+    
+    @Override
+    public Color get() {
+        return Main.pref.getColor(this);
+    }
+
+    @Override
+    public boolean put(Color value) {
+        return Main.pref.putColor(getColorKey(name), value);
+    }
+    
+    /**
+     * Replies the color key used in JOSM preferences for this property.
+     * @param colName The color name
+     * @return The color key for this property
+     */
+    public static String getColorKey(String colName) {
+        return colName == null ? null : colName.toLowerCase().replaceAll("[^a-z0-9]+",".");
+    }
+
+    @Override
+    public String getColorName() {
+        return name;
+    }
+
+    @Override
+    public String getSpecialName() {
+        return null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/projection/Projections.java b/src/org/openstreetmap/josm/data/projection/Projections.java
index de718f7..ef0d447 100644
--- a/src/org/openstreetmap/josm/data/projection/Projections.java
+++ b/src/org/openstreetmap/josm/data/projection/Projections.java
@@ -19,6 +19,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.datum.Datum;
+import org.openstreetmap.josm.data.projection.datum.GRS80Datum;
 import org.openstreetmap.josm.data.projection.datum.NTV2GridShiftFileWrapper;
 import org.openstreetmap.josm.data.projection.datum.WGS84Datum;
 import org.openstreetmap.josm.data.projection.proj.ClassProjFactory;
@@ -80,6 +81,7 @@ public final class Projections {
         ellipsoids.put("bessel", Ellipsoid.Bessel1841);
 
         datums.put("WGS84", WGS84Datum.INSTANCE);
+        datums.put("GRS80", GRS80Datum.INSTANCE);
 
         nadgrids.put("BETA2007.gsb", NTV2GridShiftFileWrapper.BETA2007);
         nadgrids.put("ntf_r93_b.gsb", NTV2GridShiftFileWrapper.ntf_rgf93);
@@ -122,8 +124,16 @@ public final class Projections {
         return nadgrids.get(id);
     }
 
+    /**
+     * Get the projection definition string for the given id.
+     * @param id the id
+     * @return the string that can be processed by #{link CustomProjection}.
+     * Null, if the id isn't supported.
+     */
     public static String getInit(String id) {
-        return inits.get(id.toUpperCase()).b;
+        Pair<String, String> r = inits.get(id.toUpperCase());
+        if (r == null) return null;
+        return r.b;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
index 8b4bf41..47f0995 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
@@ -128,13 +128,13 @@ public class NTV2GridShiftFile implements Serializable {
         shiftType = new String(b8, StandardCharsets.UTF_8);
         in.read(b8);
         in.read(b8);
-        version = new String(b8);
+        version = new String(b8, StandardCharsets.UTF_8);
         in.read(b8);
         in.read(b8);
-        fromEllipsoid = new String(b8);
+        fromEllipsoid = new String(b8, StandardCharsets.UTF_8);
         in.read(b8);
         in.read(b8);
-        toEllipsoid = new String(b8);
+        toEllipsoid = new String(b8, StandardCharsets.UTF_8);
         in.read(b8);
         in.read(b8);
         fromSemiMajorAxis = NTV2Util.getDouble(b8, bigEndian);
diff --git a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
index 795026c..33e6097 100644
--- a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
+++ b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
@@ -1,282 +1,282 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Point;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-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.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.WaySegment;
-import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
-import org.openstreetmap.josm.gui.MapView;
-
-/**
- * Visitor that highlights the primitives affected by an error
- * @author frsantos
- * @since 5671
- */
-public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
-    /** The graphics */
-    private final Graphics g;
-    /** The MapView */
-    private final MapView mv;
-
-    /** The severity color */
-    private Color color;
-    /** Is the error selected ? */
-    private boolean selected;
-    
-    private final Set<PaintedPoint> paintedPoints = new HashSet<>();
-    private final Set<PaintedSegment> paintedSegments = new HashSet<>();
-
-    /**
-     * Constructor
-     * @param g The graphics
-     * @param mv The Mapview
-     */
-    public PaintVisitor(Graphics g, MapView mv) {
-        this.g = g;
-        this.mv = mv;
-    }
-
-    protected static class PaintedPoint {
-        protected final LatLon p1;
-        protected final Color color;
-
-        public PaintedPoint(LatLon p1, Color color) {
-            this.p1 = p1;
-            this.color = color;
-        }
-        
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + p1.hashCode();
-            result = prime * result + color.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;
-            PaintedPoint other = (PaintedPoint) obj;
-            if (!p1.equals(other.p1))
-                return false;
-            if (!color.equals(other.color))
-                return false;
-            return true;
-        }
-    }
-
-    protected static class PaintedSegment extends PaintedPoint {
-        final LatLon p2;
-        
-        public PaintedSegment(LatLon p1, LatLon p2, Color color) {
-            super(p1, color);
-            this.p2 = p2;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = super.hashCode();
-            result = prime * result + p2.hashCode();
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (!super.equals(obj)) {
-                return false;
-            }
-            PaintedSegment other = (PaintedSegment) obj;
-            if (!p2.equals(other.p2))
-                return false;
-            return true;
-        }
-    }
-
-    @Override
-    public void visit(TestError error) {
-        if (error != null && !error.getIgnored()) {
-            color = error.getSeverity().getColor();
-            selected = error.isSelected();
-            error.visitHighlighted(this);
-        }
-    }
-
-    @Override
-    public void visit(OsmPrimitive p) {
-        if (p.isUsable()) {
-            p.accept(this);
-        }
-    }
-
-    /**
-     * Draws a circle around the node
-     * @param n The node
-     * @param color The circle color
-     */
-    protected void drawNode(Node n, Color color) {
-        PaintedPoint pp = new PaintedPoint(n.getCoor(), color);
-        
-        if (!paintedPoints.contains(pp)) {
-            Point p = mv.getPoint(n);
-            g.setColor(color);
-            
-            if (selected) {
-                g.fillOval(p.x - 5, p.y - 5, 10, 10);
-            } else {
-                g.drawOval(p.x - 5, p.y - 5, 10, 10);
-            }
-            paintedPoints.add(pp);
-        }
-    }
-
-    /**
-     * Draws a line around the segment
-     *
-     * @param p1 The first point of segment
-     * @param p2 The second point of segment
-     * @param color The color
-     */
-    protected void drawSegment(Point p1, Point p2, Color color) {
-        g.setColor(color);
-        
-        double t = Math.atan2(p2.x - p1.x, p2.y - p1.y);
-        double cosT = 5 * Math.cos(t);
-        double sinT = 5 * Math.sin(t);
-        int deg = (int) Math.toDegrees(t);
-        if (selected) {
-            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),
-                                  (int) (p2.y + sinT), (int) (p1.y + sinT) };
-            g.fillPolygon(x, y, 4);
-            g.fillArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
-            g.fillArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
-        } else {
-            g.drawLine((int) (p1.x + cosT), (int) (p1.y - sinT),
-                       (int) (p2.x + cosT), (int) (p2.y - sinT));
-            g.drawLine((int) (p1.x - cosT), (int) (p1.y + sinT),
-                       (int) (p2.x - cosT), (int) (p2.y + sinT));
-            g.drawArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
-            g.drawArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
-        }
-    }
-
-    /**
-     * Draws a line around the segment
-     *
-     * @param n1 The first node of segment
-     * @param n2 The second node of segment
-     * @param color The color
-     */
-    protected void drawSegment(Node n1, Node n2, Color color) {
-        if (n1.isDrawable() && n2.isDrawable() && isSegmentVisible(n1, n2)) {
-            PaintedSegment ps = new PaintedSegment(n1.getCoor(), n2.getCoor(), color);
-            if (!paintedSegments.contains(ps)) {
-                drawSegment(mv.getPoint(n1), mv.getPoint(n2), color);
-                paintedSegments.add(ps);
-            }
-        }
-    }
-
-    /**
-     * Draw a small rectangle.
-     * White if selected (as always) or red otherwise.
-     *
-     * @param n The node to draw.
-     */
-    @Override
-    public void visit(Node n) {
-        if (n.isDrawable() && isNodeVisible(n)) {
-            drawNode(n, color);
-        }
-    }
-
-    @Override
-    public void visit(Way w) {
-        visit(w.getNodes());
-    }
-
-    @Override
-    public void visit(WaySegment ws) {
-        if (ws.lowerIndex < 0 || ws.lowerIndex + 1 >= ws.way.getNodesCount())
-            return;
-        Node a = ws.way.getNodes().get(ws.lowerIndex);
-        Node b = ws.way.getNodes().get(ws.lowerIndex + 1);
-        drawSegment(a, b, color);
-    }
-
-    @Override
-    public void visit(Relation r) {
-        /* No idea how to draw a relation. */
-    }
-
-    /**
-     * Checks if the given node is in the visible area.
-     * @param n The node to check for visibility
-     * @return true if the node is visible
-     */
-    protected boolean isNodeVisible(Node n) {
-        Point p = mv.getPoint(n);
-        return !((p.x < 0) || (p.y < 0) || (p.x > mv.getWidth()) || (p.y > mv.getHeight()));
-    }
-
-    /**
-     * Checks if the given segment is in the visible area.
-     * NOTE: This will return true for a small number of non-visible
-     *       segments.
-     * @param n1 The first point of the segment to check
-     * @param n2 The second point of the segment to check
-     * @return {@code true} if the segment is visible
-     */
-    protected boolean isSegmentVisible(Node n1, Node n2) {
-        Point p1 = mv.getPoint(n1);
-        Point p2 = mv.getPoint(n2);
-        if ((p1.x < 0) && (p2.x < 0))
-            return false;
-        if ((p1.y < 0) && (p2.y < 0))
-            return false;
-        if ((p1.x > mv.getWidth()) && (p2.x > mv.getWidth()))
-            return false;
-        if ((p1.y > mv.getHeight()) && (p2.y > mv.getHeight()))
-            return false;
-        return true;
-    }
-
-    @Override
-    public void visit(List<Node> nodes) {
-        Node lastN = null;
-        for (Node n : nodes) {
-            if (lastN == null) {
-                lastN = n;
-                continue;
-            }
-            drawSegment(lastN, n, color);
-            lastN = n;
-        }
-    }
-    
-    /**
-     * Clears the internal painted objects collections.
-     */
-    public void clearPaintedObjects() {
-        paintedPoints.clear();
-        paintedSegments.clear();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+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.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
+import org.openstreetmap.josm.gui.MapView;
+
+/**
+ * Visitor that highlights the primitives affected by an error
+ * @author frsantos
+ * @since 5671
+ */
+public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
+    /** The graphics */
+    private final Graphics g;
+    /** The MapView */
+    private final MapView mv;
+
+    /** The severity color */
+    private Color color;
+    /** Is the error selected ? */
+    private boolean selected;
+    
+    private final Set<PaintedPoint> paintedPoints = new HashSet<>();
+    private final Set<PaintedSegment> paintedSegments = new HashSet<>();
+
+    /**
+     * Constructor
+     * @param g The graphics
+     * @param mv The Mapview
+     */
+    public PaintVisitor(Graphics g, MapView mv) {
+        this.g = g;
+        this.mv = mv;
+    }
+
+    protected static class PaintedPoint {
+        protected final LatLon p1;
+        protected final Color color;
+
+        public PaintedPoint(LatLon p1, Color color) {
+            this.p1 = p1;
+            this.color = color;
+        }
+        
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + p1.hashCode();
+            result = prime * result + color.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;
+            PaintedPoint other = (PaintedPoint) obj;
+            if (!p1.equals(other.p1))
+                return false;
+            if (!color.equals(other.color))
+                return false;
+            return true;
+        }
+    }
+
+    protected static class PaintedSegment extends PaintedPoint {
+        final LatLon p2;
+        
+        public PaintedSegment(LatLon p1, LatLon p2, Color color) {
+            super(p1, color);
+            this.p2 = p2;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = super.hashCode();
+            result = prime * result + p2.hashCode();
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!super.equals(obj)) {
+                return false;
+            }
+            PaintedSegment other = (PaintedSegment) obj;
+            if (!p2.equals(other.p2))
+                return false;
+            return true;
+        }
+    }
+
+    @Override
+    public void visit(TestError error) {
+        if (error != null && !error.getIgnored()) {
+            color = error.getSeverity().getColor();
+            selected = error.isSelected();
+            error.visitHighlighted(this);
+        }
+    }
+
+    @Override
+    public void visit(OsmPrimitive p) {
+        if (p.isUsable()) {
+            p.accept(this);
+        }
+    }
+
+    /**
+     * Draws a circle around the node
+     * @param n The node
+     * @param color The circle color
+     */
+    protected void drawNode(Node n, Color color) {
+        PaintedPoint pp = new PaintedPoint(n.getCoor(), color);
+        
+        if (!paintedPoints.contains(pp)) {
+            Point p = mv.getPoint(n);
+            g.setColor(color);
+            
+            if (selected) {
+                g.fillOval(p.x - 5, p.y - 5, 10, 10);
+            } else {
+                g.drawOval(p.x - 5, p.y - 5, 10, 10);
+            }
+            paintedPoints.add(pp);
+        }
+    }
+
+    /**
+     * Draws a line around the segment
+     *
+     * @param p1 The first point of segment
+     * @param p2 The second point of segment
+     * @param color The color
+     */
+    protected void drawSegment(Point p1, Point p2, Color color) {
+        g.setColor(color);
+        
+        double t = Math.atan2(p2.x - p1.x, p2.y - p1.y);
+        double cosT = 5 * Math.cos(t);
+        double sinT = 5 * Math.sin(t);
+        int deg = (int) Math.toDegrees(t);
+        if (selected) {
+            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),
+                                  (int) (p2.y + sinT), (int) (p1.y + sinT) };
+            g.fillPolygon(x, y, 4);
+            g.fillArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
+            g.fillArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
+        } else {
+            g.drawLine((int) (p1.x + cosT), (int) (p1.y - sinT),
+                       (int) (p2.x + cosT), (int) (p2.y - sinT));
+            g.drawLine((int) (p1.x - cosT), (int) (p1.y + sinT),
+                       (int) (p2.x - cosT), (int) (p2.y + sinT));
+            g.drawArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
+            g.drawArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
+        }
+    }
+
+    /**
+     * Draws a line around the segment
+     *
+     * @param n1 The first node of segment
+     * @param n2 The second node of segment
+     * @param color The color
+     */
+    protected void drawSegment(Node n1, Node n2, Color color) {
+        if (n1.isDrawable() && n2.isDrawable() && isSegmentVisible(n1, n2)) {
+            PaintedSegment ps = new PaintedSegment(n1.getCoor(), n2.getCoor(), color);
+            if (!paintedSegments.contains(ps)) {
+                drawSegment(mv.getPoint(n1), mv.getPoint(n2), color);
+                paintedSegments.add(ps);
+            }
+        }
+    }
+
+    /**
+     * Draw a small rectangle.
+     * White if selected (as always) or red otherwise.
+     *
+     * @param n The node to draw.
+     */
+    @Override
+    public void visit(Node n) {
+        if (n.isDrawable() && isNodeVisible(n)) {
+            drawNode(n, color);
+        }
+    }
+
+    @Override
+    public void visit(Way w) {
+        visit(w.getNodes());
+    }
+
+    @Override
+    public void visit(WaySegment ws) {
+        if (ws.lowerIndex < 0 || ws.lowerIndex + 1 >= ws.way.getNodesCount())
+            return;
+        Node a = ws.way.getNodes().get(ws.lowerIndex);
+        Node b = ws.way.getNodes().get(ws.lowerIndex + 1);
+        drawSegment(a, b, color);
+    }
+
+    @Override
+    public void visit(Relation r) {
+        /* No idea how to draw a relation. */
+    }
+
+    /**
+     * Checks if the given node is in the visible area.
+     * @param n The node to check for visibility
+     * @return true if the node is visible
+     */
+    protected boolean isNodeVisible(Node n) {
+        Point p = mv.getPoint(n);
+        return !((p.x < 0) || (p.y < 0) || (p.x > mv.getWidth()) || (p.y > mv.getHeight()));
+    }
+
+    /**
+     * Checks if the given segment is in the visible area.
+     * NOTE: This will return true for a small number of non-visible
+     *       segments.
+     * @param n1 The first point of the segment to check
+     * @param n2 The second point of the segment to check
+     * @return {@code true} if the segment is visible
+     */
+    protected boolean isSegmentVisible(Node n1, Node n2) {
+        Point p1 = mv.getPoint(n1);
+        Point p2 = mv.getPoint(n2);
+        if ((p1.x < 0) && (p2.x < 0))
+            return false;
+        if ((p1.y < 0) && (p2.y < 0))
+            return false;
+        if ((p1.x > mv.getWidth()) && (p2.x > mv.getWidth()))
+            return false;
+        if ((p1.y > mv.getHeight()) && (p2.y > mv.getHeight()))
+            return false;
+        return true;
+    }
+
+    @Override
+    public void visit(List<Node> nodes) {
+        Node lastN = null;
+        for (Node n : nodes) {
+            if (lastN == null) {
+                lastN = n;
+                continue;
+            }
+            drawSegment(lastN, n, color);
+            lastN = n;
+        }
+    }
+    
+    /**
+     * Clears the internal painted objects collections.
+     */
+    public void clearPaintedObjects() {
+        paintedPoints.clear();
+        paintedSegments.clear();
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/routines/AbstractValidator.java b/src/org/openstreetmap/josm/data/validation/routines/AbstractValidator.java
index 4003578..eb64629 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/AbstractValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/AbstractValidator.java
@@ -1,51 +1,51 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.routines;
-
-/**
- * Abstract validator superclass to extend Apache Validator routines.
- * @since 7489
- */
-public abstract class AbstractValidator {
-
-    private String errorMessage;
-    private String fix;
-
-    /**
-     * Tests validity of a given value.
-     * @param value Value to test
-     * @return {@code true} if value is valid, {@code false} otherwise
-     */
-    public abstract boolean isValid(String value);
-
-    /**
-     * Replies the error message.
-     * @return the errorMessage
-     */
-    public final String getErrorMessage() {
-        return errorMessage;
-    }
-
-    /**
-     * Sets the error message.
-     * @param errorMessage the errorMessage
-     */
-    protected final void setErrorMessage(String errorMessage) {
-        this.errorMessage = errorMessage;
-    }
-
-    /**
-     * Replies the fixed value, if any.
-     * @return the fixed value or {@code null}
-     */
-    public final String getFix() {
-        return fix;
-    }
-
-    /**
-     * Sets the fixed value.
-     * @param fix the fixed value, if any
-     */
-    protected final void setFix(String fix) {
-        this.fix = fix;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.routines;
+
+/**
+ * Abstract validator superclass to extend Apache Validator routines.
+ * @since 7489
+ */
+public abstract class AbstractValidator {
+
+    private String errorMessage;
+    private String fix;
+
+    /**
+     * Tests validity of a given value.
+     * @param value Value to test
+     * @return {@code true} if value is valid, {@code false} otherwise
+     */
+    public abstract boolean isValid(String value);
+
+    /**
+     * Replies the error message.
+     * @return the errorMessage
+     */
+    public final String getErrorMessage() {
+        return errorMessage;
+    }
+
+    /**
+     * Sets the error message.
+     * @param errorMessage the errorMessage
+     */
+    protected final void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    /**
+     * Replies the fixed value, if any.
+     * @return the fixed value or {@code null}
+     */
+    public final String getFix() {
+        return fix;
+    }
+
+    /**
+     * Sets the fixed value.
+     * @param fix the fixed value, if any
+     */
+    protected final void setFix(String fix) {
+        this.fix = fix;
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
index 48ef3db..1c467ab 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
@@ -27,6 +27,8 @@ import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Performs validation tests on addresses (addr:housenumber) and associatedStreet relations.
@@ -55,7 +57,11 @@ public class Addresses extends Test {
             this(code, collection, message, null, null);
         }
         public AddressError(int code, Collection<OsmPrimitive> collection, String message, String description, String englishDescription) {
-            super(Addresses.this, Severity.WARNING, message, description, englishDescription, code, collection);
+            this(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);
         }
     }
 
@@ -75,9 +81,23 @@ public class Addresses extends Test {
             }
         }
         if (list.size() > 1) {
+            Severity level;
+            // warning level only if several relations have different names, see #10945
+            final String name = list.get(0).get("name");
+            if (name == null || Utils.filter(list, new Predicate<Relation>() {
+                @Override
+                public boolean evaluate(Relation r) {
+                    return name.equals(r.get("name"));
+                }
+            }).size() < list.size()) {
+                level = Severity.WARNING;
+            } else {
+                level = Severity.OTHER;
+            }
             List<OsmPrimitive> errorList = new ArrayList<OsmPrimitive>(list);
             errorList.add(0, p);
-            errors.add(new AddressError(MULTIPLE_STREET_RELATIONS, errorList, tr("Multiple associatedStreet relations")));
+            errors.add(new AddressError(MULTIPLE_STREET_RELATIONS, level, errorList,
+                    tr("Multiple associatedStreet relations"), null, null));
         }
         return list;
     }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/ApiCapabilitiesTest.java b/src/org/openstreetmap/josm/data/validation/tests/ApiCapabilitiesTest.java
index 8b2bba6..a99c0ee 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/ApiCapabilitiesTest.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/ApiCapabilitiesTest.java
@@ -1,55 +1,55 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.io.Capabilities;
-import org.openstreetmap.josm.io.OsmApi;
-
-/**
- * Performs validation tests against OSM API capabilities. This class does not test length
- * of key/values (limited to 255 characters) because it's done by {@code TagChecker}.
- * @since 7574
- */
-public class ApiCapabilitiesTest extends Test {
-
-    private static final int MAX_WAY_NODES_ERROR = 3401;
-
-    private long maxNodes = -1;
-
-    /**
-     * Constructs a new {@code ApiCapabilitiesTest}.
-     */
-    public ApiCapabilitiesTest() {
-        super(tr("API Capabilities"), tr("Checks for errors against API capabilities"));
-    }
-
-    @Override
-    public void initialize() throws Exception {
-        super.initialize();
-        OsmApi api = OsmApi.getOsmApi();
-        api.initialize(NullProgressMonitor.INSTANCE);
-        Capabilities capabilities = api.getCapabilities();
-        if (capabilities != null) {
-            maxNodes = capabilities.getMaxWayNodes();
-        }
-    }
-
-    @Override
-    public void visit(Way w) {
-        if (maxNodes > 1 && w.getNodesCount() > maxNodes) {
-            String message;
-            if (w.isClosed()) {
-                message = tr("Way contains more than {0} nodes. It should be replaced by a multipolygon", maxNodes);
-            } else {
-                message = tr("Way contains more than {0} nodes. It should be split or simplified", maxNodes);
-            }
-            errors.add(new TestError(this, Severity.ERROR, message, MAX_WAY_NODES_ERROR, w));
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.Capabilities;
+import org.openstreetmap.josm.io.OsmApi;
+
+/**
+ * Performs validation tests against OSM API capabilities. This class does not test length
+ * of key/values (limited to 255 characters) because it's done by {@code TagChecker}.
+ * @since 7574
+ */
+public class ApiCapabilitiesTest extends Test {
+
+    private static final int MAX_WAY_NODES_ERROR = 3401;
+
+    private long maxNodes = -1;
+
+    /**
+     * Constructs a new {@code ApiCapabilitiesTest}.
+     */
+    public ApiCapabilitiesTest() {
+        super(tr("API Capabilities"), tr("Checks for errors against API capabilities"));
+    }
+
+    @Override
+    public void initialize() throws Exception {
+        super.initialize();
+        OsmApi api = OsmApi.getOsmApi();
+        api.initialize(NullProgressMonitor.INSTANCE);
+        Capabilities capabilities = api.getCapabilities();
+        if (capabilities != null) {
+            maxNodes = capabilities.getMaxWayNodes();
+        }
+    }
+
+    @Override
+    public void visit(Way w) {
+        if (maxNodes > 1 && w.getNodesCount() > maxNodes) {
+            String message;
+            if (w.isClosed()) {
+                message = tr("Way contains more than {0} nodes. It should be replaced by a multipolygon", maxNodes);
+            } else {
+                message = tr("Way contains more than {0} nodes. It should be split or simplified", maxNodes);
+            }
+            errors.add(new TestError(this, Severity.ERROR, message, MAX_WAY_NODES_ERROR, w));
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/BarriersEntrances.java b/src/org/openstreetmap/josm/data/validation/tests/BarriersEntrances.java
index c83e210..3fcdca5 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/BarriersEntrances.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/BarriersEntrances.java
@@ -1,38 +1,38 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-
-/**
- * Performs validation tests on barriers and entrances.
- * @since 6192
- */
-public class BarriersEntrances extends Test {
-    
-    protected static final int BARRIER_ENTRANCE_WITHOUT_BARRIER = 2801;
-
-    /**
-     * Constructor
-     */
-    public BarriersEntrances() {
-        super(tr("Barriers and entrances"), tr("Checks for errors in barriers and entrances."));
-    }
-
-    @Override
-    public void visit(Node n) {
-        if (n.hasTag("barrier", "entrance") && !n.isOutsideDownloadArea()) {
-            for (OsmPrimitive p : n.getReferrers()) {
-                if (p.hasKey("barrier")) {
-                    return;
-                }
-            }
-            errors.add(new TestError(this, Severity.WARNING, tr("Barrier entrance not set on a barrier"), BARRIER_ENTRANCE_WITHOUT_BARRIER, n));
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+
+/**
+ * Performs validation tests on barriers and entrances.
+ * @since 6192
+ */
+public class BarriersEntrances extends Test {
+    
+    protected static final int BARRIER_ENTRANCE_WITHOUT_BARRIER = 2801;
+
+    /**
+     * Constructor
+     */
+    public BarriersEntrances() {
+        super(tr("Barriers and entrances"), tr("Checks for errors in barriers and entrances."));
+    }
+
+    @Override
+    public void visit(Node n) {
+        if (n.hasTag("barrier", "entrance") && !n.isOutsideDownloadArea()) {
+            for (OsmPrimitive p : n.getReferrers()) {
+                if (p.hasKey("barrier")) {
+                    return;
+                }
+            }
+            errors.add(new TestError(this, Severity.WARNING, tr("Barrier entrance not set on a barrier"), BARRIER_ENTRANCE_WITHOUT_BARRIER, n));
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Highways.java b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
index fc6941b..767c4dc 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Highways.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
@@ -1,273 +1,273 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.tools.Predicate;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Test that performs semantic checks on highways.
- * @since 5902
- */
-public class Highways extends Test {
-
-    protected static final int WRONG_ROUNDABOUT_HIGHWAY = 2701;
-    protected static final int MISSING_PEDESTRIAN_CROSSING = 2702;
-    protected static final int SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE = 2703;
-    protected static final int SOURCE_MAXSPEED_UNKNOWN_CONTEXT = 2704;
-    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_MAXSPEED = 2705;
-    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_HIGHWAY = 2706;
-    protected static final int SOURCE_WRONG_LINK = 2707;
-
-    /**
-     * Classified highways in order of importance
-     */
-    protected static final List<String> CLASSIFIED_HIGHWAYS = Arrays.asList(
-            "motorway",  "motorway_link",
-            "trunk",     "trunk_link",
-            "primary",   "primary_link",
-            "secondary", "secondary_link",
-            "tertiary",  "tertiary_link",
-            "unclassified",
-            "residential",
-            "living_street");
-
-    protected static final List<String> KNOWN_SOURCE_MAXSPEED_CONTEXTS = Arrays.asList(
-            "urban", "rural", "zone", "zone30", "zone:30", "nsl_single", "nsl_dual", "motorway", "trunk", "living_street", "bicycle_road");
-
-    protected static final List<String> ISO_COUNTRIES = Arrays.asList(Locale.getISOCountries());
-
-    boolean leftByPedestrians = false;
-    boolean leftByCyclists = false;
-    boolean leftByCars = false;
-    int pedestrianWays = 0;
-    int cyclistWays = 0;
-    int carsWays = 0;
-
-    /**
-     * Constructs a new {@code Highways} test.
-     */
-    public Highways() {
-        super(tr("Highways"), tr("Performs semantic checks on highways."));
-    }
-
-    protected class WrongRoundaboutHighway extends TestError {
-
-        public final String correctValue;
-
-        public WrongRoundaboutHighway(Way w, String key) {
-            super(Highways.this, Severity.WARNING,
-                    tr("Incorrect roundabout (highway: {0} instead of {1})", w.get("highway"), key),
-                    WRONG_ROUNDABOUT_HIGHWAY, w);
-            this.correctValue = key;
-        }
-    }
-
-    @Override
-    public void visit(Node n) {
-        if (n.isUsable()) {
-            if (!n.hasTag("crossing", "no")
-             && !(n.hasKey("crossing") && (n.hasTag("highway", "crossing") || n.hasTag("highway", "traffic_signals")))
-             && n.isReferredByWays(2)) {
-                testMissingPedestrianCrossing(n);
-            }
-            if (n.hasKey("source:maxspeed")) {
-                // Check maxspeed but not context against highway for nodes as maxspeed is not set on highways here but on signs, speed cameras, etc.
-                testSourceMaxspeed(n, false);
-            }
-        }
-    }
-
-    @Override
-    public void visit(Way w) {
-        if (w.isUsable()) {
-            if (w.hasKey("highway") && CLASSIFIED_HIGHWAYS.contains(w.get("highway")) && w.hasKey("junction") && "roundabout".equals(w.get("junction"))) {
-                testWrongRoundabout(w);
-            }
-            if (w.hasKey("source:maxspeed")) {
-                // Check maxspeed, including context against highway
-                testSourceMaxspeed(w, true);
-            }
-            testHighwayLink(w);
-        }
-    }
-
-    private void testWrongRoundabout(Way w) {
-        Map<String, List<Way>> map = new HashMap<>();
-        // Count all highways (per type) connected to this roundabout, except links
-        // As roundabouts are closed ways, take care of not processing the first/last node twice
-        for (Node n : new HashSet<>(w.getNodes())) {
-            for (Way h : Utils.filteredCollection(n.getReferrers(), Way.class)) {
-                String value = h.get("highway");
-                if (h != w && value != null && !value.endsWith("_link")) {
-                    List<Way> list = map.get(value);
-                    if (list == null) {
-                        map.put(value, list = new ArrayList<>());
-                    }
-                    list.add(h);
-                }
-            }
-        }
-        // The roundabout should carry the highway tag of its two biggest highways
-        for (String s : CLASSIFIED_HIGHWAYS) {
-            List<Way> list = map.get(s);
-            if (list != null && list.size() >= 2) {
-                // Except when a single road is connected, but with two oneway segments
-                Boolean oneway1 = OsmUtils.getOsmBoolean(list.get(0).get("oneway"));
-                Boolean oneway2 = OsmUtils.getOsmBoolean(list.get(1).get("oneway"));
-                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));
-                    }
-                    break;
-                }
-            }
-        }
-    }
-
-    public static boolean isHighwayLinkOkay(final Way way) {
-        final String highway = way.get("highway");
-        if (highway == null || !highway.endsWith("_link")) {
-            return true;
-        }
-
-        final HashSet<OsmPrimitive> referrers = new HashSet<>();
-
-        if (way.isClosed()) {
-            // for closed way we need to check all adjacent ways
-            for (Node n: way.getNodes()) {
-                referrers.addAll(n.getReferrers());
-            }
-        } else {
-            referrers.addAll(way.firstNode().getReferrers());
-            referrers.addAll(way.lastNode().getReferrers());
-        }
-
-        return Utils.exists(Utils.filteredCollection(referrers, Way.class), new Predicate<Way>() {
-            @Override
-            public boolean evaluate(final Way otherWay) {
-                return !way.equals(otherWay) && otherWay.hasTag("highway", highway, highway.replaceAll("_link$", ""));
-            }
-        });
-    }
-
-    private void testHighwayLink(final Way way) {
-        if (!isHighwayLinkOkay(way)) {
-            errors.add(new TestError(this, Severity.WARNING,
-                    tr("Highway link is not linked to adequate highway/link"), SOURCE_WRONG_LINK, way));
-        }
-    }
-
-    private void testMissingPedestrianCrossing(Node n) {
-        leftByPedestrians = false;
-        leftByCyclists = false;
-        leftByCars = false;
-        pedestrianWays = 0;
-        cyclistWays = 0;
-        carsWays = 0;
-
-        for (Way w : OsmPrimitive.getFilteredList(n.getReferrers(), Way.class)) {
-            String highway = w.get("highway");
-            if (highway != null) {
-                if ("footway".equals(highway) || "path".equals(highway)) {
-                    handlePedestrianWay(n, w);
-                    if (w.hasTag("bicycle", "yes", "designated")) {
-                        handleCyclistWay(n, w);
-                    }
-                } else if ("cycleway".equals(highway)) {
-                    handleCyclistWay(n, w);
-                    if (w.hasTag("foot", "yes", "designated")) {
-                        handlePedestrianWay(n, w);
-                    }
-                } else if (CLASSIFIED_HIGHWAYS.contains(highway)) {
-                    // Only look at classified highways for now:
-                    // - service highways support is TBD (see #9141 comments)
-                    // - roads should be determined first. Another warning is raised anyway
-                    handleCarWay(n, w);
-                }
-                if ((leftByPedestrians || leftByCyclists) && leftByCars) {
-                    errors.add(new TestError(this, Severity.OTHER, tr("Missing pedestrian crossing information"), MISSING_PEDESTRIAN_CROSSING, n));
-                    return;
-                }
-            }
-        }
-    }
-
-    private void handleCarWay(Node n, Way w) {
-        carsWays++;
-        if (!w.isFirstLastNode(n) || carsWays > 1) {
-            leftByCars = true;
-        }
-    }
-
-    private void handleCyclistWay(Node n, Way w) {
-        cyclistWays++;
-        if (!w.isFirstLastNode(n) || cyclistWays > 1) {
-            leftByCyclists = true;
-        }
-    }
-
-    private void handlePedestrianWay(Node n, Way w) {
-        pedestrianWays++;
-        if (!w.isFirstLastNode(n) || pedestrianWays > 1) {
-            leftByPedestrians = true;
-        }
-    }
-
-    private void testSourceMaxspeed(OsmPrimitive p, boolean testContextHighway) {
-        String value = p.get("source:maxspeed");
-        if (value.matches("[A-Z]{2}:.+")) {
-            int index = value.indexOf(':');
-            // Check country
-            String country = value.substring(0, index);
-            if (!ISO_COUNTRIES.contains(country)) {
-                errors.add(new TestError(this, Severity.WARNING, tr("Unknown country code: {0}", country), SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE, p));
-            }
-            // Check context
-            String context = value.substring(index+1);
-            if (!KNOWN_SOURCE_MAXSPEED_CONTEXTS.contains(context)) {
-                errors.add(new TestError(this, Severity.WARNING, tr("Unknown source:maxspeed context: {0}", context), SOURCE_MAXSPEED_UNKNOWN_CONTEXT, p));
-            }
-            // TODO: Check coherence of context against maxspeed
-            // TODO: Check coherence of context against highway
-        }
-    }
-
-    @Override
-    public boolean isFixable(TestError testError) {
-        return testError instanceof WrongRoundaboutHighway;
-    }
-
-    @Override
-    public Command fixError(TestError testError) {
-        if (testError instanceof WrongRoundaboutHighway) {
-            // primitives list can be empty if all primitives have been purged
-            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
-            if (it.hasNext()) {
-                return new ChangePropertyCommand(it.next(),
-                        "highway", ((WrongRoundaboutHighway) testError).correctValue);
-            }
-        }
-        return null;
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Test that performs semantic checks on highways.
+ * @since 5902
+ */
+public class Highways extends Test {
+
+    protected static final int WRONG_ROUNDABOUT_HIGHWAY = 2701;
+    protected static final int MISSING_PEDESTRIAN_CROSSING = 2702;
+    protected static final int SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE = 2703;
+    protected static final int SOURCE_MAXSPEED_UNKNOWN_CONTEXT = 2704;
+    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_MAXSPEED = 2705;
+    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_HIGHWAY = 2706;
+    protected static final int SOURCE_WRONG_LINK = 2707;
+
+    /**
+     * Classified highways in order of importance
+     */
+    protected static final List<String> CLASSIFIED_HIGHWAYS = Arrays.asList(
+            "motorway",  "motorway_link",
+            "trunk",     "trunk_link",
+            "primary",   "primary_link",
+            "secondary", "secondary_link",
+            "tertiary",  "tertiary_link",
+            "unclassified",
+            "residential",
+            "living_street");
+
+    protected static final List<String> KNOWN_SOURCE_MAXSPEED_CONTEXTS = Arrays.asList(
+            "urban", "rural", "zone", "zone30", "zone:30", "nsl_single", "nsl_dual", "motorway", "trunk", "living_street", "bicycle_road");
+
+    protected static final List<String> ISO_COUNTRIES = Arrays.asList(Locale.getISOCountries());
+
+    boolean leftByPedestrians = false;
+    boolean leftByCyclists = false;
+    boolean leftByCars = false;
+    int pedestrianWays = 0;
+    int cyclistWays = 0;
+    int carsWays = 0;
+
+    /**
+     * Constructs a new {@code Highways} test.
+     */
+    public Highways() {
+        super(tr("Highways"), tr("Performs semantic checks on highways."));
+    }
+
+    protected class WrongRoundaboutHighway extends TestError {
+
+        public final String correctValue;
+
+        public WrongRoundaboutHighway(Way w, String key) {
+            super(Highways.this, Severity.WARNING,
+                    tr("Incorrect roundabout (highway: {0} instead of {1})", w.get("highway"), key),
+                    WRONG_ROUNDABOUT_HIGHWAY, w);
+            this.correctValue = key;
+        }
+    }
+
+    @Override
+    public void visit(Node n) {
+        if (n.isUsable()) {
+            if (!n.hasTag("crossing", "no")
+             && !(n.hasKey("crossing") && (n.hasTag("highway", "crossing") || n.hasTag("highway", "traffic_signals")))
+             && n.isReferredByWays(2)) {
+                testMissingPedestrianCrossing(n);
+            }
+            if (n.hasKey("source:maxspeed")) {
+                // Check maxspeed but not context against highway for nodes as maxspeed is not set on highways here but on signs, speed cameras, etc.
+                testSourceMaxspeed(n, false);
+            }
+        }
+    }
+
+    @Override
+    public void visit(Way w) {
+        if (w.isUsable()) {
+            if (w.hasKey("highway") && CLASSIFIED_HIGHWAYS.contains(w.get("highway")) && w.hasKey("junction") && "roundabout".equals(w.get("junction"))) {
+                testWrongRoundabout(w);
+            }
+            if (w.hasKey("source:maxspeed")) {
+                // Check maxspeed, including context against highway
+                testSourceMaxspeed(w, true);
+            }
+            testHighwayLink(w);
+        }
+    }
+
+    private void testWrongRoundabout(Way w) {
+        Map<String, List<Way>> map = new HashMap<>();
+        // Count all highways (per type) connected to this roundabout, except links
+        // As roundabouts are closed ways, take care of not processing the first/last node twice
+        for (Node n : new HashSet<>(w.getNodes())) {
+            for (Way h : Utils.filteredCollection(n.getReferrers(), Way.class)) {
+                String value = h.get("highway");
+                if (h != w && value != null && !value.endsWith("_link")) {
+                    List<Way> list = map.get(value);
+                    if (list == null) {
+                        map.put(value, list = new ArrayList<>());
+                    }
+                    list.add(h);
+                }
+            }
+        }
+        // The roundabout should carry the highway tag of its two biggest highways
+        for (String s : CLASSIFIED_HIGHWAYS) {
+            List<Way> list = map.get(s);
+            if (list != null && list.size() >= 2) {
+                // Except when a single road is connected, but with two oneway segments
+                Boolean oneway1 = OsmUtils.getOsmBoolean(list.get(0).get("oneway"));
+                Boolean oneway2 = OsmUtils.getOsmBoolean(list.get(1).get("oneway"));
+                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));
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    public static boolean isHighwayLinkOkay(final Way way) {
+        final String highway = way.get("highway");
+        if (highway == null || !highway.endsWith("_link")) {
+            return true;
+        }
+
+        final HashSet<OsmPrimitive> referrers = new HashSet<>();
+
+        if (way.isClosed()) {
+            // for closed way we need to check all adjacent ways
+            for (Node n: way.getNodes()) {
+                referrers.addAll(n.getReferrers());
+            }
+        } else {
+            referrers.addAll(way.firstNode().getReferrers());
+            referrers.addAll(way.lastNode().getReferrers());
+        }
+
+        return Utils.exists(Utils.filteredCollection(referrers, Way.class), new Predicate<Way>() {
+            @Override
+            public boolean evaluate(final Way otherWay) {
+                return !way.equals(otherWay) && otherWay.hasTag("highway", highway, highway.replaceAll("_link$", ""));
+            }
+        });
+    }
+
+    private void testHighwayLink(final Way way) {
+        if (!isHighwayLinkOkay(way)) {
+            errors.add(new TestError(this, Severity.WARNING,
+                    tr("Highway link is not linked to adequate highway/link"), SOURCE_WRONG_LINK, way));
+        }
+    }
+
+    private void testMissingPedestrianCrossing(Node n) {
+        leftByPedestrians = false;
+        leftByCyclists = false;
+        leftByCars = false;
+        pedestrianWays = 0;
+        cyclistWays = 0;
+        carsWays = 0;
+
+        for (Way w : OsmPrimitive.getFilteredList(n.getReferrers(), Way.class)) {
+            String highway = w.get("highway");
+            if (highway != null) {
+                if ("footway".equals(highway) || "path".equals(highway)) {
+                    handlePedestrianWay(n, w);
+                    if (w.hasTag("bicycle", "yes", "designated")) {
+                        handleCyclistWay(n, w);
+                    }
+                } else if ("cycleway".equals(highway)) {
+                    handleCyclistWay(n, w);
+                    if (w.hasTag("foot", "yes", "designated")) {
+                        handlePedestrianWay(n, w);
+                    }
+                } else if (CLASSIFIED_HIGHWAYS.contains(highway)) {
+                    // Only look at classified highways for now:
+                    // - service highways support is TBD (see #9141 comments)
+                    // - roads should be determined first. Another warning is raised anyway
+                    handleCarWay(n, w);
+                }
+                if ((leftByPedestrians || leftByCyclists) && leftByCars) {
+                    errors.add(new TestError(this, Severity.OTHER, tr("Missing pedestrian crossing information"), MISSING_PEDESTRIAN_CROSSING, n));
+                    return;
+                }
+            }
+        }
+    }
+
+    private void handleCarWay(Node n, Way w) {
+        carsWays++;
+        if (!w.isFirstLastNode(n) || carsWays > 1) {
+            leftByCars = true;
+        }
+    }
+
+    private void handleCyclistWay(Node n, Way w) {
+        cyclistWays++;
+        if (!w.isFirstLastNode(n) || cyclistWays > 1) {
+            leftByCyclists = true;
+        }
+    }
+
+    private void handlePedestrianWay(Node n, Way w) {
+        pedestrianWays++;
+        if (!w.isFirstLastNode(n) || pedestrianWays > 1) {
+            leftByPedestrians = true;
+        }
+    }
+
+    private void testSourceMaxspeed(OsmPrimitive p, boolean testContextHighway) {
+        String value = p.get("source:maxspeed");
+        if (value.matches("[A-Z]{2}:.+")) {
+            int index = value.indexOf(':');
+            // Check country
+            String country = value.substring(0, index);
+            if (!ISO_COUNTRIES.contains(country)) {
+                errors.add(new TestError(this, Severity.WARNING, tr("Unknown country code: {0}", country), SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE, p));
+            }
+            // Check context
+            String context = value.substring(index+1);
+            if (!KNOWN_SOURCE_MAXSPEED_CONTEXTS.contains(context)) {
+                errors.add(new TestError(this, Severity.WARNING, tr("Unknown source:maxspeed context: {0}", context), SOURCE_MAXSPEED_UNKNOWN_CONTEXT, p));
+            }
+            // TODO: Check coherence of context against maxspeed
+            // TODO: Check coherence of context against highway
+        }
+    }
+
+    @Override
+    public boolean isFixable(TestError testError) {
+        return testError instanceof WrongRoundaboutHighway;
+    }
+
+    @Override
+    public Command fixError(TestError testError) {
+        if (testError instanceof WrongRoundaboutHighway) {
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+            if (it.hasNext()) {
+                return new ChangePropertyCommand(it.next(),
+                        "highway", ((WrongRoundaboutHighway) testError).correctValue);
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java b/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
index 6162dad..700fb4f 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
@@ -1,174 +1,174 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.net.IDN;
-import java.util.regex.Pattern;
-
-import org.openstreetmap.josm.command.ChangePropertyCommand;
-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;
-import org.openstreetmap.josm.data.validation.FixableTestError;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.data.validation.routines.AbstractValidator;
-import org.openstreetmap.josm.data.validation.routines.EmailValidator;
-import org.openstreetmap.josm.data.validation.routines.UrlValidator;
-
-/**
- * Performs validation tests on internet-related tags (websites, e-mail addresses, etc.).
- * @since 7489
- */
-public class InternetTags extends Test {
-
-    /** Error code for an invalid URL */
-    public static final int INVALID_URL = 3301;
-    /** Error code for an invalid e-mail */
-    public static final int INVALID_EMAIL = 3302;
-
-    private static final Pattern ASCII_PATTERN = Pattern.compile("^\\p{ASCII}+$");
-
-    /**
-     * List of keys subject to URL validation.
-     */
-    private static String[] URL_KEYS = new String[] {
-        "url", "source:url",
-        "website", "contact:website", "heritage:website", "source:website"
-    };
-
-    /**
-     * List of keys subject to email validation.
-     */
-    private static String[] EMAIL_KEYS = new String[] {
-        "email", "contact:email"
-    };
-
-    /**
-     * Constructs a new {@code InternetTags} test.
-     */
-    public InternetTags() {
-        super(tr("Internet tags"), tr("Checks for errors in internet-related tags."));
-    }
-
-    /**
-     * Potentially validates a given primitive key against a given validator.
-     * @param p The OSM primitive to test
-     * @param k The key to validate
-     * @param keys The list of keys to check. If {@code k} is not inside this collection, do nothing
-     * @param validator The validator to run if {@code k} is inside {@code keys}
-     * @param code The error code to set if the validation fails
-     * @return {@code true} if the validation fails. In this case, a new error has been created.
-     */
-    private boolean doTest(OsmPrimitive p, String k, String[] keys, AbstractValidator validator, int code) {
-        for (String i : keys) {
-            if (i.equals(k)) {
-                TestError error = validateTag(p, k, validator, code);
-                if (error != null) {
-                    errors.add(error);
-                }
-                break;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Validates a given primitive tag against a given validator.
-     * @param p The OSM primitive to test
-     * @param k The key to validate
-     * @param validator The validator to run
-     * @param code The error code to set if the validation fails
-     * @return The error if the validation fails, {@code null} otherwise
-     * @since 7824
-     */
-    public TestError validateTag(OsmPrimitive p, String k, AbstractValidator validator, int code) {
-        TestError error = doValidateTag(p, k, null, validator, code);
-        if (error != null) {
-            // Workaround to https://issues.apache.org/jira/browse/VALIDATOR-290
-            // Apache Commons Validator 1.4.1-SNAPSHOT does not support yet IDN URLs
-            // To remove if it gets fixed on Apache side
-            String v = p.get(k);
-            if (!ASCII_PATTERN.matcher(v).matches()) {
-                try {
-                    String protocol = "";
-                    if (v.contains("://")) {
-                        protocol = v.substring(0, v.indexOf("://")+3);
-                    }
-                    String domain = !protocol.isEmpty() ? v.substring(protocol.length(), v.length()) : v;
-                    String ending = "";
-                    if (domain.contains("/")) {
-                        int idx = domain.indexOf("/");
-                        ending = domain.substring(idx, domain.length());
-                        domain = domain.substring(0, idx);
-                    }
-                    // Try to apply ToASCII algorithm
-                    error = doValidateTag(p, k, protocol+IDN.toASCII(domain)+ending, validator, code);
-                } catch (IllegalArgumentException e) {
-                    error.setMessage(error.getMessage() +
-                            tr(" URL cannot be converted to ASCII: {0}", e.getMessage()));
-                }
-            }
-        }
-        return error;
-    }
-
-    /**
-     * Validates a given primitive tag against a given validator.
-     * @param p The OSM primitive to test
-     * @param k The key to validate
-     * @param v The value to validate. May be {@code null} to use {@code p.get(k)}
-     * @param validator The validator to run
-     * @param code The error code to set if the validation fails
-     * @return The error if the validation fails, {@code null} otherwise
-     */
-    private TestError doValidateTag(OsmPrimitive p, String k, String v, AbstractValidator validator, int code) {
-        TestError error = null;
-        String value = v != null ? v : p.get(k);
-        if (!validator.isValid(value)) {
-            String errMsg = validator.getErrorMessage();
-            // Special treatment to allow URLs without protocol. See UrlValidator#isValid
-            if (tr("URL contains an invalid protocol: {0}", (String)null).equals(errMsg)) {
-                String proto = validator instanceof EmailValidator ? "mailto://" : "http://";
-                return doValidateTag(p, k, proto+value, validator, code);
-            }
-            String msg = tr("''{0}'': {1}", k, errMsg);
-            String fix = validator.getFix();
-            if (fix != null) {
-                error = new FixableTestError(this, Severity.WARNING, msg, code, p,
-                        new ChangePropertyCommand(p, k, fix));
-            } else {
-                error = new TestError(this, Severity.WARNING, msg, code, p);
-            }
-        }
-        return error;
-    }
-
-    private void test(OsmPrimitive p) {
-        for (String k : p.keySet()) {
-            // Test key against URL validator
-            if (!doTest(p, k, URL_KEYS, UrlValidator.getInstance(), INVALID_URL)) {
-                // Test key against e-mail validator only if the URL validator did not fail
-                doTest(p, k, EMAIL_KEYS, EmailValidator.getInstance(), INVALID_EMAIL);
-            }
-        }
-    }
-
-    @Override
-    public void visit(Node n) {
-        test(n);
-    }
-
-    @Override
-    public void visit(Way w) {
-        test(w);
-    }
-
-    @Override
-    public void visit(Relation r) {
-        test(r);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.net.IDN;
+import java.util.regex.Pattern;
+
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+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;
+import org.openstreetmap.josm.data.validation.FixableTestError;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.data.validation.routines.AbstractValidator;
+import org.openstreetmap.josm.data.validation.routines.EmailValidator;
+import org.openstreetmap.josm.data.validation.routines.UrlValidator;
+
+/**
+ * Performs validation tests on internet-related tags (websites, e-mail addresses, etc.).
+ * @since 7489
+ */
+public class InternetTags extends Test {
+
+    /** Error code for an invalid URL */
+    public static final int INVALID_URL = 3301;
+    /** Error code for an invalid e-mail */
+    public static final int INVALID_EMAIL = 3302;
+
+    private static final Pattern ASCII_PATTERN = Pattern.compile("^\\p{ASCII}+$");
+
+    /**
+     * List of keys subject to URL validation.
+     */
+    private static String[] URL_KEYS = new String[] {
+        "url", "source:url",
+        "website", "contact:website", "heritage:website", "source:website"
+    };
+
+    /**
+     * List of keys subject to email validation.
+     */
+    private static String[] EMAIL_KEYS = new String[] {
+        "email", "contact:email"
+    };
+
+    /**
+     * Constructs a new {@code InternetTags} test.
+     */
+    public InternetTags() {
+        super(tr("Internet tags"), tr("Checks for errors in internet-related tags."));
+    }
+
+    /**
+     * Potentially validates a given primitive key against a given validator.
+     * @param p The OSM primitive to test
+     * @param k The key to validate
+     * @param keys The list of keys to check. If {@code k} is not inside this collection, do nothing
+     * @param validator The validator to run if {@code k} is inside {@code keys}
+     * @param code The error code to set if the validation fails
+     * @return {@code true} if the validation fails. In this case, a new error has been created.
+     */
+    private boolean doTest(OsmPrimitive p, String k, String[] keys, AbstractValidator validator, int code) {
+        for (String i : keys) {
+            if (i.equals(k)) {
+                TestError error = validateTag(p, k, validator, code);
+                if (error != null) {
+                    errors.add(error);
+                }
+                break;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Validates a given primitive tag against a given validator.
+     * @param p The OSM primitive to test
+     * @param k The key to validate
+     * @param validator The validator to run
+     * @param code The error code to set if the validation fails
+     * @return The error if the validation fails, {@code null} otherwise
+     * @since 7824
+     */
+    public TestError validateTag(OsmPrimitive p, String k, AbstractValidator validator, int code) {
+        TestError error = doValidateTag(p, k, null, validator, code);
+        if (error != null) {
+            // Workaround to https://issues.apache.org/jira/browse/VALIDATOR-290
+            // Apache Commons Validator 1.4.1-SNAPSHOT does not support yet IDN URLs
+            // To remove if it gets fixed on Apache side
+            String v = p.get(k);
+            if (!ASCII_PATTERN.matcher(v).matches()) {
+                try {
+                    String protocol = "";
+                    if (v.contains("://")) {
+                        protocol = v.substring(0, v.indexOf("://")+3);
+                    }
+                    String domain = !protocol.isEmpty() ? v.substring(protocol.length(), v.length()) : v;
+                    String ending = "";
+                    if (domain.contains("/")) {
+                        int idx = domain.indexOf("/");
+                        ending = domain.substring(idx, domain.length());
+                        domain = domain.substring(0, idx);
+                    }
+                    // Try to apply ToASCII algorithm
+                    error = doValidateTag(p, k, protocol+IDN.toASCII(domain)+ending, validator, code);
+                } catch (IllegalArgumentException e) {
+                    error.setMessage(error.getMessage() +
+                            tr(" URL cannot be converted to ASCII: {0}", e.getMessage()));
+                }
+            }
+        }
+        return error;
+    }
+
+    /**
+     * Validates a given primitive tag against a given validator.
+     * @param p The OSM primitive to test
+     * @param k The key to validate
+     * @param v The value to validate. May be {@code null} to use {@code p.get(k)}
+     * @param validator The validator to run
+     * @param code The error code to set if the validation fails
+     * @return The error if the validation fails, {@code null} otherwise
+     */
+    private TestError doValidateTag(OsmPrimitive p, String k, String v, AbstractValidator validator, int code) {
+        TestError error = null;
+        String value = v != null ? v : p.get(k);
+        if (!validator.isValid(value)) {
+            String errMsg = validator.getErrorMessage();
+            // Special treatment to allow URLs without protocol. See UrlValidator#isValid
+            if (tr("URL contains an invalid protocol: {0}", (String)null).equals(errMsg)) {
+                String proto = validator instanceof EmailValidator ? "mailto://" : "http://";
+                return doValidateTag(p, k, proto+value, validator, code);
+            }
+            String msg = tr("''{0}'': {1}", k, errMsg);
+            String fix = validator.getFix();
+            if (fix != null) {
+                error = new FixableTestError(this, Severity.WARNING, msg, code, p,
+                        new ChangePropertyCommand(p, k, fix));
+            } else {
+                error = new TestError(this, Severity.WARNING, msg, code, p);
+            }
+        }
+        return error;
+    }
+
+    private void test(OsmPrimitive p) {
+        for (String k : p.keySet()) {
+            // Test key against URL validator
+            if (!doTest(p, k, URL_KEYS, UrlValidator.getInstance(), INVALID_URL)) {
+                // Test key against e-mail validator only if the URL validator did not fail
+                doTest(p, k, EMAIL_KEYS, EmailValidator.getInstance(), INVALID_EMAIL);
+            }
+        }
+    }
+
+    @Override
+    public void visit(Node n) {
+        test(n);
+    }
+
+    @Override
+    public void visit(Way w) {
+        test(w);
+    }
+
+    @Override
+    public void visit(Relation r) {
+        test(r);
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
index 744f84b..a93264a 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
@@ -1,220 +1,220 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
-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;
-import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
-import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
-import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.tools.Geometry;
-
-/**
- * Checks for nodes in power lines/minor_lines that do not have a power=tower/pole tag.<br>
- * See #7812 for discussions about this test.
- */
-public class PowerLines extends Test {
-
-    protected static final int POWER_LINES = 2501;
-
-    /** Values for {@code power} key interpreted as power lines */
-    public static final Collection<String> POWER_LINE_TAGS = Arrays.asList("line", "minor_line");
-    /** Values for {@code power} key interpreted as power towers */
-    public static final Collection<String> POWER_TOWER_TAGS = Arrays.asList("tower", "pole");
-    /** Values for {@code power} key interpreted as power stations */
-    public static final Collection<String> POWER_STATION_TAGS = Arrays.asList("station", "sub_station", "substation", "plant", "generator");
-    /** Values for {@code power} key interpreted as allowed power items */
-    public static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator", "switchgear");
-
-    private final Map<Way, String> towerPoleTagMap = new HashMap<>();
-
-    private final List<PowerLineError> potentialErrors = new ArrayList<>();
-
-    private final List<OsmPrimitive> powerStations = new ArrayList<>();
-
-    /**
-     * Constructs a new {@code PowerLines} test.
-     */
-    public PowerLines() {
-        super(tr("Power lines"), tr("Checks for nodes in power lines that do not have a power=tower/pole tag."));
-    }
-
-    @Override
-    public void visit(Way w) {
-        if (w.isUsable()) {
-            if (isPowerLine(w) && !w.hasTag("location", "underground")) {
-                String fixValue = null;
-                boolean erroneous = false;
-                boolean canFix = false;
-                for (Node n : w.getNodes()) {
-                    if (!isPowerTower(n)) {
-                        if (!isPowerAllowed(n)) {
-                            if (!w.isFirstLastNode(n) || !isPowerStation(n)) {
-                                potentialErrors.add(new PowerLineError(n, w));
-                                erroneous = true;
-                            }
-                        }
-                    } else if (fixValue == null) {
-                        // First tower/pole tag found, remember it
-                        fixValue = n.get("power");
-                        canFix = true;
-                    } else if (!fixValue.equals(n.get("power"))) {
-                        // The power line contains both "tower" and "pole" -> cannot fix this error
-                        canFix = false;
-                    }
-                }
-                if (erroneous && canFix) {
-                    towerPoleTagMap.put(w, fixValue);
-                }
-            } else if (w.isClosed() && isPowerStation(w)) {
-                powerStations.add(w);
-            }
-        }
-    }
-
-    @Override
-    public void visit(Relation r) {
-        if (r.isMultipolygon() && isPowerStation(r)) {
-            powerStations.add(r);
-        }
-    }
-
-    @Override
-    public void startTest(ProgressMonitor progressMonitor) {
-        super.startTest(progressMonitor);
-        towerPoleTagMap.clear();
-        powerStations.clear();
-        potentialErrors.clear();
-    }
-
-    @Override
-    public void endTest() {
-        for (PowerLineError e : potentialErrors) {
-            Node n = e.getNode();
-            if (n != null && !isInPowerStation(n)) {
-                errors.add(e);
-            }
-        }
-        potentialErrors.clear();
-        super.endTest();
-    }
-
-    protected final boolean isInPowerStation(Node n) {
-        for (OsmPrimitive station : powerStations) {
-            List<List<Node>> nodesLists = new ArrayList<>();
-            if (station instanceof Way) {
-                nodesLists.add(((Way)station).getNodes());
-            } else if (station instanceof Relation) {
-                Multipolygon polygon = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) station);
-                if (polygon != null) {
-                    for (JoinedWay outer : Multipolygon.joinWays(polygon.getOuterWays())) {
-                        nodesLists.add(outer.getNodes());
-                    }
-                }
-            }
-            for (List<Node> nodes : nodesLists) {
-                if (Geometry.nodeInsidePolygon(n, nodes)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Command fixError(TestError testError) {
-        if (testError instanceof PowerLineError && isFixable(testError)) {
-            // primitives list can be empty if all primitives have been purged
-            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
-            if (it.hasNext()) {
-                return new ChangePropertyCommand(it.next(),
-                        "power", towerPoleTagMap.get(((PowerLineError)testError).line));
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isFixable(TestError testError) {
-        return testError instanceof PowerLineError && towerPoleTagMap.containsKey(((PowerLineError)testError).line);
-    }
-
-    /**
-     * Determines if the specified way denotes a power line.
-     * @param w The way to be tested
-     * @return {@code true} if power key is set and equal to line/minor_line
-     */
-    protected static final boolean isPowerLine(Way w) {
-        return isPowerIn(w, POWER_LINE_TAGS);
-    }
-
-    /**
-     * Determines if the specified primitive denotes a power station.
-     * @param p The primitive to be tested
-     * @return {@code true} if power key is set and equal to station/sub_station/plant
-     */
-    protected static final boolean isPowerStation(OsmPrimitive p) {
-        return isPowerIn(p, POWER_STATION_TAGS);
-    }
-
-    /**
-     * Determines if the specified node denotes a power tower/pole.
-     * @param n The node to be tested
-     * @return {@code true} if power key is set and equal to tower/pole
-     */
-    protected static final boolean isPowerTower(Node n) {
-        return isPowerIn(n, POWER_TOWER_TAGS);
-    }
-
-    /**
-     * Determines if the specified node denotes a power infrastructure allowed on a power line.
-     * @param n The node to be tested
-     * @return True if power key is set and equal to switch/tranformer/busbar/generator
-     */
-    protected static final boolean isPowerAllowed(Node n) {
-        return isPowerIn(n, POWER_ALLOWED_TAGS);
-    }
-
-    /**
-     * Helper function to check if power tags is a certain value.
-     * @param p The primitive to be tested
-     * @param values List of possible values
-     * @return {@code true} if power key is set and equal to possible values
-     */
-    private static final boolean isPowerIn(OsmPrimitive p, Collection<String> values) {
-        String v = p.get("power");
-        return v != null && values != null && values.contains(v);
-    }
-
-    protected class PowerLineError extends TestError {
-        private final Way line;
-        public PowerLineError(Node n, Way line) {
-            super(PowerLines.this, Severity.WARNING,
-                    tr("Missing power tower/pole within power line"), POWER_LINES, n);
-            this.line = line;
-        }
-        public final Node getNode() {
-            // primitives list can be empty if all primitives have been purged
-            Iterator<? extends OsmPrimitive> it = getPrimitives().iterator();
-            return it.hasNext() ? (Node) it.next() : null;
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.command.Command;
+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;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.Geometry;
+
+/**
+ * Checks for nodes in power lines/minor_lines that do not have a power=tower/pole tag.<br>
+ * See #7812 for discussions about this test.
+ */
+public class PowerLines extends Test {
+
+    protected static final int POWER_LINES = 2501;
+
+    /** Values for {@code power} key interpreted as power lines */
+    public static final Collection<String> POWER_LINE_TAGS = Arrays.asList("line", "minor_line");
+    /** Values for {@code power} key interpreted as power towers */
+    public static final Collection<String> POWER_TOWER_TAGS = Arrays.asList("tower", "pole");
+    /** Values for {@code power} key interpreted as power stations */
+    public static final Collection<String> POWER_STATION_TAGS = Arrays.asList("station", "sub_station", "substation", "plant", "generator");
+    /** Values for {@code power} key interpreted as allowed power items */
+    public static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator", "switchgear");
+
+    private final Map<Way, String> towerPoleTagMap = new HashMap<>();
+
+    private final List<PowerLineError> potentialErrors = new ArrayList<>();
+
+    private final List<OsmPrimitive> powerStations = new ArrayList<>();
+
+    /**
+     * Constructs a new {@code PowerLines} test.
+     */
+    public PowerLines() {
+        super(tr("Power lines"), tr("Checks for nodes in power lines that do not have a power=tower/pole tag."));
+    }
+
+    @Override
+    public void visit(Way w) {
+        if (w.isUsable()) {
+            if (isPowerLine(w) && !w.hasTag("location", "underground")) {
+                String fixValue = null;
+                boolean erroneous = false;
+                boolean canFix = false;
+                for (Node n : w.getNodes()) {
+                    if (!isPowerTower(n)) {
+                        if (!isPowerAllowed(n)) {
+                            if (!w.isFirstLastNode(n) || !isPowerStation(n)) {
+                                potentialErrors.add(new PowerLineError(n, w));
+                                erroneous = true;
+                            }
+                        }
+                    } else if (fixValue == null) {
+                        // First tower/pole tag found, remember it
+                        fixValue = n.get("power");
+                        canFix = true;
+                    } else if (!fixValue.equals(n.get("power"))) {
+                        // The power line contains both "tower" and "pole" -> cannot fix this error
+                        canFix = false;
+                    }
+                }
+                if (erroneous && canFix) {
+                    towerPoleTagMap.put(w, fixValue);
+                }
+            } else if (w.isClosed() && isPowerStation(w)) {
+                powerStations.add(w);
+            }
+        }
+    }
+
+    @Override
+    public void visit(Relation r) {
+        if (r.isMultipolygon() && isPowerStation(r)) {
+            powerStations.add(r);
+        }
+    }
+
+    @Override
+    public void startTest(ProgressMonitor progressMonitor) {
+        super.startTest(progressMonitor);
+        towerPoleTagMap.clear();
+        powerStations.clear();
+        potentialErrors.clear();
+    }
+
+    @Override
+    public void endTest() {
+        for (PowerLineError e : potentialErrors) {
+            Node n = e.getNode();
+            if (n != null && !isInPowerStation(n)) {
+                errors.add(e);
+            }
+        }
+        potentialErrors.clear();
+        super.endTest();
+    }
+
+    protected final boolean isInPowerStation(Node n) {
+        for (OsmPrimitive station : powerStations) {
+            List<List<Node>> nodesLists = new ArrayList<>();
+            if (station instanceof Way) {
+                nodesLists.add(((Way)station).getNodes());
+            } else if (station instanceof Relation) {
+                Multipolygon polygon = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) station);
+                if (polygon != null) {
+                    for (JoinedWay outer : Multipolygon.joinWays(polygon.getOuterWays())) {
+                        nodesLists.add(outer.getNodes());
+                    }
+                }
+            }
+            for (List<Node> nodes : nodesLists) {
+                if (Geometry.nodeInsidePolygon(n, nodes)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Command fixError(TestError testError) {
+        if (testError instanceof PowerLineError && isFixable(testError)) {
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+            if (it.hasNext()) {
+                return new ChangePropertyCommand(it.next(),
+                        "power", towerPoleTagMap.get(((PowerLineError)testError).line));
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean isFixable(TestError testError) {
+        return testError instanceof PowerLineError && towerPoleTagMap.containsKey(((PowerLineError)testError).line);
+    }
+
+    /**
+     * Determines if the specified way denotes a power line.
+     * @param w The way to be tested
+     * @return {@code true} if power key is set and equal to line/minor_line
+     */
+    protected static final boolean isPowerLine(Way w) {
+        return isPowerIn(w, POWER_LINE_TAGS);
+    }
+
+    /**
+     * Determines if the specified primitive denotes a power station.
+     * @param p The primitive to be tested
+     * @return {@code true} if power key is set and equal to station/sub_station/plant
+     */
+    protected static final boolean isPowerStation(OsmPrimitive p) {
+        return isPowerIn(p, POWER_STATION_TAGS);
+    }
+
+    /**
+     * Determines if the specified node denotes a power tower/pole.
+     * @param n The node to be tested
+     * @return {@code true} if power key is set and equal to tower/pole
+     */
+    protected static final boolean isPowerTower(Node n) {
+        return isPowerIn(n, POWER_TOWER_TAGS);
+    }
+
+    /**
+     * Determines if the specified node denotes a power infrastructure allowed on a power line.
+     * @param n The node to be tested
+     * @return True if power key is set and equal to switch/tranformer/busbar/generator
+     */
+    protected static final boolean isPowerAllowed(Node n) {
+        return isPowerIn(n, POWER_ALLOWED_TAGS);
+    }
+
+    /**
+     * Helper function to check if power tags is a certain value.
+     * @param p The primitive to be tested
+     * @param values List of possible values
+     * @return {@code true} if power key is set and equal to possible values
+     */
+    private static final boolean isPowerIn(OsmPrimitive p, Collection<String> values) {
+        String v = p.get("power");
+        return v != null && values != null && values.contains(v);
+    }
+
+    protected class PowerLineError extends TestError {
+        private final Way line;
+        public PowerLineError(Node n, Way line) {
+            super(PowerLines.this, Severity.WARNING,
+                    tr("Missing power tower/pole within power line"), POWER_LINES, n);
+            this.line = line;
+        }
+        public final Node getNode() {
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = getPrimitives().iterator();
+            return it.hasNext() ? (Node) it.next() : null;
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
index d0ad8e1..17141c3 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
@@ -173,6 +173,7 @@ public class RelationChecker extends Test {
                 return r.types.contains(TaggingPresetType.CLOSEDWAY);
             case WAY:
                 return r.types.contains(TaggingPresetType.WAY);
+            case MULTIPOLYGON:
             case RELATION:
                 return r.types.contains(TaggingPresetType.RELATION);
             default: // not matching type
@@ -234,7 +235,7 @@ public class RelationChecker extends Test {
             }
         }
 
-        if( possibleMatchError != null) {
+        if (possibleMatchError != null) {
             // if any error found, then assume that member type was correct
             // and complain about not matching the memberExpression
             // (the only failure, that we could gather)
@@ -245,7 +246,7 @@ public class RelationChecker extends Test {
             String s = marktr("Role member type {0} does not match accepted list of {1} in template {2}");
 
             // prepare Set of all accepted types in template
-            EnumSet<TaggingPresetType> types = EnumSet.noneOf(TaggingPresetType.class);
+            Collection<TaggingPresetType> types = EnumSet.noneOf(TaggingPresetType.class);
             for (Role r: rolePreset.roles) {
                 types.addAll(r.types);
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java b/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
index 4a9bcbd..dedbce2 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
@@ -78,8 +78,9 @@ public class UntaggedWay extends Test {
         Map<String, String> tags = w.getKeys();
         if (!tags.isEmpty()) {
             String highway = tags.get("highway");
-            if (highway != null && NAMED_WAYS.contains(highway) && !tags.containsKey("name") && !tags.containsKey("ref")) {
-                boolean isRoundabout = false;
+            if (highway != null && NAMED_WAYS.contains(highway) && !tags.containsKey("name") && !tags.containsKey("ref")
+                    && !"yes".equals(tags.get("noname"))) {
+                boolean isJunction = false;
                 boolean hasName = false;
                 for (String key : w.keySet()) {
                     hasName = key.startsWith("name:") || key.endsWith("_name") || key.endsWith("_ref");
@@ -87,15 +88,15 @@ public class UntaggedWay extends Test {
                         break;
                     }
                     if ("junction".equals(key)) {
-                        isRoundabout = "roundabout".equals(w.get("junction"));
+                        isJunction = true;
                         break;
                     }
                 }
 
-                if (!hasName && !isRoundabout) {
+                if (!hasName && !isJunction) {
                     errors.add(new TestError(this, Severity.WARNING, tr("Unnamed ways"), UNNAMED_WAY, w));
-                } else if (isRoundabout) {
-                    errors.add(new TestError(this, Severity.WARNING, tr("Unnamed junction"), UNNAMED_JUNCTION, w));
+                } else if (isJunction) {
+                    errors.add(new TestError(this, Severity.OTHER, tr("Unnamed junction"), UNNAMED_JUNCTION, w));
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/ImageryMenu.java b/src/org/openstreetmap/josm/gui/ImageryMenu.java
index 0bf6e63..cc14fd0 100644
--- a/src/org/openstreetmap/josm/gui/ImageryMenu.java
+++ b/src/org/openstreetmap/josm/gui/ImageryMenu.java
@@ -1,277 +1,290 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trc;
-
-import java.awt.Component;
-import java.awt.GraphicsEnvironment;
-import java.awt.MenuComponent;
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.swing.Action;
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.MenuElement;
-import javax.swing.event.MenuEvent;
-import javax.swing.event.MenuListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AddImageryLayerAction;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.actions.MapRectifierWMSmenuAction;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.imagery.ImageryInfo;
-import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
-import org.openstreetmap.josm.data.imagery.Shape;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Imagery menu, holding entries for imagery preferences, offset actions and dynamic imagery entries
- * depending on current maview coordinates.
- * @since 3737
- */
-public class ImageryMenu extends JMenu implements LayerChangeListener {
-
-    private Action offsetAction = new JosmAction(
-            tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
-        {
-            putValue("toolbar", "imagery-offset");
-            Main.toolbar.register(this);
-        }
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
-            if (layers.isEmpty()) {
-                setEnabled(false);
-                return;
-            }
-            Component source = null;
-            if (e.getSource() instanceof Component) {
-                source = (Component)e.getSource();
-            }
-            JPopupMenu popup = new JPopupMenu();
-            if (layers.size() == 1) {
-                JComponent c = layers.iterator().next().getOffsetMenuItem(popup);
-                if (c instanceof JMenuItem) {
-                    ((JMenuItem) c).getAction().actionPerformed(e);
-                } else {
-                    if (source == null) return;
-                    popup.show(source, source.getWidth()/2, source.getHeight()/2);
-                }
-                return;
-            }
-            if (source == null) return;
-            for (ImageryLayer layer : layers) {
-                JMenuItem layerMenu = layer.getOffsetMenuItem();
-                layerMenu.setText(layer.getName());
-                layerMenu.setIcon(layer.getIcon());
-                popup.add(layerMenu);
-            }
-            popup.show(source, source.getWidth()/2, source.getHeight()/2);
-        }
-    };
-
-    private final JMenuItem singleOffset = new JMenuItem(offsetAction);
-    private JMenuItem offsetMenuItem = singleOffset;
-    private final MapRectifierWMSmenuAction rectaction = new MapRectifierWMSmenuAction();
-
-    /**
-     * Constructs a new {@code ImageryMenu}.
-     * @param subMenu submenu in that contains plugin-managed additional imagery layers
-     */
-    public ImageryMenu(JMenu subMenu) {
-        super(tr("Imagery"));
-        setupMenuScroller();
-        MapView.addLayerChangeListener(this);
-        // build dynamically
-        addMenuListener(new MenuListener() {
-            @Override
-            public void menuSelected(MenuEvent e) {
-                refreshImageryMenu();
-            }
-
-            @Override
-            public void menuDeselected(MenuEvent e) {
-            }
-
-            @Override
-            public void menuCanceled(MenuEvent e) {
-            }
-        });
-        MainMenu.add(subMenu, rectaction);
-    }
-
-    private void setupMenuScroller() {
-        if (!GraphicsEnvironment.isHeadless()) {
-            MenuScroller.setScrollerFor(this, 150, 2);
-        }
-    }
-
-    /**
-     * Refresh imagery menu.
-     *
-     * Outside this class only called in {@link ImageryPreference#initialize()}.
-     * (In order to have actions ready for the toolbar, see #8446.)
-     */
-    public void refreshImageryMenu() {
-        removeDynamicItems();
-
-        addDynamic(offsetMenuItem);
-        addDynamicSeparator();
-
-        // for each configured ImageryInfo, add a menu entry.
-        for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
-            addDynamic(new AddImageryLayerAction(u));
-        }
-
-        // list all imagery entries where the current map location
-        // is within the imagery bounds
-        if (Main.isDisplayingMapView()) {
-            MapView mv = Main.map.mapView;
-            LatLon pos = mv.getProjection().eastNorth2latlon(mv.getCenter());
-            final Set<ImageryInfo> inViewLayers = new TreeSet<>();
-
-            for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
-                if (i.getBounds() != null && i.getBounds().contains(pos)) {
-                    inViewLayers.add(i);
-                }
-            }
-            // Do not suggest layers already in use
-            inViewLayers.removeAll(ImageryLayerInfo.instance.getLayers());
-            // For layers containing complex shapes, check that center is in one
-            // of its shapes (fix #7910)
-            for (Iterator<ImageryInfo> iti = inViewLayers.iterator(); iti.hasNext(); ) {
-                List<Shape> shapes = iti.next().getBounds().getShapes();
-                if (shapes != null && !shapes.isEmpty()) {
-                    boolean found = false;
-                    for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
-                        found = its.next().contains(pos);
-                    }
-                    if (!found) {
-                        iti.remove();
-                    }
-                }
-            }
-            if (!inViewLayers.isEmpty()) {
-                addDynamicSeparator();
-                for (ImageryInfo i : inViewLayers) {
-                    addDynamic(new AddImageryLayerAction(i));
-                }
-            }
-        }
-
-        addDynamicSeparator();
-        JMenu subMenu = Main.main.menu.imagerySubMenu;
-        int heightUnrolled = 30*(getItemCount()+subMenu.getItemCount());
-        if (heightUnrolled < Main.panel.getHeight()) {
-            // add all items of submenu if they will fit on screen
-            int n = subMenu.getItemCount();
-            for (int i=0; i<n; i++) {
-                addDynamic(subMenu.getItem(i).getAction());
-            }
-        } else {
-            // or add the submenu itself
-            addDynamic(subMenu);
-        }
-    }
-
-    private JMenuItem getNewOffsetMenu(){
-        if (!Main.isDisplayingMapView()) {
-            offsetAction.setEnabled(false);
-            return singleOffset;
-        }
-        Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
-        if (layers.isEmpty()) {
-            offsetAction.setEnabled(false);
-            return singleOffset;
-        }
-        offsetAction.setEnabled(true);
-        JMenu newMenu = new JMenu(trc("layer","Offset"));
-        newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
-        newMenu.setAction(offsetAction);
-        if (layers.size() == 1)
-            return (JMenuItem)layers.iterator().next().getOffsetMenuItem(newMenu);
-        for (ImageryLayer layer : layers) {
-            JMenuItem layerMenu = layer.getOffsetMenuItem();
-            layerMenu.setText(layer.getName());
-            layerMenu.setIcon(layer.getIcon());
-            newMenu.add(layerMenu);
-        }
-        return newMenu;
-    }
-
-    public void refreshOffsetMenu() {
-        offsetMenuItem = getNewOffsetMenu();
-    }
-
-    @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof ImageryLayer) {
-            refreshOffsetMenu();
-        }
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof ImageryLayer) {
-            refreshOffsetMenu();
-        }
-    }
-
-    /**
-     * Collection to store temporary menu items. They will be deleted
-     * (and possibly recreated) when refreshImageryMenu() is called.
-     * @since 5803
-     */
-    private List <Object> dynamicItems = new ArrayList<>(20);
-
-    /**
-     * Remove all the items in @field dynamicItems collection
-     * @since 5803
-     */
-    private void removeDynamicItems() {
-        for (Object item : dynamicItems) {
-            if (item instanceof JMenuItem) {
-                remove((JMenuItem)item);
-            }
-            if (item instanceof MenuComponent) {
-                remove((MenuComponent)item);
-            }
-            if (item instanceof Component) {
-                remove((Component)item);
-            }
-        }
-        dynamicItems.clear();
-    }
-
-    private void addDynamicSeparator() {
-        JPopupMenu.Separator s =  new JPopupMenu.Separator();
-        dynamicItems.add(s);
-        add(s);
-    }
-
-    private void addDynamic(Action a) {
-        dynamicItems.add( this.add(a) );
-    }
-
-    private void addDynamic(JMenuItem it) {
-        dynamicItems.add( this.add(it) );
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.awt.Component;
+import java.awt.GraphicsEnvironment;
+import java.awt.MenuComponent;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Action;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AddImageryLayerAction;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.MapRectifierWMSmenuAction;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
+import org.openstreetmap.josm.data.imagery.Shape;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Imagery menu, holding entries for imagery preferences, offset actions and dynamic imagery entries
+ * depending on current maview coordinates.
+ * @since 3737
+ */
+public class ImageryMenu extends JMenu implements LayerChangeListener {
+
+    /**
+     * Compare ImageryInfo objects alphabetically by name.
+     *
+     * ImageryInfo objects are normally sorted by country code first
+     * (for the preferences). We don't want this in the imagery menu.
+     */
+    public static Comparator<ImageryInfo> alphabeticImageryComparator = new Comparator<ImageryInfo>() {
+        @Override
+        public int compare(ImageryInfo ii1, ImageryInfo ii2) {
+            return ii1.getName().toLowerCase().compareTo(ii2.getName().toLowerCase());
+        }
+    };
+
+    private Action offsetAction = new JosmAction(
+            tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
+        {
+            putValue("toolbar", "imagery-offset");
+            Main.toolbar.register(this);
+        }
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+            if (layers.isEmpty()) {
+                setEnabled(false);
+                return;
+            }
+            Component source = null;
+            if (e.getSource() instanceof Component) {
+                source = (Component)e.getSource();
+            }
+            JPopupMenu popup = new JPopupMenu();
+            if (layers.size() == 1) {
+                JComponent c = layers.iterator().next().getOffsetMenuItem(popup);
+                if (c instanceof JMenuItem) {
+                    ((JMenuItem) c).getAction().actionPerformed(e);
+                } else {
+                    if (source == null) return;
+                    popup.show(source, source.getWidth()/2, source.getHeight()/2);
+                }
+                return;
+            }
+            if (source == null) return;
+            for (ImageryLayer layer : layers) {
+                JMenuItem layerMenu = layer.getOffsetMenuItem();
+                layerMenu.setText(layer.getName());
+                layerMenu.setIcon(layer.getIcon());
+                popup.add(layerMenu);
+            }
+            popup.show(source, source.getWidth()/2, source.getHeight()/2);
+        }
+    };
+
+    private final JMenuItem singleOffset = new JMenuItem(offsetAction);
+    private JMenuItem offsetMenuItem = singleOffset;
+    private final MapRectifierWMSmenuAction rectaction = new MapRectifierWMSmenuAction();
+
+    /**
+     * Constructs a new {@code ImageryMenu}.
+     * @param subMenu submenu in that contains plugin-managed additional imagery layers
+     */
+    public ImageryMenu(JMenu subMenu) {
+        super(tr("Imagery"));
+        setupMenuScroller();
+        MapView.addLayerChangeListener(this);
+        // build dynamically
+        addMenuListener(new MenuListener() {
+            @Override
+            public void menuSelected(MenuEvent e) {
+                refreshImageryMenu();
+            }
+
+            @Override
+            public void menuDeselected(MenuEvent e) {
+            }
+
+            @Override
+            public void menuCanceled(MenuEvent e) {
+            }
+        });
+        MainMenu.add(subMenu, rectaction);
+    }
+
+    private void setupMenuScroller() {
+        if (!GraphicsEnvironment.isHeadless()) {
+            MenuScroller.setScrollerFor(this, 150, 2);
+        }
+    }
+
+    /**
+     * Refresh imagery menu.
+     *
+     * Outside this class only called in {@link ImageryPreference#initialize()}.
+     * (In order to have actions ready for the toolbar, see #8446.)
+     */
+    public void refreshImageryMenu() {
+        removeDynamicItems();
+
+        addDynamic(offsetMenuItem);
+        addDynamicSeparator();
+
+        // for each configured ImageryInfo, add a menu entry.
+        final List<ImageryInfo> savedLayers = new ArrayList<>(ImageryLayerInfo.instance.getLayers());
+        Collections.sort(savedLayers, alphabeticImageryComparator);
+        for (final ImageryInfo u : savedLayers) {
+            addDynamic(new AddImageryLayerAction(u));
+        }
+
+        // list all imagery entries where the current map location
+        // is within the imagery bounds
+        if (Main.isDisplayingMapView()) {
+            MapView mv = Main.map.mapView;
+            LatLon pos = mv.getProjection().eastNorth2latlon(mv.getCenter());
+            final List<ImageryInfo> inViewLayers = new ArrayList<>();
+
+            for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
+                if (i.getBounds() != null && i.getBounds().contains(pos)) {
+                    inViewLayers.add(i);
+                }
+            }
+            // Do not suggest layers already in use
+            inViewLayers.removeAll(ImageryLayerInfo.instance.getLayers());
+            // For layers containing complex shapes, check that center is in one
+            // of its shapes (fix #7910)
+            for (Iterator<ImageryInfo> iti = inViewLayers.iterator(); iti.hasNext(); ) {
+                List<Shape> shapes = iti.next().getBounds().getShapes();
+                if (shapes != null && !shapes.isEmpty()) {
+                    boolean found = false;
+                    for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
+                        found = its.next().contains(pos);
+                    }
+                    if (!found) {
+                        iti.remove();
+                    }
+                }
+            }
+            if (!inViewLayers.isEmpty()) {
+                Collections.sort(inViewLayers, alphabeticImageryComparator);
+                addDynamicSeparator();
+                for (ImageryInfo i : inViewLayers) {
+                    addDynamic(new AddImageryLayerAction(i));
+                }
+            }
+        }
+
+        addDynamicSeparator();
+        JMenu subMenu = Main.main.menu.imagerySubMenu;
+        int heightUnrolled = 30*(getItemCount()+subMenu.getItemCount());
+        if (heightUnrolled < Main.panel.getHeight()) {
+            // add all items of submenu if they will fit on screen
+            int n = subMenu.getItemCount();
+            for (int i=0; i<n; i++) {
+                addDynamic(subMenu.getItem(i).getAction());
+            }
+        } else {
+            // or add the submenu itself
+            addDynamic(subMenu);
+        }
+    }
+
+    private JMenuItem getNewOffsetMenu(){
+        if (!Main.isDisplayingMapView()) {
+            offsetAction.setEnabled(false);
+            return singleOffset;
+        }
+        Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        if (layers.isEmpty()) {
+            offsetAction.setEnabled(false);
+            return singleOffset;
+        }
+        offsetAction.setEnabled(true);
+        JMenu newMenu = new JMenu(trc("layer","Offset"));
+        newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
+        newMenu.setAction(offsetAction);
+        if (layers.size() == 1)
+            return (JMenuItem)layers.iterator().next().getOffsetMenuItem(newMenu);
+        for (ImageryLayer layer : layers) {
+            JMenuItem layerMenu = layer.getOffsetMenuItem();
+            layerMenu.setText(layer.getName());
+            layerMenu.setIcon(layer.getIcon());
+            newMenu.add(layerMenu);
+        }
+        return newMenu;
+    }
+
+    public void refreshOffsetMenu() {
+        offsetMenuItem = getNewOffsetMenu();
+    }
+
+    @Override
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    }
+
+    @Override
+    public void layerAdded(Layer newLayer) {
+        if (newLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
+
+    @Override
+    public void layerRemoved(Layer oldLayer) {
+        if (oldLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
+
+    /**
+     * Collection to store temporary menu items. They will be deleted
+     * (and possibly recreated) when refreshImageryMenu() is called.
+     * @since 5803
+     */
+    private List <Object> dynamicItems = new ArrayList<>(20);
+
+    /**
+     * Remove all the items in @field dynamicItems collection
+     * @since 5803
+     */
+    private void removeDynamicItems() {
+        for (Object item : dynamicItems) {
+            if (item instanceof JMenuItem) {
+                remove((JMenuItem)item);
+            }
+            if (item instanceof MenuComponent) {
+                remove((MenuComponent)item);
+            }
+            if (item instanceof Component) {
+                remove((Component)item);
+            }
+        }
+        dynamicItems.clear();
+    }
+
+    private void addDynamicSeparator() {
+        JPopupMenu.Separator s =  new JPopupMenu.Separator();
+        dynamicItems.add(s);
+        add(s);
+    }
+
+    private void addDynamic(Action a) {
+        dynamicItems.add( this.add(a) );
+    }
+
+    private void addDynamic(JMenuItem it) {
+        dynamicItems.add( this.add(it) );
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/MapFrameListener.java b/src/org/openstreetmap/josm/gui/MapFrameListener.java
index ca6c33a..b28037a 100644
--- a/src/org/openstreetmap/josm/gui/MapFrameListener.java
+++ b/src/org/openstreetmap/josm/gui/MapFrameListener.java
@@ -1,18 +1,18 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui;
-
-/**
- * Listener notified of MapFrame changes.
- * @since 5957
- */
-public interface MapFrameListener {
-
-    /**
-     * Called after Main.mapFrame is initalized. (After the first data is loaded).
-     * You can use this callback to tweak the newFrame to your needs, as example install
-     * an alternative Painter.
-     * @param oldFrame The old MapFrame
-     * @param newFrame The new MapFrame
-     */
-    public abstract void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame);
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui;
+
+/**
+ * Listener notified of MapFrame changes.
+ * @since 5957
+ */
+public interface MapFrameListener {
+
+    /**
+     * Called after Main.mapFrame is initalized. (After the first data is loaded).
+     * You can use this callback to tweak the newFrame to your needs, as example install
+     * an alternative Painter.
+     * @param oldFrame The old MapFrame
+     * @param newFrame The new MapFrame
+     */
+    public abstract void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame);
+}
diff --git a/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java b/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
index 709e6e4..82724f5 100644
--- a/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
+++ b/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
@@ -41,8 +41,8 @@ public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
      * Create the runnable object with a given message for the user.
      *
      * @param title message for the user
-     * @param ignoreException If true, exception will be propagated to calling code. If false then
-     * exception will be thrown directly in EDT. When this runnable is executed using executor framework
+     * @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 PleaseWaitRunnable(String title, boolean ignoreException) {
@@ -54,8 +54,8 @@ public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
      *
      * @param parent the parent component for the please wait dialog. Must not be null.
      * @param title message for the user
-     * @param ignoreException If true, exception will be propagated to calling code. If false then
-     * exception will be thrown directly in EDT. When this runnable is executed using executor framework
+     * @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)
      * @throws IllegalArgumentException thrown if parent is null
      */
@@ -71,8 +71,8 @@ public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
      *
      * @param title message for the user
      * @param progressMonitor progress monitor
-     * @param ignoreException If true, exception will be propagated to calling code. If false then
-     * exception will be thrown directly in EDT. When this runnable is executed using executor framework
+     * @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 PleaseWaitRunnable(String title, ProgressMonitor progressMonitor, boolean ignoreException) {
diff --git a/src/org/openstreetmap/josm/gui/PopupMenuHandler.java b/src/org/openstreetmap/josm/gui/PopupMenuHandler.java
index 64e7e9c..feaadde 100644
--- a/src/org/openstreetmap/josm/gui/PopupMenuHandler.java
+++ b/src/org/openstreetmap/josm/gui/PopupMenuHandler.java
@@ -1,125 +1,125 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.Action;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.MenuElement;
-import javax.swing.event.PopupMenuListener;
-
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-
-/**
- * Handler to ease management of actions in different popup menus.
- * @since 5821
- */
-public class PopupMenuHandler {
-
-    // Set of enabled osm primitives actions
-    private final Set<OsmPrimitiveAction> primitiveActions = new HashSet<>();
-    // Managed menu
-    private final JPopupMenu menu;
-    
-    /**
-     * Constructs a new {@code RelationActionMenuHandler} for the specified popup menu.
-     * 
-     * @param menu The menu to be managed
-     */
-    public PopupMenuHandler(JPopupMenu menu) {
-        this.menu = menu;
-    }
-
-    /**
-     * Appends a new separator at the end of the menu.
-     * @see JPopupMenu#addSeparator
-     */
-    public void addSeparator() {
-        menu.addSeparator();
-    }
-
-    /**
-     * Appends a new menu item to the end of the menu which dispatches the specified <code>Action</code> object.
-     * 
-     * @param a the <code>Action</code> to add to the menu
-     * @return the new menu item
-     * @see JPopupMenu#add(Action)
-     */
-    public JMenuItem addAction(Action a) {
-        if (a != null) {
-            if (a instanceof OsmPrimitiveAction) {
-                primitiveActions.add((OsmPrimitiveAction) a);
-            }
-            return menu.add(a);
-        }
-        return null;
-    }
-
-    /**
-     * Removes the menu item which dispatches the specified <code>Action</code> object.
-     * 
-     * @param a the <code>Action</code> to remove from the menu
-     * @see JPopupMenu#remove(int)
-     */
-    public void removeAction(Action a) {
-        if (a != null) {
-            if (a instanceof OsmPrimitiveAction) {
-                primitiveActions.remove(a);
-            }
-            MenuElement[] elements = menu.getSubElements();
-            for (int i=0; i<elements.length; i++) {
-                if (elements[i] instanceof JMenuItem) {
-                    if (((JMenuItem) elements[i]).getAction() == a) {
-                        menu.remove(i);
-                        return;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     *  Adds a <code>PopupMenu</code> listener.
-     *
-     *  @param l the <code>PopupMenuListener</code> to add
-     *  @see JPopupMenu#addPopupMenuListener
-     */
-    public void addListener(PopupMenuListener l) {
-        menu.addPopupMenuListener(l);
-    }
-
-    /**
-     * Removes a <code>PopupMenu</code> listener.
-     *
-     * @param l the <code>PopupMenuListener</code> to remove
-     *  @see JPopupMenu#removePopupMenuListener
-     */
-    public void removeListener(PopupMenuListener l) {
-        menu.removePopupMenuListener(l);
-    }
-    
-    /**
-     * Returns all enabled primitive actions.
-     * @return All primitive actions that have been added.
-     * @see #addAction(Action)
-     */
-    public Collection<OsmPrimitiveAction> getPrimitiveActions() {
-        return Collections.unmodifiableCollection(primitiveActions);
-    }
-    
-    /**
-     * Specifies the working set of primitives for all primitive actions.
-     * @param primitives The new working set of primitives. Can be null or empty
-     * @see OsmPrimitiveAction#setPrimitives
-     */
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
-        for (OsmPrimitiveAction action : primitiveActions) {
-            action.setPrimitives(primitives);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.Action;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.MenuElement;
+import javax.swing.event.PopupMenuListener;
+
+import org.openstreetmap.josm.actions.OsmPrimitiveAction;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Handler to ease management of actions in different popup menus.
+ * @since 5821
+ */
+public class PopupMenuHandler {
+
+    // Set of enabled osm primitives actions
+    private final Set<OsmPrimitiveAction> primitiveActions = new HashSet<>();
+    // Managed menu
+    private final JPopupMenu menu;
+    
+    /**
+     * Constructs a new {@code RelationActionMenuHandler} for the specified popup menu.
+     * 
+     * @param menu The menu to be managed
+     */
+    public PopupMenuHandler(JPopupMenu menu) {
+        this.menu = menu;
+    }
+
+    /**
+     * Appends a new separator at the end of the menu.
+     * @see JPopupMenu#addSeparator
+     */
+    public void addSeparator() {
+        menu.addSeparator();
+    }
+
+    /**
+     * Appends a new menu item to the end of the menu which dispatches the specified <code>Action</code> object.
+     * 
+     * @param a the <code>Action</code> to add to the menu
+     * @return the new menu item
+     * @see JPopupMenu#add(Action)
+     */
+    public JMenuItem addAction(Action a) {
+        if (a != null) {
+            if (a instanceof OsmPrimitiveAction) {
+                primitiveActions.add((OsmPrimitiveAction) a);
+            }
+            return menu.add(a);
+        }
+        return null;
+    }
+
+    /**
+     * Removes the menu item which dispatches the specified <code>Action</code> object.
+     * 
+     * @param a the <code>Action</code> to remove from the menu
+     * @see JPopupMenu#remove(int)
+     */
+    public void removeAction(Action a) {
+        if (a != null) {
+            if (a instanceof OsmPrimitiveAction) {
+                primitiveActions.remove(a);
+            }
+            MenuElement[] elements = menu.getSubElements();
+            for (int i=0; i<elements.length; i++) {
+                if (elements[i] instanceof JMenuItem) {
+                    if (((JMenuItem) elements[i]).getAction() == a) {
+                        menu.remove(i);
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     *  Adds a <code>PopupMenu</code> listener.
+     *
+     *  @param l the <code>PopupMenuListener</code> to add
+     *  @see JPopupMenu#addPopupMenuListener
+     */
+    public void addListener(PopupMenuListener l) {
+        menu.addPopupMenuListener(l);
+    }
+
+    /**
+     * Removes a <code>PopupMenu</code> listener.
+     *
+     * @param l the <code>PopupMenuListener</code> to remove
+     *  @see JPopupMenu#removePopupMenuListener
+     */
+    public void removeListener(PopupMenuListener l) {
+        menu.removePopupMenuListener(l);
+    }
+    
+    /**
+     * Returns all enabled primitive actions.
+     * @return All primitive actions that have been added.
+     * @see #addAction(Action)
+     */
+    public Collection<OsmPrimitiveAction> getPrimitiveActions() {
+        return Collections.unmodifiableCollection(primitiveActions);
+    }
+    
+    /**
+     * Specifies the working set of primitives for all primitive actions.
+     * @param primitives The new working set of primitives. Can be null or empty
+     * @see OsmPrimitiveAction#setPrimitives
+     */
+    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+        for (OsmPrimitiveAction action : primitiveActions) {
+            action.setPrimitives(primitives);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/SelectionManager.java b/src/org/openstreetmap/josm/gui/SelectionManager.java
index ab13a66..da9a2d6 100644
--- a/src/org/openstreetmap/josm/gui/SelectionManager.java
+++ b/src/org/openstreetmap/josm/gui/SelectionManager.java
@@ -150,7 +150,7 @@ public class SelectionManager implements MouseListener, MouseMotionListener, Pro
      */
     @Override
     public void mousePressed(MouseEvent e) {
-        if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() > 1) {
+        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);
diff --git a/src/org/openstreetmap/josm/gui/actionsupport/LogShowDialog.java b/src/org/openstreetmap/josm/gui/actionsupport/LogShowDialog.java
index 563c468..b96ace0 100644
--- a/src/org/openstreetmap/josm/gui/actionsupport/LogShowDialog.java
+++ b/src/org/openstreetmap/josm/gui/actionsupport/LogShowDialog.java
@@ -1,53 +1,53 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.actionsupport;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Generic dialog with message and scrolling area
- * @author Alexei
- */
-public class LogShowDialog extends ExtendedDialog {
-
-
-    public LogShowDialog (String title, String msg, String log) {
-        super(Main.parent, title, new String[] {tr("OK")});
-        setButtonIcons(new String[] {"ok.png"});
-        setContent(build(msg, log));
-    }
-
-    protected final JPanel build(String msg, String log) {
-        JPanel p = new JPanel(new GridBagLayout());
-        JLabel lbl = new JLabel(msg);
-        
-        lbl.setFont(lbl.getFont().deriveFont(0, 14));
-        
-        p.add(lbl, GBC.eol().insets(5,0,5,0));
-        JosmEditorPane txt = new JosmEditorPane();
-        txt.setContentType("text/html");
-        txt.setText(log);
-        txt.setEditable(false);
-        txt.setOpaque(false);
-        
-        JScrollPane sp = new JScrollPane(txt);
-        sp.setOpaque(false);
-        sp.setPreferredSize(new Dimension(600,300));
-        
-        
-        p.add(sp, GBC.eop().insets(5,15,0,0).fill(GBC.HORIZONTAL));
-
-        return p;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.actionsupport;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Generic dialog with message and scrolling area
+ * @author Alexei
+ */
+public class LogShowDialog extends ExtendedDialog {
+
+
+    public LogShowDialog (String title, String msg, String log) {
+        super(Main.parent, title, new String[] {tr("OK")});
+        setButtonIcons(new String[] {"ok.png"});
+        setContent(build(msg, log));
+    }
+
+    protected final JPanel build(String msg, String log) {
+        JPanel p = new JPanel(new GridBagLayout());
+        JLabel lbl = new JLabel(msg);
+        
+        lbl.setFont(lbl.getFont().deriveFont(0, 14));
+        
+        p.add(lbl, GBC.eol().insets(5,0,5,0));
+        JosmEditorPane txt = new JosmEditorPane();
+        txt.setContentType("text/html");
+        txt.setText(log);
+        txt.setEditable(false);
+        txt.setOpaque(false);
+        
+        JScrollPane sp = new JScrollPane(txt);
+        sp.setOpaque(false);
+        sp.setPreferredSize(new Dimension(600,300));
+        
+        
+        p.add(sp, GBC.eop().insets(5,15,0,0).fill(GBC.HORIZONTAL));
+
+        return p;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/PairTable.java b/src/org/openstreetmap/josm/gui/conflict/pair/PairTable.java
index 46b2ea3..ac952dd 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/PairTable.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/PairTable.java
@@ -1,33 +1,33 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair;
-
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.table.TableColumnModel;
-
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
-
-public abstract class PairTable extends OsmPrimitivesTable {
-
-    private final ListMergeModel<? extends PrimitiveId> model;
-    
-    public PairTable(String name, ListMergeModel<? extends PrimitiveId> model, OsmPrimitivesTableModel dm, TableColumnModel cm, ListSelectionModel sm) {
-        super(dm, cm, sm);
-        this.model = model;
-        setName(name);
-        setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
-    }
-
-    @Override
-    public OsmPrimitive getPrimitiveInLayer(int row, OsmDataLayer layer) {
-        OsmPrimitive result = super.getPrimitiveInLayer(row, layer);
-        if (model != null && result != null && layer != null && result.getDataSet() != layer.data) {
-            result = model.getMyPrimitiveById(result);
-        }
-        return result;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair;
+
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.TableColumnModel;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
+import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
+
+public abstract class PairTable extends OsmPrimitivesTable {
+
+    private final ListMergeModel<? extends PrimitiveId> model;
+    
+    public PairTable(String name, ListMergeModel<? extends PrimitiveId> model, OsmPrimitivesTableModel dm, TableColumnModel cm, ListSelectionModel sm) {
+        super(dm, cm, sm);
+        this.model = model;
+        setName(name);
+        setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
+    }
+
+    @Override
+    public OsmPrimitive getPrimitiveInLayer(int row, OsmDataLayer layer) {
+        OsmPrimitive result = super.getPrimitiveInLayer(row, layer);
+        if (model != null && result != null && layer != null && result.getDataSet() != layer.data) {
+            result = model.getMyPrimitiveById(result);
+        }
+        return result;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListTable.java b/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListTable.java
index 677bd81..40928dc 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListTable.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListTable.java
@@ -1,22 +1,22 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.nodes;
-
-import javax.swing.ListSelectionModel;
-
-import org.openstreetmap.josm.actions.ZoomToAction;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
-import org.openstreetmap.josm.gui.conflict.pair.PairTable;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
-
-public class NodeListTable extends PairTable {
-
-    public NodeListTable(String name, ListMergeModel<Node> model, OsmPrimitivesTableModel dm, ListSelectionModel sm) {
-        super(name, model, dm, new NodeListColumnModel(new NodeListTableCellRenderer()), sm);
-    }
-
-    @Override
-    protected ZoomToAction buildZoomToAction() {
-        return new ZoomToAction(this);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.nodes;
+
+import javax.swing.ListSelectionModel;
+
+import org.openstreetmap.josm.actions.ZoomToAction;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
+import org.openstreetmap.josm.gui.conflict.pair.PairTable;
+import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
+
+public class NodeListTable extends PairTable {
+
+    public NodeListTable(String name, ListMergeModel<Node> model, OsmPrimitivesTableModel dm, ListSelectionModel sm) {
+        super(name, model, dm, new NodeListColumnModel(new NodeListTableCellRenderer()), sm);
+    }
+
+    @Override
+    protected ZoomToAction buildZoomToAction() {
+        return new ZoomToAction(this);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTable.java b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTable.java
index 3703fd8..00e98a3 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTable.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTable.java
@@ -1,22 +1,22 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.relation;
-
-import javax.swing.ListSelectionModel;
-
-import org.openstreetmap.josm.actions.ZoomToAction;
-import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
-import org.openstreetmap.josm.gui.conflict.pair.PairTable;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
-
-public class RelationMemberTable extends PairTable {
-
-    public RelationMemberTable(String name, ListMergeModel<RelationMember> model, OsmPrimitivesTableModel dm, ListSelectionModel sm) {
-        super(name, model, dm, new RelationMemberListColumnModel(), sm);
-    }
-
-    @Override
-    protected ZoomToAction buildZoomToAction() {
-        return new ZoomToAction(this);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.relation;
+
+import javax.swing.ListSelectionModel;
+
+import org.openstreetmap.josm.actions.ZoomToAction;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
+import org.openstreetmap.josm.gui.conflict.pair.PairTable;
+import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
+
+public class RelationMemberTable extends PairTable {
+
+    public RelationMemberTable(String name, ListMergeModel<RelationMember> model, OsmPrimitivesTableModel dm, ListSelectionModel sm) {
+        super(name, model, dm, new RelationMemberListColumnModel(), sm);
+    }
+
+    @Override
+    protected ZoomToAction buildZoomToAction() {
+        return new ZoomToAction(this);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
index 57a3322..3bb1a3b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
@@ -31,6 +31,7 @@ import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AbstractSelectAction;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -440,11 +441,8 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
         }
     }
 
-    class SelectAction extends AbstractAction implements ListSelectionListener {
-        public SelectAction() {
-            putValue(NAME, tr("Select"));
-            putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+    class SelectAction extends AbstractSelectAction implements ListSelectionListener {
+        private SelectAction() {
             putValue("help", ht("/Dialog/ConflictList#SelectAction"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
index 0dcad7e..8bb1e04 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
@@ -7,6 +7,8 @@ import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Image;
 import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -23,6 +25,7 @@ import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.ListCellRenderer;
 import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
@@ -112,6 +115,17 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
                 }
                 updateButtonStates();
             }});
+        displayList.addMouseListener(new MouseAdapter() {
+            //center view on selected note on double click
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
+                    if (noteData != null && noteData.getSelectedNote() != null) {
+                        Main.map.mapView.zoomTo(noteData.getSelectedNote().getLatLon());
+                    }
+                }
+            }
+        });
 
         JPanel pane = new JPanel(new BorderLayout());
         pane.add(new JScrollPane(displayList), BorderLayout.CENTER);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
index 3a40939..b777dc4 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
@@ -33,12 +33,14 @@ import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AbstractSelectAction;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
 import org.openstreetmap.josm.actions.relation.EditRelationAction;
 import org.openstreetmap.josm.actions.relation.SelectInRelationListAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
@@ -316,14 +318,11 @@ public class SelectionListDialog extends ToggleDialog  {
      * Sets the current JOSM selection to the OSM primitives selected in the list
      * of this dialog
      */
-    class SelectAction extends AbstractAction implements ListSelectionListener {
+    class SelectAction extends AbstractSelectAction implements ListSelectionListener {
         /**
          * Constructs a new {@code SelectAction}.
          */
         public SelectAction() {
-            putValue(NAME, tr("Select"));
-            putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs","select"));
             updateEnabledState();
         }
 
@@ -334,6 +333,7 @@ public class SelectionListDialog extends ToggleDialog  {
             OsmDataLayer editLayer = Main.main.getEditLayer();
             if (editLayer == null) return;
             editLayer.data.setSelected(sel);
+            model.selectionModel.setSelectionInterval(0, sel.size()-1);
         }
 
         protected void updateEnabledState() {
@@ -610,15 +610,20 @@ public class SelectionListDialog extends ToggleDialog  {
                         remember(selection);
                         if (selection.size() == 2) {
                             Iterator<? extends OsmPrimitive> it = selection.iterator();
-                            OsmPrimitive n1 = it.next(), n2=it.next();
-                            // show distance between two selected nodes
+                            OsmPrimitive n1 = it.next();
+                            OsmPrimitive n2 = it.next();
+                            // show distance between two selected nodes with coordinates
                             if (n1 instanceof Node && n2 instanceof Node) {
-                                double d = ((Node) n1).getCoor().greatCircleDistance(((Node) n2).getCoor());
-                                Main.map.statusLine.setDist(d);
-                                return;
+                                LatLon c1 = ((Node) n1).getCoor();
+                                LatLon c2 = ((Node) n2).getCoor();
+                                if (c1 != null && c2 != null) {
+                                    Main.map.statusLine.setDist(c1.greatCircleDistance(c2));
+                                    return;
+                                }
                             }
                         }
-                        Main.map.statusLine.setDist(new SubclassFilteredCollection<OsmPrimitive, Way>(selection, OsmPrimitive.wayPredicate));
+                        Main.map.statusLine.setDist(
+                                new SubclassFilteredCollection<OsmPrimitive, Way>(selection, OsmPrimitive.wayPredicate));
                     }
                 }
             });
@@ -715,9 +720,14 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         @Override
-        public void primitivesAdded(PrimitivesAddedEvent event) {/* ignored - handled by SelectionChangeListener */}
+        public void primitivesAdded(PrimitivesAddedEvent event) {
+            /* ignored - handled by SelectionChangeListener */
+        }
+
         @Override
-        public void primitivesRemoved(PrimitivesRemovedEvent event) {/* ignored - handled by SelectionChangeListener*/}
+        public void primitivesRemoved(PrimitivesRemovedEvent event) {
+            /* ignored - handled by SelectionChangeListener*/
+        }
     }
 
     /**
@@ -729,7 +739,8 @@ public class SelectionListDialog extends ToggleDialog  {
         protected final SearchSetting s;
 
         public SearchMenuItem(SearchSetting s) {
-            super(Utils.shortenString(s.toString(), org.openstreetmap.josm.actions.search.SearchAction.MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY));
+            super(Utils.shortenString(s.toString(),
+                    org.openstreetmap.josm.actions.search.SearchAction.MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY));
             this.s = s;
             addActionListener(this);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
index 6bba469..81aeda3 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
@@ -27,6 +27,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.TreePath;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AbstractSelectAction;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.relation.EditRelationAction;
 import org.openstreetmap.josm.command.Command;
@@ -101,12 +102,7 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
 
         List<SideButton> buttons = new LinkedList<>();
 
-        selectButton = new SideButton(new AbstractAction() {
-            {
-                putValue(NAME, tr("Select"));
-                putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs","select"));
-            }
+        selectButton = new SideButton(new AbstractSelectAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
                 setSelectedItems();
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java
index cbaad24..4a47008 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java
@@ -1,76 +1,76 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Font;
-import java.text.DateFormat;
-import java.util.Date;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.UIManager;
-import javax.swing.table.TableCellRenderer;
-
-import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.tools.date.DateUtils;
-
-/**
- * Superclass of changeset cell renderers.
- * @since 7715
- */
-public abstract class AbstractCellRenderer extends JLabel implements TableCellRenderer {
-
-    protected void reset(JComponent c, boolean tableFont) {
-        c.setBackground(UIManager.getColor("Table.background"));
-        c.setForeground(UIManager.getColor("Table.foreground"));
-        if (tableFont) {
-            c.setFont(UIManager.getFont("Table.font"));
-        }
-        c.setToolTipText(null);
-        c.setOpaque(true);
-    }
-
-    protected void reset() {
-        reset(this, true);
-    }
-
-    protected void renderColors(JComponent c, boolean isSelected) {
-        if (isSelected) {
-            c.setBackground(UIManager.getColor("Table.selectionBackground"));
-            c.setForeground(UIManager.getColor("Table.selectionForeground"));
-        } else {
-            c.setBackground(UIManager.getColor("Table.background"));
-            c.setForeground(UIManager.getColor("Table.foreground"));
-        }
-    }
-
-    protected void renderColors(boolean isSelected) {
-        renderColors(this, isSelected);
-    }
-
-    protected void renderId(long id) {
-        setText(Long.toString(id));
-        setToolTipText(null);
-    }
-
-    protected void renderUser(User user) {
-        if (user == null || user.getName().trim().isEmpty()) {
-            setFont(UIManager.getFont("Table.font").deriveFont(Font.ITALIC));
-            setText(tr("anonymous"));
-        } else {
-            setFont(UIManager.getFont("Table.font"));
-            setText(user.getName());
-            setToolTipText(user.getName());
-        }
-    }
-
-    protected void renderDate(Date d) {
-        if (d == null) {
-            setText("");
-        } else {
-            setText(DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT));
-        }
-        setToolTipText(null);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Font;
+import java.text.DateFormat;
+import java.util.Date;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.UIManager;
+import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.tools.date.DateUtils;
+
+/**
+ * Superclass of changeset cell renderers.
+ * @since 7715
+ */
+public abstract class AbstractCellRenderer extends JLabel implements TableCellRenderer {
+
+    protected void reset(JComponent c, boolean tableFont) {
+        c.setBackground(UIManager.getColor("Table.background"));
+        c.setForeground(UIManager.getColor("Table.foreground"));
+        if (tableFont) {
+            c.setFont(UIManager.getFont("Table.font"));
+        }
+        c.setToolTipText(null);
+        c.setOpaque(true);
+    }
+
+    protected void reset() {
+        reset(this, true);
+    }
+
+    protected void renderColors(JComponent c, boolean isSelected) {
+        if (isSelected) {
+            c.setBackground(UIManager.getColor("Table.selectionBackground"));
+            c.setForeground(UIManager.getColor("Table.selectionForeground"));
+        } else {
+            c.setBackground(UIManager.getColor("Table.background"));
+            c.setForeground(UIManager.getColor("Table.foreground"));
+        }
+    }
+
+    protected void renderColors(boolean isSelected) {
+        renderColors(this, isSelected);
+    }
+
+    protected void renderId(long id) {
+        setText(Long.toString(id));
+        setToolTipText(null);
+    }
+
+    protected void renderUser(User user) {
+        if (user == null || user.getName().trim().isEmpty()) {
+            setFont(UIManager.getFont("Table.font").deriveFont(Font.ITALIC));
+            setText(tr("anonymous"));
+        } else {
+            setFont(UIManager.getFont("Table.font"));
+            setText(user.getName());
+            setToolTipText(user.getName());
+        }
+    }
+
+    protected void renderDate(Date d) {
+        if (d == null) {
+            setText("");
+        } else {
+            setText(DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT));
+        }
+        setToolTipText(null);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
index 5d6019a..5001071 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
@@ -149,7 +149,7 @@ public class ChangesetCacheManager extends JFrame {
         //-- help action
         pnl.add(new SideButton(
                 new ContextSensitiveHelpAction(
-                        HelpUtil.ht("/Dialog/ChangesetCacheManager"))
+                        HelpUtil.ht("/Dialog/ChangesetManager"))
         )
         );
 
@@ -287,7 +287,7 @@ public class ChangesetCacheManager extends JFrame {
         cp.add(buildButtonPanel(), BorderLayout.SOUTH);
 
         // the help context
-        HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Dialog/ChangesetCacheManager"));
+        HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Dialog/ChangesetManager"));
 
         // make the dialog respond to ESC
         getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "cancelAndClose");
@@ -552,7 +552,7 @@ public class ChangesetCacheManager extends JFrame {
                     ),
                     tr("Warning"),
                     JOptionPane.WARNING_MESSAGE,
-                    HelpUtil.ht("/Dialog/ChangesetCacheManager#CanDownloadMyChangesets")
+                    HelpUtil.ht("/Dialog/ChangesetManager#CanDownloadMyChangesets")
             );
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
index 5d52710..1586383 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
@@ -1,144 +1,161 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.Collections;
-
-import javax.swing.AbstractAction;
-import javax.swing.BorderFactory;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.JToolBar;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.Changeset;
-import org.openstreetmap.josm.io.OnlineResource;
-
-/**
- * The panel which displays the public discussion around a changeset in a scrollable table.
- *
- * It listens to property change events for {@link ChangesetCacheManagerModel#CHANGESET_IN_DETAIL_VIEW_PROP}
- * and updates its view accordingly.
- *
- * @since 7704
- */
-public class ChangesetDiscussionPanel extends JPanel implements PropertyChangeListener {
-
-    private final UpdateChangesetDiscussionAction actUpdateChangesets = new UpdateChangesetDiscussionAction();
-
-    private final ChangesetDiscussionTableModel model = new ChangesetDiscussionTableModel();
-
-    private JTable table;
-
-    private Changeset current = null;
-
-    protected JPanel buildActionButtonPanel() {
-        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
-
-        JToolBar tb = new JToolBar(JToolBar.VERTICAL);
-        tb.setFloatable(false);
-
-        // -- changeset discussion update
-        tb.add(actUpdateChangesets);
-        actUpdateChangesets.initProperties(current);
-
-        pnl.add(tb);
-        return pnl;
-    }
-
-    /**
-     * Updates the current changeset discussion from the OSM server
-     */
-    class UpdateChangesetDiscussionAction extends AbstractAction {
-        public UpdateChangesetDiscussionAction() {
-            putValue(NAME, tr("Update changeset discussion"));
-            putValue(SMALL_ICON, ChangesetCacheManager.UPDATE_CONTENT_ICON);
-            putValue(SHORT_DESCRIPTION, tr("Update the changeset discussion from the OSM server"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent evt) {
-            if (current == null) return;
-            Main.worker.submit(
-                    new ChangesetHeaderDownloadTask(
-                            ChangesetDiscussionPanel.this,
-                            Collections.singleton(current.getId()),
-                            true /* include discussion */
-                    )
-            );
-        }
-
-        public void initProperties(Changeset cs) {
-            setEnabled(cs != null && !Main.isOffline(OnlineResource.OSM_API));
-        }
-    }
-
-    /**
-     * Constructs a new {@code ChangesetDiscussionPanel}.
-     */
-    public ChangesetDiscussionPanel() {
-        build();
-    }
-
-    protected void setCurrentChangeset(Changeset cs) {
-        current = cs;
-        if (cs == null) {
-            clearView();
-        } else {
-            updateView(cs);
-        }
-        actUpdateChangesets.initProperties(current);
-        if (cs != null && cs.getDiscussion().size() < cs.getCommentsCount()) {
-            actUpdateChangesets.actionPerformed(null);
-        }
-    }
-
-    protected final void build() {
-        setLayout(new BorderLayout());
-        setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
-        add(buildActionButtonPanel(), BorderLayout.WEST);
-        add(buildDiscussionPanel(), BorderLayout.CENTER);
-    }
-
-    private Component buildDiscussionPanel() {
-        JPanel pnl = new JPanel(new BorderLayout());
-        table = new JTable(model, new ChangesetDiscussionTableColumnModel());
-        pnl.add(new JScrollPane(table), BorderLayout.CENTER);
-        return pnl;
-    }
-
-    protected void clearView() {
-        model.populate(null);
-    }
-
-    protected void updateView(Changeset cs) {
-        model.populate(cs.getDiscussion());
-        // Update row heights
-        for (int row = 0; row < table.getRowCount(); row++) {
-            int rowHeight = table.getRowHeight();
-
-            Component comp = table.prepareRenderer(table.getCellRenderer(row, 2), row, 2);
-            rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
-
-            table.setRowHeight(row, rowHeight);
-        }
-    }
-
-    /* ---------------------------------------------------------------------------- */
-    /* interface PropertyChangeListener                                             */
-    /* ---------------------------------------------------------------------------- */
-    @Override
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (! evt.getPropertyName().equals(ChangesetCacheManagerModel.CHANGESET_IN_DETAIL_VIEW_PROP))
-            return;
-        setCurrentChangeset((Changeset)evt.getNewValue());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Collections;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JToolBar;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.io.OnlineResource;
+
+/**
+ * The panel which displays the public discussion around a changeset in a scrollable table.
+ *
+ * It listens to property change events for {@link ChangesetCacheManagerModel#CHANGESET_IN_DETAIL_VIEW_PROP}
+ * and updates its view accordingly.
+ *
+ * @since 7704
+ */
+public class ChangesetDiscussionPanel extends JPanel implements PropertyChangeListener {
+
+    private final UpdateChangesetDiscussionAction actUpdateChangesets = new UpdateChangesetDiscussionAction();
+
+    private final ChangesetDiscussionTableModel model = new ChangesetDiscussionTableModel();
+
+    private JTable table;
+
+    private Changeset current = null;
+
+    protected JPanel buildActionButtonPanel() {
+        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
+
+        JToolBar tb = new JToolBar(JToolBar.VERTICAL);
+        tb.setFloatable(false);
+
+        // -- changeset discussion update
+        tb.add(actUpdateChangesets);
+        actUpdateChangesets.initProperties(current);
+
+        pnl.add(tb);
+        return pnl;
+    }
+
+    /**
+     * Updates the current changeset discussion from the OSM server
+     */
+    class UpdateChangesetDiscussionAction extends AbstractAction {
+        public UpdateChangesetDiscussionAction() {
+            putValue(NAME, tr("Update changeset discussion"));
+            putValue(SMALL_ICON, ChangesetCacheManager.UPDATE_CONTENT_ICON);
+            putValue(SHORT_DESCRIPTION, tr("Update the changeset discussion from the OSM server"));
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent evt) {
+            if (current == null) return;
+            Main.worker.submit(
+                    new ChangesetHeaderDownloadTask(
+                            ChangesetDiscussionPanel.this,
+                            Collections.singleton(current.getId()),
+                            true /* include discussion */
+                    )
+            );
+        }
+
+        public void initProperties(Changeset cs) {
+            setEnabled(cs != null && !Main.isOffline(OnlineResource.OSM_API));
+        }
+    }
+
+    /**
+     * Constructs a new {@code ChangesetDiscussionPanel}.
+     */
+    public ChangesetDiscussionPanel() {
+        build();
+    }
+
+    protected void setCurrentChangeset(Changeset cs) {
+        current = cs;
+        if (cs == null) {
+            clearView();
+        } else {
+            updateView(cs);
+        }
+        actUpdateChangesets.initProperties(current);
+        if (cs != null && cs.getDiscussion().size() < cs.getCommentsCount()) {
+            actUpdateChangesets.actionPerformed(null);
+        }
+    }
+
+    protected final void build() {
+        setLayout(new BorderLayout());
+        setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
+        add(buildActionButtonPanel(), BorderLayout.WEST);
+        add(buildDiscussionPanel(), BorderLayout.CENTER);
+    }
+
+    private Component buildDiscussionPanel() {
+        JPanel pnl = new JPanel(new BorderLayout());
+        table = new JTable(model, new ChangesetDiscussionTableColumnModel());
+        table.getColumnModel().getColumn(2).addPropertyChangeListener(new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                if ("width".equals(evt.getPropertyName())) {
+                    updateRowHeights();
+                }
+            }
+        });
+        pnl.add(new JScrollPane(table), BorderLayout.CENTER);
+        return pnl;
+    }
+
+    protected void clearView() {
+        model.populate(null);
+    }
+
+    protected void updateView(Changeset cs) {
+        model.populate(cs.getDiscussion());
+        updateRowHeights();
+    }
+
+    protected void updateRowHeights() {
+        int intercellWidth = table.getIntercellSpacing().width;
+        int colWidth = table.getColumnModel().getColumn(2).getWidth();
+        // Update row heights
+        for (int row = 0; row < table.getRowCount(); row++) {
+            int rowHeight = table.getRowHeight();
+
+            Component comp = table.prepareRenderer(table.getCellRenderer(row, 2), row, 2);
+            // constrain width of component
+            comp.setBounds(new Rectangle(0, 0, colWidth - intercellWidth, Integer.MAX_VALUE));
+            rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
+
+            table.setRowHeight(row, rowHeight);
+        }
+    }
+
+    /* ---------------------------------------------------------------------------- */
+    /* interface PropertyChangeListener                                             */
+    /* ---------------------------------------------------------------------------- */
+    @Override
+    public void propertyChange(PropertyChangeEvent evt) {
+        if (! evt.getPropertyName().equals(ChangesetCacheManagerModel.CHANGESET_IN_DETAIL_VIEW_PROP))
+            return;
+        setCurrentChangeset((Changeset)evt.getNewValue());
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
index 16c417f..23c5009 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
@@ -1,41 +1,43 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import java.awt.Component;
-import java.util.Date;
-
-import javax.swing.JComponent;
-import javax.swing.JTable;
-
-import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.gui.widgets.JosmTextArea;
-
-/**
- * The cell renderer for the changeset dicussion table
- * @since 7715
- */
-public class ChangesetDiscussionTableCellRenderer extends AbstractCellRenderer {
-
-    @Override
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
-            int row, int column) {
-        if (value == null)
-            return this;
-        JComponent comp = this;
-        reset(comp, true);
-        renderColors(comp, isSelected);
-        switch(column) {
-        case 0:
-            renderDate((Date)value);
-            break;
-        case 1:
-            renderUser((User)value);
-            break;
-        case 2:
-            comp = new JosmTextArea((String) value);
-            reset(comp, false);
-            renderColors(comp, isSelected);
-        }
-        return comp;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import java.awt.Component;
+import java.util.Date;
+
+import javax.swing.JComponent;
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.gui.widgets.JosmTextArea;
+
+/**
+ * The cell renderer for the changeset dicussion table
+ * @since 7715
+ */
+public class ChangesetDiscussionTableCellRenderer extends AbstractCellRenderer {
+
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+            int row, int column) {
+        if (value == null)
+            return this;
+        JComponent comp = this;
+        reset(comp, true);
+        renderColors(comp, isSelected);
+        switch(column) {
+        case 0:
+            renderDate((Date)value);
+            break;
+        case 1:
+            renderUser((User)value);
+            break;
+        case 2:
+            comp = new JosmTextArea((String) value);
+            ((JosmTextArea)comp).setLineWrap(true);
+            ((JosmTextArea)comp).setWrapStyleWord(true);
+            reset(comp, false);
+            renderColors(comp, isSelected);
+        }
+        return comp;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java
index eff648a..6b8dac2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java
@@ -1,48 +1,48 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableColumn;
-
-/**
- * The column model for the changeset content
- * @since 7715
- */
-public class ChangesetDiscussionTableColumnModel extends DefaultTableColumnModel {
-
-    protected void createColumns() {
-        TableColumn col = null;
-        ChangesetDiscussionTableCellRenderer renderer = new ChangesetDiscussionTableCellRenderer();
-        // column 0 - Date
-        col = new TableColumn(0, 150);
-        col.setHeaderValue(tr("Date"));
-        col.setResizable(true);
-        col.setMaxWidth(200);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 1 - User
-        col = new TableColumn(1, 150);
-        col.setHeaderValue(tr("User"));
-        col.setResizable(true);
-        col.setMaxWidth(300);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 2 - Text
-        col = new TableColumn(2, 400);
-        col.setHeaderValue(tr("Comment"));
-        col.setResizable(true);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-    }
-
-    /**
-     * Constructs a new {@code ChangesetContentTableColumnModel}.
-     */
-    public ChangesetDiscussionTableColumnModel() {
-        createColumns();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableColumn;
+
+/**
+ * The column model for the changeset content
+ * @since 7715
+ */
+public class ChangesetDiscussionTableColumnModel extends DefaultTableColumnModel {
+
+    protected void createColumns() {
+        TableColumn col = null;
+        ChangesetDiscussionTableCellRenderer renderer = new ChangesetDiscussionTableCellRenderer();
+        // column 0 - Date
+        col = new TableColumn(0, 150);
+        col.setHeaderValue(tr("Date"));
+        col.setResizable(true);
+        col.setMaxWidth(200);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+
+        // column 1 - User
+        col = new TableColumn(1, 150);
+        col.setHeaderValue(tr("User"));
+        col.setResizable(true);
+        col.setMaxWidth(300);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+
+        // column 2 - Text
+        col = new TableColumn(2, 400);
+        col.setHeaderValue(tr("Comment"));
+        col.setResizable(true);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+    }
+
+    /**
+     * Constructs a new {@code ChangesetContentTableColumnModel}.
+     */
+    public ChangesetDiscussionTableColumnModel() {
+        createColumns();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java
index c839081..dac6638 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java
@@ -1,55 +1,55 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.table.AbstractTableModel;
-
-import org.openstreetmap.josm.data.osm.ChangesetDiscussionComment;
-
-/**
- * Model of changeset discussion table.
- * @since 7715
- */
-public class ChangesetDiscussionTableModel extends AbstractTableModel {
-
-    private final List<ChangesetDiscussionComment> data = new ArrayList<>();
-
-    @Override
-    public int getRowCount() {
-        return data.size();
-    }
-
-    @Override
-    public int getColumnCount() {
-        return 3;
-    }
-
-    @Override
-    public Object getValueAt(int rowIndex, int columnIndex) {
-        if (rowIndex < 0 || rowIndex >= data.size())
-            return null;
-        switch (columnIndex) {
-        case 0:
-            return data.get(rowIndex).getDate();
-        case 1:
-            return data.get(rowIndex).getUser();
-        default:
-            return data.get(rowIndex).getText();
-        }
-    }
-
-    /**
-     * Populates the model with the discussion of a changeset. If ds is null, the table is cleared.
-     *
-     * @param list the changeset discussion.
-     */
-    public void populate(List<ChangesetDiscussionComment> list) {
-        data.clear();
-        if (list != null) {
-            data.addAll(list);
-        }
-        fireTableDataChanged();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.table.AbstractTableModel;
+
+import org.openstreetmap.josm.data.osm.ChangesetDiscussionComment;
+
+/**
+ * Model of changeset discussion table.
+ * @since 7715
+ */
+public class ChangesetDiscussionTableModel extends AbstractTableModel {
+
+    private final List<ChangesetDiscussionComment> data = new ArrayList<>();
+
+    @Override
+    public int getRowCount() {
+        return data.size();
+    }
+
+    @Override
+    public int getColumnCount() {
+        return 3;
+    }
+
+    @Override
+    public Object getValueAt(int rowIndex, int columnIndex) {
+        if (rowIndex < 0 || rowIndex >= data.size())
+            return null;
+        switch (columnIndex) {
+        case 0:
+            return data.get(rowIndex).getDate();
+        case 1:
+            return data.get(rowIndex).getUser();
+        default:
+            return data.get(rowIndex).getText();
+        }
+    }
+
+    /**
+     * Populates the model with the discussion of a changeset. If ds is null, the table is cleared.
+     *
+     * @param list the changeset discussion.
+     */
+    public void populate(List<ChangesetDiscussionComment> list) {
+        data.clear();
+        if (list != null) {
+            data.addAll(list);
+        }
+        fireTableDataChanged();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesCellRenderer.java
index 65876d9..abd2606 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesCellRenderer.java
@@ -1,78 +1,78 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.properties;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.util.Map;
-
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.UIDefaults;
-import javax.swing.table.DefaultTableCellRenderer;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-
-/**
- * Cell renderer of tags table.
- * @since 6314
- */
-public class PropertiesCellRenderer extends DefaultTableCellRenderer {
-
-    private void setColors(Component c, String key, boolean isSelected) {
-        UIDefaults defaults = javax.swing.UIManager.getDefaults();
-        if (OsmPrimitive.getDiscardableKeys().contains(key)) {
-            if (isSelected) {
-                c.setForeground(Main.pref.getColor(marktr("Discardable key: selection Foreground"), Color.GRAY));
-                c.setBackground(Main.pref.getColor(marktr("Discardable key: selection Background"), defaults.getColor("Table.selectionBackground")));
-            } else {
-                c.setForeground(Main.pref.getColor(marktr("Discardable key: foreground"), Color.GRAY));
-                c.setBackground(Main.pref.getColor(marktr("Discardable key: background"), defaults.getColor("Table.background")));
-            }
-        } else {
-            c.setForeground(defaults.getColor("Table."+(isSelected ? "selectionF" : "f")+"oreground"));
-            c.setBackground(defaults.getColor("Table."+(isSelected ? "selectionB" : "b")+"ackground"));
-        }
-    }
-    
-    @Override 
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-        Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
-        if (value == null)
-            return this;
-        if (c instanceof JLabel) {
-            String str = null;
-            if (value instanceof String) {
-                str = (String) value;
-            } else if (value instanceof Map<?, ?>) {
-                Map<?, ?> v = (Map<?, ?>) value;
-                if (v.size() != 1) {
-                    str=tr("<different>");
-                    c.setFont(c.getFont().deriveFont(Font.ITALIC));
-                } else {
-                    final Map.Entry<?, ?> entry = v.entrySet().iterator().next();
-                    str = (String) entry.getKey();
-                }
-            }
-            ((JLabel)c).putClientProperty("html.disable", Boolean.TRUE); // Fix #8730
-            ((JLabel)c).setText(str);
-            if (Main.pref.getBoolean("display.discardable-keys", false)) {
-                String key = null;
-                if (column == 0) {
-                    key = str;
-                } else if (column == 1) {
-                    Object value0 = table.getModel().getValueAt(row, 0);
-                    if (value0 instanceof String) {
-                        key = (String) value0;
-                    }
-                }
-                setColors(c, key, isSelected);
-            }
-        }
-        return c;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.util.Map;
+
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.UIDefaults;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Cell renderer of tags table.
+ * @since 6314
+ */
+public class PropertiesCellRenderer extends DefaultTableCellRenderer {
+
+    private void setColors(Component c, String key, boolean isSelected) {
+        UIDefaults defaults = javax.swing.UIManager.getDefaults();
+        if (OsmPrimitive.getDiscardableKeys().contains(key)) {
+            if (isSelected) {
+                c.setForeground(Main.pref.getColor(marktr("Discardable key: selection Foreground"), Color.GRAY));
+                c.setBackground(Main.pref.getColor(marktr("Discardable key: selection Background"), defaults.getColor("Table.selectionBackground")));
+            } else {
+                c.setForeground(Main.pref.getColor(marktr("Discardable key: foreground"), Color.GRAY));
+                c.setBackground(Main.pref.getColor(marktr("Discardable key: background"), defaults.getColor("Table.background")));
+            }
+        } else {
+            c.setForeground(defaults.getColor("Table."+(isSelected ? "selectionF" : "f")+"oreground"));
+            c.setBackground(defaults.getColor("Table."+(isSelected ? "selectionB" : "b")+"ackground"));
+        }
+    }
+    
+    @Override 
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+        Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
+        if (value == null)
+            return this;
+        if (c instanceof JLabel) {
+            String str = null;
+            if (value instanceof String) {
+                str = (String) value;
+            } else if (value instanceof Map<?, ?>) {
+                Map<?, ?> v = (Map<?, ?>) value;
+                if (v.size() != 1) {
+                    str=tr("<different>");
+                    c.setFont(c.getFont().deriveFont(Font.ITALIC));
+                } else {
+                    final Map.Entry<?, ?> entry = v.entrySet().iterator().next();
+                    str = (String) entry.getKey();
+                }
+            }
+            ((JLabel)c).putClientProperty("html.disable", Boolean.TRUE); // Fix #8730
+            ((JLabel)c).setText(str);
+            if (Main.pref.getBoolean("display.discardable-keys", false)) {
+                String key = null;
+                if (column == 0) {
+                    key = str;
+                } else if (column == 1) {
+                    Object value0 = table.getModel().getValueAt(row, 0);
+                    if (value0 instanceof String) {
+                        key = (String) value0;
+                    }
+                }
+                setColors(c, key, isSelected);
+            }
+        }
+        return c;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
index e8cd97f..607a158 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
@@ -1,797 +1,797 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.properties;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.awt.image.BufferedImage;
-import java.text.Normalizer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.Box;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.ImageIcon;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.KeyStroke;
-import javax.swing.ListCellRenderer;
-import javax.swing.table.DefaultTableModel;
-import javax.swing.text.JTextComponent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.data.preferences.IntegerProperty;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
-import org.openstreetmap.josm.gui.tagging.TaggingPreset;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionListItem;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
-import org.openstreetmap.josm.io.XmlWriter;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.tools.WindowGeometry;
-
-/**
- * Class that helps PropertiesDialog add and edit tag values.
- * @since 5633
- */
-class TagEditHelper {
-    private final DefaultTableModel tagData;
-    private final Map<String, Map<String, Integer>> valueCount;
-
-    // Selection that we are editing by using both dialogs
-    Collection<OsmPrimitive> sel;
-
-    private String changedKey;
-    private String objKey;
-
-    Comparator<AutoCompletionListItem> defaultACItemComparator = new Comparator<AutoCompletionListItem>() {
-        @Override
-        public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
-            return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
-        }
-    };
-
-    private String lastAddKey = null;
-    private String lastAddValue = null;
-
-    public static final int DEFAULT_LRU_TAGS_NUMBER = 5;
-    public static final int MAX_LRU_TAGS_NUMBER = 30;
-
-    // LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
-    private final Map<Tag, Void> recentTags = new LinkedHashMap<Tag, Void>(MAX_LRU_TAGS_NUMBER+1, 1.1f, true) {
-        @Override
-        protected boolean removeEldestEntry(Map.Entry<Tag, Void> eldest) {
-            return size() > MAX_LRU_TAGS_NUMBER;
-        }
-    };
-
-    TagEditHelper(DefaultTableModel propertyData, Map<String, Map<String, Integer>> valueCount) {
-        this.tagData = propertyData;
-        this.valueCount = valueCount;
-    }
-
-    /**
-     * Open the add selection dialog and add a new key/value to the table (and
-     * to the dataset, of course).
-     */
-    public void addTag() {
-        changedKey = null;
-        sel = Main.main.getInProgressSelection();
-        if (sel == null || sel.isEmpty()) return;
-
-        final AddTagsDialog addDialog = new AddTagsDialog();
-
-        addDialog.showDialog();
-
-        addDialog.destroyActions();
-        if (addDialog.getValue() == 1)
-            addDialog.performTagAdding();
-        else
-            addDialog.undoAllTagsAdding();
-    }
-
-    /**
-    * Edit the value in the tags table row.
-    * @param row The row of the table from which the value is edited.
-    * @param focusOnKey Determines if the initial focus should be set on key instead of value
-    * @since 5653
-    */
-    public void editTag(final int row, boolean focusOnKey) {
-        changedKey = null;
-        sel = Main.main.getInProgressSelection();
-        if (sel == null || sel.isEmpty()) return;
-
-        String key = tagData.getValueAt(row, 0).toString();
-        objKey=key;
-
-        @SuppressWarnings("unchecked")
-        final EditTagDialog editDialog = new EditTagDialog(key, row,
-                (Map<String, Integer>) tagData.getValueAt(row, 1), focusOnKey);
-        editDialog.showDialog();
-        if (editDialog.getValue() !=1 ) return;
-        editDialog.performTagEdit();
-    }
-
-    /**
-     * If during last editProperty call user changed the key name, this key will be returned
-     * Elsewhere, returns null.
-     * @return The modified key, or {@code null}
-     */
-    public String getChangedKey() {
-        return changedKey;
-    }
-
-    public void resetChangedKey() {
-        changedKey = null;
-    }
-
-    /**
-     * For a given key k, return a list of keys which are used as keys for
-     * auto-completing values to increase the search space.
-     * @param key the key k
-     * @return a list of keys
-     */
-    private static List<String> getAutocompletionKeys(String key) {
-        if ("name".equals(key) || "addr:street".equals(key))
-            return Arrays.asList("addr:street", "name");
-        else
-            return Arrays.asList(key);
-    }
-
-    /**
-     * Load recently used tags from preferences if needed.
-     */
-    public void loadTagsIfNeeded() {
-        if (PROPERTY_REMEMBER_TAGS.get() && recentTags.isEmpty()) {
-            recentTags.clear();
-            Collection<String> c = Main.pref.getCollection("properties.recent-tags");
-            Iterator<String> it = c.iterator();
-            String key, value;
-            while (it.hasNext()) {
-                key = it.next();
-                value = it.next();
-                recentTags.put(new Tag(key, value), null);
-            }
-        }
-    }
-
-    /**
-     * Store recently used tags in preferences if needed.
-     */
-    public void saveTagsIfNeeded() {
-        if (PROPERTY_REMEMBER_TAGS.get() && !recentTags.isEmpty()) {
-            List<String> c = new ArrayList<>( recentTags.size()*2 );
-            for (Tag t: recentTags.keySet()) {
-                c.add(t.getKey());
-                c.add(t.getValue());
-            }
-            Main.pref.putCollection("properties.recent-tags", c);
-        }
-    }
-
-    /**
-     * Warns user about a key being overwritten.
-     * @param action The action done by the user. Must state what key is changed
-     * @param togglePref  The preference to save the checkbox state to
-     * @return {@code true} if the user accepts to overwrite key, {@code false} otherwise
-     */
-    private boolean warnOverwriteKey(String action, String togglePref) {
-        ExtendedDialog ed = new ExtendedDialog(
-                Main.parent,
-                tr("Overwrite key"),
-                new String[]{tr("Replace"), tr("Cancel")});
-        ed.setButtonIcons(new String[]{"purge", "cancel"});
-        ed.setContent(action+"\n"+ tr("The new key is already used, overwrite values?"));
-        ed.setCancelButton(2);
-        ed.toggleEnable(togglePref);
-        ed.showDialog();
-
-        return ed.getValue() == 1;
-    }
-
-    public final class EditTagDialog extends AbstractTagsDialog {
-        final String key;
-        final Map<String, Integer> m;
-        final int row;
-
-        Comparator<AutoCompletionListItem> usedValuesAwareComparator = new Comparator<AutoCompletionListItem>() {
-                @Override
-                public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
-                    boolean c1 = m.containsKey(o1.getValue());
-                    boolean c2 = m.containsKey(o2.getValue());
-                    if (c1 == c2)
-                        return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
-                    else if (c1)
-                        return -1;
-                    else
-                        return +1;
-                }
-            };
-
-        ListCellRenderer<AutoCompletionListItem> cellRenderer = new ListCellRenderer<AutoCompletionListItem>() {
-            final DefaultListCellRenderer def = new DefaultListCellRenderer();
-            @Override
-            public Component getListCellRendererComponent(JList<? extends AutoCompletionListItem> list,
-                    AutoCompletionListItem value, int index, boolean isSelected,  boolean cellHasFocus){
-                Component c = def.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
-                if (c instanceof JLabel) {
-                    String str = value.getValue();
-                    if (valueCount.containsKey(objKey)) {
-                        Map<String, Integer> m = valueCount.get(objKey);
-                        if (m.containsKey(str)) {
-                            str = tr("{0} ({1})", str, m.get(str));
-                            c.setFont(c.getFont().deriveFont(Font.ITALIC + Font.BOLD));
-                        }
-                    }
-                    ((JLabel) c).setText(str);
-                }
-                return c;
-            }
-        };
-
-        private EditTagDialog(String key, int row, Map<String, Integer> map, final boolean initialFocusOnKey) {
-            super(Main.parent, trn("Change value?", "Change values?", map.size()), new String[] {tr("OK"),tr("Cancel")});
-            setButtonIcons(new String[] {"ok","cancel"});
-            setCancelButton(2);
-            configureContextsensitiveHelp("/Dialog/EditValue", true /* show help button */);
-            this.key = key;
-            this.row = row;
-            this.m = map;
-
-            JPanel mainPanel = new JPanel(new BorderLayout());
-
-            String msg = "<html>"+trn("This will change {0} object.",
-                    "This will change up to {0} objects.", sel.size(), sel.size())
-                    +"<br><br>("+tr("An empty value deletes the tag.", key)+")</html>";
-
-            mainPanel.add(new JLabel(msg), BorderLayout.NORTH);
-
-            JPanel p = new JPanel(new GridBagLayout());
-            mainPanel.add(p, BorderLayout.CENTER);
-
-            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
-            List<AutoCompletionListItem> keyList = autocomplete.getKeys();
-            Collections.sort(keyList, defaultACItemComparator);
-
-            keys = new AutoCompletingComboBox(key);
-            keys.setPossibleACItems(keyList);
-            keys.setEditable(true);
-            keys.setSelectedItem(key);
-
-            p.add(Box.createVerticalStrut(5),GBC.eol());
-            p.add(new JLabel(tr("Key")), GBC.std());
-            p.add(Box.createHorizontalStrut(10), GBC.std());
-            p.add(keys, GBC.eol().fill(GBC.HORIZONTAL));
-
-            List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
-            Collections.sort(valueList, usedValuesAwareComparator);
-
-            final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey();
-
-            values = new AutoCompletingComboBox(selection);
-            values.setRenderer(cellRenderer);
-
-            values.setEditable(true);
-            values.setPossibleACItems(valueList);
-            values.setSelectedItem(selection);
-            values.getEditor().setItem(selection);
-            p.add(Box.createVerticalStrut(5),GBC.eol());
-            p.add(new JLabel(tr("Value")), GBC.std());
-            p.add(Box.createHorizontalStrut(10), GBC.std());
-            p.add(values, GBC.eol().fill(GBC.HORIZONTAL));
-            values.getEditor().addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    buttonAction(0, null); // emulate OK button click
-                }
-            });
-            addFocusAdapter(autocomplete, usedValuesAwareComparator);
-
-            setContent(mainPanel, false);
-
-            addWindowListener(new WindowAdapter() {
-                @Override
-                public void windowOpened(WindowEvent e) {
-                    if (initialFocusOnKey) {
-                        selectKeysComboBox();
-                    } else {
-                        selectValuesCombobox();
-                    }
-                }
-            });
-        }
-
-        /**
-         * Edit tags of multiple selected objects according to selected ComboBox values
-         * If value == "", tag will be deleted
-         * Confirmations may be needed.
-         */
-        private void performTagEdit() {
-            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
-            value = Normalizer.normalize(value, java.text.Normalizer.Form.NFC);
-            if (value.isEmpty()) {
-                value = null; // delete the key
-            }
-            String newkey = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
-            newkey = Normalizer.normalize(newkey, java.text.Normalizer.Form.NFC);
-            if (newkey.isEmpty()) {
-                newkey = key;
-                value = null; // delete the key instead
-            }
-            if (key.equals(newkey) && tr("<different>").equals(value))
-                return;
-            if (key.equals(newkey) || value == null) {
-                Main.main.undoRedo.add(new ChangePropertyCommand(sel, newkey, value));
-                AutoCompletionManager.rememberUserInput(newkey, value, true);
-            } else {
-                for (OsmPrimitive osm: sel) {
-                    if (osm.get(newkey) != null) {
-                        if (!warnOverwriteKey(tr("You changed the key from ''{0}'' to ''{1}''.", key, newkey),
-                                "overwriteEditKey"))
-                            return;
-                        break;
-                    }
-                }
-                Collection<Command> commands = new ArrayList<>();
-                commands.add(new ChangePropertyCommand(sel, key, null));
-                if (value.equals(tr("<different>"))) {
-                    Map<String, List<OsmPrimitive>> map = new HashMap<>();
-                    for (OsmPrimitive osm: sel) {
-                        String val = osm.get(key);
-                        if (val != null) {
-                            if (map.containsKey(val)) {
-                                map.get(val).add(osm);
-                            } else {
-                                List<OsmPrimitive> v = new ArrayList<>();
-                                v.add(osm);
-                                map.put(val, v);
-                            }
-                        }
-                    }
-                    for (Map.Entry<String, List<OsmPrimitive>> e: map.entrySet()) {
-                        commands.add(new ChangePropertyCommand(e.getValue(), newkey, e.getKey()));
-                    }
-                } else {
-                    commands.add(new ChangePropertyCommand(sel, newkey, value));
-                    AutoCompletionManager.rememberUserInput(newkey, value, false);
-                }
-                Main.main.undoRedo.add(new SequenceCommand(
-                        trn("Change properties of up to {0} object",
-                                "Change properties of up to {0} objects", sel.size(), sel.size()),
-                                commands));
-            }
-
-            changedKey = newkey;
-        }
-    }
-
-    public static final BooleanProperty PROPERTY_FIX_TAG_LOCALE = new BooleanProperty("properties.fix-tag-combobox-locale", false);
-    public static final BooleanProperty PROPERTY_REMEMBER_TAGS = new BooleanProperty("properties.remember-recently-added-tags", true);
-    public static final IntegerProperty PROPERTY_RECENT_TAGS_NUMBER = new IntegerProperty("properties.recently-added-tags", DEFAULT_LRU_TAGS_NUMBER);
-
-    abstract class AbstractTagsDialog extends ExtendedDialog {
-        AutoCompletingComboBox keys;
-        AutoCompletingComboBox values;
-        Component componentUnderMouse;
-
-        public AbstractTagsDialog(Component parent, String title, String[] buttonTexts) {
-            super(parent, title, buttonTexts);
-            addMouseListener(new PopupMenuLauncher(popupMenu));
-        }
-
-        @Override
-        public void setupDialog() {
-            super.setupDialog();
-            final Dimension size = getSize();
-            // Set resizable only in width
-            setMinimumSize(size);
-            setPreferredSize(size);
-            // setMaximumSize does not work, and never worked, but still it seems not to bother Oracle to fix this 10-year-old bug
-            // https://bugs.openjdk.java.net/browse/JDK-6200438
-            // https://bugs.openjdk.java.net/browse/JDK-6464548
-
-            setRememberWindowGeometry(getClass().getName() + ".geometry",
-                WindowGeometry.centerInWindow(Main.parent, size));
-        }
-
-        @Override
-        public void setVisible(boolean visible) {
-            // Do not want dialog to be resizable in height, as its size may increase each time because of the recently added tags
-            // So need to modify the stored geometry (size part only) in order to use the automatic positioning mechanism
-            if (visible) {
-                WindowGeometry geometry = initWindowGeometry();
-                Dimension storedSize = geometry.getSize();
-                Dimension size = getSize();
-                if (!storedSize.equals(size)) {
-                    if (storedSize.width < size.width) {
-                        storedSize.width = size.width;
-                    }
-                    if (storedSize.height != size.height) {
-                        storedSize.height = size.height;
-                    }
-                    rememberWindowGeometry(geometry);
-                }
-                keys.setFixedLocale(PROPERTY_FIX_TAG_LOCALE.get());
-            }
-            super.setVisible(visible);
-        }
-
-        private void selectACComboBoxSavingUnixBuffer(AutoCompletingComboBox cb) {
-            // select combobox with saving unix system selection (middle mouse paste)
-            Clipboard sysSel = Toolkit.getDefaultToolkit().getSystemSelection();
-            if(sysSel != null) {
-                Transferable old = sysSel.getContents(null);
-                cb.requestFocusInWindow();
-                cb.getEditor().selectAll();
-                sysSel.setContents(old, null);
-            } else {
-                cb.requestFocusInWindow();
-                cb.getEditor().selectAll();
-            }
-        }
-
-        public void selectKeysComboBox() {
-            selectACComboBoxSavingUnixBuffer(keys);
-        }
-
-        public void selectValuesCombobox()   {
-            selectACComboBoxSavingUnixBuffer(values);
-        }
-
-        /**
-        * Create a focus handling adapter and apply in to the editor component of value
-        * autocompletion box.
-        * @param autocomplete Manager handling the autocompletion
-        * @param comparator Class to decide what values are offered on autocompletion
-        * @return The created adapter
-        */
-        protected FocusAdapter addFocusAdapter(final AutoCompletionManager autocomplete, final Comparator<AutoCompletionListItem> comparator) {
-           // get the combo box' editor component
-           JTextComponent editor = (JTextComponent)values.getEditor().getEditorComponent();
-           // Refresh the values model when focus is gained
-           FocusAdapter focus = new FocusAdapter() {
-               @Override
-               public void focusGained(FocusEvent e) {
-                   String key = keys.getEditor().getItem().toString();
-
-                   List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
-                   Collections.sort(valueList, comparator);
-
-                   values.setPossibleACItems(valueList);
-                   values.getEditor().selectAll();
-                   objKey=key;
-               }
-           };
-           editor.addFocusListener(focus);
-           return focus;
-        }
-
-        protected JPopupMenu popupMenu = new JPopupMenu() {
-            JCheckBoxMenuItem fixTagLanguageCb = new JCheckBoxMenuItem(
-                new AbstractAction(tr("Use English language for tag by default")){
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    boolean sel=((JCheckBoxMenuItem) e.getSource()).getState();
-                    PROPERTY_FIX_TAG_LOCALE.put(sel);
-                }
-            });
-            {
-                add(fixTagLanguageCb);
-                fixTagLanguageCb.setState(PROPERTY_FIX_TAG_LOCALE.get());
-            }
-        };
-    }
-
-    class AddTagsDialog extends AbstractTagsDialog {
-        List<JosmAction> recentTagsActions = new ArrayList<>();
-
-        // Counter of added commands for possible undo
-        private int commandCount;
-
-        public AddTagsDialog() {
-            super(Main.parent, tr("Add value?"), new String[] {tr("OK"),tr("Cancel")});
-            setButtonIcons(new String[] {"ok","cancel"});
-            setCancelButton(2);
-            configureContextsensitiveHelp("/Dialog/AddValue", true /* show help button */);
-
-            JPanel mainPanel = new JPanel(new GridBagLayout());
-            keys = new AutoCompletingComboBox();
-            values = new AutoCompletingComboBox();
-
-            mainPanel.add(new JLabel("<html>"+trn("This will change up to {0} object.",
-                "This will change up to {0} objects.", sel.size(),sel.size())
-                +"<br><br>"+tr("Please select a key")), GBC.eol().fill(GBC.HORIZONTAL));
-
-            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
-            List<AutoCompletionListItem> keyList = autocomplete.getKeys();
-
-            AutoCompletionListItem itemToSelect = null;
-            // remove the object's tag keys from the list
-            Iterator<AutoCompletionListItem> iter = keyList.iterator();
-            while (iter.hasNext()) {
-                AutoCompletionListItem item = iter.next();
-                if (item.getValue().equals(lastAddKey)) {
-                    itemToSelect = item;
-                }
-                for (int i = 0; i < tagData.getRowCount(); ++i) {
-                    if (item.getValue().equals(tagData.getValueAt(i, 0))) {
-                        if (itemToSelect == item) {
-                            itemToSelect = null;
-                        }
-                        iter.remove();
-                        break;
-                    }
-                }
-            }
-
-            Collections.sort(keyList, defaultACItemComparator);
-            keys.setPossibleACItems(keyList);
-            keys.setEditable(true);
-
-            mainPanel.add(keys, GBC.eop().fill());
-
-            mainPanel.add(new JLabel(tr("Please select a value")), GBC.eol());
-            values.setEditable(true);
-            mainPanel.add(values, GBC.eop().fill());
-            if (itemToSelect != null) {
-                keys.setSelectedItem(itemToSelect);
-                if (lastAddValue != null) {
-                    values.setSelectedItem(lastAddValue);
-                }
-            }
-
-            FocusAdapter focus = addFocusAdapter(autocomplete, defaultACItemComparator);
-            // fire focus event in advance or otherwise the popup list will be too small at first
-            focus.focusGained(null);
-
-            int recentTagsToShow = PROPERTY_RECENT_TAGS_NUMBER.get();
-            if (recentTagsToShow > MAX_LRU_TAGS_NUMBER) {
-                recentTagsToShow = MAX_LRU_TAGS_NUMBER;
-            }
-
-            // Add tag on Shift-Enter
-            mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                        KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK), "addAndContinue");
-                mainPanel.getActionMap().put("addAndContinue", new AbstractAction() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        performTagAdding();
-                        selectKeysComboBox();
-                    }
-                });
-
-            suggestRecentlyAddedTags(mainPanel, recentTagsToShow, focus);
-
-            setContent(mainPanel, false);
-
-            selectKeysComboBox();
-
-            popupMenu.add(new AbstractAction(tr("Set number of recently added tags")) {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    selectNumberOfTags();
-                }
-            });
-            JCheckBoxMenuItem rememberLastTags = new JCheckBoxMenuItem(
-                new AbstractAction(tr("Remember last used tags after a restart")){
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    boolean sel=((JCheckBoxMenuItem) e.getSource()).getState();
-                    PROPERTY_REMEMBER_TAGS.put(sel);
-                    if (sel) saveTagsIfNeeded();
-                }
-            });
-            rememberLastTags.setState(PROPERTY_REMEMBER_TAGS.get());
-            popupMenu.add(rememberLastTags);
-        }
-
-        private void selectNumberOfTags() {
-            String s = JOptionPane.showInputDialog(this, tr("Please enter the number of recently added tags to display"));
-            if (s!=null) try {
-                int v = Integer.parseInt(s);
-                if (v>=0 && v<=MAX_LRU_TAGS_NUMBER) {
-                    PROPERTY_RECENT_TAGS_NUMBER.put(v);
-                    return;
-                }
-            } catch (NumberFormatException ex) {
-                Main.warn(ex);
-            }
-            JOptionPane.showMessageDialog(this, tr("Please enter integer number between 0 and {0}", MAX_LRU_TAGS_NUMBER));
-        }
-
-        private void suggestRecentlyAddedTags(JPanel mainPanel, int tagsToShow, final FocusAdapter focus) {
-            if (!(tagsToShow > 0 && !recentTags.isEmpty()))
-                return;
-
-            mainPanel.add(new JLabel(tr("Recently added tags")), GBC.eol());
-
-            int count = 1;
-            // We store the maximum number (9) of recent tags to allow dynamic change of number of tags shown in the preferences.
-            // This implies to iterate in descending order, as the oldest elements will only be removed after we reach the maximum numbern and not the number of tags to show.
-            // However, as Set does not allow to iterate in descending order, we need to copy its elements into a List we can access in reverse order.
-            List<Tag> tags = new LinkedList<>(recentTags.keySet());
-            for (int i = tags.size()-1; i >= 0 && count <= tagsToShow; i--, count++) {
-                final Tag t = tags.get(i);
-                // Create action for reusing the tag, with keyboard shortcut Ctrl+(1-5)
-                String actionShortcutKey = "properties:recent:"+count;
-                String actionShortcutShiftKey = "properties:recent:shift:"+count;
-                Shortcut sc = Shortcut.registerShortcut(actionShortcutKey, tr("Choose recent tag {0}", count), KeyEvent.VK_0+count, Shortcut.CTRL);
-                final JosmAction action = new JosmAction(actionShortcutKey, null, tr("Use this tag again"), sc, false) {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        keys.setSelectedItem(t.getKey());
-                        // fix #7951, #8298 - update list of values before setting value (?)
-                        focus.focusGained(null);
-                        values.setSelectedItem(t.getValue());
-                        selectValuesCombobox();
-                    }
-                };
-                Shortcut scShift = Shortcut.registerShortcut(actionShortcutShiftKey, tr("Apply recent tag {0}", count), KeyEvent.VK_0+count, Shortcut.CTRL_SHIFT);
-                final JosmAction actionShift = new JosmAction(actionShortcutShiftKey, null, tr("Use this tag again"), scShift, false) {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        action.actionPerformed(null);
-                        performTagAdding();
-                        selectKeysComboBox();
-                    }
-                };
-                recentTagsActions.add(action);
-                recentTagsActions.add(actionShift);
-                disableTagIfNeeded(t, action);
-                // Find and display icon
-                ImageIcon icon = MapPaintStyles.getNodeIcon(t, false); // Filters deprecated icon
-                if (icon == null) {
-                    // If no icon found in map style look at presets
-                    Map<String, String> map = new HashMap<>();
-                    map.put(t.getKey(), t.getValue());
-                    for (TaggingPreset tp : TaggingPreset.getMatchingPresets(null, map, false)) {
-                        icon = tp.getIcon();
-                        if (icon != null) {
-                            break;
-                        }
-                    }
-                    // If still nothing display an empty icon
-                    if (icon == null) {
-                        icon = new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB));
-                    }
-                }
-                GridBagConstraints gbc = new GridBagConstraints();
-                gbc.ipadx = 5;
-                mainPanel.add(new JLabel(action.isEnabled() ? icon : GuiHelper.getDisabledIcon(icon)), gbc);
-                // Create tag label
-                final String color = action.isEnabled() ? "" : "; color:gray";
-                final JLabel tagLabel = new JLabel("<html>"
-                    + "<style>td{border:1px solid gray; font-weight:normal"+color+"}</style>"
-                    + "<table><tr><td>" + XmlWriter.encode(t.toString(), true) + "</td></tr></table></html>");
-                if (action.isEnabled()) {
-                    // Register action
-                    mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(sc.getKeyStroke(), actionShortcutKey);
-                    mainPanel.getActionMap().put(actionShortcutKey, action);
-                    mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scShift.getKeyStroke(), actionShortcutShiftKey);
-                    mainPanel.getActionMap().put(actionShortcutShiftKey, actionShift);
-                    // Make the tag label clickable and set tooltip to the action description (this displays also the keyboard shortcut)
-                    tagLabel.setToolTipText((String) action.getValue(Action.SHORT_DESCRIPTION));
-                    tagLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-                    tagLabel.addMouseListener(new MouseAdapter() {
-                        @Override
-                        public void mouseClicked(MouseEvent e) {
-                            action.actionPerformed(null);
-                            // add tags and close window on double-click
-                            if (e.getClickCount()>1) {
-                                buttonAction(0, null); // emulate OK click and close the dialog
-                            }
-                            // add tags on Shift-Click
-                            if (e.isShiftDown()) {
-                                performTagAdding();
-                                selectKeysComboBox();
-                            }
-                        }
-                    });
-                } else {
-                    // Disable tag label
-                    tagLabel.setEnabled(false);
-                    // Explain in the tooltip why
-                    tagLabel.setToolTipText(tr("The key ''{0}'' is already used", t.getKey()));
-                }
-                // Finally add label to the resulting panel
-                JPanel tagPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
-                tagPanel.add(tagLabel);
-                mainPanel.add(tagPanel, GBC.eol().fill(GBC.HORIZONTAL));
-            }
-        }
-
-        public void destroyActions() {
-            for (JosmAction action : recentTagsActions) {
-                action.destroy();
-            }
-        }
-
-        /**
-         * Read tags from comboboxes and add it to all selected objects
-         */
-        public final void performTagAdding() {
-            String key = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
-            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
-            if (key.isEmpty() || value.isEmpty()) return;
-            for (OsmPrimitive osm: sel) {
-                String val = osm.get(key);
-                if (val != null && !val.equals(value)) {
-                    if (!warnOverwriteKey(tr("You changed the value of ''{0}'' from ''{1}'' to ''{2}''.", key, val, value),
-                            "overwriteAddKey"))
-                        return;
-                    break;
-                }
-            }
-            lastAddKey = key;
-            lastAddValue = value;
-            recentTags.put(new Tag(key, value), null);
-            AutoCompletionManager.rememberUserInput(key, value, false);
-            commandCount++;
-            Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, value));
-            changedKey = key;
-        }
-
-        public void undoAllTagsAdding() {
-            Main.main.undoRedo.undo(commandCount);
-        }
-
-        private void disableTagIfNeeded(final Tag t, final JosmAction action) {
-            // Disable action if its key is already set on the object (the key being absent from the keys list for this reason
-            // performing this action leads to autocomplete to the next key (see #7671 comments)
-            for (int j = 0; j < tagData.getRowCount(); ++j) {
-                if (t.getKey().equals(tagData.getValueAt(j, 0))) {
-                    action.setEnabled(false);
-                    break;
-                }
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+import java.text.Normalizer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.ImageIcon;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.ListCellRenderer;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.text.JTextComponent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.gui.tagging.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionListItem;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.io.XmlWriter;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.WindowGeometry;
+
+/**
+ * Class that helps PropertiesDialog add and edit tag values.
+ * @since 5633
+ */
+class TagEditHelper {
+    private final DefaultTableModel tagData;
+    private final Map<String, Map<String, Integer>> valueCount;
+
+    // Selection that we are editing by using both dialogs
+    Collection<OsmPrimitive> sel;
+
+    private String changedKey;
+    private String objKey;
+
+    Comparator<AutoCompletionListItem> defaultACItemComparator = new Comparator<AutoCompletionListItem>() {
+        @Override
+        public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
+            return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
+        }
+    };
+
+    private String lastAddKey = null;
+    private String lastAddValue = null;
+
+    public static final int DEFAULT_LRU_TAGS_NUMBER = 5;
+    public static final int MAX_LRU_TAGS_NUMBER = 30;
+
+    // LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
+    private final Map<Tag, Void> recentTags = new LinkedHashMap<Tag, Void>(MAX_LRU_TAGS_NUMBER+1, 1.1f, true) {
+        @Override
+        protected boolean removeEldestEntry(Map.Entry<Tag, Void> eldest) {
+            return size() > MAX_LRU_TAGS_NUMBER;
+        }
+    };
+
+    TagEditHelper(DefaultTableModel propertyData, Map<String, Map<String, Integer>> valueCount) {
+        this.tagData = propertyData;
+        this.valueCount = valueCount;
+    }
+
+    /**
+     * Open the add selection dialog and add a new key/value to the table (and
+     * to the dataset, of course).
+     */
+    public void addTag() {
+        changedKey = null;
+        sel = Main.main.getInProgressSelection();
+        if (sel == null || sel.isEmpty()) return;
+
+        final AddTagsDialog addDialog = new AddTagsDialog();
+
+        addDialog.showDialog();
+
+        addDialog.destroyActions();
+        if (addDialog.getValue() == 1)
+            addDialog.performTagAdding();
+        else
+            addDialog.undoAllTagsAdding();
+    }
+
+    /**
+    * Edit the value in the tags table row.
+    * @param row The row of the table from which the value is edited.
+    * @param focusOnKey Determines if the initial focus should be set on key instead of value
+    * @since 5653
+    */
+    public void editTag(final int row, boolean focusOnKey) {
+        changedKey = null;
+        sel = Main.main.getInProgressSelection();
+        if (sel == null || sel.isEmpty()) return;
+
+        String key = tagData.getValueAt(row, 0).toString();
+        objKey=key;
+
+        @SuppressWarnings("unchecked")
+        final EditTagDialog editDialog = new EditTagDialog(key, row,
+                (Map<String, Integer>) tagData.getValueAt(row, 1), focusOnKey);
+        editDialog.showDialog();
+        if (editDialog.getValue() !=1 ) return;
+        editDialog.performTagEdit();
+    }
+
+    /**
+     * If during last editProperty call user changed the key name, this key will be returned
+     * Elsewhere, returns null.
+     * @return The modified key, or {@code null}
+     */
+    public String getChangedKey() {
+        return changedKey;
+    }
+
+    public void resetChangedKey() {
+        changedKey = null;
+    }
+
+    /**
+     * For a given key k, return a list of keys which are used as keys for
+     * auto-completing values to increase the search space.
+     * @param key the key k
+     * @return a list of keys
+     */
+    private static List<String> getAutocompletionKeys(String key) {
+        if ("name".equals(key) || "addr:street".equals(key))
+            return Arrays.asList("addr:street", "name");
+        else
+            return Arrays.asList(key);
+    }
+
+    /**
+     * Load recently used tags from preferences if needed.
+     */
+    public void loadTagsIfNeeded() {
+        if (PROPERTY_REMEMBER_TAGS.get() && recentTags.isEmpty()) {
+            recentTags.clear();
+            Collection<String> c = Main.pref.getCollection("properties.recent-tags");
+            Iterator<String> it = c.iterator();
+            String key, value;
+            while (it.hasNext()) {
+                key = it.next();
+                value = it.next();
+                recentTags.put(new Tag(key, value), null);
+            }
+        }
+    }
+
+    /**
+     * Store recently used tags in preferences if needed.
+     */
+    public void saveTagsIfNeeded() {
+        if (PROPERTY_REMEMBER_TAGS.get() && !recentTags.isEmpty()) {
+            List<String> c = new ArrayList<>( recentTags.size()*2 );
+            for (Tag t: recentTags.keySet()) {
+                c.add(t.getKey());
+                c.add(t.getValue());
+            }
+            Main.pref.putCollection("properties.recent-tags", c);
+        }
+    }
+
+    /**
+     * Warns user about a key being overwritten.
+     * @param action The action done by the user. Must state what key is changed
+     * @param togglePref  The preference to save the checkbox state to
+     * @return {@code true} if the user accepts to overwrite key, {@code false} otherwise
+     */
+    private boolean warnOverwriteKey(String action, String togglePref) {
+        ExtendedDialog ed = new ExtendedDialog(
+                Main.parent,
+                tr("Overwrite key"),
+                new String[]{tr("Replace"), tr("Cancel")});
+        ed.setButtonIcons(new String[]{"purge", "cancel"});
+        ed.setContent(action+"\n"+ tr("The new key is already used, overwrite values?"));
+        ed.setCancelButton(2);
+        ed.toggleEnable(togglePref);
+        ed.showDialog();
+
+        return ed.getValue() == 1;
+    }
+
+    public final class EditTagDialog extends AbstractTagsDialog {
+        final String key;
+        final Map<String, Integer> m;
+        final int row;
+
+        Comparator<AutoCompletionListItem> usedValuesAwareComparator = new Comparator<AutoCompletionListItem>() {
+                @Override
+                public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
+                    boolean c1 = m.containsKey(o1.getValue());
+                    boolean c2 = m.containsKey(o2.getValue());
+                    if (c1 == c2)
+                        return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
+                    else if (c1)
+                        return -1;
+                    else
+                        return +1;
+                }
+            };
+
+        ListCellRenderer<AutoCompletionListItem> cellRenderer = new ListCellRenderer<AutoCompletionListItem>() {
+            final DefaultListCellRenderer def = new DefaultListCellRenderer();
+            @Override
+            public Component getListCellRendererComponent(JList<? extends AutoCompletionListItem> list,
+                    AutoCompletionListItem value, int index, boolean isSelected,  boolean cellHasFocus){
+                Component c = def.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+                if (c instanceof JLabel) {
+                    String str = value.getValue();
+                    if (valueCount.containsKey(objKey)) {
+                        Map<String, Integer> m = valueCount.get(objKey);
+                        if (m.containsKey(str)) {
+                            str = tr("{0} ({1})", str, m.get(str));
+                            c.setFont(c.getFont().deriveFont(Font.ITALIC + Font.BOLD));
+                        }
+                    }
+                    ((JLabel) c).setText(str);
+                }
+                return c;
+            }
+        };
+
+        private EditTagDialog(String key, int row, Map<String, Integer> map, final boolean initialFocusOnKey) {
+            super(Main.parent, trn("Change value?", "Change values?", map.size()), new String[] {tr("OK"),tr("Cancel")});
+            setButtonIcons(new String[] {"ok","cancel"});
+            setCancelButton(2);
+            configureContextsensitiveHelp("/Dialog/EditValue", true /* show help button */);
+            this.key = key;
+            this.row = row;
+            this.m = map;
+
+            JPanel mainPanel = new JPanel(new BorderLayout());
+
+            String msg = "<html>"+trn("This will change {0} object.",
+                    "This will change up to {0} objects.", sel.size(), sel.size())
+                    +"<br><br>("+tr("An empty value deletes the tag.", key)+")</html>";
+
+            mainPanel.add(new JLabel(msg), BorderLayout.NORTH);
+
+            JPanel p = new JPanel(new GridBagLayout());
+            mainPanel.add(p, BorderLayout.CENTER);
+
+            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
+            List<AutoCompletionListItem> keyList = autocomplete.getKeys();
+            Collections.sort(keyList, defaultACItemComparator);
+
+            keys = new AutoCompletingComboBox(key);
+            keys.setPossibleACItems(keyList);
+            keys.setEditable(true);
+            keys.setSelectedItem(key);
+
+            p.add(Box.createVerticalStrut(5),GBC.eol());
+            p.add(new JLabel(tr("Key")), GBC.std());
+            p.add(Box.createHorizontalStrut(10), GBC.std());
+            p.add(keys, GBC.eol().fill(GBC.HORIZONTAL));
+
+            List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
+            Collections.sort(valueList, usedValuesAwareComparator);
+
+            final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey();
+
+            values = new AutoCompletingComboBox(selection);
+            values.setRenderer(cellRenderer);
+
+            values.setEditable(true);
+            values.setPossibleACItems(valueList);
+            values.setSelectedItem(selection);
+            values.getEditor().setItem(selection);
+            p.add(Box.createVerticalStrut(5),GBC.eol());
+            p.add(new JLabel(tr("Value")), GBC.std());
+            p.add(Box.createHorizontalStrut(10), GBC.std());
+            p.add(values, GBC.eol().fill(GBC.HORIZONTAL));
+            values.getEditor().addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    buttonAction(0, null); // emulate OK button click
+                }
+            });
+            addFocusAdapter(autocomplete, usedValuesAwareComparator);
+
+            setContent(mainPanel, false);
+
+            addWindowListener(new WindowAdapter() {
+                @Override
+                public void windowOpened(WindowEvent e) {
+                    if (initialFocusOnKey) {
+                        selectKeysComboBox();
+                    } else {
+                        selectValuesCombobox();
+                    }
+                }
+            });
+        }
+
+        /**
+         * Edit tags of multiple selected objects according to selected ComboBox values
+         * If value == "", tag will be deleted
+         * Confirmations may be needed.
+         */
+        private void performTagEdit() {
+            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
+            value = Normalizer.normalize(value, java.text.Normalizer.Form.NFC);
+            if (value.isEmpty()) {
+                value = null; // delete the key
+            }
+            String newkey = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
+            newkey = Normalizer.normalize(newkey, java.text.Normalizer.Form.NFC);
+            if (newkey.isEmpty()) {
+                newkey = key;
+                value = null; // delete the key instead
+            }
+            if (key.equals(newkey) && tr("<different>").equals(value))
+                return;
+            if (key.equals(newkey) || value == null) {
+                Main.main.undoRedo.add(new ChangePropertyCommand(sel, newkey, value));
+                AutoCompletionManager.rememberUserInput(newkey, value, true);
+            } else {
+                for (OsmPrimitive osm: sel) {
+                    if (osm.get(newkey) != null) {
+                        if (!warnOverwriteKey(tr("You changed the key from ''{0}'' to ''{1}''.", key, newkey),
+                                "overwriteEditKey"))
+                            return;
+                        break;
+                    }
+                }
+                Collection<Command> commands = new ArrayList<>();
+                commands.add(new ChangePropertyCommand(sel, key, null));
+                if (value.equals(tr("<different>"))) {
+                    Map<String, List<OsmPrimitive>> map = new HashMap<>();
+                    for (OsmPrimitive osm: sel) {
+                        String val = osm.get(key);
+                        if (val != null) {
+                            if (map.containsKey(val)) {
+                                map.get(val).add(osm);
+                            } else {
+                                List<OsmPrimitive> v = new ArrayList<>();
+                                v.add(osm);
+                                map.put(val, v);
+                            }
+                        }
+                    }
+                    for (Map.Entry<String, List<OsmPrimitive>> e: map.entrySet()) {
+                        commands.add(new ChangePropertyCommand(e.getValue(), newkey, e.getKey()));
+                    }
+                } else {
+                    commands.add(new ChangePropertyCommand(sel, newkey, value));
+                    AutoCompletionManager.rememberUserInput(newkey, value, false);
+                }
+                Main.main.undoRedo.add(new SequenceCommand(
+                        trn("Change properties of up to {0} object",
+                                "Change properties of up to {0} objects", sel.size(), sel.size()),
+                                commands));
+            }
+
+            changedKey = newkey;
+        }
+    }
+
+    public static final BooleanProperty PROPERTY_FIX_TAG_LOCALE = new BooleanProperty("properties.fix-tag-combobox-locale", false);
+    public static final BooleanProperty PROPERTY_REMEMBER_TAGS = new BooleanProperty("properties.remember-recently-added-tags", true);
+    public static final IntegerProperty PROPERTY_RECENT_TAGS_NUMBER = new IntegerProperty("properties.recently-added-tags", DEFAULT_LRU_TAGS_NUMBER);
+
+    abstract class AbstractTagsDialog extends ExtendedDialog {
+        AutoCompletingComboBox keys;
+        AutoCompletingComboBox values;
+        Component componentUnderMouse;
+
+        public AbstractTagsDialog(Component parent, String title, String[] buttonTexts) {
+            super(parent, title, buttonTexts);
+            addMouseListener(new PopupMenuLauncher(popupMenu));
+        }
+
+        @Override
+        public void setupDialog() {
+            super.setupDialog();
+            final Dimension size = getSize();
+            // Set resizable only in width
+            setMinimumSize(size);
+            setPreferredSize(size);
+            // setMaximumSize does not work, and never worked, but still it seems not to bother Oracle to fix this 10-year-old bug
+            // https://bugs.openjdk.java.net/browse/JDK-6200438
+            // https://bugs.openjdk.java.net/browse/JDK-6464548
+
+            setRememberWindowGeometry(getClass().getName() + ".geometry",
+                WindowGeometry.centerInWindow(Main.parent, size));
+        }
+
+        @Override
+        public void setVisible(boolean visible) {
+            // Do not want dialog to be resizable in height, as its size may increase each time because of the recently added tags
+            // So need to modify the stored geometry (size part only) in order to use the automatic positioning mechanism
+            if (visible) {
+                WindowGeometry geometry = initWindowGeometry();
+                Dimension storedSize = geometry.getSize();
+                Dimension size = getSize();
+                if (!storedSize.equals(size)) {
+                    if (storedSize.width < size.width) {
+                        storedSize.width = size.width;
+                    }
+                    if (storedSize.height != size.height) {
+                        storedSize.height = size.height;
+                    }
+                    rememberWindowGeometry(geometry);
+                }
+                keys.setFixedLocale(PROPERTY_FIX_TAG_LOCALE.get());
+            }
+            super.setVisible(visible);
+        }
+
+        private void selectACComboBoxSavingUnixBuffer(AutoCompletingComboBox cb) {
+            // select combobox with saving unix system selection (middle mouse paste)
+            Clipboard sysSel = Toolkit.getDefaultToolkit().getSystemSelection();
+            if(sysSel != null) {
+                Transferable old = sysSel.getContents(null);
+                cb.requestFocusInWindow();
+                cb.getEditor().selectAll();
+                sysSel.setContents(old, null);
+            } else {
+                cb.requestFocusInWindow();
+                cb.getEditor().selectAll();
+            }
+        }
+
+        public void selectKeysComboBox() {
+            selectACComboBoxSavingUnixBuffer(keys);
+        }
+
+        public void selectValuesCombobox()   {
+            selectACComboBoxSavingUnixBuffer(values);
+        }
+
+        /**
+        * Create a focus handling adapter and apply in to the editor component of value
+        * autocompletion box.
+        * @param autocomplete Manager handling the autocompletion
+        * @param comparator Class to decide what values are offered on autocompletion
+        * @return The created adapter
+        */
+        protected FocusAdapter addFocusAdapter(final AutoCompletionManager autocomplete, final Comparator<AutoCompletionListItem> comparator) {
+           // get the combo box' editor component
+           JTextComponent editor = (JTextComponent)values.getEditor().getEditorComponent();
+           // Refresh the values model when focus is gained
+           FocusAdapter focus = new FocusAdapter() {
+               @Override
+               public void focusGained(FocusEvent e) {
+                   String key = keys.getEditor().getItem().toString();
+
+                   List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
+                   Collections.sort(valueList, comparator);
+
+                   values.setPossibleACItems(valueList);
+                   values.getEditor().selectAll();
+                   objKey=key;
+               }
+           };
+           editor.addFocusListener(focus);
+           return focus;
+        }
+
+        protected JPopupMenu popupMenu = new JPopupMenu() {
+            JCheckBoxMenuItem fixTagLanguageCb = new JCheckBoxMenuItem(
+                new AbstractAction(tr("Use English language for tag by default")){
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    boolean sel=((JCheckBoxMenuItem) e.getSource()).getState();
+                    PROPERTY_FIX_TAG_LOCALE.put(sel);
+                }
+            });
+            {
+                add(fixTagLanguageCb);
+                fixTagLanguageCb.setState(PROPERTY_FIX_TAG_LOCALE.get());
+            }
+        };
+    }
+
+    class AddTagsDialog extends AbstractTagsDialog {
+        List<JosmAction> recentTagsActions = new ArrayList<>();
+
+        // Counter of added commands for possible undo
+        private int commandCount;
+
+        public AddTagsDialog() {
+            super(Main.parent, tr("Add value?"), new String[] {tr("OK"),tr("Cancel")});
+            setButtonIcons(new String[] {"ok","cancel"});
+            setCancelButton(2);
+            configureContextsensitiveHelp("/Dialog/AddValue", true /* show help button */);
+
+            JPanel mainPanel = new JPanel(new GridBagLayout());
+            keys = new AutoCompletingComboBox();
+            values = new AutoCompletingComboBox();
+
+            mainPanel.add(new JLabel("<html>"+trn("This will change up to {0} object.",
+                "This will change up to {0} objects.", sel.size(),sel.size())
+                +"<br><br>"+tr("Please select a key")), GBC.eol().fill(GBC.HORIZONTAL));
+
+            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
+            List<AutoCompletionListItem> keyList = autocomplete.getKeys();
+
+            AutoCompletionListItem itemToSelect = null;
+            // remove the object's tag keys from the list
+            Iterator<AutoCompletionListItem> iter = keyList.iterator();
+            while (iter.hasNext()) {
+                AutoCompletionListItem item = iter.next();
+                if (item.getValue().equals(lastAddKey)) {
+                    itemToSelect = item;
+                }
+                for (int i = 0; i < tagData.getRowCount(); ++i) {
+                    if (item.getValue().equals(tagData.getValueAt(i, 0))) {
+                        if (itemToSelect == item) {
+                            itemToSelect = null;
+                        }
+                        iter.remove();
+                        break;
+                    }
+                }
+            }
+
+            Collections.sort(keyList, defaultACItemComparator);
+            keys.setPossibleACItems(keyList);
+            keys.setEditable(true);
+
+            mainPanel.add(keys, GBC.eop().fill());
+
+            mainPanel.add(new JLabel(tr("Please select a value")), GBC.eol());
+            values.setEditable(true);
+            mainPanel.add(values, GBC.eop().fill());
+            if (itemToSelect != null) {
+                keys.setSelectedItem(itemToSelect);
+                if (lastAddValue != null) {
+                    values.setSelectedItem(lastAddValue);
+                }
+            }
+
+            FocusAdapter focus = addFocusAdapter(autocomplete, defaultACItemComparator);
+            // fire focus event in advance or otherwise the popup list will be too small at first
+            focus.focusGained(null);
+
+            int recentTagsToShow = PROPERTY_RECENT_TAGS_NUMBER.get();
+            if (recentTagsToShow > MAX_LRU_TAGS_NUMBER) {
+                recentTagsToShow = MAX_LRU_TAGS_NUMBER;
+            }
+
+            // Add tag on Shift-Enter
+            mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+                        KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK), "addAndContinue");
+                mainPanel.getActionMap().put("addAndContinue", new AbstractAction() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        performTagAdding();
+                        selectKeysComboBox();
+                    }
+                });
+
+            suggestRecentlyAddedTags(mainPanel, recentTagsToShow, focus);
+
+            setContent(mainPanel, false);
+
+            selectKeysComboBox();
+
+            popupMenu.add(new AbstractAction(tr("Set number of recently added tags")) {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    selectNumberOfTags();
+                }
+            });
+            JCheckBoxMenuItem rememberLastTags = new JCheckBoxMenuItem(
+                new AbstractAction(tr("Remember last used tags after a restart")){
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    boolean sel=((JCheckBoxMenuItem) e.getSource()).getState();
+                    PROPERTY_REMEMBER_TAGS.put(sel);
+                    if (sel) saveTagsIfNeeded();
+                }
+            });
+            rememberLastTags.setState(PROPERTY_REMEMBER_TAGS.get());
+            popupMenu.add(rememberLastTags);
+        }
+
+        private void selectNumberOfTags() {
+            String s = JOptionPane.showInputDialog(this, tr("Please enter the number of recently added tags to display"));
+            if (s!=null) try {
+                int v = Integer.parseInt(s);
+                if (v>=0 && v<=MAX_LRU_TAGS_NUMBER) {
+                    PROPERTY_RECENT_TAGS_NUMBER.put(v);
+                    return;
+                }
+            } catch (NumberFormatException ex) {
+                Main.warn(ex);
+            }
+            JOptionPane.showMessageDialog(this, tr("Please enter integer number between 0 and {0}", MAX_LRU_TAGS_NUMBER));
+        }
+
+        private void suggestRecentlyAddedTags(JPanel mainPanel, int tagsToShow, final FocusAdapter focus) {
+            if (!(tagsToShow > 0 && !recentTags.isEmpty()))
+                return;
+
+            mainPanel.add(new JLabel(tr("Recently added tags")), GBC.eol());
+
+            int count = 1;
+            // We store the maximum number (9) of recent tags to allow dynamic change of number of tags shown in the preferences.
+            // This implies to iterate in descending order, as the oldest elements will only be removed after we reach the maximum numbern and not the number of tags to show.
+            // However, as Set does not allow to iterate in descending order, we need to copy its elements into a List we can access in reverse order.
+            List<Tag> tags = new LinkedList<>(recentTags.keySet());
+            for (int i = tags.size()-1; i >= 0 && count <= tagsToShow; i--, count++) {
+                final Tag t = tags.get(i);
+                // Create action for reusing the tag, with keyboard shortcut Ctrl+(1-5)
+                String actionShortcutKey = "properties:recent:"+count;
+                String actionShortcutShiftKey = "properties:recent:shift:"+count;
+                Shortcut sc = Shortcut.registerShortcut(actionShortcutKey, tr("Choose recent tag {0}", count), KeyEvent.VK_0+count, Shortcut.CTRL);
+                final JosmAction action = new JosmAction(actionShortcutKey, null, tr("Use this tag again"), sc, false) {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        keys.setSelectedItem(t.getKey());
+                        // fix #7951, #8298 - update list of values before setting value (?)
+                        focus.focusGained(null);
+                        values.setSelectedItem(t.getValue());
+                        selectValuesCombobox();
+                    }
+                };
+                Shortcut scShift = Shortcut.registerShortcut(actionShortcutShiftKey, tr("Apply recent tag {0}", count), KeyEvent.VK_0+count, Shortcut.CTRL_SHIFT);
+                final JosmAction actionShift = new JosmAction(actionShortcutShiftKey, null, tr("Use this tag again"), scShift, false) {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        action.actionPerformed(null);
+                        performTagAdding();
+                        selectKeysComboBox();
+                    }
+                };
+                recentTagsActions.add(action);
+                recentTagsActions.add(actionShift);
+                disableTagIfNeeded(t, action);
+                // Find and display icon
+                ImageIcon icon = MapPaintStyles.getNodeIcon(t, false); // Filters deprecated icon
+                if (icon == null) {
+                    // If no icon found in map style look at presets
+                    Map<String, String> map = new HashMap<>();
+                    map.put(t.getKey(), t.getValue());
+                    for (TaggingPreset tp : TaggingPreset.getMatchingPresets(null, map, false)) {
+                        icon = tp.getIcon();
+                        if (icon != null) {
+                            break;
+                        }
+                    }
+                    // If still nothing display an empty icon
+                    if (icon == null) {
+                        icon = new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB));
+                    }
+                }
+                GridBagConstraints gbc = new GridBagConstraints();
+                gbc.ipadx = 5;
+                mainPanel.add(new JLabel(action.isEnabled() ? icon : GuiHelper.getDisabledIcon(icon)), gbc);
+                // Create tag label
+                final String color = action.isEnabled() ? "" : "; color:gray";
+                final JLabel tagLabel = new JLabel("<html>"
+                    + "<style>td{border:1px solid gray; font-weight:normal"+color+"}</style>"
+                    + "<table><tr><td>" + XmlWriter.encode(t.toString(), true) + "</td></tr></table></html>");
+                if (action.isEnabled()) {
+                    // Register action
+                    mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(sc.getKeyStroke(), actionShortcutKey);
+                    mainPanel.getActionMap().put(actionShortcutKey, action);
+                    mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scShift.getKeyStroke(), actionShortcutShiftKey);
+                    mainPanel.getActionMap().put(actionShortcutShiftKey, actionShift);
+                    // Make the tag label clickable and set tooltip to the action description (this displays also the keyboard shortcut)
+                    tagLabel.setToolTipText((String) action.getValue(Action.SHORT_DESCRIPTION));
+                    tagLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+                    tagLabel.addMouseListener(new MouseAdapter() {
+                        @Override
+                        public void mouseClicked(MouseEvent e) {
+                            action.actionPerformed(null);
+                            // add tags and close window on double-click
+                            if (e.getClickCount()>1) {
+                                buttonAction(0, null); // emulate OK click and close the dialog
+                            }
+                            // add tags on Shift-Click
+                            if (e.isShiftDown()) {
+                                performTagAdding();
+                                selectKeysComboBox();
+                            }
+                        }
+                    });
+                } else {
+                    // Disable tag label
+                    tagLabel.setEnabled(false);
+                    // Explain in the tooltip why
+                    tagLabel.setToolTipText(tr("The key ''{0}'' is already used", t.getKey()));
+                }
+                // Finally add label to the resulting panel
+                JPanel tagPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
+                tagPanel.add(tagLabel);
+                mainPanel.add(tagPanel, GBC.eol().fill(GBC.HORIZONTAL));
+            }
+        }
+
+        public void destroyActions() {
+            for (JosmAction action : recentTagsActions) {
+                action.destroy();
+            }
+        }
+
+        /**
+         * Read tags from comboboxes and add it to all selected objects
+         */
+        public final void performTagAdding() {
+            String key = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
+            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
+            if (key.isEmpty() || value.isEmpty()) return;
+            for (OsmPrimitive osm: sel) {
+                String val = osm.get(key);
+                if (val != null && !val.equals(value)) {
+                    if (!warnOverwriteKey(tr("You changed the value of ''{0}'' from ''{1}'' to ''{2}''.", key, val, value),
+                            "overwriteAddKey"))
+                        return;
+                    break;
+                }
+            }
+            lastAddKey = key;
+            lastAddValue = value;
+            recentTags.put(new Tag(key, value), null);
+            AutoCompletionManager.rememberUserInput(key, value, false);
+            commandCount++;
+            Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, value));
+            changedKey = key;
+        }
+
+        public void undoAllTagsAdding() {
+            Main.main.undoRedo.undo(commandCount);
+        }
+
+        private void disableTagIfNeeded(final Tag t, final JosmAction action) {
+            // Disable action if its key is already set on the object (the key being absent from the keys list for this reason
+            // performing this action leads to autocomplete to the next key (see #7671 comments)
+            for (int j = 0; j < tagData.getRowCount(); ++j) {
+                if (t.getKey().equals(tagData.getValueAt(j, 0))) {
+                    action.setEnabled(false);
+                    break;
+                }
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java b/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
index f12e407..2ee97c9 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
@@ -1,115 +1,115 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.download;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Component;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.WindowEvent;
-import java.util.Arrays;
-import java.util.Collection;
-
-import javax.swing.JCheckBox;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
-import org.openstreetmap.josm.io.OnlineResource;
-
-/**
- * Dialog prompt to user to let him choose OSM primitives to download by specifying their type and IDs
- * @since 5765
- */
-public class DownloadObjectDialog extends OsmIdSelectionDialog {
-
-    protected final JCheckBox referrers = new JCheckBox(tr("Download referrers (parent relations)"));
-    protected final JCheckBox fullRel   = new JCheckBox(tr("Download relation members"));
-    protected final JCheckBox newLayer  = new JCheckBox(tr("Separate Layer"));
-
-    /**
-     * Constructs a new DownloadObjectDialog with Main.parent as parent component.
-     */
-    public DownloadObjectDialog() {
-        this(Main.parent);
-    }
-
-    /**
-     * Constructs a new DownloadObjectDialog.
-     * @param parent The parent component
-     */
-    public DownloadObjectDialog(Component parent) {
-        super(parent, tr("Download object"), new String[]{tr("Download object"), tr("Cancel")});
-        init();
-        setButtonIcons(new String[]{"download.png", "cancel.png"});
-        setToolTipTexts(new String[]{
-                tr("Start downloading"),
-                tr("Close dialog and cancel downloading")
-        });
-        configureContextsensitiveHelp("/Action/DownloadObject", true /* show help button */);
-    }
-
-    @Override
-    public void setupDialog() {
-        super.setupDialog();
-        buttons.get(0).setEnabled(!Main.isOffline(OnlineResource.OSM_API));
-    }
-
-    @Override
-    protected Collection<Component> getComponentsBeforeHelp() {
-        newLayer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
-        newLayer.setSelected(Main.pref.getBoolean("download.newlayer"));
-
-        referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well, i.e.,"
-                + "parent relations and for nodes, additionally, parent ways"));
-        referrers.setSelected(Main.pref.getBoolean("downloadprimitive.referrers", true));
-
-        fullRel.setToolTipText(tr("Select if the members of a relation should be downloaded as well"));
-        fullRel.setSelected(Main.pref.getBoolean("downloadprimitive.full", true));
-
-        cbType.addItemListener(new ItemListener() {
-            @Override
-            public void itemStateChanged(ItemEvent e) {
-                referrers.setText(cbType.getType() == OsmPrimitiveType.NODE
-                        ? tr("Download referrers (parent relations and ways)")
-                        : tr("Download referrers (parent relations)"));
-            }
-        });
-
-        return Arrays.<Component>asList(referrers, fullRel, newLayer);
-    }
-
-    /**
-     * Determines if a new layer has been requested.
-     * @return true if a new layer has been requested, false otherwise
-     */
-    public final boolean isNewLayerRequested() {
-        return newLayer.isSelected();
-    }
-
-    /**
-     * Determines if relation members have been requested.
-     * @return true if relation members have been requested, false otherwise
-     */
-    public final boolean isFullRelationRequested() {
-        return fullRel.isSelected();
-    }
-
-    /**
-     * Determines if referrers have been requested.
-     * @return true if referrers have been requested, false otherwise
-     */
-    public final boolean isReferrersRequested() {
-        return referrers.isSelected();
-    }
-
-    @Override
-    public void windowClosed(WindowEvent e) {
-        super.windowClosed(e);
-        if (e != null && e.getComponent() == this && getValue() == 1) {
-            Main.pref.put("downloadprimitive.referrers", referrers.isSelected());
-            Main.pref.put("downloadprimitive.full", fullRel.isSelected());
-            Main.pref.put("download.newlayer", newLayer.isSelected());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.download;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.WindowEvent;
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.swing.JCheckBox;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
+import org.openstreetmap.josm.io.OnlineResource;
+
+/**
+ * Dialog prompt to user to let him choose OSM primitives to download by specifying their type and IDs
+ * @since 5765
+ */
+public class DownloadObjectDialog extends OsmIdSelectionDialog {
+
+    protected final JCheckBox referrers = new JCheckBox(tr("Download referrers (parent relations)"));
+    protected final JCheckBox fullRel   = new JCheckBox(tr("Download relation members"));
+    protected final JCheckBox newLayer  = new JCheckBox(tr("Separate Layer"));
+
+    /**
+     * Constructs a new DownloadObjectDialog with Main.parent as parent component.
+     */
+    public DownloadObjectDialog() {
+        this(Main.parent);
+    }
+
+    /**
+     * Constructs a new DownloadObjectDialog.
+     * @param parent The parent component
+     */
+    public DownloadObjectDialog(Component parent) {
+        super(parent, tr("Download object"), new String[]{tr("Download object"), tr("Cancel")});
+        init();
+        setButtonIcons(new String[]{"download.png", "cancel.png"});
+        setToolTipTexts(new String[]{
+                tr("Start downloading"),
+                tr("Close dialog and cancel downloading")
+        });
+        configureContextsensitiveHelp("/Action/DownloadObject", true /* show help button */);
+    }
+
+    @Override
+    public void setupDialog() {
+        super.setupDialog();
+        buttons.get(0).setEnabled(!Main.isOffline(OnlineResource.OSM_API));
+    }
+
+    @Override
+    protected Collection<Component> getComponentsBeforeHelp() {
+        newLayer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
+        newLayer.setSelected(Main.pref.getBoolean("download.newlayer"));
+
+        referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well, i.e.,"
+                + "parent relations and for nodes, additionally, parent ways"));
+        referrers.setSelected(Main.pref.getBoolean("downloadprimitive.referrers", true));
+
+        fullRel.setToolTipText(tr("Select if the members of a relation should be downloaded as well"));
+        fullRel.setSelected(Main.pref.getBoolean("downloadprimitive.full", true));
+
+        cbType.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                referrers.setText(cbType.getType() == OsmPrimitiveType.NODE
+                        ? tr("Download referrers (parent relations and ways)")
+                        : tr("Download referrers (parent relations)"));
+            }
+        });
+
+        return Arrays.<Component>asList(referrers, fullRel, newLayer);
+    }
+
+    /**
+     * Determines if a new layer has been requested.
+     * @return true if a new layer has been requested, false otherwise
+     */
+    public final boolean isNewLayerRequested() {
+        return newLayer.isSelected();
+    }
+
+    /**
+     * Determines if relation members have been requested.
+     * @return true if relation members have been requested, false otherwise
+     */
+    public final boolean isFullRelationRequested() {
+        return fullRel.isSelected();
+    }
+
+    /**
+     * Determines if referrers have been requested.
+     * @return true if referrers have been requested, false otherwise
+     */
+    public final boolean isReferrersRequested() {
+        return referrers.isSelected();
+    }
+
+    @Override
+    public void windowClosed(WindowEvent e) {
+        super.windowClosed(e);
+        if (e != null && e.getComponent() == this && getValue() == 1) {
+            Main.pref.put("downloadprimitive.referrers", referrers.isSelected());
+            Main.pref.put("downloadprimitive.full", fullRel.isSelected());
+            Main.pref.put("download.newlayer", newLayer.isSelected());
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java b/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
index fdcb7f0..1343cb2 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
@@ -1,125 +1,125 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
-
-/**
- * Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
- * @since 6207
- */
-public abstract class HistoryViewerPanel extends JPanel {
-    
-    protected HistoryBrowserModel model;
-    protected VersionInfoPanel referenceInfoPanel;
-    protected VersionInfoPanel currentInfoPanel;
-    protected AdjustmentSynchronizer adjustmentSynchronizer;
-    protected SelectionSynchronizer selectionSynchronizer;
-
-    protected HistoryViewerPanel(HistoryBrowserModel model) {
-        setModel(model);
-        build();
-    }
-    
-    private JScrollPane embedInScrollPane(JTable table) {
-        JScrollPane pane = new JScrollPane(table);
-        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
-        return pane;
-    }
-    
-    /**
-     * Sets the history browsing model.
-     * @param model The history browsing model
-     */
-    public final void setModel(HistoryBrowserModel model) {
-        if (this.model != null) {
-            unregisterAsObserver(model);
-        }
-        this.model = model;
-        if (this.model != null) {
-            registerAsObserver(model);
-        }
-    }
-    
-    protected final void unregisterAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
-        }
-    }
-    
-    protected final void registerAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
-        }
-    }
-    
-    protected abstract JTable buildReferenceTable();
-    
-    protected abstract JTable buildCurrentTable();
-    
-    private void build() {
-        setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.insets = new Insets(5,5,5,0);
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
-        add(referenceInfoPanel,gc);
-
-        gc.gridx = 1;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
-        add(currentInfoPanel,gc);
-
-        adjustmentSynchronizer = new AdjustmentSynchronizer();
-        selectionSynchronizer = new SelectionSynchronizer();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embedInScrollPane(buildReferenceTable()),gc);
-
-        gc.gridx = 1;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embedInScrollPane(buildCurrentTable()),gc);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
+
+/**
+ * Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
+ * @since 6207
+ */
+public abstract class HistoryViewerPanel extends JPanel {
+    
+    protected HistoryBrowserModel model;
+    protected VersionInfoPanel referenceInfoPanel;
+    protected VersionInfoPanel currentInfoPanel;
+    protected AdjustmentSynchronizer adjustmentSynchronizer;
+    protected SelectionSynchronizer selectionSynchronizer;
+
+    protected HistoryViewerPanel(HistoryBrowserModel model) {
+        setModel(model);
+        build();
+    }
+    
+    private JScrollPane embedInScrollPane(JTable table) {
+        JScrollPane pane = new JScrollPane(table);
+        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
+        return pane;
+    }
+    
+    /**
+     * Sets the history browsing model.
+     * @param model The history browsing model
+     */
+    public final void setModel(HistoryBrowserModel model) {
+        if (this.model != null) {
+            unregisterAsObserver(model);
+        }
+        this.model = model;
+        if (this.model != null) {
+            registerAsObserver(model);
+        }
+    }
+    
+    protected final void unregisterAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.deleteObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.deleteObserver(referenceInfoPanel);
+        }
+    }
+    
+    protected final void registerAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.addObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.addObserver(referenceInfoPanel);
+        }
+    }
+    
+    protected abstract JTable buildReferenceTable();
+    
+    protected abstract JTable buildCurrentTable();
+    
+    private void build() {
+        setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+
+        // ---------------------------
+        gc.gridx = 0;
+        gc.gridy = 0;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.insets = new Insets(5,5,5,0);
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+        add(referenceInfoPanel,gc);
+
+        gc.gridx = 1;
+        gc.gridy = 0;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
+        add(currentInfoPanel,gc);
+
+        adjustmentSynchronizer = new AdjustmentSynchronizer();
+        selectionSynchronizer = new SelectionSynchronizer();
+
+        // ---------------------------
+        gc.gridx = 0;
+        gc.gridy = 1;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(embedInScrollPane(buildReferenceTable()),gc);
+
+        gc.gridx = 1;
+        gc.gridy = 1;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(embedInScrollPane(buildCurrentTable()),gc);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/history/VersionTable.java b/src/org/openstreetmap/josm/gui/history/VersionTable.java
index b39da93..3e302e8 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionTable.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionTable.java
@@ -41,7 +41,7 @@ import org.openstreetmap.josm.tools.OpenBrowser;
 /**
  * VersionTable shows a list of version in a {@link org.openstreetmap.josm.data.osm.history.History}
  * of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive}.
- *
+ * @since 1709
  */
 public class VersionTable extends JTable implements Observer{
     private VersionTablePopupMenu popupMenu;
@@ -92,6 +92,10 @@ public class VersionTable extends JTable implements Observer{
         });
     }
 
+    /**
+     * Constructs a new {@code VersionTable}.
+     * @param model model used by the history browser
+     */
     public VersionTable(HistoryBrowserModel model) {
         super(model.getVersionTableModel(), new VersionTableColumnModel());
         model.addObserver(this);
@@ -116,7 +120,7 @@ public class VersionTable extends JTable implements Observer{
     }
 
     class MouseListener extends PopupMenuLauncher {
-        public MouseListener() {
+        private MouseListener() {
             super(popupMenu);
         }
         @Override
@@ -125,9 +129,9 @@ public class VersionTable extends JTable implements Observer{
             if (!e.isPopupTrigger() && e.getButton() == MouseEvent.BUTTON1) {
                 int row = rowAtPoint(e.getPoint());
                 int col = columnAtPoint(e.getPoint());
-                if (row > 0 && (col == VersionTableColumnModel.COL_DATE || col == VersionTableColumnModel.COL_USER)) {
+                if (row >= 0 && (col == VersionTableColumnModel.COL_DATE || col == VersionTableColumnModel.COL_USER)) {
                     model.getVersionTableModel().setCurrentPointInTime(row);
-                    model.getVersionTableModel().setReferencePointInTime(row - 1);
+                    model.getVersionTableModel().setReferencePointInTime(Math.max(0, row - 1));
                 }
             }
         }
@@ -230,7 +234,8 @@ public class VersionTable extends JTable implements Observer{
     public static class RadioButtonRenderer extends JRadioButton implements TableCellRenderer {
 
         @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+                int row, int column) {
             setSelected(value != null && (Boolean)value);
             setHorizontalAlignment(SwingConstants.CENTER);
             return this;
@@ -241,6 +246,9 @@ public class VersionTable extends JTable implements Observer{
 
         private JRadioButton btn;
 
+        /**
+         * Constructs a new {@code RadioButtonEditor}.
+         */
         public RadioButtonEditor() {
             super(new JCheckBox());
             btn = new JRadioButton();
@@ -269,11 +277,19 @@ public class VersionTable extends JTable implements Observer{
     }
 
     public static class AlignedRenderer extends JLabel implements TableCellRenderer {
+
+        /**
+         * Constructs a new {@code AlignedRenderer}.
+         * @param hAlignment Horizontal alignement. One of the following constants defined in SwingConstants:
+         *        LEFT, CENTER (the default for image-only labels), RIGHT, LEADING (the default for text-only labels) or TRAILING
+         */
         public AlignedRenderer(int hAlignment) {
             setHorizontalAlignment(hAlignment);
         }
+
         @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+                int row, int column) {
             String v = value.toString();
             setText(v);
             return this;
@@ -297,5 +313,4 @@ public class VersionTable extends JTable implements Observer{
         int spacing = tbl.getIntercellSpacing().width;
         tbl.getColumnModel().getColumn(col).setPreferredWidth(maxwidth + spacing);
     }
-
 }
diff --git a/src/org/openstreetmap/josm/gui/io/AbstractUploadDialog.java b/src/org/openstreetmap/josm/gui/io/AbstractUploadDialog.java
index 8c3613a..38ff05e 100644
--- a/src/org/openstreetmap/josm/gui/io/AbstractUploadDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/AbstractUploadDialog.java
@@ -1,207 +1,207 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.io;
-
-import java.awt.GraphicsConfiguration;
-import java.awt.HeadlessException;
-import java.awt.Window;
-
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-
-/**
- * This is an abstract base class for dialogs used for entering generic upload options.
- * @since 7358
- */
-public abstract class AbstractUploadDialog extends JDialog {
-
-    private boolean canceled = false;
-
-    /**
-     * Creates a dialog with an empty title and the specified modality and
-     * {@code Window} as its owner.
-     * <p>
-     * This constructor sets the component's locale property to the value
-     * returned by {@code JComponent.getDefaultLocale}.
-     *
-     * @param owner the {@code Window} from which the dialog is displayed or
-     *     {@code null} if this dialog has no owner
-     * @param modalityType specifies whether dialog blocks input to other
-     *     windows when shown. {@code null} value and unsupported modality
-     *     types are equivalent to {@code MODELESS}
-     *
-     * @throws IllegalArgumentException
-     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
-     *     or {@link java.awt.Frame Frame}
-     * @throws IllegalArgumentException
-     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
-     * @throws HeadlessException
-     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
-     * @throws SecurityException
-     *     if the calling thread does not have permission to create modal dialogs
-     *     with the given {@code modalityType}
-     *
-     * @see java.awt.Dialog.ModalityType
-     * @see java.awt.Dialog#setModal
-     * @see java.awt.Dialog#setModalityType
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     * @see JComponent#getDefaultLocale
-     */
-    public AbstractUploadDialog(Window owner, ModalityType modalityType) {
-        super(owner, modalityType);
-    }
-
-    /**
-     * Creates a dialog with the specified title, owner {@code Window},
-     * modality and {@code GraphicsConfiguration}.
-     * <p>
-     * NOTE: Any popup components ({@code JComboBox},
-     * {@code JPopupMenu}, {@code JMenuBar})
-     * created within a modal dialog will be forced to be lightweight.
-     * <p>
-     * This constructor sets the component's locale property to the value
-     * returned by {@code JComponent.getDefaultLocale}.
-     *
-     * @param owner the {@code Window} from which the dialog is displayed or
-     *     {@code null} if this dialog has no owner
-     * @param title the {@code String} to display in the dialog's
-     *     title bar or {@code null} if the dialog has no title
-     * @param modalityType specifies whether dialog blocks input to other
-     *     windows when shown. {@code null} value and unsupported modality
-     *     types are equivalent to {@code MODELESS}
-     * @param gc the {@code GraphicsConfiguration} of the target screen device;
-     *     if {@code null}, the default system {@code GraphicsConfiguration}
-     *     is assumed
-     * @throws IllegalArgumentException
-     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
-     *     or {@link java.awt.Frame Frame}
-     * @throws IllegalArgumentException
-     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
-     * @throws HeadlessException
-     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
-     * @throws SecurityException
-     *     if the calling thread does not have permission to create modal dialogs
-     *     with the given {@code modalityType}
-     *
-     * @see java.awt.Dialog.ModalityType
-     * @see java.awt.Dialog#setModal
-     * @see java.awt.Dialog#setModalityType
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     * @see JComponent#getDefaultLocale
-     */
-    public AbstractUploadDialog(Window owner, String title, ModalityType modalityType, GraphicsConfiguration gc) {
-        super(owner, title, modalityType, gc);
-    }
-
-    /**
-     * Creates a dialog with the specified title, owner {@code Window} and
-     * modality.
-     * <p>
-     * This constructor sets the component's locale property to the value
-     * returned by {@code JComponent.getDefaultLocale}.
-     *
-     * @param owner the {@code Window} from which the dialog is displayed or
-     *     {@code null} if this dialog has no owner
-     * @param title the {@code String} to display in the dialog's
-     *     title bar or {@code null} if the dialog has no title
-     * @param modalityType specifies whether dialog blocks input to other
-     *     windows when shown. {@code null} value and unsupported modality
-     *     types are equivalent to {@code MODELESS}
-     *
-     * @throws IllegalArgumentException
-     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
-     *     or {@link java.awt.Frame Frame}
-     * @throws IllegalArgumentException
-     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
-     * @throws HeadlessException
-     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
-     * @throws SecurityException
-     *     if the calling thread does not have permission to create modal dialogs
-     *     with the given {@code modalityType}
-     *
-     * @see java.awt.Dialog.ModalityType
-     * @see java.awt.Dialog#setModal
-     * @see java.awt.Dialog#setModalityType
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     * @see JComponent#getDefaultLocale
-     */
-    public AbstractUploadDialog(Window owner, String title, ModalityType modalityType) {
-        super(owner, title, modalityType);
-    }
-
-    /**
-     * Creates a modeless dialog with the specified title and owner
-     * {@code Window}.
-     * <p>
-     * This constructor sets the component's locale property to the value
-     * returned by {@code JComponent.getDefaultLocale}.
-     *
-     * @param owner the {@code Window} from which the dialog is displayed or
-     *     {@code null} if this dialog has no owner
-     * @param title the {@code String} to display in the dialog's
-     *     title bar or {@code null} if the dialog has no title
-     *
-     * @throws IllegalArgumentException
-     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
-     *     or {@link java.awt.Frame Frame}
-     * @throws IllegalArgumentException
-     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
-     * @throws HeadlessException
-     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
-     *
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     * @see JComponent#getDefaultLocale
-     */
-    public AbstractUploadDialog(Window owner, String title) {
-        super(owner, title);
-    }
-
-    /**
-     * Creates a modeless dialog with the specified {@code Window}
-     * as its owner and an empty title.
-     * <p>
-     * This constructor sets the component's locale property to the value
-     * returned by {@code JComponent.getDefaultLocale}.
-     *
-     * @param owner the {@code Window} from which the dialog is displayed or
-     *     {@code null} if this dialog has no owner
-     *
-     * @throws IllegalArgumentException
-     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
-     *     or {@link java.awt.Frame Frame}
-     * @throws IllegalArgumentException
-     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
-     * @throws HeadlessException
-     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
-     *
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     * @see JComponent#getDefaultLocale
-     */
-    public AbstractUploadDialog(Window owner) {
-        super(owner);
-    }
-
-    /**
-     * Returns true if the dialog was canceled
-     *
-     * @return true if the dialog was canceled
-     */
-    public final boolean isCanceled() {
-        return canceled;
-    }
-
-    /**
-     * Sets whether the dialog was canceled
-     *
-     * @param canceled true if the dialog is canceled
-     */
-    protected void setCanceled(boolean canceled) {
-        this.canceled = canceled;
-    }
-
-    /**
-     * Remembers the user input in the preference settings
-     */
-    public void rememberUserInput() {
-        // Override if needed
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.io;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.HeadlessException;
+import java.awt.Window;
+
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+
+/**
+ * This is an abstract base class for dialogs used for entering generic upload options.
+ * @since 7358
+ */
+public abstract class AbstractUploadDialog extends JDialog {
+
+    private boolean canceled = false;
+
+    /**
+     * Creates a dialog with an empty title and the specified modality and
+     * {@code Window} as its owner.
+     * <p>
+     * This constructor sets the component's locale property to the value
+     * returned by {@code JComponent.getDefaultLocale}.
+     *
+     * @param owner the {@code Window} from which the dialog is displayed or
+     *     {@code null} if this dialog has no owner
+     * @param modalityType specifies whether dialog blocks input to other
+     *     windows when shown. {@code null} value and unsupported modality
+     *     types are equivalent to {@code MODELESS}
+     *
+     * @throws IllegalArgumentException
+     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
+     *     or {@link java.awt.Frame Frame}
+     * @throws IllegalArgumentException
+     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
+     * @throws HeadlessException
+     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
+     * @throws SecurityException
+     *     if the calling thread does not have permission to create modal dialogs
+     *     with the given {@code modalityType}
+     *
+     * @see java.awt.Dialog.ModalityType
+     * @see java.awt.Dialog#setModal
+     * @see java.awt.Dialog#setModalityType
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     * @see JComponent#getDefaultLocale
+     */
+    public AbstractUploadDialog(Window owner, ModalityType modalityType) {
+        super(owner, modalityType);
+    }
+
+    /**
+     * Creates a dialog with the specified title, owner {@code Window},
+     * modality and {@code GraphicsConfiguration}.
+     * <p>
+     * NOTE: Any popup components ({@code JComboBox},
+     * {@code JPopupMenu}, {@code JMenuBar})
+     * created within a modal dialog will be forced to be lightweight.
+     * <p>
+     * This constructor sets the component's locale property to the value
+     * returned by {@code JComponent.getDefaultLocale}.
+     *
+     * @param owner the {@code Window} from which the dialog is displayed or
+     *     {@code null} if this dialog has no owner
+     * @param title the {@code String} to display in the dialog's
+     *     title bar or {@code null} if the dialog has no title
+     * @param modalityType specifies whether dialog blocks input to other
+     *     windows when shown. {@code null} value and unsupported modality
+     *     types are equivalent to {@code MODELESS}
+     * @param gc the {@code GraphicsConfiguration} of the target screen device;
+     *     if {@code null}, the default system {@code GraphicsConfiguration}
+     *     is assumed
+     * @throws IllegalArgumentException
+     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
+     *     or {@link java.awt.Frame Frame}
+     * @throws IllegalArgumentException
+     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
+     * @throws HeadlessException
+     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
+     * @throws SecurityException
+     *     if the calling thread does not have permission to create modal dialogs
+     *     with the given {@code modalityType}
+     *
+     * @see java.awt.Dialog.ModalityType
+     * @see java.awt.Dialog#setModal
+     * @see java.awt.Dialog#setModalityType
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     * @see JComponent#getDefaultLocale
+     */
+    public AbstractUploadDialog(Window owner, String title, ModalityType modalityType, GraphicsConfiguration gc) {
+        super(owner, title, modalityType, gc);
+    }
+
+    /**
+     * Creates a dialog with the specified title, owner {@code Window} and
+     * modality.
+     * <p>
+     * This constructor sets the component's locale property to the value
+     * returned by {@code JComponent.getDefaultLocale}.
+     *
+     * @param owner the {@code Window} from which the dialog is displayed or
+     *     {@code null} if this dialog has no owner
+     * @param title the {@code String} to display in the dialog's
+     *     title bar or {@code null} if the dialog has no title
+     * @param modalityType specifies whether dialog blocks input to other
+     *     windows when shown. {@code null} value and unsupported modality
+     *     types are equivalent to {@code MODELESS}
+     *
+     * @throws IllegalArgumentException
+     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
+     *     or {@link java.awt.Frame Frame}
+     * @throws IllegalArgumentException
+     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
+     * @throws HeadlessException
+     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
+     * @throws SecurityException
+     *     if the calling thread does not have permission to create modal dialogs
+     *     with the given {@code modalityType}
+     *
+     * @see java.awt.Dialog.ModalityType
+     * @see java.awt.Dialog#setModal
+     * @see java.awt.Dialog#setModalityType
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     * @see JComponent#getDefaultLocale
+     */
+    public AbstractUploadDialog(Window owner, String title, ModalityType modalityType) {
+        super(owner, title, modalityType);
+    }
+
+    /**
+     * Creates a modeless dialog with the specified title and owner
+     * {@code Window}.
+     * <p>
+     * This constructor sets the component's locale property to the value
+     * returned by {@code JComponent.getDefaultLocale}.
+     *
+     * @param owner the {@code Window} from which the dialog is displayed or
+     *     {@code null} if this dialog has no owner
+     * @param title the {@code String} to display in the dialog's
+     *     title bar or {@code null} if the dialog has no title
+     *
+     * @throws IllegalArgumentException
+     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
+     *     or {@link java.awt.Frame Frame}
+     * @throws IllegalArgumentException
+     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
+     * @throws HeadlessException
+     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
+     *
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     * @see JComponent#getDefaultLocale
+     */
+    public AbstractUploadDialog(Window owner, String title) {
+        super(owner, title);
+    }
+
+    /**
+     * Creates a modeless dialog with the specified {@code Window}
+     * as its owner and an empty title.
+     * <p>
+     * This constructor sets the component's locale property to the value
+     * returned by {@code JComponent.getDefaultLocale}.
+     *
+     * @param owner the {@code Window} from which the dialog is displayed or
+     *     {@code null} if this dialog has no owner
+     *
+     * @throws IllegalArgumentException
+     *     if the {@code owner} is not an instance of {@link java.awt.Dialog Dialog}
+     *     or {@link java.awt.Frame Frame}
+     * @throws IllegalArgumentException
+     *     if the {@code owner}'s {@code GraphicsConfiguration} is not from a screen device
+     * @throws HeadlessException
+     *     when {@code GraphicsEnvironment.isHeadless()} returns {@code true}
+     *
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     * @see JComponent#getDefaultLocale
+     */
+    public AbstractUploadDialog(Window owner) {
+        super(owner);
+    }
+
+    /**
+     * Returns true if the dialog was canceled
+     *
+     * @return true if the dialog was canceled
+     */
+    public final boolean isCanceled() {
+        return canceled;
+    }
+
+    /**
+     * Sets whether the dialog was canceled
+     *
+     * @param canceled true if the dialog is canceled
+     */
+    protected void setCanceled(boolean canceled) {
+        this.canceled = canceled;
+    }
+
+    /**
+     * Remembers the user input in the preference settings
+     */
+    public void rememberUserInput() {
+        // Override if needed
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
index b02ed5e..df5670c 100644
--- a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
@@ -33,9 +33,8 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.GBC;
 
 /**
- * BasicUploadSettingsPanel allows to enter the basic parameters required for uploading
- * data.
- *
+ * BasicUploadSettingsPanel allows to enter the basic parameters required for uploading data.
+ * @since 2599
  */
 public class BasicUploadSettingsPanel extends JPanel {
     public static final String HISTORY_KEY = "upload.comment.history";
@@ -55,19 +54,19 @@ public class BasicUploadSettingsPanel extends JPanel {
     protected JPanel buildUploadCommentPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
 
-        final JEditorPane commentLabel = new JMultilineLabel("<html><b>" + tr("Provide a brief comment for the changes you are uploading:"));
+        JEditorPane commentLabel = new JMultilineLabel("<html><b>" + tr("Provide a brief comment for the changes you are uploading:"));
         pnl.add(commentLabel, GBC.eol().insets(0, 5, 10, 3).fill(GBC.HORIZONTAL));
         hcbUploadComment.setToolTipText(tr("Enter an upload comment"));
-        hcbUploadComment.setMaxTextLength(Changeset.MAX_COMMENT_LENGTH);
+        hcbUploadComment.setMaxTextLength(Changeset.MAX_CHANGESET_TAG_LENGTH);
         List<String> cmtHistory = new LinkedList<>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
         Collections.reverse(cmtHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadComment.setPossibleItems(cmtHistory);
-        final CommentModelListener commentModelListener = new CommentModelListener(hcbUploadComment, changesetCommentModel);
+        CommentModelListener commentModelListener = new CommentModelListener(hcbUploadComment, changesetCommentModel);
         hcbUploadComment.getEditor().addActionListener(commentModelListener);
         hcbUploadComment.getEditor().getEditorComponent().addFocusListener(commentModelListener);
         pnl.add(hcbUploadComment, GBC.eol().fill(GBC.HORIZONTAL));
 
-        final JEditorPane sourceLabel = new JMultilineLabel("<html><b>" + tr("Specify the data source for the changes")
+        JEditorPane sourceLabel = new JMultilineLabel("<html><b>" + tr("Specify the data source for the changes")
                 + "</b> (<a href=\"urn:changeset-source\">" + tr("obtain from current layers") + "</a>)<b>:</b>");
         sourceLabel.addHyperlinkListener(new HyperlinkListener() {
             @Override
@@ -82,10 +81,12 @@ public class BasicUploadSettingsPanel extends JPanel {
         pnl.add(sourceLabel, GBC.eol().insets(0, 8, 10, 3).fill(GBC.HORIZONTAL));
 
         hcbUploadSource.setToolTipText(tr("Enter a source"));
-        List<String> sourceHistory = new LinkedList<>(Main.pref.getCollection(SOURCE_HISTORY_KEY, Arrays.asList("knowledge", "survey", "Bing")));
+        hcbUploadSource.setMaxTextLength(Changeset.MAX_CHANGESET_TAG_LENGTH);
+        List<String> sourceHistory = new LinkedList<>(Main.pref.getCollection(SOURCE_HISTORY_KEY,
+                Arrays.asList("knowledge", "survey", "Bing")));
         Collections.reverse(sourceHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadSource.setPossibleItems(sourceHistory);
-        final CommentModelListener sourceModelListener = new CommentModelListener(hcbUploadSource, changesetSourceModel);
+        CommentModelListener sourceModelListener = new CommentModelListener(hcbUploadSource, changesetSourceModel);
         hcbUploadSource.getEditor().addActionListener(sourceModelListener);
         hcbUploadSource.getEditor().getEditorComponent().addFocusListener(sourceModelListener);
         pnl.add(hcbUploadSource, GBC.eol().fill(GBC.HORIZONTAL));
diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java
index 12929e8..37fcade 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java
@@ -1,96 +1,96 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.layer;
-
-import org.openstreetmap.josm.gui.io.AbstractIOTask;
-import org.openstreetmap.josm.gui.io.AbstractUploadDialog;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-
-/**
- * A modifiable layer.
- * @since 7358
- */
-public abstract class AbstractModifiableLayer extends Layer {
-
-    /**
-     * Constructs a new {@code ModifiableLayer}.
-     * @param name Layer name
-     */
-    public AbstractModifiableLayer(String name) {
-        super(name);
-    }
-
-    /**
-     * Determines if the data managed by this layer needs to be uploaded to
-     * the server because it contains modified data.
-     *
-     * @return true if the data managed by this layer needs to be uploaded to
-     * the server because it contains modified data; false, otherwise
-     */
-    public boolean requiresUploadToServer() {
-        // Override if needed
-        return false;
-    }
-
-    /**
-     * Determines if the data managed by this layer needs to be saved to
-     * a file. Only replies true if a file is assigned to this layer and
-     * if the data managed by this layer has been modified since the last
-     * save operation to the file.
-     *
-     * @return true if the data managed by this layer needs to be saved to a file
-     */
-    public boolean requiresSaveToFile() {
-        // Override if needed
-        return false;
-    }
-
-    /**
-     * Determines if upload of data managed by this layer is discouraged.
-     * This feature allows to use "private" data layers.
-     *
-     * @return true if upload is discouraged for this layer; false, otherwise
-     */
-    public boolean isUploadDiscouraged() {
-        // Override if needed
-        return false;
-    }
-
-    /**
-     * Determines if data managed by this layer has been modified.
-     * @return true if data has been modified; false, otherwise
-     */
-    public abstract boolean isModified();
-
-    /**
-     * Initializes the layer after a successful save of data to a file.
-     */
-    public void onPostSaveToFile() {
-        // Override if needed
-    }
-
-    /**
-     * Initializes the layer after a successful upload to the server.
-     */
-    public void onPostUploadToServer() {
-        // Override if needed
-    }
-
-    /**
-     * Creates a new {@code AbstractIOTask} for uploading data.
-     * @param monitor The progress monitor
-     * @return a new {@code AbstractIOTask} for uploading data, or {@code null} if not applicable
-     */
-    public AbstractIOTask createUploadTask(ProgressMonitor monitor) {
-        // Override if needed
-        return null;
-    }
-
-    /**
-     * Returns the upload dialog for this layer.
-     * @return the upload dialog for this layer, or {@code null} if not applicable
-     */
-    public AbstractUploadDialog getUploadDialog() {
-        // Override if needed
-        return null;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import org.openstreetmap.josm.gui.io.AbstractIOTask;
+import org.openstreetmap.josm.gui.io.AbstractUploadDialog;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+/**
+ * A modifiable layer.
+ * @since 7358
+ */
+public abstract class AbstractModifiableLayer extends Layer {
+
+    /**
+     * Constructs a new {@code ModifiableLayer}.
+     * @param name Layer name
+     */
+    public AbstractModifiableLayer(String name) {
+        super(name);
+    }
+
+    /**
+     * Determines if the data managed by this layer needs to be uploaded to
+     * the server because it contains modified data.
+     *
+     * @return true if the data managed by this layer needs to be uploaded to
+     * the server because it contains modified data; false, otherwise
+     */
+    public boolean requiresUploadToServer() {
+        // Override if needed
+        return false;
+    }
+
+    /**
+     * Determines if the data managed by this layer needs to be saved to
+     * a file. Only replies true if a file is assigned to this layer and
+     * if the data managed by this layer has been modified since the last
+     * save operation to the file.
+     *
+     * @return true if the data managed by this layer needs to be saved to a file
+     */
+    public boolean requiresSaveToFile() {
+        // Override if needed
+        return false;
+    }
+
+    /**
+     * Determines if upload of data managed by this layer is discouraged.
+     * This feature allows to use "private" data layers.
+     *
+     * @return true if upload is discouraged for this layer; false, otherwise
+     */
+    public boolean isUploadDiscouraged() {
+        // Override if needed
+        return false;
+    }
+
+    /**
+     * Determines if data managed by this layer has been modified.
+     * @return true if data has been modified; false, otherwise
+     */
+    public abstract boolean isModified();
+
+    /**
+     * Initializes the layer after a successful save of data to a file.
+     */
+    public void onPostSaveToFile() {
+        // Override if needed
+    }
+
+    /**
+     * Initializes the layer after a successful upload to the server.
+     */
+    public void onPostUploadToServer() {
+        // Override if needed
+    }
+
+    /**
+     * Creates a new {@code AbstractIOTask} for uploading data.
+     * @param monitor The progress monitor
+     * @return a new {@code AbstractIOTask} for uploading data, or {@code null} if not applicable
+     */
+    public AbstractIOTask createUploadTask(ProgressMonitor monitor) {
+        // Override if needed
+        return null;
+    }
+
+    /**
+     * Returns the upload dialog for this layer.
+     * @return the upload dialog for this layer, or {@code null} if not applicable
+     */
+    public AbstractUploadDialog getUploadDialog() {
+        // Override if needed
+        return null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
index 543f41f..cdc437f 100644
--- a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
@@ -111,20 +111,14 @@ public class TMSLayer extends ImageryLayer implements ImageObserver, TileLoaderL
     public static final IntegerProperty PROP_TMS_JOBS = new IntegerProperty("tmsloader.maxjobs", 25);
     public static final StringProperty PROP_TILECACHE_DIR;
 
-    private static final boolean newcache = Main.pref.getBoolean("tms.newcache");
-
     static {
         String defPath = null;
         try {
-            if (newcache) {
-                defPath = new File(Main.pref.getCacheDirectory(), "tms").getAbsolutePath();
-            } else {
-                defPath = OsmFileCacheTileLoader.getDefaultCacheDir().getAbsolutePath();
-            }
+            defPath = new File(Main.pref.getCacheDirectory(), "tms").getAbsolutePath();
         } catch (SecurityException e) {
             Main.warn(e);
         }
-        PROP_TILECACHE_DIR = new StringProperty(PREFERENCE_PREFIX + (newcache ? ".tilecache" : ".tilecache_path"), defPath);
+        PROP_TILECACHE_DIR = new StringProperty(PREFERENCE_PREFIX + ".tilecache", defPath);
     }
 
     public interface TileLoaderFactory {
@@ -142,11 +136,7 @@ public class TMSLayer extends ImageryLayer implements ImageObserver, TileLoaderL
             if (cachePath != null && !cachePath.isEmpty()) {
                 try {
                     OsmFileCacheTileLoader loader;
-                    if (newcache) {
-                        loader = new TMSFileCacheTileLoader(listener, new File(cachePath));
-                    } else {
-                        loader = new OsmFileCacheTileLoader(listener, new File(cachePath));
-                    }
+                    loader = new TMSFileCacheTileLoader(listener, new File(cachePath));
                     loader.headers.put("User-Agent", Version.getInstance().getFullAgentString());
                     return loader;
                 } catch (IOException e) {
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
index 285a178..608dbc4 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
@@ -727,7 +727,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                     Main.pref.put("geoimage.showThumbs", yLayer.useThumbs);
 
                     yLayer.useThumbs = cbShowThumbs.isSelected();
-                    yLayer.loadThumbs();
+                    yLayer.startLoadThumbs();
 
                     // Search whether an other layer has yet defined some bounding box.
                     // If none, we'll zoom to the bounding box of the layer with the photos.
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
index aa4e2c0..711a53f 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.AlphaComposite;
+import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Composite;
 import java.awt.Dimension;
@@ -12,12 +13,10 @@ import java.awt.Graphics2D;
 import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.RenderingHints;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.image.BufferedImage;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
-import java.awt.Toolkit;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
@@ -35,6 +34,9 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.TimeZone;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
 
 import javax.swing.Action;
 import javax.swing.Icon;
@@ -64,6 +66,7 @@ import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToMarkerLayer;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToNextMarker;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ExifReader;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
@@ -90,8 +93,17 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
     private int currentPhoto = -1;
 
     boolean useThumbs = false;
+    ExecutorService thumbsLoaderExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
+        @Override
+        public Thread newThread(Runnable r) {
+            Thread t = new Thread(r);
+            t.setPriority(Thread.MIN_PRIORITY);
+            return t;
+        }
+    });
     ThumbsLoader thumbsloader;
-    boolean thumbsLoaded = false;
+    boolean thumbsLoaderRunning = false;
+    volatile boolean thumbsLoaded = false;
     private BufferedImage offscreenBuffer;
     boolean updateOffscreenBuffer = true;
 
@@ -328,6 +340,7 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
         entries.add(new RenameLayerAction(null, this));
         entries.add(SeparatorLayerAction.INSTANCE);
         entries.add(new CorrelateGpxWithImages(this));
+        entries.add(new ShowThumbnailAction(this));
         if (!menuAdditions.isEmpty()) {
             entries.add(SeparatorLayerAction.INSTANCE);
             entries.addAll(menuAdditions);
@@ -370,10 +383,12 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
     public void mergeFrom(Layer from) {
         GeoImageLayer l = (GeoImageLayer) from;
 
-        ImageEntry selected = null;
-        if (l.currentPhoto >= 0) {
-            selected = l.data.get(l.currentPhoto);
-        }
+        // Stop to load thumbnails on both layers.  Thumbnail loading will continue the next time
+        // the layer is painted.
+        stopLoadThumbs();
+        l.stopLoadThumbs();
+
+        final ImageEntry selected = l.currentPhoto >= 0 ? l.data.get(l.currentPhoto) : null;
 
         data.addAll(l.data);
         Collections.sort(data);
@@ -392,14 +407,19 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
             }
         }
 
-        if (selected != null) {
-            for (int i = 0; i < data.size() ; i++) {
-                if (data.get(i) == selected) {
-                    currentPhoto = i;
-                    ImageViewerDialog.showImage(GeoImageLayer.this, data.get(i));
-                    break;
+        if (selected != null && !data.isEmpty()) {
+            GuiHelper.runInEDTAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    for (int i = 0; i < data.size() ; i++) {
+                        if (selected.equals(data.get(i))) {
+                            currentPhoto = i;
+                            ImageViewerDialog.showImage(GeoImageLayer.this, data.get(i));
+                            break;
+                        }
+                    }
                 }
-            }
+            });
         }
 
         setName(l.getName());
@@ -437,7 +457,7 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
         Rectangle clip = g.getClipBounds();
         if (useThumbs) {
             if (!thumbsLoaded) {
-                loadThumbs();
+                startLoadThumbs();
             }
 
             if (null == offscreenBuffer || offscreenBuffer.getWidth() != width  // reuse the old buffer if possible
@@ -495,39 +515,55 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
             if (e.getPos() != null) {
                 Point p = mv.getPoint(e.getPos());
 
+                int imgWidth = 100;
+                int imgHeight = 100;
                 if (useThumbs && e.thumbnail != null) {
                     Dimension d = scaledDimension(e.thumbnail);
-                    g.setColor(new Color(128, 0, 0, 122));
-                    g.fillRect(p.x - d.width / 2, p.y - d.height / 2, d.width, d.height);
-                } else {
-                    if (e.getExifImgDir() != null) {
-                        double arrowlength = 25;
-                        double arrowwidth = 18;
-
-                        double dir = e.getExifImgDir();
-                        // Rotate 90 degrees CCW
-                        double headdir = ( dir < 90 ) ? dir + 270 : dir - 90;
-                        double leftdir = ( headdir < 90 ) ? headdir + 270 : headdir - 90;
-                        double rightdir = ( headdir > 270 ) ? headdir - 270 : headdir + 90;
-
-                        double ptx = p.x + Math.cos(Math.toRadians(headdir)) * arrowlength;
-                        double pty = p.y + Math.sin(Math.toRadians(headdir)) * arrowlength;
-
-                        double ltx = p.x + Math.cos(Math.toRadians(leftdir)) * arrowwidth/2;
-                        double lty = p.y + Math.sin(Math.toRadians(leftdir)) * arrowwidth/2;
-
-                        double rtx = p.x + Math.cos(Math.toRadians(rightdir)) * arrowwidth/2;
-                        double rty = p.y + Math.sin(Math.toRadians(rightdir)) * arrowwidth/2;
+                    imgWidth = d.width;
+                    imgHeight = d.height;
+                }
+                else {
+                    imgWidth = selectedIcon.getIconWidth();
+                    imgHeight = selectedIcon.getIconHeight();
+                }
 
-                        g.setColor(Color.white);
-                        int[] xar = {(int) ltx, (int) ptx, (int) rtx, (int) ltx};
-                        int[] yar = {(int) lty, (int) pty, (int) rty, (int) lty};
-                        g.fillPolygon(xar, yar, 4);
-                    }
+                if (e.getExifImgDir() != null) {
+                    // Multiplier must be larger than sqrt(2)/2=0.71.
+                    double arrowlength = Math.max(25, Math.max(imgWidth, imgHeight) * 0.85);
+                    double arrowwidth = arrowlength / 1.4;
+
+                    double dir = e.getExifImgDir();
+                    // Rotate 90 degrees CCW
+                    double headdir = ( dir < 90 ) ? dir + 270 : dir - 90;
+                    double leftdir = ( headdir < 90 ) ? headdir + 270 : headdir - 90;
+                    double rightdir = ( headdir > 270 ) ? headdir - 270 : headdir + 90;
+
+                    double ptx = p.x + Math.cos(Math.toRadians(headdir)) * arrowlength;
+                    double pty = p.y + Math.sin(Math.toRadians(headdir)) * arrowlength;
+
+                    double ltx = p.x + Math.cos(Math.toRadians(leftdir)) * arrowwidth/2;
+                    double lty = p.y + Math.sin(Math.toRadians(leftdir)) * arrowwidth/2;
+
+                    double rtx = p.x + Math.cos(Math.toRadians(rightdir)) * arrowwidth/2;
+                    double rty = p.y + Math.sin(Math.toRadians(rightdir)) * arrowwidth/2;
+
+                    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+                    g.setColor(new Color(255, 255, 255, 192));
+                    int[] xar = {(int) ltx, (int) ptx, (int) rtx, (int) ltx};
+                    int[] yar = {(int) lty, (int) pty, (int) rty, (int) lty};
+                    g.fillPolygon(xar, yar, 4);
+                    g.setColor(Color.black);
+                    g.setStroke(new BasicStroke(1.2f));
+                    g.drawPolyline(xar, yar, 3);
+                }
 
+                if (useThumbs && e.thumbnail != null) {
+                    g.setColor(new Color(128, 0, 0, 122));
+                    g.fillRect(p.x - imgWidth / 2, p.y - imgHeight / 2, imgWidth, imgHeight);
+                } else {
                     selectedIcon.paintIcon(mv, g,
-                            p.x - selectedIcon.getIconWidth() / 2,
-                            p.y - selectedIcon.getIconHeight() / 2);
+                            p.x - imgWidth / 2,
+                            p.y - imgHeight / 2);
 
                 }
             }
@@ -578,6 +614,24 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
         }
 
         try {
+            double speed = dirGps.getDouble(GpsDirectory.TAG_GPS_SPEED);
+            String speedRef = dirGps.getString(GpsDirectory.TAG_GPS_SPEED_REF);
+            if (speedRef != null) {
+                if (speedRef.equalsIgnoreCase("M")) {
+                    // miles per hour
+                    speed *= 1.609344;
+                } else if (speedRef.equalsIgnoreCase("N")) {
+                    // knots == nautical miles per hour
+                    speed *= 1.852;
+                }
+                // default is K (km/h)
+            }
+            e.setSpeed(speed);
+        } catch (Exception ex) {
+            Main.debug(ex.getMessage());
+        }
+
+        try {
             double ele = dirGps.getDouble(GpsDirectory.TAG_GPS_ALTITUDE);
             int d = dirGps.getInt(GpsDirectory.TAG_GPS_ALTITUDE_REF);
             if (d == 1) {
@@ -952,9 +1006,7 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
             @Override
             public void layerRemoved(Layer oldLayer) {
                 if (oldLayer == GeoImageLayer.this) {
-                    if (thumbsloader != null) {
-                        thumbsloader.stop = true;
-                    }
+                    stopLoadThumbs();
                     Main.map.mapView.removeMouseListener(mouseAdapter);
                     MapFrame.removeMapModeChangeListener(mapModeListener);
                     currentPhoto = -1;
@@ -980,16 +1032,40 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
         }
     }
 
-    public void loadThumbs() {
-        if (useThumbs && !thumbsLoaded) {
-            thumbsLoaded = true;
+    /**
+     * Start to load thumbnails.
+     */
+    public synchronized void startLoadThumbs() {
+        if (useThumbs && !thumbsLoaded && !thumbsLoaderRunning) {
+            stopLoadThumbs();
             thumbsloader = new ThumbsLoader(this);
-            Thread t = new Thread(thumbsloader);
-            t.setPriority(Thread.MIN_PRIORITY);
-            t.start();
+            thumbsLoaderExecutor.submit(thumbsloader);
+            thumbsLoaderRunning = true;
         }
     }
 
+    /**
+     * Stop to load thumbnails.
+     *
+     * Can be called at any time to make sure that the
+     * thumbnail loader is stopped.
+     */
+    public synchronized void stopLoadThumbs() {
+        if (thumbsloader != null) {
+            thumbsloader.stop = true;
+        }
+        thumbsLoaderRunning = false;
+    }
+
+    /**
+     * Called to signal that the loading of thumbnails has finished.
+     *
+     * Usually called from {@link ThumbsLoader} in another thread.
+     */
+    public void thumbsLoaded() {
+        thumbsLoaded = true;
+    }
+
     public void updateBufferAndRepaint() {
         updateOffscreenBuffer = true;
         Main.map.mapView.repaint();
@@ -1039,7 +1115,9 @@ public class GeoImageLayer extends Layer implements PropertyChangeListener, Jump
     public void setUseThumbs(boolean useThumbs) {
         this.useThumbs = useThumbs;
         if (useThumbs && !thumbsLoaded) {
-            loadThumbs();
+            startLoadThumbs();
+        } else if (!useThumbs) {
+            stopLoadThumbs();
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
index c8a078b..bbd58d8 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
@@ -26,6 +26,7 @@ import java.io.File;
 import javax.swing.JComponent;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ExifReader;
 
 public class ImageDisplay extends JComponent {
 
@@ -102,37 +103,17 @@ public class ImageDisplay extends JComponent {
                     final int w = (int) visibleRect.getWidth();
                     final int h = (int) visibleRect.getHeight();
 
-                    outer: {
-                        final int hh, ww, q;
-                        final double ax, ay;
-                        switch (orientation) {
-                        case 8:
-                            q = -1;
-                            ax = w / 2;
-                            ay = w / 2;
+                    if (ExifReader.orientationNeedsCorrection(orientation)) {
+                        final int hh, ww;
+                        if (ExifReader.orientationSwitchesDimensions(orientation)) {
                             ww = h;
                             hh = w;
-                            break;
-                        case 3:
-                            q = 2;
-                            ax = w / 2;
-                            ay = h / 2;
+                        } else {
                             ww = w;
                             hh = h;
-                            break;
-                        case 6:
-                            q = 1;
-                            ax = h / 2;
-                            ay = h / 2;
-                            ww = h;
-                            hh = w;
-                            break;
-                        default:
-                            break outer;
                         }
-
                         final BufferedImage rot = new BufferedImage(ww, hh, BufferedImage.TYPE_INT_RGB);
-                        final AffineTransform xform = AffineTransform.getQuadrantRotateInstance(q, ax, ay);
+                        final AffineTransform xform = ExifReader.getRestoreOrientationTransform(orientation, w, h);
                         final Graphics2D g = rot.createGraphics();
                         g.drawImage(image, xform, null);
                         g.dispose();
@@ -468,6 +449,7 @@ public class ImageDisplay extends JComponent {
 
     public void setOsdText(String text) {
         this.osdText = text;
+        repaint();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
index c4990e7..e00de28 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
@@ -32,7 +32,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
      * or extracted from the image EXIF data.
      */
     private CachedLatLon pos;
-    /** Speed in kilometer per second */
+    /** Speed in kilometer per hour */
     private Double speed;
     /** Elevation (altitude) in meters */
     private Double elevation;
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
index 67a9d1d..02e820f 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
@@ -302,7 +302,7 @@ public final class ImageViewerDialog extends ToggleDialog implements LayerChange
                 osd.append(tr("\nAltitude: {0} m", entry.getElevation().longValue()));
             }
             if (entry.getSpeed() != null) {
-                osd.append(tr("\n{0} km/h", Math.round(entry.getSpeed())));
+                osd.append(tr("\nSpeed: {0} km/h", Math.round(entry.getSpeed())));
             }
             if (entry.getExifImgDir() != null) {
                 osd.append(tr("\nDirection {0}\u00b0", Math.round(entry.getExifImgDir())));
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java
new file mode 100644
index 0000000..2bb7da1
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java
@@ -0,0 +1,69 @@
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.layer.geoimage;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.List;
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBoxMenuItem;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Toggle the image display between thumbnails and symbols.
+ * @since 7935
+ */
+public class ShowThumbnailAction extends AbstractAction implements LayerAction {
+
+    private final GeoImageLayer layer;
+
+    /**
+     * Constructs a new {@code ToggleGeoImageThumbAction} action.
+     * @param layer image layer
+     */
+    public ShowThumbnailAction(GeoImageLayer layer) {
+        super(tr("Show thumbnails"), ImageProvider.get("dialogs/geoimage/togglegit"));
+        putValue(SHORT_DESCRIPTION, tr("Show image thumbnails instead of icons."));
+        this.layer = layer;
+    }
+
+    /**
+     * This is called after the menu entry was selected.
+     * @param arg0 action event
+     */
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        layer.setUseThumbs(!layer.isUseThumbs());
+        Main.map.mapView.repaint();
+    }
+
+    /**
+     * Check if there is any suitable image to be toggled.
+     * @param layer image layer
+     * @return {@code true} if there are images to be toggled,
+     *         {@code false} otherwise
+     */
+    private static boolean enabled(GeoImageLayer layer) {
+        return !layer.data.isEmpty();
+    }
+
+    /** Create actual menu entry and define if it is enabled or not. */
+    @Override
+    public Component createMenuComponent() {
+        JCheckBoxMenuItem toggleItem = new JCheckBoxMenuItem(this);
+        toggleItem.setEnabled(enabled(layer));
+        toggleItem.setState(layer.isUseThumbs());
+        return toggleItem;
+    }
+
+    /** Check if the current layer is supported. */
+    @Override
+    public boolean supportLayers(List<Layer> layers) {
+        return layers.size() == 1 && layers.get(0) instanceof GeoImageLayer;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
index 04fa16c..e3eb8f7 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
@@ -6,17 +6,19 @@ import java.awt.Image;
 import java.awt.MediaTracker;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
+import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.CacheFiles;
+import org.openstreetmap.josm.tools.ExifReader;
 
 public class ThumbsLoader implements Runnable {
     public static final int maxSize = 120;
     public static final int minSize = 22;
-    volatile boolean stop = false;
+    public volatile boolean stop = false;
     List<ImageEntry> data;
     GeoImageLayer layer;
     MediaTracker tracker;
@@ -50,6 +52,7 @@ public class ThumbsLoader implements Runnable {
                 }
             }
         }
+        layer.thumbsLoaded();
         layer.updateOffscreenBuffer = true;
         Main.map.mapView.repaint();
     }
@@ -77,12 +80,29 @@ public class ThumbsLoader implements Runnable {
             Main.error(" Invalid image");
             return null;
         }
+
+        final int w = img.getWidth(null);
+        final int h = img.getHeight(null);
+        final int hh, ww;
+        if (ExifReader.orientationSwitchesDimensions(entry.getExifOrientation())) {
+            ww = h;
+            hh = w;
+        } else {
+            ww = w;
+            hh = h;
+        }
+
         Rectangle targetSize = ImageDisplay.calculateDrawImageRectangle(
-                new Rectangle(0, 0, img.getWidth(null), img.getHeight(null)),
+                new Rectangle(0, 0, ww, hh),
                 new Rectangle(0, 0, maxSize, maxSize));
         BufferedImage scaledBI = new BufferedImage(targetSize.width, targetSize.height, BufferedImage.TYPE_INT_RGB);
         Graphics2D g = scaledBI.createGraphics();
-        while (!g.drawImage(img, 0, 0, targetSize.width, targetSize.height, null)) {
+
+        final AffineTransform restoreOrientation = ExifReader.getRestoreOrientationTransform(entry.getExifOrientation(), w, h);
+        final AffineTransform scale = AffineTransform.getScaleInstance((double) targetSize.width / ww, (double) targetSize.height / hh);
+        scale.concatenate(restoreOrientation);
+
+        while (!g.drawImage(img, scale, null)) {
             try {
                 Thread.sleep(10);
             } catch(InterruptedException ie) {
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java b/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
index 103fada..e6607f4 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
@@ -1,137 +1,137 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.layer.gpx;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Component;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import javax.swing.JCheckBox;
-import javax.swing.JPanel;
-import javax.swing.Timer;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
-import org.openstreetmap.josm.gui.widgets.DateEditorWithSlider;
-import org.openstreetmap.josm.tools.GBC;
-
-public class DateFilterPanel extends JPanel {
-    DateEditorWithSlider dateFrom = new DateEditorWithSlider(tr("From"));
-    DateEditorWithSlider dateTo = new DateEditorWithSlider(tr("To"));
-    JCheckBox noTimestampCb  = new JCheckBox(tr("No timestamp"));
-    GpxLayer layer;
-    
-    ActionListener filterAppliedListener;
-    
-    final String PREF_DATE_0;
-    final String PREF_DATE_MIN;
-    final String PREF_DATE_MAX;
-
-    /**
-     * Create the panel to filter tracks on GPX layer @param layer by date
-     * Preferences will be stored in @param preferencePrefix
-     * If @param enabled = true, the the panel is created as active and filtering occurs immediately.
-     */
-    public DateFilterPanel(GpxLayer layer, String preferencePrefix, boolean enabled) {
-        super(new GridBagLayout());
-        PREF_DATE_0 = preferencePrefix+".showzerotimestamp";
-        PREF_DATE_MIN = preferencePrefix+".mintime";
-        PREF_DATE_MAX = preferencePrefix+".maxtime";
-        this.layer = layer;
-        
-        final Date startTime, endTime;
-        Date[] bounds = layer.data.getMinMaxTimeForAllTracks();
-        startTime = (bounds==null) ? new GregorianCalendar(2000, 1, 1).getTime():bounds[0];
-        endTime = (bounds==null) ? new Date() : bounds[1];
-                
-        dateFrom.setDate(startTime); 
-        dateTo.setDate(endTime);
-        dateFrom.setRange(startTime, endTime); 
-        dateTo.setRange(startTime, endTime); 
-        
-        add(noTimestampCb, GBC.std().grid(1,1).insets(0, 0, 5, 0));
-        add(dateFrom, GBC.std().grid(2,1).fill(GBC.HORIZONTAL));
-        add(dateTo, GBC.eol().grid(3,1).fill(GBC.HORIZONTAL));
-        
-        setEnabled(enabled);
-        
-        dateFrom.addDateListener(changeListener);
-        dateTo.addDateListener(changeListener);
-        noTimestampCb.addChangeListener(changeListener);
-    }
-    
-    private ChangeListener changeListener = new ChangeListener() {
-        @Override public void stateChanged(ChangeEvent e) {
-            if (isEnabled()) applyFilterWithDelay();
-        }
-    };
-    
-    private Timer t = new Timer(200 , new ActionListener() {
-        @Override  public void actionPerformed(ActionEvent e) {
-            applyFilter();
-        }
-    });
-    
-    /**
-     * Do filtering but little bit later (to reduce cpu load)
-     */
-    public void applyFilterWithDelay() {
-        if (t.isRunning()) {
-            t.restart();
-        } else {
-            t.start();
-        }
-    }
-    
-    public void applyFilter() {
-        t.stop();
-        filterTracksByDate();
-        if (filterAppliedListener!=null)
-           filterAppliedListener.actionPerformed(null);
-    }
-    
-    /**
-     * Called by other components when it is correct time to save date filtering parameters
-     */
-    public void saveInPrefs() {
-        Main.pref.putLong(PREF_DATE_MIN, dateFrom.getDate().getTime());
-        Main.pref.putLong(PREF_DATE_MAX, dateTo.getDate().getTime());
-        Main.pref.put(PREF_DATE_0, noTimestampCb.isSelected());
-    }
-
-    /**
-     * If possible, load date ragne and "zero timestamp" option from preferences
-     * Called by other components when it is needed.
-     */
-    public void loadFromPrefs() {
-        long t1 =Main.pref.getLong(PREF_DATE_MIN, 0);
-        if (t1!=0) dateFrom.setDate(new Date(t1));
-        long t2 =Main.pref.getLong(PREF_DATE_MAX, 0);
-        if (t2!=0) dateTo.setDate(new Date(t2));
-        noTimestampCb.setSelected(Main.pref.getBoolean(PREF_DATE_0, false));
-    }
-
-    public void setFilterAppliedListener(ActionListener filterAppliedListener) {
-        this.filterAppliedListener = filterAppliedListener;
-    }
-    
-    private void filterTracksByDate() {
-        Date from = dateFrom.getDate();
-        Date to = dateTo.getDate();
-        layer.filterTracksByDate(from, to, noTimestampCb.isSelected());
-    }
-
-    @Override
-    public final void setEnabled(boolean enabled) {
-        super.setEnabled(enabled); 
-        for (Component c: getComponents()) {
-            c.setEnabled(enabled);
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.layer.gpx;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+import javax.swing.Timer;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.widgets.DateEditorWithSlider;
+import org.openstreetmap.josm.tools.GBC;
+
+public class DateFilterPanel extends JPanel {
+    DateEditorWithSlider dateFrom = new DateEditorWithSlider(tr("From"));
+    DateEditorWithSlider dateTo = new DateEditorWithSlider(tr("To"));
+    JCheckBox noTimestampCb  = new JCheckBox(tr("No timestamp"));
+    GpxLayer layer;
+    
+    ActionListener filterAppliedListener;
+    
+    final String PREF_DATE_0;
+    final String PREF_DATE_MIN;
+    final String PREF_DATE_MAX;
+
+    /**
+     * Create the panel to filter tracks on GPX layer @param layer by date
+     * Preferences will be stored in @param preferencePrefix
+     * If @param enabled = true, the the panel is created as active and filtering occurs immediately.
+     */
+    public DateFilterPanel(GpxLayer layer, String preferencePrefix, boolean enabled) {
+        super(new GridBagLayout());
+        PREF_DATE_0 = preferencePrefix+".showzerotimestamp";
+        PREF_DATE_MIN = preferencePrefix+".mintime";
+        PREF_DATE_MAX = preferencePrefix+".maxtime";
+        this.layer = layer;
+        
+        final Date startTime, endTime;
+        Date[] bounds = layer.data.getMinMaxTimeForAllTracks();
+        startTime = (bounds==null) ? new GregorianCalendar(2000, 1, 1).getTime():bounds[0];
+        endTime = (bounds==null) ? new Date() : bounds[1];
+                
+        dateFrom.setDate(startTime); 
+        dateTo.setDate(endTime);
+        dateFrom.setRange(startTime, endTime); 
+        dateTo.setRange(startTime, endTime); 
+        
+        add(noTimestampCb, GBC.std().grid(1,1).insets(0, 0, 5, 0));
+        add(dateFrom, GBC.std().grid(2,1).fill(GBC.HORIZONTAL));
+        add(dateTo, GBC.eol().grid(3,1).fill(GBC.HORIZONTAL));
+        
+        setEnabled(enabled);
+        
+        dateFrom.addDateListener(changeListener);
+        dateTo.addDateListener(changeListener);
+        noTimestampCb.addChangeListener(changeListener);
+    }
+    
+    private ChangeListener changeListener = new ChangeListener() {
+        @Override public void stateChanged(ChangeEvent e) {
+            if (isEnabled()) applyFilterWithDelay();
+        }
+    };
+    
+    private Timer t = new Timer(200 , new ActionListener() {
+        @Override  public void actionPerformed(ActionEvent e) {
+            applyFilter();
+        }
+    });
+    
+    /**
+     * Do filtering but little bit later (to reduce cpu load)
+     */
+    public void applyFilterWithDelay() {
+        if (t.isRunning()) {
+            t.restart();
+        } else {
+            t.start();
+        }
+    }
+    
+    public void applyFilter() {
+        t.stop();
+        filterTracksByDate();
+        if (filterAppliedListener!=null)
+           filterAppliedListener.actionPerformed(null);
+    }
+    
+    /**
+     * Called by other components when it is correct time to save date filtering parameters
+     */
+    public void saveInPrefs() {
+        Main.pref.putLong(PREF_DATE_MIN, dateFrom.getDate().getTime());
+        Main.pref.putLong(PREF_DATE_MAX, dateTo.getDate().getTime());
+        Main.pref.put(PREF_DATE_0, noTimestampCb.isSelected());
+    }
+
+    /**
+     * If possible, load date ragne and "zero timestamp" option from preferences
+     * Called by other components when it is needed.
+     */
+    public void loadFromPrefs() {
+        long t1 =Main.pref.getLong(PREF_DATE_MIN, 0);
+        if (t1!=0) dateFrom.setDate(new Date(t1));
+        long t2 =Main.pref.getLong(PREF_DATE_MAX, 0);
+        if (t2!=0) dateTo.setDate(new Date(t2));
+        noTimestampCb.setSelected(Main.pref.getBoolean(PREF_DATE_0, false));
+    }
+
+    public void setFilterAppliedListener(ActionListener filterAppliedListener) {
+        this.filterAppliedListener = filterAppliedListener;
+    }
+    
+    private void filterTracksByDate() {
+        Date from = dateFrom.getDate();
+        Date to = dateTo.getDate();
+        layer.filterTracksByDate(from, to, noTimestampCb.isSelected());
+    }
+
+    @Override
+    public final void setEnabled(boolean enabled) {
+        super.setEnabled(enabled); 
+        for (Component c: getComponents()) {
+            c.setEnabled(enabled);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java
index bfe95f2..305f005 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java
@@ -1,195 +1,195 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.layer.gpx;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Panel displayed in "Download along..." dialogs
- * @since 6054
- */
-public class DownloadAlongPanel extends JPanel {
-
-    // Preferences keys
-    private final String prefOsm;
-    private final String prefGps;
-    private final String prefDist;
-    private final String prefArea;
-    private final String prefNear;
-
-    // Data types to download
-    private final JCheckBox cbDownloadOsmData;
-    private final JCheckBox cbDownloadGpxData;
-
-    private final JSpinner buffer;
-    private final JSpinner maxRect;
-    private final JList<String> downloadNear;
-
-    /**
-     * Constructs a new {@code DownloadPanel}.
-     * @param prefOsm Preference key determining if OSM data should be downloaded
-     * @param prefGps Preference key determining if GPS data should be downloaded
-     * @param prefDist Preference key determining maximum distance
-     * @param prefArea Preference key determining maximum area
-     * @param prefNear Preference key determining "near" parameter. Can be {@code null}
-     */
-    public DownloadAlongPanel(String prefOsm, String prefGps, String prefDist, String prefArea, String prefNear) {
-        super(new GridBagLayout());
-
-        this.prefOsm = prefOsm;
-        this.prefGps = prefGps;
-        this.prefDist = prefDist;
-        this.prefArea = prefArea;
-        this.prefNear = prefNear;
-
-        cbDownloadOsmData = new JCheckBox(tr("OpenStreetMap data"), Main.pref.getBoolean(prefOsm, true));
-        cbDownloadOsmData.setToolTipText(tr("Select to download OSM data."));
-        add(cbDownloadOsmData, GBC.std().insets(1,5,1,5));
-        cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"), Main.pref.getBoolean(prefGps, false));
-        cbDownloadGpxData.setToolTipText(tr("Select to download GPS traces."));
-        add(cbDownloadGpxData, GBC.eol().insets(5,5,1,5));
-
-        add(new JLabel(tr("Download everything within:")), GBC.std());
-        buffer = new JSpinner(new SpinnerNumberModel(50.0, 10.0, 5000.0, 1.0));
-        add(buffer, GBC.std().insets(5,5,5,5));
-        add(new JLabel(tr("meters")), GBC.eol());
-
-        add(new JLabel(tr("Maximum area per request:")), GBC.std());
-        maxRect = new JSpinner(new SpinnerNumberModel(20.0, 1.0, 25.0, 1.0)) {
-            @Override
-            public Dimension getPreferredSize() {
-                return buffer.getPreferredSize();
-            }
-        };
-        add(maxRect, GBC.std().insets(5,5,5,5));
-        add(new JLabel(tr("sq km")), GBC.eol());
-
-        if (prefNear != null) {
-            add(new JLabel(tr("Download near:")), GBC.eol());
-            downloadNear = new JList<>(new String[]{tr("track only"), tr("waypoints only"), tr("track and waypoints")});
-            downloadNear.setSelectedIndex(Main.pref.getInteger(prefNear, 0));
-            add(downloadNear, GBC.eol());
-        } else {
-            downloadNear = null;
-        }
-    }
-
-    /**
-     * Gets the maximum distance in meters
-     * @return The maximum distance, in meters
-     */
-    public final double getDistance() {
-        return (double) buffer.getValue();
-    }
-
-    /**
-     * Gets the maximum area in squared kilometers
-     * @return The maximum distance, in squared kilometers
-     */
-    public final double getArea() {
-        return (double) maxRect.getValue();
-    }
-
-    /**
-     * Gets the "download near" choosen value
-     * @return the "download near" choosen value (0: track only, 1: waypoints only, 2: both)
-     */
-    public final int getNear() {
-        return downloadNear.getSelectedIndex();
-    }
-
-    /**
-     * Replies true if the user selected to download OSM data
-     *
-     * @return true if the user selected to download OSM data
-     */
-    public boolean isDownloadOsmData() {
-        return cbDownloadOsmData.isSelected();
-    }
-
-    /**
-     * Replies true if the user selected to download GPX data
-     *
-     * @return true if the user selected to download GPX data
-     */
-    public boolean isDownloadGpxData() {
-        return cbDownloadGpxData.isSelected();
-    }
-
-    /**
-     * Remembers the current settings in the download panel
-     */
-    protected final void rememberSettings() {
-        Main.pref.put(prefOsm, isDownloadOsmData());
-        Main.pref.put(prefGps, isDownloadGpxData());
-        Main.pref.putDouble(prefDist, getDistance());
-        Main.pref.putDouble(prefArea, getArea());
-        if (prefNear != null) {
-            Main.pref.putInteger(prefNear, getNear());
-        }
-    }
-
-    /**
-     * Adds a change listener to comboboxes
-     * @param listener The listener that will be notified of each combobox change
-     */
-    protected final void addChangeListener(ChangeListener listener) {
-        cbDownloadGpxData.addChangeListener(listener);
-        cbDownloadOsmData.addChangeListener(listener);
-    }
-
-    /**
-     * Show this panel in a new "Download along" help-aware dialog
-     * @param title The dialog title
-     * @param helpTopic The dialog help topic
-     * @return The selected button index (0 for download, 1 for cancel, 2 for dialog closure)
-     */
-    public int showInDownloadDialog(String title, String helpTopic) {
-        final ButtonSpec[] options = new ButtonSpec[] {
-                new ButtonSpec(
-                        tr("Download"),
-                        ImageProvider.get("download"),
-                        tr("Click to download"),
-                        null // no specific help text
-                ),
-                new ButtonSpec(
-                        tr("Cancel"),
-                        ImageProvider.get("cancel"),
-                        tr("Click to cancel"),
-                        null // no specific help text
-                )
-        };
-
-        addChangeListener(new ChangeListener() {
-            @Override public void stateChanged(ChangeEvent e) {
-                options[0].setEnabled(isDownloadOsmData() || isDownloadGpxData());
-            }
-        });
-
-        int ret = HelpAwareOptionPane.showOptionDialog(Main.parent, this, title,
-                JOptionPane.QUESTION_MESSAGE, null, options, options[0], helpTopic);
-        if (0 == ret) {
-            rememberSettings();
-        }
-
-        return ret;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.gpx;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.HelpAwareOptionPane;
+import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Panel displayed in "Download along..." dialogs
+ * @since 6054
+ */
+public class DownloadAlongPanel extends JPanel {
+
+    // Preferences keys
+    private final String prefOsm;
+    private final String prefGps;
+    private final String prefDist;
+    private final String prefArea;
+    private final String prefNear;
+
+    // Data types to download
+    private final JCheckBox cbDownloadOsmData;
+    private final JCheckBox cbDownloadGpxData;
+
+    private final JSpinner buffer;
+    private final JSpinner maxRect;
+    private final JList<String> downloadNear;
+
+    /**
+     * Constructs a new {@code DownloadPanel}.
+     * @param prefOsm Preference key determining if OSM data should be downloaded
+     * @param prefGps Preference key determining if GPS data should be downloaded
+     * @param prefDist Preference key determining maximum distance
+     * @param prefArea Preference key determining maximum area
+     * @param prefNear Preference key determining "near" parameter. Can be {@code null}
+     */
+    public DownloadAlongPanel(String prefOsm, String prefGps, String prefDist, String prefArea, String prefNear) {
+        super(new GridBagLayout());
+
+        this.prefOsm = prefOsm;
+        this.prefGps = prefGps;
+        this.prefDist = prefDist;
+        this.prefArea = prefArea;
+        this.prefNear = prefNear;
+
+        cbDownloadOsmData = new JCheckBox(tr("OpenStreetMap data"), Main.pref.getBoolean(prefOsm, true));
+        cbDownloadOsmData.setToolTipText(tr("Select to download OSM data."));
+        add(cbDownloadOsmData, GBC.std().insets(1,5,1,5));
+        cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"), Main.pref.getBoolean(prefGps, false));
+        cbDownloadGpxData.setToolTipText(tr("Select to download GPS traces."));
+        add(cbDownloadGpxData, GBC.eol().insets(5,5,1,5));
+
+        add(new JLabel(tr("Download everything within:")), GBC.std());
+        buffer = new JSpinner(new SpinnerNumberModel(50.0, 10.0, 5000.0, 1.0));
+        add(buffer, GBC.std().insets(5,5,5,5));
+        add(new JLabel(tr("meters")), GBC.eol());
+
+        add(new JLabel(tr("Maximum area per request:")), GBC.std());
+        maxRect = new JSpinner(new SpinnerNumberModel(20.0, 1.0, 25.0, 1.0)) {
+            @Override
+            public Dimension getPreferredSize() {
+                return buffer.getPreferredSize();
+            }
+        };
+        add(maxRect, GBC.std().insets(5,5,5,5));
+        add(new JLabel(tr("sq km")), GBC.eol());
+
+        if (prefNear != null) {
+            add(new JLabel(tr("Download near:")), GBC.eol());
+            downloadNear = new JList<>(new String[]{tr("track only"), tr("waypoints only"), tr("track and waypoints")});
+            downloadNear.setSelectedIndex(Main.pref.getInteger(prefNear, 0));
+            add(downloadNear, GBC.eol());
+        } else {
+            downloadNear = null;
+        }
+    }
+
+    /**
+     * Gets the maximum distance in meters
+     * @return The maximum distance, in meters
+     */
+    public final double getDistance() {
+        return (double) buffer.getValue();
+    }
+
+    /**
+     * Gets the maximum area in squared kilometers
+     * @return The maximum distance, in squared kilometers
+     */
+    public final double getArea() {
+        return (double) maxRect.getValue();
+    }
+
+    /**
+     * Gets the "download near" choosen value
+     * @return the "download near" choosen value (0: track only, 1: waypoints only, 2: both)
+     */
+    public final int getNear() {
+        return downloadNear.getSelectedIndex();
+    }
+
+    /**
+     * Replies true if the user selected to download OSM data
+     *
+     * @return true if the user selected to download OSM data
+     */
+    public boolean isDownloadOsmData() {
+        return cbDownloadOsmData.isSelected();
+    }
+
+    /**
+     * Replies true if the user selected to download GPX data
+     *
+     * @return true if the user selected to download GPX data
+     */
+    public boolean isDownloadGpxData() {
+        return cbDownloadGpxData.isSelected();
+    }
+
+    /**
+     * Remembers the current settings in the download panel
+     */
+    protected final void rememberSettings() {
+        Main.pref.put(prefOsm, isDownloadOsmData());
+        Main.pref.put(prefGps, isDownloadGpxData());
+        Main.pref.putDouble(prefDist, getDistance());
+        Main.pref.putDouble(prefArea, getArea());
+        if (prefNear != null) {
+            Main.pref.putInteger(prefNear, getNear());
+        }
+    }
+
+    /**
+     * Adds a change listener to comboboxes
+     * @param listener The listener that will be notified of each combobox change
+     */
+    protected final void addChangeListener(ChangeListener listener) {
+        cbDownloadGpxData.addChangeListener(listener);
+        cbDownloadOsmData.addChangeListener(listener);
+    }
+
+    /**
+     * Show this panel in a new "Download along" help-aware dialog
+     * @param title The dialog title
+     * @param helpTopic The dialog help topic
+     * @return The selected button index (0 for download, 1 for cancel, 2 for dialog closure)
+     */
+    public int showInDownloadDialog(String title, String helpTopic) {
+        final ButtonSpec[] options = new ButtonSpec[] {
+                new ButtonSpec(
+                        tr("Download"),
+                        ImageProvider.get("download"),
+                        tr("Click to download"),
+                        null // no specific help text
+                ),
+                new ButtonSpec(
+                        tr("Cancel"),
+                        ImageProvider.get("cancel"),
+                        tr("Click to cancel"),
+                        null // no specific help text
+                )
+        };
+
+        addChangeListener(new ChangeListener() {
+            @Override public void stateChanged(ChangeEvent e) {
+                options[0].setEnabled(isDownloadOsmData() || isDownloadGpxData());
+            }
+        });
+
+        int ret = HelpAwareOptionPane.showOptionDialog(Main.parent, this, title,
+                JOptionPane.QUESTION_MESSAGE, null, options, options[0], helpTopic);
+        if (0 == ret) {
+            rememberSettings();
+        }
+
+        return ret;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
index e69deed..8938bcf 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
@@ -1,547 +1,547 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.layer.gpx;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.RenderingHints;
-import java.awt.Stroke;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.gpx.GpxConstants;
-import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.gui.MapView;
-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 {
-    private GpxData data;
-
-    // draw lines between points belonging to different segments
-    private boolean forceLines;
-    // draw direction arrows on the lines
-    private boolean direction;
-    /** don't draw lines if longer than x meters **/
-    private int lineWidth;
-    private int maxLineLength;
-    private boolean lines;
-    /** paint large dots for points **/
-    private boolean large;
-    private int largesize;
-    private boolean hdopCircle;
-    /** paint direction arrow with alternate math. may be faster **/
-    private boolean alternateDirection;
-    /** don't draw arrows nearer to each other than this **/
-    private int delta;
-    private double minTrackDurationForTimeColoring;
-
-    private int hdopfactor;
-
-    private static final double PHI = Math.toRadians(15);
-
-    //// Variables used only to check cache validity
-    private boolean computeCacheInSync = false;
-    private int computeCacheMaxLineLengthUsed;
-    private Color computeCacheColorUsed;
-    private boolean computeCacheColorDynamic;
-    private ColorMode computeCacheColored;
-    private int computeCacheColorTracksTune;
-
-    //// Color-related fields
-    /** Mode of the line coloring **/
-    private ColorMode colored;
-    /** max speed for coloring - allows to tweak line coloring for different speed levels. **/
-    private int colorTracksTune;
-    private boolean colorModeDynamic;
-    private Color neutralColor;
-    private int largePointAlpha;
-
-    // default access is used to allow changing from plugins
-    ColorScale velocityScale;
-    /** Colors (without custom alpha channel, if given) for HDOP painting. **/
-    ColorScale hdopScale;
-    ColorScale dateScale;
-    ColorScale directionScale;
-
-    /** Opacity for hdop points **/
-    private int hdopAlpha;
-
-
-    // lookup array to draw arrows without doing any math
-    private static final int ll0 = 9;
-    private static final int sl4 = 5;
-    private static final int sl9 = 3;
-    private static final int[][] dir = { { +sl4, +ll0, +ll0, +sl4 }, { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 },
-        { -ll0, -sl9, -ll0, +sl9 }, { -sl4, -ll0, -ll0, -sl4 }, { +sl9, -ll0, -sl9, -ll0 },
-        { +ll0, -sl4, +sl4, -ll0 }, { +ll0, +sl9, +ll0, -sl9 }, { +sl4, +ll0, +ll0, +sl4 },
-        { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 }, { -ll0, -sl9, -ll0, +sl9 } };
-
-    private void setupColors() {
-        hdopAlpha = Main.pref.getInteger("hdop.color.alpha", -1);
-        velocityScale = ColorScale.createHSBScale(256).addTitle(tr("Velocity, km/h"));
-        /** Colors (without custom alpha channel, if given) for HDOP painting. **/
-        hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP, m"));
-        dateScale = ColorScale.createHSBScale(256).addTitle(tr("Time"));
-        directionScale = ColorScale.createCyclicScale(256).setIntervalCount(4).addTitle(tr("Direction"));
-    }
-
-    /**
-     * Different color modes
-     */
-    public enum ColorMode {
-        NONE, VELOCITY, HDOP, DIRECTION, TIME
-    }
-
-    /**
-     * Constructs a new {@code GpxDrawHelper}.
-     * @param gpxData GPX data
-     */
-    public GpxDrawHelper(GpxData gpxData) {
-        data = gpxData;
-        setupColors();
-    }
-
-    private static String specName(String layerName) {
-        return "layer " + layerName;
-    }
-
-    /**
-     * Get the default color for gps tracks for specified layer
-     * @param layerName name of the GpxLayer
-     * @param ignoreCustom do not use preferences
-     * @return the color or null if the color is not constant
-     */
-    public Color getColor(String layerName, boolean ignoreCustom) {
-        Color c = Main.pref.getColor(marktr("gps point"), specName(layerName), Color.gray);
-        return ignoreCustom || getColorMode(layerName) == ColorMode.NONE ? c : null;
-    }
-
-    /**
-     * Read coloring mode for specified layer from preferences
-     * @param layerName name of the GpxLayer
-     * @return coloting mode
-     */
-    public ColorMode getColorMode(String layerName) {
-        try {
-            int i = Main.pref.getInteger("draw.rawgps.colors", specName(layerName), 0);
-            return ColorMode.values()[i];
-        } catch (Exception e) {
-            Main.warn(e);
-        }
-        return ColorMode.NONE;
-    }
-
-    /** Reads generic color from preferences (usually gray)
-     * @return the color
-     **/
-    public static Color getGenericColor() {
-        return Main.pref.getColor(marktr("gps point"), Color.gray);
-    }
-
-    /**
-     * Read all drawing-related settings from preferences
-     * @param layerName layer name used to access its specific preferences
-     **/
-    public void readPreferences(String layerName) {
-        String spec = specName(layerName);
-        forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false);
-        direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false);
-        lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0);
-
-        if (!data.fromServer) {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1);
-            lines = Main.pref.getBoolean("draw.rawgps.lines.local", spec, true);
-        } else {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", spec, 200);
-            lines = Main.pref.getBoolean("draw.rawgps.lines", spec, true);
-        }
-        large = Main.pref.getBoolean("draw.rawgps.large", spec, false);
-        largesize = Main.pref.getInteger("draw.rawgps.large.size", spec, 3);
-        hdopCircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", spec, false);
-        colored = getColorMode(layerName);
-        alternateDirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", spec, false);
-        delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", spec, 40);
-        colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", spec, 45);
-        colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false);
-        hdopfactor = Main.pref.getInteger("hdop.factor", 25);
-        minTrackDurationForTimeColoring = Main.pref.getInteger("draw.rawgps.date-coloring-min-dt", 60);
-        largePointAlpha = Main.pref.getInteger("draw.rawgps.large.alpha", -1) & 0xFF;
-
-        neutralColor = getColor(layerName, true);
-        velocityScale.setNoDataColor(neutralColor);
-        dateScale.setNoDataColor(neutralColor);
-        hdopScale.setNoDataColor(neutralColor);
-        directionScale.setNoDataColor(neutralColor);
-
-        largesize += lineWidth;
-    }
-
-
-    public void drawAll(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
-
-        checkCache();
-
-        // STEP 2b - RE-COMPUTE CACHE DATA *********************
-        if (!computeCacheInSync) { // don't compute if the cache is good
-            calculateColors();
-        }
-
-        Stroke storedStroke = g.getStroke();
-
-        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-            Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
-                    RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
-
-        if (lineWidth != 0) {
-            g.setStroke(new BasicStroke(lineWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
-        }
-        fixColors(visibleSegments);
-        drawLines(g, mv, visibleSegments);
-        drawArrows(g, mv, visibleSegments);
-        drawPoints(g, mv, visibleSegments);
-        if (lineWidth != 0) {
-            g.setStroke(storedStroke);
-        }
-    }
-
-    public void calculateColors() {
-        double minval = +1e10;
-        double maxval = -1e10;
-        WayPoint oldWp = null;
-
-        if (colorModeDynamic) {
-            if (colored == ColorMode.VELOCITY) {
-                for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
-                    if(!forceLines) {
-                        oldWp = null;
-                    }
-                    for (WayPoint trkPnt : segment) {
-                        LatLon c = trkPnt.getCoor();
-                        if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                            continue;
-                        }
-                        if (oldWp != null && trkPnt.time > oldWp.time) {
-                            double vel = c.greatCircleDistance(oldWp.getCoor())
-                                    / (trkPnt.time - oldWp.time);
-                            if(vel > maxval) {
-                                maxval = vel;
-                            }
-                            if(vel < minval) {
-                                minval = vel;
-                            }
-                        }
-                        oldWp = trkPnt;
-                    }
-                }
-                if (minval >= maxval) {
-                    velocityScale.setRange(0, 120/3.6);
-                } else {
-                    velocityScale.setRange(minval, maxval);
-                }
-            } else if (colored == ColorMode.HDOP) {
-                for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
-                    for (WayPoint trkPnt : segment) {
-                        Object val = trkPnt.get(GpxConstants.PT_HDOP);
-                        if (val != null) {
-                            double hdop = ((Float) val).doubleValue();
-                            if(hdop > maxval) {
-                                maxval = hdop;
-                            }
-                            if(hdop < minval) {
-                                minval = hdop;
-                            }
-                        }
-                    }
-                }
-                if (minval >= maxval) {
-                    hdopScale.setRange(0, 100);
-                } else {
-                    hdopScale.setRange(minval, maxval);
-                }
-            }
-            oldWp = null;
-        } else { // color mode not dynamic
-            velocityScale.setRange(0, colorTracksTune);
-            hdopScale.setRange(0, 1.0/hdopfactor);
-        }
-        double now = System.currentTimeMillis()/1000.0;
-        if (colored == ColorMode.TIME) {
-            Date[] bounds = data.getMinMaxTimeForAllTracks();
-            if (bounds!=null) {
-                minval = bounds[0].getTime()/1000.0;
-                maxval = bounds[1].getTime()/1000.0;
-            } else {
-                minval = 0; maxval=now;
-            }
-            dateScale.setRange(minval, maxval);
-        }
-
-
-        // Now the colors for all the points will be assigned
-        for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
-            if (!forceLines) { // don't draw lines between segments, unless forced to
-                oldWp = null;
-            }
-            for (WayPoint trkPnt : segment) {
-                LatLon c = trkPnt.getCoor();
-                trkPnt.customColoring = neutralColor;
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                 // now we are sure some color will be assigned
-                Color color = null;
-
-                if (colored == ColorMode.HDOP) {
-                    Float hdop = (Float) trkPnt.get(GpxConstants.PT_HDOP);
-                    color = hdopScale.getColor(hdop);
-                }
-                if (oldWp != null) { // other coloring modes need segment for calcuation
-                    double dist = c.greatCircleDistance(oldWp.getCoor());
-                    boolean noDraw=false;
-                    switch (colored) {
-                    case VELOCITY:
-                        double dtime = trkPnt.time - oldWp.time;
-                        if(dtime > 0) {
-                            color = velocityScale.getColor(dist / dtime);
-                        } else {
-                            color = velocityScale.getNoDataColor();
-                        }
-                        break;
-                    case DIRECTION:
-                        double dirColor = oldWp.getCoor().heading(trkPnt.getCoor());
-                        color = directionScale.getColor(dirColor);
-                        break;
-                    case TIME:
-                        double t=trkPnt.time;
-                        if (t > 0 && t <= now && maxval - minval > minTrackDurationForTimeColoring) { // skip bad timestamps and very short tracks
-                            color = dateScale.getColor(t);
-                        } else {
-                            color = dateScale.getNoDataColor();
-                        }
-                        break;
-                    }
-                    if (!noDraw && (maxLineLength == -1 || dist <= maxLineLength)) {
-                        trkPnt.drawLine = true;
-                        trkPnt.dir = (int) oldWp.getCoor().heading(trkPnt.getCoor());
-                    } else {
-                        trkPnt.drawLine = false;
-                    }
-                } else { // make sure we reset outdated data
-                    trkPnt.drawLine = false;
-                    color = neutralColor;
-                }
-                if (color!=null) {
-                    trkPnt.customColoring = color;
-                }
-                oldWp = trkPnt;
-            }
-        }
-
-        computeCacheInSync = true;
-    }
-
-    private void drawLines(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
-        if (lines) {
-            Point old = null;
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                Point screen = mv.getPoint(trkPnt.getEastNorth());
-                // skip points that are on the same screenposition
-                if (trkPnt.drawLine && old != null && ((old.x != screen.x) || (old.y != screen.y))) {
-                    g.setColor(trkPnt.customColoring);
-                    g.drawLine(old.x, old.y, screen.x, screen.y);
-                }
-                old = screen;
-            }
-        }
-    }
-
-    private void drawArrows(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
-        /****************************************************************
-         ********** STEP 3b - DRAW NICE ARROWS **************************
-         ****************************************************************/
-        if (lines && direction && !alternateDirection) {
-            Point old = null;
-            Point oldA = null; // last arrow painted
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                if (trkPnt.drawLine) {
-                    Point screen = mv.getPoint(trkPnt.getEastNorth());
-                    // skip points that are on the same screenposition
-                    if (old != null
-                            && (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;
-                        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)),
-                                (int) (screen.y + 10 * Math.sin(t + PHI)));
-                        oldA = screen;
-                    }
-                    old = screen;
-                }
-            } // end for trkpnt
-        }
-
-        /****************************************************************
-         ********** STEP 3c - DRAW FAST ARROWS **************************
-         ****************************************************************/
-        if (lines && direction && alternateDirection) {
-            Point old = null;
-            Point oldA = null; // last arrow painted
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                if (trkPnt.drawLine) {
-                    Point screen = mv.getPoint(trkPnt.getEastNorth());
-                    // skip points that are on the same screenposition
-                    if (old != null
-                            && (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);
-                        g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][0], screen.y
-                                + dir[trkPnt.dir][1]);
-                        g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][2], screen.y
-                                + dir[trkPnt.dir][3]);
-                        oldA = screen;
-                    }
-                    old = screen;
-                }
-            } // end for trkpnt
-        }
-    }
-
-    private void drawPoints(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
-        /****************************************************************
-         ********** STEP 3d - DRAW LARGE POINTS AND HDOP CIRCLE *********
-         ****************************************************************/
-        if (large || hdopCircle) {
-            final int halfSize = largesize/2;
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                Point screen = mv.getPoint(trkPnt.getEastNorth());
-
-
-                if (hdopCircle && trkPnt.get(GpxConstants.PT_HDOP) != null) {
-                    // hdop value
-                    float hdop = (Float)trkPnt.get(GpxConstants.PT_HDOP);
-                    if (hdop < 0) {
-                        hdop = 0;
-                    }
-                    Color customColoringTransparent = hdopAlpha<0 ? trkPnt.customColoring:
-                        new Color(trkPnt.customColoring.getRGB() & 0x00ffffff | hdopAlpha<<24, true);
-                    g.setColor(customColoringTransparent);
-                    // hdop cirles
-                    int hdopp = mv.getPoint(new LatLon(trkPnt.getCoor().lat(), trkPnt.getCoor().lon() + 2*6*hdop*360/40000000)).x - screen.x;
-                    g.drawArc(screen.x-hdopp/2, screen.y-hdopp/2, hdopp, hdopp, 0, 360);
-                }
-                if (large) {
-                    // color the large GPS points like the gps lines
-                    if (trkPnt.customColoring != null) {
-                        Color customColoringTransparent = largePointAlpha<0 ? trkPnt.customColoring:
-                            new Color(trkPnt.customColoring.getRGB() & 0x00ffffff | largePointAlpha<<24, true);
-
-                        g.setColor(customColoringTransparent);
-                    }
-                    g.fillRect(screen.x-halfSize, screen.y-halfSize, largesize, largesize);
-                }
-            } // end for trkpnt
-        } // end if large || hdopcircle
-
-        /****************************************************************
-         ********** STEP 3e - DRAW SMALL POINTS FOR LINES ***************
-         ****************************************************************/
-        if (!large && lines) {
-            g.setColor(neutralColor);
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                if (!trkPnt.drawLine) {
-                    Point screen = mv.getPoint(trkPnt.getEastNorth());
-                    g.drawRect(screen.x, screen.y, 0, 0);
-                }
-            } // end for trkpnt
-        } // end if large
-
-        /****************************************************************
-         ********** STEP 3f - DRAW SMALL POINTS INSTEAD OF LINES ********
-         ****************************************************************/
-        if (!large && !lines) {
-            g.setColor(neutralColor);
-            for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
-                    continue;
-                }
-                Point screen = mv.getPoint(trkPnt.getEastNorth());
-                g.setColor(trkPnt.customColoring);
-                g.drawRect(screen.x, screen.y, 0, 0);
-            } // end for trkpnt
-        } // end if large
-    }
-
-    private void fixColors(List<WayPoint> visibleSegments) {
-        for (WayPoint trkPnt : visibleSegments) {
-            if (trkPnt.customColoring == null) {
-                trkPnt.customColoring = neutralColor;
-            }
-        }
-    }
-
-    /**
-     * Check cache validity set necessary flags
-     */
-    private void checkCache() {
-        if ((computeCacheMaxLineLengthUsed != maxLineLength) || (!neutralColor.equals(computeCacheColorUsed))
-                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune)
-                || (computeCacheColorDynamic != colorModeDynamic)) {
-            computeCacheMaxLineLengthUsed = maxLineLength;
-            computeCacheInSync = false;
-            computeCacheColorUsed = neutralColor;
-            computeCacheColored = colored;
-            computeCacheColorTracksTune = colorTracksTune;
-            computeCacheColorDynamic = colorModeDynamic;
-        }
-    }
-
-    public void dataChanged() {
-        computeCacheInSync = false;
-    }
-
-    public void drawColorBar(Graphics2D g, MapView mv) {
-        int w = mv.getWidth();
-        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);
-        } else if (colored == ColorMode.DIRECTION) {
-            directionScale.drawColorBar(g, w-30, 50, 20, 100, 180.0/Math.PI);
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.layer.gpx;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.gpx.GpxConstants;
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+import org.openstreetmap.josm.gui.MapView;
+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 {
+    private GpxData data;
+
+    // draw lines between points belonging to different segments
+    private boolean forceLines;
+    // draw direction arrows on the lines
+    private boolean direction;
+    /** don't draw lines if longer than x meters **/
+    private int lineWidth;
+    private int maxLineLength;
+    private boolean lines;
+    /** paint large dots for points **/
+    private boolean large;
+    private int largesize;
+    private boolean hdopCircle;
+    /** paint direction arrow with alternate math. may be faster **/
+    private boolean alternateDirection;
+    /** don't draw arrows nearer to each other than this **/
+    private int delta;
+    private double minTrackDurationForTimeColoring;
+
+    private int hdopfactor;
+
+    private static final double PHI = Math.toRadians(15);
+
+    //// Variables used only to check cache validity
+    private boolean computeCacheInSync = false;
+    private int computeCacheMaxLineLengthUsed;
+    private Color computeCacheColorUsed;
+    private boolean computeCacheColorDynamic;
+    private ColorMode computeCacheColored;
+    private int computeCacheColorTracksTune;
+
+    //// Color-related fields
+    /** Mode of the line coloring **/
+    private ColorMode colored;
+    /** max speed for coloring - allows to tweak line coloring for different speed levels. **/
+    private int colorTracksTune;
+    private boolean colorModeDynamic;
+    private Color neutralColor;
+    private int largePointAlpha;
+
+    // default access is used to allow changing from plugins
+    ColorScale velocityScale;
+    /** Colors (without custom alpha channel, if given) for HDOP painting. **/
+    ColorScale hdopScale;
+    ColorScale dateScale;
+    ColorScale directionScale;
+
+    /** Opacity for hdop points **/
+    private int hdopAlpha;
+
+
+    // lookup array to draw arrows without doing any math
+    private static final int ll0 = 9;
+    private static final int sl4 = 5;
+    private static final int sl9 = 3;
+    private static final int[][] dir = { { +sl4, +ll0, +ll0, +sl4 }, { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 },
+        { -ll0, -sl9, -ll0, +sl9 }, { -sl4, -ll0, -ll0, -sl4 }, { +sl9, -ll0, -sl9, -ll0 },
+        { +ll0, -sl4, +sl4, -ll0 }, { +ll0, +sl9, +ll0, -sl9 }, { +sl4, +ll0, +ll0, +sl4 },
+        { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 }, { -ll0, -sl9, -ll0, +sl9 } };
+
+    private void setupColors() {
+        hdopAlpha = Main.pref.getInteger("hdop.color.alpha", -1);
+        velocityScale = ColorScale.createHSBScale(256).addTitle(tr("Velocity, km/h"));
+        /** Colors (without custom alpha channel, if given) for HDOP painting. **/
+        hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP, m"));
+        dateScale = ColorScale.createHSBScale(256).addTitle(tr("Time"));
+        directionScale = ColorScale.createCyclicScale(256).setIntervalCount(4).addTitle(tr("Direction"));
+    }
+
+    /**
+     * Different color modes
+     */
+    public enum ColorMode {
+        NONE, VELOCITY, HDOP, DIRECTION, TIME
+    }
+
+    /**
+     * Constructs a new {@code GpxDrawHelper}.
+     * @param gpxData GPX data
+     */
+    public GpxDrawHelper(GpxData gpxData) {
+        data = gpxData;
+        setupColors();
+    }
+
+    private static String specName(String layerName) {
+        return "layer " + layerName;
+    }
+
+    /**
+     * Get the default color for gps tracks for specified layer
+     * @param layerName name of the GpxLayer
+     * @param ignoreCustom do not use preferences
+     * @return the color or null if the color is not constant
+     */
+    public Color getColor(String layerName, boolean ignoreCustom) {
+        Color c = Main.pref.getColor(marktr("gps point"), specName(layerName), Color.gray);
+        return ignoreCustom || getColorMode(layerName) == ColorMode.NONE ? c : null;
+    }
+
+    /**
+     * Read coloring mode for specified layer from preferences
+     * @param layerName name of the GpxLayer
+     * @return coloting mode
+     */
+    public ColorMode getColorMode(String layerName) {
+        try {
+            int i = Main.pref.getInteger("draw.rawgps.colors", specName(layerName), 0);
+            return ColorMode.values()[i];
+        } catch (Exception e) {
+            Main.warn(e);
+        }
+        return ColorMode.NONE;
+    }
+
+    /** Reads generic color from preferences (usually gray)
+     * @return the color
+     **/
+    public static Color getGenericColor() {
+        return Main.pref.getColor(marktr("gps point"), Color.gray);
+    }
+
+    /**
+     * Read all drawing-related settings from preferences
+     * @param layerName layer name used to access its specific preferences
+     **/
+    public void readPreferences(String layerName) {
+        String spec = specName(layerName);
+        forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false);
+        direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false);
+        lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0);
+
+        if (!data.fromServer) {
+            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1);
+            lines = Main.pref.getBoolean("draw.rawgps.lines.local", spec, true);
+        } else {
+            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", spec, 200);
+            lines = Main.pref.getBoolean("draw.rawgps.lines", spec, true);
+        }
+        large = Main.pref.getBoolean("draw.rawgps.large", spec, false);
+        largesize = Main.pref.getInteger("draw.rawgps.large.size", spec, 3);
+        hdopCircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", spec, false);
+        colored = getColorMode(layerName);
+        alternateDirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", spec, false);
+        delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", spec, 40);
+        colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", spec, 45);
+        colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false);
+        hdopfactor = Main.pref.getInteger("hdop.factor", 25);
+        minTrackDurationForTimeColoring = Main.pref.getInteger("draw.rawgps.date-coloring-min-dt", 60);
+        largePointAlpha = Main.pref.getInteger("draw.rawgps.large.alpha", -1) & 0xFF;
+
+        neutralColor = getColor(layerName, true);
+        velocityScale.setNoDataColor(neutralColor);
+        dateScale.setNoDataColor(neutralColor);
+        hdopScale.setNoDataColor(neutralColor);
+        directionScale.setNoDataColor(neutralColor);
+
+        largesize += lineWidth;
+    }
+
+
+    public void drawAll(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
+
+        checkCache();
+
+        // STEP 2b - RE-COMPUTE CACHE DATA *********************
+        if (!computeCacheInSync) { // don't compute if the cache is good
+            calculateColors();
+        }
+
+        Stroke storedStroke = g.getStroke();
+
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+            Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
+                    RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
+
+        if (lineWidth != 0) {
+            g.setStroke(new BasicStroke(lineWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
+        }
+        fixColors(visibleSegments);
+        drawLines(g, mv, visibleSegments);
+        drawArrows(g, mv, visibleSegments);
+        drawPoints(g, mv, visibleSegments);
+        if (lineWidth != 0) {
+            g.setStroke(storedStroke);
+        }
+    }
+
+    public void calculateColors() {
+        double minval = +1e10;
+        double maxval = -1e10;
+        WayPoint oldWp = null;
+
+        if (colorModeDynamic) {
+            if (colored == ColorMode.VELOCITY) {
+                for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
+                    if(!forceLines) {
+                        oldWp = null;
+                    }
+                    for (WayPoint trkPnt : segment) {
+                        LatLon c = trkPnt.getCoor();
+                        if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                            continue;
+                        }
+                        if (oldWp != null && trkPnt.time > oldWp.time) {
+                            double vel = c.greatCircleDistance(oldWp.getCoor())
+                                    / (trkPnt.time - oldWp.time);
+                            if(vel > maxval) {
+                                maxval = vel;
+                            }
+                            if(vel < minval) {
+                                minval = vel;
+                            }
+                        }
+                        oldWp = trkPnt;
+                    }
+                }
+                if (minval >= maxval) {
+                    velocityScale.setRange(0, 120/3.6);
+                } else {
+                    velocityScale.setRange(minval, maxval);
+                }
+            } else if (colored == ColorMode.HDOP) {
+                for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
+                    for (WayPoint trkPnt : segment) {
+                        Object val = trkPnt.get(GpxConstants.PT_HDOP);
+                        if (val != null) {
+                            double hdop = ((Float) val).doubleValue();
+                            if(hdop > maxval) {
+                                maxval = hdop;
+                            }
+                            if(hdop < minval) {
+                                minval = hdop;
+                            }
+                        }
+                    }
+                }
+                if (minval >= maxval) {
+                    hdopScale.setRange(0, 100);
+                } else {
+                    hdopScale.setRange(minval, maxval);
+                }
+            }
+            oldWp = null;
+        } else { // color mode not dynamic
+            velocityScale.setRange(0, colorTracksTune);
+            hdopScale.setRange(0, 1.0/hdopfactor);
+        }
+        double now = System.currentTimeMillis()/1000.0;
+        if (colored == ColorMode.TIME) {
+            Date[] bounds = data.getMinMaxTimeForAllTracks();
+            if (bounds!=null) {
+                minval = bounds[0].getTime()/1000.0;
+                maxval = bounds[1].getTime()/1000.0;
+            } else {
+                minval = 0; maxval=now;
+            }
+            dateScale.setRange(minval, maxval);
+        }
+
+
+        // Now the colors for all the points will be assigned
+        for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
+            if (!forceLines) { // don't draw lines between segments, unless forced to
+                oldWp = null;
+            }
+            for (WayPoint trkPnt : segment) {
+                LatLon c = trkPnt.getCoor();
+                trkPnt.customColoring = neutralColor;
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                 // now we are sure some color will be assigned
+                Color color = null;
+
+                if (colored == ColorMode.HDOP) {
+                    Float hdop = (Float) trkPnt.get(GpxConstants.PT_HDOP);
+                    color = hdopScale.getColor(hdop);
+                }
+                if (oldWp != null) { // other coloring modes need segment for calcuation
+                    double dist = c.greatCircleDistance(oldWp.getCoor());
+                    boolean noDraw=false;
+                    switch (colored) {
+                    case VELOCITY:
+                        double dtime = trkPnt.time - oldWp.time;
+                        if(dtime > 0) {
+                            color = velocityScale.getColor(dist / dtime);
+                        } else {
+                            color = velocityScale.getNoDataColor();
+                        }
+                        break;
+                    case DIRECTION:
+                        double dirColor = oldWp.getCoor().heading(trkPnt.getCoor());
+                        color = directionScale.getColor(dirColor);
+                        break;
+                    case TIME:
+                        double t=trkPnt.time;
+                        if (t > 0 && t <= now && maxval - minval > minTrackDurationForTimeColoring) { // skip bad timestamps and very short tracks
+                            color = dateScale.getColor(t);
+                        } else {
+                            color = dateScale.getNoDataColor();
+                        }
+                        break;
+                    }
+                    if (!noDraw && (maxLineLength == -1 || dist <= maxLineLength)) {
+                        trkPnt.drawLine = true;
+                        trkPnt.dir = (int) oldWp.getCoor().heading(trkPnt.getCoor());
+                    } else {
+                        trkPnt.drawLine = false;
+                    }
+                } else { // make sure we reset outdated data
+                    trkPnt.drawLine = false;
+                    color = neutralColor;
+                }
+                if (color!=null) {
+                    trkPnt.customColoring = color;
+                }
+                oldWp = trkPnt;
+            }
+        }
+
+        computeCacheInSync = true;
+    }
+
+    private void drawLines(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
+        if (lines) {
+            Point old = null;
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                Point screen = mv.getPoint(trkPnt.getEastNorth());
+                // skip points that are on the same screenposition
+                if (trkPnt.drawLine && old != null && ((old.x != screen.x) || (old.y != screen.y))) {
+                    g.setColor(trkPnt.customColoring);
+                    g.drawLine(old.x, old.y, screen.x, screen.y);
+                }
+                old = screen;
+            }
+        }
+    }
+
+    private void drawArrows(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
+        /****************************************************************
+         ********** STEP 3b - DRAW NICE ARROWS **************************
+         ****************************************************************/
+        if (lines && direction && !alternateDirection) {
+            Point old = null;
+            Point oldA = null; // last arrow painted
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                if (trkPnt.drawLine) {
+                    Point screen = mv.getPoint(trkPnt.getEastNorth());
+                    // skip points that are on the same screenposition
+                    if (old != null
+                            && (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;
+                        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)),
+                                (int) (screen.y + 10 * Math.sin(t + PHI)));
+                        oldA = screen;
+                    }
+                    old = screen;
+                }
+            } // end for trkpnt
+        }
+
+        /****************************************************************
+         ********** STEP 3c - DRAW FAST ARROWS **************************
+         ****************************************************************/
+        if (lines && direction && alternateDirection) {
+            Point old = null;
+            Point oldA = null; // last arrow painted
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                if (trkPnt.drawLine) {
+                    Point screen = mv.getPoint(trkPnt.getEastNorth());
+                    // skip points that are on the same screenposition
+                    if (old != null
+                            && (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);
+                        g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][0], screen.y
+                                + dir[trkPnt.dir][1]);
+                        g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][2], screen.y
+                                + dir[trkPnt.dir][3]);
+                        oldA = screen;
+                    }
+                    old = screen;
+                }
+            } // end for trkpnt
+        }
+    }
+
+    private void drawPoints(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
+        /****************************************************************
+         ********** STEP 3d - DRAW LARGE POINTS AND HDOP CIRCLE *********
+         ****************************************************************/
+        if (large || hdopCircle) {
+            final int halfSize = largesize/2;
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                Point screen = mv.getPoint(trkPnt.getEastNorth());
+
+
+                if (hdopCircle && trkPnt.get(GpxConstants.PT_HDOP) != null) {
+                    // hdop value
+                    float hdop = (Float)trkPnt.get(GpxConstants.PT_HDOP);
+                    if (hdop < 0) {
+                        hdop = 0;
+                    }
+                    Color customColoringTransparent = hdopAlpha<0 ? trkPnt.customColoring:
+                        new Color(trkPnt.customColoring.getRGB() & 0x00ffffff | hdopAlpha<<24, true);
+                    g.setColor(customColoringTransparent);
+                    // hdop cirles
+                    int hdopp = mv.getPoint(new LatLon(trkPnt.getCoor().lat(), trkPnt.getCoor().lon() + 2*6*hdop*360/40000000)).x - screen.x;
+                    g.drawArc(screen.x-hdopp/2, screen.y-hdopp/2, hdopp, hdopp, 0, 360);
+                }
+                if (large) {
+                    // color the large GPS points like the gps lines
+                    if (trkPnt.customColoring != null) {
+                        Color customColoringTransparent = largePointAlpha<0 ? trkPnt.customColoring:
+                            new Color(trkPnt.customColoring.getRGB() & 0x00ffffff | largePointAlpha<<24, true);
+
+                        g.setColor(customColoringTransparent);
+                    }
+                    g.fillRect(screen.x-halfSize, screen.y-halfSize, largesize, largesize);
+                }
+            } // end for trkpnt
+        } // end if large || hdopcircle
+
+        /****************************************************************
+         ********** STEP 3e - DRAW SMALL POINTS FOR LINES ***************
+         ****************************************************************/
+        if (!large && lines) {
+            g.setColor(neutralColor);
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                if (!trkPnt.drawLine) {
+                    Point screen = mv.getPoint(trkPnt.getEastNorth());
+                    g.drawRect(screen.x, screen.y, 0, 0);
+                }
+            } // end for trkpnt
+        } // end if large
+
+        /****************************************************************
+         ********** STEP 3f - DRAW SMALL POINTS INSTEAD OF LINES ********
+         ****************************************************************/
+        if (!large && !lines) {
+            g.setColor(neutralColor);
+            for (WayPoint trkPnt : visibleSegments) {
+                LatLon c = trkPnt.getCoor();
+                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                    continue;
+                }
+                Point screen = mv.getPoint(trkPnt.getEastNorth());
+                g.setColor(trkPnt.customColoring);
+                g.drawRect(screen.x, screen.y, 0, 0);
+            } // end for trkpnt
+        } // end if large
+    }
+
+    private void fixColors(List<WayPoint> visibleSegments) {
+        for (WayPoint trkPnt : visibleSegments) {
+            if (trkPnt.customColoring == null) {
+                trkPnt.customColoring = neutralColor;
+            }
+        }
+    }
+
+    /**
+     * Check cache validity set necessary flags
+     */
+    private void checkCache() {
+        if ((computeCacheMaxLineLengthUsed != maxLineLength) || (!neutralColor.equals(computeCacheColorUsed))
+                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune)
+                || (computeCacheColorDynamic != colorModeDynamic)) {
+            computeCacheMaxLineLengthUsed = maxLineLength;
+            computeCacheInSync = false;
+            computeCacheColorUsed = neutralColor;
+            computeCacheColored = colored;
+            computeCacheColorTracksTune = colorTracksTune;
+            computeCacheColorDynamic = colorModeDynamic;
+        }
+    }
+
+    public void dataChanged() {
+        computeCacheInSync = false;
+    }
+
+    public void drawColorBar(Graphics2D g, MapView mv) {
+        int w = mv.getWidth();
+        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);
+        } 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/mappaint/StyleKeys.java b/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java
index ee706ab..d74c7c4 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java
@@ -1,34 +1,34 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.mappaint;
-
-public interface StyleKeys {
-
-    String COLOR = "color";
-    String DASHES = "dashes";
-    String DASHES_BACKGROUND_COLOR = "dashes-background-color";
-    String DASHES_BACKGROUND_OPACITY = "dashes-background-opacity";
-    String DASHES_OFFSET = "dashes-offset";
-    String FILL_COLOR = "fill-color";
-    String FILL_IMAGE = "fill-image";
-    String FILL_OPACITY = "fill-opacity";
-    String ICON_IMAGE = "icon-image";
-    String MODIFIER = "modifier";
-    String OBJECT_Z_INDEX = "object-z-index";
-    String OFFSET = "offset";
-    String OPACITY = "opacity";
-    String REAL_WIDTH = "real-width";
-    String TEXT_POSITION = "text-position";
-    String TEXT = "text";
-    String WIDTH = "width";
-    String Z_INDEX = "z-index";
-    String REPEAT_IMAGE = "repeat-image";
-    String REPEAT_IMAGE_OFFSET = "repeat-image-offset";
-    String REPEAT_IMAGE_SPACING = "repeat-image-spacing";
-    String REPEAT_IMAGE_PHASE = "repeat-image-phase";
-    String REPEAT_IMAGE_ALIGN = "repeat-image-align";
-
-    int ICON_IMAGE_IDX = 0;
-    int ICON_WIDTH_IDX = 1;
-    int ICON_HEIGHT_IDX = 2;
-    int ICON_OPACITY_IDX = 3;
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.mappaint;
+
+public interface StyleKeys {
+
+    String COLOR = "color";
+    String DASHES = "dashes";
+    String DASHES_BACKGROUND_COLOR = "dashes-background-color";
+    String DASHES_BACKGROUND_OPACITY = "dashes-background-opacity";
+    String DASHES_OFFSET = "dashes-offset";
+    String FILL_COLOR = "fill-color";
+    String FILL_IMAGE = "fill-image";
+    String FILL_OPACITY = "fill-opacity";
+    String ICON_IMAGE = "icon-image";
+    String MODIFIER = "modifier";
+    String OBJECT_Z_INDEX = "object-z-index";
+    String OFFSET = "offset";
+    String OPACITY = "opacity";
+    String REAL_WIDTH = "real-width";
+    String TEXT_POSITION = "text-position";
+    String TEXT = "text";
+    String WIDTH = "width";
+    String Z_INDEX = "z-index";
+    String REPEAT_IMAGE = "repeat-image";
+    String REPEAT_IMAGE_OFFSET = "repeat-image-offset";
+    String REPEAT_IMAGE_SPACING = "repeat-image-spacing";
+    String REPEAT_IMAGE_PHASE = "repeat-image-phase";
+    String REPEAT_IMAGE_ALIGN = "repeat-image-align";
+
+    int ICON_IMAGE_IDX = 0;
+    int ICON_WIDTH_IDX = 1;
+    int ICON_HEIGHT_IDX = 2;
+    int ICON_OPACITY_IDX = 3;
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java b/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java
index c349986..5110643 100644
--- a/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java
+++ b/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java
@@ -1,20 +1,20 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-public abstract class DefaultPreferenceSetting implements PreferenceSetting {
-
-    private final boolean isExpert;
-    
-    public DefaultPreferenceSetting() {
-        this(false);
-    }
-
-    public DefaultPreferenceSetting(boolean isExpert) {
-        this.isExpert = isExpert;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return isExpert;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+public abstract class DefaultPreferenceSetting implements PreferenceSetting {
+
+    private final boolean isExpert;
+    
+    public DefaultPreferenceSetting() {
+        this(false);
+    }
+
+    public DefaultPreferenceSetting(boolean isExpert) {
+        this.isExpert = isExpert;
+    }
+
+    @Override
+    public boolean isExpert() {
+        return isExpert;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java b/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
index ddadb97..1896b04 100644
--- a/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
+++ b/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
@@ -1,133 +1,133 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-import java.awt.Component;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.GBC;
-
-public abstract class DefaultTabPreferenceSetting extends DefaultPreferenceSetting implements TabPreferenceSetting {
-
-    private final String iconName;
-    private final String description;
-    private final String title;
-    private final JTabbedPane tabpane;
-    private final Map<SubPreferenceSetting, Component> subSettingMap;
-    
-    /**
-     * Constructs a new {@code DefaultTabPreferenceSetting}.
-     */
-    public DefaultTabPreferenceSetting() {
-        this(null, null, null);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description) {
-        this(iconName, title, description, false);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert) {
-        this(iconName, title, description, isExpert, null);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert, JTabbedPane tabpane) {
-        super(isExpert);
-        this.iconName = iconName;
-        this.description = description;
-        this.title = title;
-        this.tabpane = tabpane;
-        this.subSettingMap = tabpane != null ? new HashMap<SubPreferenceSetting, Component>() : null;
-    }
-
-    @Override
-    public String getIconName() {
-        return iconName;
-    }
-
-    @Override
-    public String getTooltip() {
-        if (getDescription() != null) {
-            return "<html>"+getDescription()+"</html>";
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * Get the inner tab pane, if any.
-     * @return The JTabbedPane contained in this tab preference settings, or null if none is set.
-     * @since 5631
-     */
-    public final JTabbedPane getTabPane() {
-        return tabpane;
-    }
-    
-    protected final void createPreferenceTabWithScrollPane(PreferenceTabbedPane gui, JPanel panel) {
-        GBC a = GBC.eol().insets(-5,0,0,0);
-        a.anchor = GBC.EAST;
-        
-        JScrollPane scrollPane = new JScrollPane(panel);
-        scrollPane.setBorder(null);
-
-        JPanel tab = gui.createPreferenceTab(this);
-        tab.add(scrollPane, GBC.eol().fill(GBC.BOTH));
-        tab.add(GBC.glue(0,10), a);
-    }
-
-    @Override
-    public boolean selectSubTab(SubPreferenceSetting subPref) {
-        if (tabpane != null && subPref != null) {
-            Component tab = getSubTab(subPref);
-            if (tab != null) {
-                try {
-                    tabpane.setSelectedComponent(tab);
-                    return true;
-                } catch (IllegalArgumentException e) {
-                    // Ignore exception and return false below
-                    Main.debug(Main.getErrorMessage(e));
-                }
-            }
-        }
-        return false;
-    }
-    
-    @Override
-    public final void addSubTab(SubPreferenceSetting sub, String title, Component component) {
-        addSubTab(sub, title, component, null);
-    }
-    
-    @Override
-    public final void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip) {
-        if (tabpane != null && component != null) {
-            tabpane.addTab(title, null, component, tip);
-            registerSubTab(sub, component);
-        }
-    }
-    
-    @Override
-    public final void registerSubTab(SubPreferenceSetting sub, Component component) {
-        if (subSettingMap != null && sub != null && component != null) {
-            subSettingMap.put(sub, component);
-        }
-    }
-    
-    @Override
-    public final Component getSubTab(SubPreferenceSetting sub) {
-        return subSettingMap != null ? subSettingMap.get(sub) : null;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import java.awt.Component;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.GBC;
+
+public abstract class DefaultTabPreferenceSetting extends DefaultPreferenceSetting implements TabPreferenceSetting {
+
+    private final String iconName;
+    private final String description;
+    private final String title;
+    private final JTabbedPane tabpane;
+    private final Map<SubPreferenceSetting, Component> subSettingMap;
+    
+    /**
+     * Constructs a new {@code DefaultTabPreferenceSetting}.
+     */
+    public DefaultTabPreferenceSetting() {
+        this(null, null, null);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description) {
+        this(iconName, title, description, false);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert) {
+        this(iconName, title, description, isExpert, null);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert, JTabbedPane tabpane) {
+        super(isExpert);
+        this.iconName = iconName;
+        this.description = description;
+        this.title = title;
+        this.tabpane = tabpane;
+        this.subSettingMap = tabpane != null ? new HashMap<SubPreferenceSetting, Component>() : null;
+    }
+
+    @Override
+    public String getIconName() {
+        return iconName;
+    }
+
+    @Override
+    public String getTooltip() {
+        if (getDescription() != null) {
+            return "<html>"+getDescription()+"</html>";
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * Get the inner tab pane, if any.
+     * @return The JTabbedPane contained in this tab preference settings, or null if none is set.
+     * @since 5631
+     */
+    public final JTabbedPane getTabPane() {
+        return tabpane;
+    }
+    
+    protected final void createPreferenceTabWithScrollPane(PreferenceTabbedPane gui, JPanel panel) {
+        GBC a = GBC.eol().insets(-5,0,0,0);
+        a.anchor = GBC.EAST;
+        
+        JScrollPane scrollPane = new JScrollPane(panel);
+        scrollPane.setBorder(null);
+
+        JPanel tab = gui.createPreferenceTab(this);
+        tab.add(scrollPane, GBC.eol().fill(GBC.BOTH));
+        tab.add(GBC.glue(0,10), a);
+    }
+
+    @Override
+    public boolean selectSubTab(SubPreferenceSetting subPref) {
+        if (tabpane != null && subPref != null) {
+            Component tab = getSubTab(subPref);
+            if (tab != null) {
+                try {
+                    tabpane.setSelectedComponent(tab);
+                    return true;
+                } catch (IllegalArgumentException e) {
+                    // Ignore exception and return false below
+                    Main.debug(Main.getErrorMessage(e));
+                }
+            }
+        }
+        return false;
+    }
+    
+    @Override
+    public final void addSubTab(SubPreferenceSetting sub, String title, Component component) {
+        addSubTab(sub, title, component, null);
+    }
+    
+    @Override
+    public final void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip) {
+        if (tabpane != null && component != null) {
+            tabpane.addTab(title, null, component, tip);
+            registerSubTab(sub, component);
+        }
+    }
+    
+    @Override
+    public final void registerSubTab(SubPreferenceSetting sub, Component component) {
+        if (subSettingMap != null && sub != null && component != null) {
+            subSettingMap.put(sub, component);
+        }
+    }
+    
+    @Override
+    public final Component getSubTab(SubPreferenceSetting sub) {
+        return subSettingMap != null ? subSettingMap.get(sub) : null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java b/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java
index 35a2e3b..97bf852 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java
@@ -1,9 +1,9 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-import java.util.Collection;
-
-public interface SourceProvider {
-
-    public Collection<SourceEntry> getSources();
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import java.util.Collection;
+
+public interface SourceProvider {
+
+    public Collection<SourceEntry> getSources();
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceType.java b/src/org/openstreetmap/josm/gui/preferences/SourceType.java
index 87b972d..41cbd27 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SourceType.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SourceType.java
@@ -1,15 +1,15 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-/**
- * The different types of source entries.
- * @since 6670
- */
-public enum SourceType {
-    /** Entry for a map paint style **/
-    MAP_PAINT_STYLE,
-    /** Entry for a tagging preset **/
-    TAGGING_PRESET,
-    /** Entry for a validator tag checker rule **/
-    TAGCHECKER_RULE
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+/**
+ * The different types of source entries.
+ * @since 6670
+ */
+public enum SourceType {
+    /** Entry for a map paint style **/
+    MAP_PAINT_STYLE,
+    /** Entry for a tagging preset **/
+    TAGGING_PRESET,
+    /** Entry for a validator tag checker rule **/
+    TAGCHECKER_RULE
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/SubPreferenceSetting.java b/src/org/openstreetmap/josm/gui/preferences/SubPreferenceSetting.java
index 32cecb3..67857c2 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SubPreferenceSetting.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SubPreferenceSetting.java
@@ -1,16 +1,16 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-/**
- * Preference settings, that do *not* display a top level tab.
- *
- * This preference setting's addGui method is called after the user clicked the parent tab
- * (returned by getTabPreferenceSetting).
- */
-public interface SubPreferenceSetting extends PreferenceSetting {
-
-    /**
-     * Returns the preference setting (displayed in the specified preferences tab pane) that contains this preference setting.
-     */
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+/**
+ * Preference settings, that do *not* display a top level tab.
+ *
+ * This preference setting's addGui method is called after the user clicked the parent tab
+ * (returned by getTabPreferenceSetting).
+ */
+public interface SubPreferenceSetting extends PreferenceSetting {
+
+    /**
+     * Returns the preference setting (displayed in the specified preferences tab pane) that contains this preference setting.
+     */
+    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui);
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/TabPreferenceSetting.java b/src/org/openstreetmap/josm/gui/preferences/TabPreferenceSetting.java
index 9452ee5..d0d784e 100644
--- a/src/org/openstreetmap/josm/gui/preferences/TabPreferenceSetting.java
+++ b/src/org/openstreetmap/josm/gui/preferences/TabPreferenceSetting.java
@@ -1,80 +1,80 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-import java.awt.Component;
-
-/**
- * Preference settings, that display a top level tab.
- *
- * This preference setting's addGui method is called after the user clicked the tab.
- */
-public interface TabPreferenceSetting extends PreferenceSetting {
-    
-    /**
-     * Called during preferences dialog initialization to display the preferences tab with the returned icon.
-     * @return The icon name in the preferences folder.
-     */
-    public String getIconName();
-
-    /**
-     * Called during preferences tab initialization to display its title.
-     * @return The title of this preferences tab.
-     */
-    String getTitle();
-    
-    /**
-     * Called during preferences dialog initialization to display the preferences tab with the returned tooltip.
-     * @return The tooltip of this preferences tab.
-     */
-    public String getTooltip();
-
-    /**
-     * Called during preferences tab initialization to display a description in one sentence for this tab. 
-     * Will be displayed in italic under the title.
-     * @return The description of this preferences tab.
-     */
-    public String getDescription();
-
-    /**
-     * Adds a new sub preference settings tab with the given title and component.
-     * @param sub The new sub preference settings.
-     * @param title The tab title.
-     * @param component The tab component.
-     * @since 5631
-     */
-    public void addSubTab(SubPreferenceSetting sub, String title, Component component);
-    
-    /**
-     * Adds a new sub preference settings tab with the given title, component and tooltip.
-     * @param sub The new sub preference settings.
-     * @param title The tab title.
-     * @param component The tab component.
-     * @param tip The tab tooltip.
-     * @since 5631
-     */
-    public void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip);
-
-    /**
-     * Registers a sub preference settings to an existing tab component.
-     * @param sub The new sub preference settings.
-     * @param component The component for which a tab already exists.
-     * @since 5631
-     */
-    public void registerSubTab(SubPreferenceSetting sub, Component component);
-    
-    /**
-     * Returns the tab component related to the specified sub preference settings
-     * @param sub The requested sub preference settings.
-     * @return The component related to the specified sub preference settings, or null.
-     * @since 5631
-     */
-    public Component getSubTab(SubPreferenceSetting sub);
-
-    /**
-     * Selects the specified sub preference settings, if applicable. Not all Tab preference settings need to implement this.
-     * @param subPref The sub preference settings to be selected.
-     * @return true if the specified preference settings have been selected, false otherwise.
-     * @since 5631
-     */
-    public boolean selectSubTab(SubPreferenceSetting subPref);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import java.awt.Component;
+
+/**
+ * Preference settings, that display a top level tab.
+ *
+ * This preference setting's addGui method is called after the user clicked the tab.
+ */
+public interface TabPreferenceSetting extends PreferenceSetting {
+    
+    /**
+     * Called during preferences dialog initialization to display the preferences tab with the returned icon.
+     * @return The icon name in the preferences folder.
+     */
+    public String getIconName();
+
+    /**
+     * Called during preferences tab initialization to display its title.
+     * @return The title of this preferences tab.
+     */
+    String getTitle();
+    
+    /**
+     * Called during preferences dialog initialization to display the preferences tab with the returned tooltip.
+     * @return The tooltip of this preferences tab.
+     */
+    public String getTooltip();
+
+    /**
+     * Called during preferences tab initialization to display a description in one sentence for this tab. 
+     * Will be displayed in italic under the title.
+     * @return The description of this preferences tab.
+     */
+    public String getDescription();
+
+    /**
+     * Adds a new sub preference settings tab with the given title and component.
+     * @param sub The new sub preference settings.
+     * @param title The tab title.
+     * @param component The tab component.
+     * @since 5631
+     */
+    public void addSubTab(SubPreferenceSetting sub, String title, Component component);
+    
+    /**
+     * Adds a new sub preference settings tab with the given title, component and tooltip.
+     * @param sub The new sub preference settings.
+     * @param title The tab title.
+     * @param component The tab component.
+     * @param tip The tab tooltip.
+     * @since 5631
+     */
+    public void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip);
+
+    /**
+     * Registers a sub preference settings to an existing tab component.
+     * @param sub The new sub preference settings.
+     * @param component The component for which a tab already exists.
+     * @since 5631
+     */
+    public void registerSubTab(SubPreferenceSetting sub, Component component);
+    
+    /**
+     * Returns the tab component related to the specified sub preference settings
+     * @param sub The requested sub preference settings.
+     * @return The component related to the specified sub preference settings, or null.
+     * @since 5631
+     */
+    public Component getSubTab(SubPreferenceSetting sub);
+
+    /**
+     * Selects the specified sub preference settings, if applicable. Not all Tab preference settings need to implement this.
+     * @param subPref The sub preference settings to be selected.
+     * @return true if the specified preference settings have been selected, false otherwise.
+     * @since 5631
+     */
+    public boolean selectSubTab(SubPreferenceSetting subPref);
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java b/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java
index 85b7245..b7ba680 100644
--- a/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java
+++ b/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java
@@ -1,85 +1,85 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.preferences.advanced;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.AbstractAction;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.filechooser.FileFilter;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.DiskAccessAction;
-import org.openstreetmap.josm.data.CustomConfigurator;
-import org.openstreetmap.josm.data.Preferences;
-import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
-
-/**
- * Action that exports some fragment of settings to custom configuration file
- */
-public class ExportProfileAction extends AbstractAction {
-    private final String prefPattern;
-    private final String schemaKey;
-    private final Preferences prefs;
-
-    /**
-     * Constructs a new {@code ExportProfileAction}.
-     */
-    public ExportProfileAction(Preferences prefs, String schemaKey, String prefPattern) {
-        super(tr("Save {0} profile", tr(schemaKey)));
-        this.prefs = prefs;
-        this.prefPattern = prefPattern;
-        this.schemaKey = schemaKey;
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent ae) {
-        List<String> keys = new ArrayList<>();
-        Map<String, Setting<?>> all = prefs.getAllSettings();
-        for (String key: all.keySet()) {
-            if (key.matches(prefPattern)) {
-                keys.add(key);
-            }
-        }
-        if (keys.isEmpty()) {
-            JOptionPane.showMessageDialog(Main.parent,
-                    tr("All the preferences of this group are default, nothing to save"), tr("Warning"), JOptionPane.WARNING_MESSAGE);
-            return;
-        }
-        File f = askUserForCustomSettingsFile();
-        if (f!=null)
-           CustomConfigurator.exportPreferencesKeysToFile(f.getAbsolutePath(), false, keys);
-    }
-
-    private File askUserForCustomSettingsFile() {
-        String title = tr("Choose profile file");
-
-        FileFilter filter = new FileFilter() {
-            @Override
-            public boolean accept(File f) {
-                return f.isDirectory() || f.getName().toLowerCase().endsWith(".xml") && f.getName().toLowerCase().startsWith(schemaKey);
-            }
-            @Override
-            public String getDescription() {
-                return tr("JOSM custom settings files (*.xml)");
-            }
-        };
-        AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(false, false, title, filter, JFileChooser.FILES_ONLY, "customsettings.lastDirectory");
-        if (fc != null) {
-            File sel = fc.getSelectedFile();
-            if (!sel.getName().endsWith(".xml")) sel=new File(sel.getAbsolutePath()+".xml");
-            if (!sel.getName().startsWith(schemaKey)) {
-                sel = new File(sel.getParentFile().getAbsolutePath()+"/"+schemaKey+"_"+sel.getName());
-            }
-            return sel;
-        }
-        return null;
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.preferences.advanced;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DiskAccessAction;
+import org.openstreetmap.josm.data.CustomConfigurator;
+import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
+
+/**
+ * Action that exports some fragment of settings to custom configuration file
+ */
+public class ExportProfileAction extends AbstractAction {
+    private final String prefPattern;
+    private final String schemaKey;
+    private final Preferences prefs;
+
+    /**
+     * Constructs a new {@code ExportProfileAction}.
+     */
+    public ExportProfileAction(Preferences prefs, String schemaKey, String prefPattern) {
+        super(tr("Save {0} profile", tr(schemaKey)));
+        this.prefs = prefs;
+        this.prefPattern = prefPattern;
+        this.schemaKey = schemaKey;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        List<String> keys = new ArrayList<>();
+        Map<String, Setting<?>> all = prefs.getAllSettings();
+        for (String key: all.keySet()) {
+            if (key.matches(prefPattern)) {
+                keys.add(key);
+            }
+        }
+        if (keys.isEmpty()) {
+            JOptionPane.showMessageDialog(Main.parent,
+                    tr("All the preferences of this group are default, nothing to save"), tr("Warning"), JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+        File f = askUserForCustomSettingsFile();
+        if (f!=null)
+           CustomConfigurator.exportPreferencesKeysToFile(f.getAbsolutePath(), false, keys);
+    }
+
+    private File askUserForCustomSettingsFile() {
+        String title = tr("Choose profile file");
+
+        FileFilter filter = new FileFilter() {
+            @Override
+            public boolean accept(File f) {
+                return f.isDirectory() || f.getName().toLowerCase().endsWith(".xml") && f.getName().toLowerCase().startsWith(schemaKey);
+            }
+            @Override
+            public String getDescription() {
+                return tr("JOSM custom settings files (*.xml)");
+            }
+        };
+        AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(false, false, title, filter, JFileChooser.FILES_ONLY, "customsettings.lastDirectory");
+        if (fc != null) {
+            File sel = fc.getSelectedFile();
+            if (!sel.getName().endsWith(".xml")) sel=new File(sel.getAbsolutePath()+".xml");
+            if (!sel.getName().startsWith(schemaKey)) {
+                sel = new File(sel.getParentFile().getAbsolutePath()+"/"+schemaKey+"_"+sel.getName());
+            }
+            return sel;
+        }
+        return null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java b/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java
index fc907fc..85c2c54 100644
--- a/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java
+++ b/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java
@@ -1,110 +1,110 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.preferences.advanced;
-
-import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-
-/**
- * Class to store single preference line for the table.
- * @since 6021
- */
-public class PrefEntry implements Comparable<PrefEntry> {
-    private String key;
-    private Setting<?> value;
-    private Setting<?> defaultValue;
-    private boolean isDefault;
-    private boolean changed;
-
-    /**
-     * Constructs a new {@code PrefEntry}.
-     * @param key The preference key
-     * @param value The preference value
-     * @param defaultValue The preference default value
-     * @param isDefault determines if the current value is the default value
-     */
-    public PrefEntry(String key, Setting<?> value, Setting<?> defaultValue, boolean isDefault) {
-        CheckParameterUtil.ensureParameterNotNull(key);
-        CheckParameterUtil.ensureParameterNotNull(value);
-        CheckParameterUtil.ensureParameterNotNull(defaultValue);
-        this.key = key;
-        this.value = value;
-        this.defaultValue = defaultValue;
-        this.isDefault = isDefault;
-    }
-
-    /**
-     * Returns the preference key.
-     * @return the preference key
-     */
-    public String getKey() {
-        return key;
-    }
-
-    /**
-     * Returns the preference value.
-     * @return the preference value
-     */
-    public Setting<?> getValue() {
-        return value;
-    }
-
-    /**
-     * Returns the preference default value.
-     * @return the preference default value
-     */
-    public Setting<?> getDefaultValue() {
-        return defaultValue;
-    }
-
-    /**
-     * Sets the preference value.
-     * @param value the preference value
-     */
-    public void setValue(Setting<?> value) {
-        this.value = value;
-        changed = true;
-        isDefault = false;
-    }
-
-    /**
-     * Determines if the current value is the default value.
-     * @return {@code true} if the current value is the default value, {@code false} otherwise
-     */
-    public boolean isDefault() {
-        return isDefault;
-    }
-
-    /**
-     * Determines if this preference entry has been modified.
-     * @return {@code true} if this preference entry has been modified, {@code false} otherwise
-     */
-    public boolean isChanged() {
-        return changed;
-    }
-
-    /**
-     * Marks this preference entry as modified.
-     */
-    public void markAsChanged() {
-        changed = true;
-    }
-
-    /**
-     * Resets this preference entry to default state.
-     */
-    public void reset() {
-        value = defaultValue;
-        changed = true;
-        isDefault = true;
-    }
-
-    @Override
-    public int compareTo(PrefEntry other) {
-        return key.compareTo(other.key);
-    }
-
-    @Override
-    public String toString() {
-        return value.toString();
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.preferences.advanced;
+
+import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
+/**
+ * Class to store single preference line for the table.
+ * @since 6021
+ */
+public class PrefEntry implements Comparable<PrefEntry> {
+    private String key;
+    private Setting<?> value;
+    private Setting<?> defaultValue;
+    private boolean isDefault;
+    private boolean changed;
+
+    /**
+     * Constructs a new {@code PrefEntry}.
+     * @param key The preference key
+     * @param value The preference value
+     * @param defaultValue The preference default value
+     * @param isDefault determines if the current value is the default value
+     */
+    public PrefEntry(String key, Setting<?> value, Setting<?> defaultValue, boolean isDefault) {
+        CheckParameterUtil.ensureParameterNotNull(key);
+        CheckParameterUtil.ensureParameterNotNull(value);
+        CheckParameterUtil.ensureParameterNotNull(defaultValue);
+        this.key = key;
+        this.value = value;
+        this.defaultValue = defaultValue;
+        this.isDefault = isDefault;
+    }
+
+    /**
+     * Returns the preference key.
+     * @return the preference key
+     */
+    public String getKey() {
+        return key;
+    }
+
+    /**
+     * Returns the preference value.
+     * @return the preference value
+     */
+    public Setting<?> getValue() {
+        return value;
+    }
+
+    /**
+     * Returns the preference default value.
+     * @return the preference default value
+     */
+    public Setting<?> getDefaultValue() {
+        return defaultValue;
+    }
+
+    /**
+     * Sets the preference value.
+     * @param value the preference value
+     */
+    public void setValue(Setting<?> value) {
+        this.value = value;
+        changed = true;
+        isDefault = false;
+    }
+
+    /**
+     * Determines if the current value is the default value.
+     * @return {@code true} if the current value is the default value, {@code false} otherwise
+     */
+    public boolean isDefault() {
+        return isDefault;
+    }
+
+    /**
+     * Determines if this preference entry has been modified.
+     * @return {@code true} if this preference entry has been modified, {@code false} otherwise
+     */
+    public boolean isChanged() {
+        return changed;
+    }
+
+    /**
+     * Marks this preference entry as modified.
+     */
+    public void markAsChanged() {
+        changed = true;
+    }
+
+    /**
+     * Resets this preference entry to default state.
+     */
+    public void reset() {
+        value = defaultValue;
+        changed = true;
+        isDefault = true;
+    }
+
+    @Override
+    public int compareTo(PrefEntry other) {
+        return key.compareTo(other.key);
+    }
+
+    @Override
+    public String toString() {
+        return value.toString();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java b/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java
index bcdac61..0d0a6b6 100644
--- a/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java
+++ b/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java
@@ -1,362 +1,362 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.preferences.advanced;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.GridBagLayout;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.swing.ButtonGroup;
-import javax.swing.DefaultCellEditor;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.DefaultTableModel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Preferences.ListListSetting;
-import org.openstreetmap.josm.data.Preferences.ListSetting;
-import org.openstreetmap.josm.data.Preferences.MapListSetting;
-import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.data.Preferences.StringSetting;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Component for editing list of preferences as a table.
- * @since 6021
- */
-public class PreferencesTable extends JTable {
-    private AllSettingsTableModel model;
-    private final List<PrefEntry> displayData;
-
-    /**
-     * Constructs a new {@code PreferencesTable}.
-     * @param displayData The list of preferences entries to display
-     */
-    public PreferencesTable(List<PrefEntry> displayData) {
-        this.displayData = displayData;
-        model = new AllSettingsTableModel();
-        setModel(model);
-        putClientProperty("terminateEditOnFocusLost", true);
-        getColumnModel().getColumn(1).setCellRenderer(new SettingCellRenderer());
-        getColumnModel().getColumn(1).setCellEditor(new SettingCellEditor());
-
-        addMouseListener(new MouseAdapter() {
-            @Override public void mouseClicked(MouseEvent e) {
-                if (e.getClickCount() == 2) {
-                    editPreference(PreferencesTable.this);
-                }
-            }
-        });
-    }
-
-    /**
-     * This method should be called when displayed data was changed form external code
-     */
-    public void fireDataChanged() {
-        model.fireTableDataChanged();
-    }
-
-    /**
-     * The list of currently selected rows
-     * @return newly created list of PrefEntry
-     */
-    public List<PrefEntry> getSelectedItems() {
-        List<PrefEntry> entries = new ArrayList<>();
-        for (int row : getSelectedRows()) {
-            PrefEntry p = (PrefEntry) model.getValueAt(row, -1);
-            entries.add(p);
-        }
-        return entries;
-    }
-
-    /**
-     * Call this to edit selected row in preferences table
-     * @param gui - parent component for messagebox
-     * @return true if editing was actually performed during this call
-     */
-    public boolean editPreference(final JComponent gui) {
-        if (getSelectedRowCount() != 1) {
-            JOptionPane.showMessageDialog(
-                    gui,
-                    tr("Please select the row to edit."),
-                    tr("Warning"),
-                    JOptionPane.WARNING_MESSAGE
-                    );
-            return false;
-        }
-        final PrefEntry e = (PrefEntry) model.getValueAt(getSelectedRow(), 1);
-        Setting<?> stg = e.getValue();
-        if (stg instanceof StringSetting) {
-            editCellAt(getSelectedRow(), 1);
-            Component editor = getEditorComponent();
-            if (editor != null) {
-                editor.requestFocus();
-            }
-        } else if (stg instanceof ListSetting) {
-            ListSetting lSetting = (ListSetting) stg;
-            ListEditor lEditor = new ListEditor(gui, e, lSetting);
-            lEditor.showDialog();
-            if (lEditor.getValue() == 1) {
-                List<String> data = lEditor.getData();
-                if (!lSetting.equalVal(data)) {
-                    e.setValue(new ListSetting(data));
-                    return true;
-                }
-            }
-        } else if (stg instanceof ListListSetting) {
-            ListListSetting llSetting = (ListListSetting) stg;
-            ListListEditor llEditor = new ListListEditor(gui, e, llSetting);
-            llEditor.showDialog();
-            if (llEditor.getValue() == 1) {
-                List<List<String>> data = llEditor.getData();
-                if (!llSetting.equalVal(data)) {
-                    e.setValue(new ListListSetting(data));
-                    return true;
-                }
-            }
-        } else if (stg instanceof MapListSetting) {
-            MapListSetting mlSetting = (MapListSetting) stg;
-            MapListEditor mlEditor = new MapListEditor(gui, e, mlSetting);
-            mlEditor.showDialog();
-            if (mlEditor.getValue() == 1) {
-                List<Map<String, String>> data = mlEditor.getData();
-                if (!mlSetting.equalVal(data)) {
-                    e.setValue(new MapListSetting(data));
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Add new preference to the table
-     * @param gui - parent component for asking dialogs
-     * @return newly created entry or null if adding was cancelled
-     */
-    public PrefEntry addPreference(final JComponent gui) {
-        JPanel p = new JPanel(new GridBagLayout());
-        p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
-        JosmTextField tkey = new JosmTextField("", 50);
-        p.add(tkey, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
-
-        p.add(new JLabel(tr("Select Setting Type:")), GBC.eol().insets(5,15,5,0));
-
-        JRadioButton rbString = new JRadioButton(tr("Simple"));
-        JRadioButton rbList = new JRadioButton(tr("List"));
-        JRadioButton rbListList = new JRadioButton(tr("List of lists"));
-        JRadioButton rbMapList = new JRadioButton(tr("List of maps"));
-
-        ButtonGroup group = new ButtonGroup();
-        group.add(rbString);
-        group.add(rbList);
-        group.add(rbListList);
-        group.add(rbMapList);
-
-        p.add(rbString, GBC.eol());
-        p.add(rbList, GBC.eol());
-        p.add(rbListList, GBC.eol());
-        p.add(rbMapList, GBC.eol());
-
-        rbString.setSelected(true);
-
-        ExtendedDialog dlg = new ExtendedDialog(gui, tr("Add setting"), new String[] {tr("OK"), tr("Cancel")});
-        dlg.setButtonIcons(new String[] {"ok.png", "cancel.png"});
-        dlg.setContent(p);
-        dlg.showDialog();
-
-        PrefEntry pe = null;
-        boolean ok = false;
-        if (dlg.getValue() == 1) {
-            if (rbString.isSelected()) {
-                StringSetting sSetting = new StringSetting(null);
-                pe = new PrefEntry(tkey.getText(), sSetting, sSetting, false);
-                StringEditor sEditor = new StringEditor(gui, pe, sSetting);
-                sEditor.showDialog();
-                if (sEditor.getValue() == 1) {
-                    String data = sEditor.getData();
-                    if (!Objects.equals(sSetting.getValue(), data)) {
-                        pe.setValue(new StringSetting(data));
-                        ok = true;
-                    }
-                }
-            } else if (rbList.isSelected()) {
-                ListSetting lSetting = new ListSetting(null);
-                pe = new PrefEntry(tkey.getText(), lSetting, lSetting, false);
-                ListEditor lEditor = new ListEditor(gui, pe, lSetting);
-                lEditor.showDialog();
-                if (lEditor.getValue() == 1) {
-                    List<String> data = lEditor.getData();
-                    if (!lSetting.equalVal(data)) {
-                        pe.setValue(new ListSetting(data));
-                        ok = true;
-                    }
-                }
-            } else if (rbListList.isSelected()) {
-                ListListSetting llSetting = new ListListSetting(null);
-                pe = new PrefEntry(tkey.getText(), llSetting, llSetting, false);
-                ListListEditor llEditor = new ListListEditor(gui, pe, llSetting);
-                llEditor.showDialog();
-                if (llEditor.getValue() == 1) {
-                    List<List<String>> data = llEditor.getData();
-                    if (!llSetting.equalVal(data)) {
-                        pe.setValue(new ListListSetting(data));
-                        ok = true;
-                    }
-                }
-            } else if (rbMapList.isSelected()) {
-                MapListSetting mlSetting = new MapListSetting(null);
-                pe = new PrefEntry(tkey.getText(), mlSetting, mlSetting, false);
-                MapListEditor mlEditor = new MapListEditor(gui, pe, mlSetting);
-                mlEditor.showDialog();
-                if (mlEditor.getValue() == 1) {
-                    List<Map<String, String>> data = mlEditor.getData();
-                    if (!mlSetting.equalVal(data)) {
-                        pe.setValue(new MapListSetting(data));
-                        ok = true;
-                    }
-                }
-            }
-        }
-        if (ok)
-            return pe;
-        else
-            return null;
-    }
-
-    /**
-     * Reset selected preferences to their default values
-     * @param gui - parent component to display warning messages
-     */
-    public void resetPreferences(final JComponent gui) {
-        if (getSelectedRowCount() == 0) {
-            JOptionPane.showMessageDialog(
-                    gui,
-                    tr("Please select the row to delete."),
-                    tr("Warning"),
-                    JOptionPane.WARNING_MESSAGE
-                    );
-            return;
-        }
-        for (int row : getSelectedRows()) {
-            PrefEntry e = displayData.get(row);
-            e.reset();
-        }
-        fireDataChanged();
-    }
-
-    private class AllSettingsTableModel extends DefaultTableModel {
-
-        public AllSettingsTableModel() {
-            setColumnIdentifiers(new String[]{tr("Key"), tr("Value")});
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return column == 1 && (displayData.get(row).getValue() instanceof StringSetting);
-        }
-
-        @Override
-        public int getRowCount() {
-            return displayData.size();
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            if (column == 0)
-                return displayData.get(row).getKey();
-            else
-                return displayData.get(row);
-        }
-
-        @Override
-        public void setValueAt(Object o, int row, int column) {
-            PrefEntry pe = displayData.get(row);
-            String s = (String) o;
-            if (!s.equals(pe.getValue().getValue())) {
-                pe.setValue(new StringSetting(s));
-                fireTableCellUpdated(row, column);
-            }
-        }
-    }
-
-    private static class SettingCellRenderer extends DefaultTableCellRenderer {
-        private Color backgroundColor = Main.pref.getUIColor("Table.background");
-        private Color changedColor = Main.pref.getColor(
-                         marktr("Advanced Background: Changed"),
-                         new Color(200,255,200));
-        private Color foregroundColor = Main.pref.getUIColor("Table.foreground");
-        private Color nonDefaultColor = Main.pref.getColor(
-                            marktr("Advanced Background: NonDefault"),
-                            new Color(255,255,200));
-
-        @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-            if (value == null)
-                return this;
-            PrefEntry pe = (PrefEntry) value;
-            Setting<?> setting = pe.getValue();
-            Object val = setting.getValue();
-            String display = val != null ? val.toString() : "<html><i><"+tr("unset")+"></i></html>";
-
-            JLabel label = (JLabel)super.getTableCellRendererComponent(table,
-                    display, isSelected, hasFocus, row, column);
-
-            label.setBackground(backgroundColor);
-            if (isSelected) {
-                label.setForeground(foregroundColor);
-            }
-            if(pe.isChanged()) {
-                label.setBackground(changedColor);
-            } else if(!pe.isDefault()) {
-                label.setBackground(nonDefaultColor);
-            }
-
-            if (!pe.isDefault()) {
-                label.setFont(label.getFont().deriveFont(Font.BOLD));
-            }
-            val = pe.getDefaultValue().getValue();
-            if(val != null)
-            {
-                if(pe.isDefault()) {
-                    label.setToolTipText(tr("Current value is default."));
-                } else {
-                    label.setToolTipText(tr("Default value is ''{0}''.", val));
-                }
-            } else {
-                label.setToolTipText(tr("Default value currently unknown (setting has not been used yet)."));
-            }
-            return label;
-        }
-    }
-
-    private static class SettingCellEditor extends DefaultCellEditor {
-        public SettingCellEditor() {
-            super(new JosmTextField());
-        }
-
-        @Override
-        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
-            PrefEntry pe = (PrefEntry) value;
-            StringSetting stg = (StringSetting) pe.getValue();
-            String s = stg.getValue() == null ? "" : stg.getValue();
-            return super.getTableCellEditorComponent(table, s, isSelected, row, column);
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.preferences.advanced;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultCellEditor;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.DefaultTableModel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.ListListSetting;
+import org.openstreetmap.josm.data.Preferences.ListSetting;
+import org.openstreetmap.josm.data.Preferences.MapListSetting;
+import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.data.Preferences.StringSetting;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Component for editing list of preferences as a table.
+ * @since 6021
+ */
+public class PreferencesTable extends JTable {
+    private AllSettingsTableModel model;
+    private final List<PrefEntry> displayData;
+
+    /**
+     * Constructs a new {@code PreferencesTable}.
+     * @param displayData The list of preferences entries to display
+     */
+    public PreferencesTable(List<PrefEntry> displayData) {
+        this.displayData = displayData;
+        model = new AllSettingsTableModel();
+        setModel(model);
+        putClientProperty("terminateEditOnFocusLost", true);
+        getColumnModel().getColumn(1).setCellRenderer(new SettingCellRenderer());
+        getColumnModel().getColumn(1).setCellEditor(new SettingCellEditor());
+
+        addMouseListener(new MouseAdapter() {
+            @Override public void mouseClicked(MouseEvent e) {
+                if (e.getClickCount() == 2) {
+                    editPreference(PreferencesTable.this);
+                }
+            }
+        });
+    }
+
+    /**
+     * This method should be called when displayed data was changed form external code
+     */
+    public void fireDataChanged() {
+        model.fireTableDataChanged();
+    }
+
+    /**
+     * The list of currently selected rows
+     * @return newly created list of PrefEntry
+     */
+    public List<PrefEntry> getSelectedItems() {
+        List<PrefEntry> entries = new ArrayList<>();
+        for (int row : getSelectedRows()) {
+            PrefEntry p = (PrefEntry) model.getValueAt(row, -1);
+            entries.add(p);
+        }
+        return entries;
+    }
+
+    /**
+     * Call this to edit selected row in preferences table
+     * @param gui - parent component for messagebox
+     * @return true if editing was actually performed during this call
+     */
+    public boolean editPreference(final JComponent gui) {
+        if (getSelectedRowCount() != 1) {
+            JOptionPane.showMessageDialog(
+                    gui,
+                    tr("Please select the row to edit."),
+                    tr("Warning"),
+                    JOptionPane.WARNING_MESSAGE
+                    );
+            return false;
+        }
+        final PrefEntry e = (PrefEntry) model.getValueAt(getSelectedRow(), 1);
+        Setting<?> stg = e.getValue();
+        if (stg instanceof StringSetting) {
+            editCellAt(getSelectedRow(), 1);
+            Component editor = getEditorComponent();
+            if (editor != null) {
+                editor.requestFocus();
+            }
+        } else if (stg instanceof ListSetting) {
+            ListSetting lSetting = (ListSetting) stg;
+            ListEditor lEditor = new ListEditor(gui, e, lSetting);
+            lEditor.showDialog();
+            if (lEditor.getValue() == 1) {
+                List<String> data = lEditor.getData();
+                if (!lSetting.equalVal(data)) {
+                    e.setValue(new ListSetting(data));
+                    return true;
+                }
+            }
+        } else if (stg instanceof ListListSetting) {
+            ListListSetting llSetting = (ListListSetting) stg;
+            ListListEditor llEditor = new ListListEditor(gui, e, llSetting);
+            llEditor.showDialog();
+            if (llEditor.getValue() == 1) {
+                List<List<String>> data = llEditor.getData();
+                if (!llSetting.equalVal(data)) {
+                    e.setValue(new ListListSetting(data));
+                    return true;
+                }
+            }
+        } else if (stg instanceof MapListSetting) {
+            MapListSetting mlSetting = (MapListSetting) stg;
+            MapListEditor mlEditor = new MapListEditor(gui, e, mlSetting);
+            mlEditor.showDialog();
+            if (mlEditor.getValue() == 1) {
+                List<Map<String, String>> data = mlEditor.getData();
+                if (!mlSetting.equalVal(data)) {
+                    e.setValue(new MapListSetting(data));
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Add new preference to the table
+     * @param gui - parent component for asking dialogs
+     * @return newly created entry or null if adding was cancelled
+     */
+    public PrefEntry addPreference(final JComponent gui) {
+        JPanel p = new JPanel(new GridBagLayout());
+        p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
+        JosmTextField tkey = new JosmTextField("", 50);
+        p.add(tkey, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
+
+        p.add(new JLabel(tr("Select Setting Type:")), GBC.eol().insets(5,15,5,0));
+
+        JRadioButton rbString = new JRadioButton(tr("Simple"));
+        JRadioButton rbList = new JRadioButton(tr("List"));
+        JRadioButton rbListList = new JRadioButton(tr("List of lists"));
+        JRadioButton rbMapList = new JRadioButton(tr("List of maps"));
+
+        ButtonGroup group = new ButtonGroup();
+        group.add(rbString);
+        group.add(rbList);
+        group.add(rbListList);
+        group.add(rbMapList);
+
+        p.add(rbString, GBC.eol());
+        p.add(rbList, GBC.eol());
+        p.add(rbListList, GBC.eol());
+        p.add(rbMapList, GBC.eol());
+
+        rbString.setSelected(true);
+
+        ExtendedDialog dlg = new ExtendedDialog(gui, tr("Add setting"), new String[] {tr("OK"), tr("Cancel")});
+        dlg.setButtonIcons(new String[] {"ok.png", "cancel.png"});
+        dlg.setContent(p);
+        dlg.showDialog();
+
+        PrefEntry pe = null;
+        boolean ok = false;
+        if (dlg.getValue() == 1) {
+            if (rbString.isSelected()) {
+                StringSetting sSetting = new StringSetting(null);
+                pe = new PrefEntry(tkey.getText(), sSetting, sSetting, false);
+                StringEditor sEditor = new StringEditor(gui, pe, sSetting);
+                sEditor.showDialog();
+                if (sEditor.getValue() == 1) {
+                    String data = sEditor.getData();
+                    if (!Objects.equals(sSetting.getValue(), data)) {
+                        pe.setValue(new StringSetting(data));
+                        ok = true;
+                    }
+                }
+            } else if (rbList.isSelected()) {
+                ListSetting lSetting = new ListSetting(null);
+                pe = new PrefEntry(tkey.getText(), lSetting, lSetting, false);
+                ListEditor lEditor = new ListEditor(gui, pe, lSetting);
+                lEditor.showDialog();
+                if (lEditor.getValue() == 1) {
+                    List<String> data = lEditor.getData();
+                    if (!lSetting.equalVal(data)) {
+                        pe.setValue(new ListSetting(data));
+                        ok = true;
+                    }
+                }
+            } else if (rbListList.isSelected()) {
+                ListListSetting llSetting = new ListListSetting(null);
+                pe = new PrefEntry(tkey.getText(), llSetting, llSetting, false);
+                ListListEditor llEditor = new ListListEditor(gui, pe, llSetting);
+                llEditor.showDialog();
+                if (llEditor.getValue() == 1) {
+                    List<List<String>> data = llEditor.getData();
+                    if (!llSetting.equalVal(data)) {
+                        pe.setValue(new ListListSetting(data));
+                        ok = true;
+                    }
+                }
+            } else if (rbMapList.isSelected()) {
+                MapListSetting mlSetting = new MapListSetting(null);
+                pe = new PrefEntry(tkey.getText(), mlSetting, mlSetting, false);
+                MapListEditor mlEditor = new MapListEditor(gui, pe, mlSetting);
+                mlEditor.showDialog();
+                if (mlEditor.getValue() == 1) {
+                    List<Map<String, String>> data = mlEditor.getData();
+                    if (!mlSetting.equalVal(data)) {
+                        pe.setValue(new MapListSetting(data));
+                        ok = true;
+                    }
+                }
+            }
+        }
+        if (ok)
+            return pe;
+        else
+            return null;
+    }
+
+    /**
+     * Reset selected preferences to their default values
+     * @param gui - parent component to display warning messages
+     */
+    public void resetPreferences(final JComponent gui) {
+        if (getSelectedRowCount() == 0) {
+            JOptionPane.showMessageDialog(
+                    gui,
+                    tr("Please select the row to delete."),
+                    tr("Warning"),
+                    JOptionPane.WARNING_MESSAGE
+                    );
+            return;
+        }
+        for (int row : getSelectedRows()) {
+            PrefEntry e = displayData.get(row);
+            e.reset();
+        }
+        fireDataChanged();
+    }
+
+    private class AllSettingsTableModel extends DefaultTableModel {
+
+        public AllSettingsTableModel() {
+            setColumnIdentifiers(new String[]{tr("Key"), tr("Value")});
+        }
+
+        @Override
+        public boolean isCellEditable(int row, int column) {
+            return column == 1 && (displayData.get(row).getValue() instanceof StringSetting);
+        }
+
+        @Override
+        public int getRowCount() {
+            return displayData.size();
+        }
+
+        @Override
+        public Object getValueAt(int row, int column) {
+            if (column == 0)
+                return displayData.get(row).getKey();
+            else
+                return displayData.get(row);
+        }
+
+        @Override
+        public void setValueAt(Object o, int row, int column) {
+            PrefEntry pe = displayData.get(row);
+            String s = (String) o;
+            if (!s.equals(pe.getValue().getValue())) {
+                pe.setValue(new StringSetting(s));
+                fireTableCellUpdated(row, column);
+            }
+        }
+    }
+
+    private static class SettingCellRenderer extends DefaultTableCellRenderer {
+        private Color backgroundColor = Main.pref.getUIColor("Table.background");
+        private Color changedColor = Main.pref.getColor(
+                         marktr("Advanced Background: Changed"),
+                         new Color(200,255,200));
+        private Color foregroundColor = Main.pref.getUIColor("Table.foreground");
+        private Color nonDefaultColor = Main.pref.getColor(
+                            marktr("Advanced Background: NonDefault"),
+                            new Color(255,255,200));
+
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+            if (value == null)
+                return this;
+            PrefEntry pe = (PrefEntry) value;
+            Setting<?> setting = pe.getValue();
+            Object val = setting.getValue();
+            String display = val != null ? val.toString() : "<html><i><"+tr("unset")+"></i></html>";
+
+            JLabel label = (JLabel)super.getTableCellRendererComponent(table,
+                    display, isSelected, hasFocus, row, column);
+
+            label.setBackground(backgroundColor);
+            if (isSelected) {
+                label.setForeground(foregroundColor);
+            }
+            if(pe.isChanged()) {
+                label.setBackground(changedColor);
+            } else if(!pe.isDefault()) {
+                label.setBackground(nonDefaultColor);
+            }
+
+            if (!pe.isDefault()) {
+                label.setFont(label.getFont().deriveFont(Font.BOLD));
+            }
+            val = pe.getDefaultValue().getValue();
+            if(val != null)
+            {
+                if(pe.isDefault()) {
+                    label.setToolTipText(tr("Current value is default."));
+                } else {
+                    label.setToolTipText(tr("Default value is ''{0}''.", val));
+                }
+            } else {
+                label.setToolTipText(tr("Default value currently unknown (setting has not been used yet)."));
+            }
+            return label;
+        }
+    }
+
+    private static class SettingCellEditor extends DefaultCellEditor {
+        public SettingCellEditor() {
+            super(new JosmTextField());
+        }
+
+        @Override
+        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
+            PrefEntry pe = (PrefEntry) value;
+            StringSetting stg = (StringSetting) pe.getValue();
+            String s = stg.getValue() == null ? "" : stg.getValue();
+            return super.getTableCellEditorComponent(table, s, isSelected, row, column);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/advanced/package-info.java b/src/org/openstreetmap/josm/gui/preferences/advanced/package-info.java
index 7ccb931..afcd1fe 100644
--- a/src/org/openstreetmap/josm/gui/preferences/advanced/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/advanced/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling advanced preferences.
- */
-package org.openstreetmap.josm.gui.preferences.advanced;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling advanced preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.advanced;
diff --git a/src/org/openstreetmap/josm/gui/preferences/audio/package-info.java b/src/org/openstreetmap/josm/gui/preferences/audio/package-info.java
index cf8fd47..94c3453 100644
--- a/src/org/openstreetmap/josm/gui/preferences/audio/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/audio/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling audio preferences.
- */
-package org.openstreetmap.josm.gui.preferences.audio;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling audio preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.audio;
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java b/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java
index 406e365..003f17a 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/DisplayPreference.java
@@ -1,43 +1,43 @@
-//License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.display;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.JTabbedPane;
-
-import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Display preferences (various settings that influence the visual representation of the whole program).
- * @since 4969
- */
-public final class DisplayPreference extends DefaultTabPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code DisplayPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new DisplayPreference();
-        }
-    }
-
-    private DisplayPreference() {
-        super(/* ICON(preferences/) */ "display", tr("Display Settings"), tr("Various settings that influence the visual representation of the whole program."), false, new JTabbedPane());
-    }
-
-    @Override
-    public boolean ok() {
-        return false;
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
-    }
-}
+//License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.display;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.JTabbedPane;
+
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Display preferences (various settings that influence the visual representation of the whole program).
+ * @since 4969
+ */
+public final class DisplayPreference extends DefaultTabPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code DisplayPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new DisplayPreference();
+        }
+    }
+
+    private DisplayPreference() {
+        super(/* ICON(preferences/) */ "display", tr("Display Settings"), tr("Various settings that influence the visual representation of the whole program."), false, new JTabbedPane());
+    }
+
+    @Override
+    public boolean ok() {
+        return false;
+    }
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/package-info.java b/src/org/openstreetmap/josm/gui/preferences/display/package-info.java
index 74f8c41..84ed5e6 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling display preferences.
- */
-package org.openstreetmap.josm.gui.preferences.display;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling display preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.display;
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/AddImageryDialog.java b/src/org/openstreetmap/josm/gui/preferences/imagery/AddImageryDialog.java
index a3cb265..a1214bb 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/AddImageryDialog.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/AddImageryDialog.java
@@ -1,43 +1,43 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.imagery;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Component;
-import java.awt.Dimension;
-
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.preferences.imagery.AddImageryPanel.ContentValidationListener;
-
-/**
- * Dialog shown to add a new imagery (WMS/TMS) source from imagery preferences.
- * @since 5731
- */
-public class AddImageryDialog extends ExtendedDialog implements ContentValidationListener {
-    
-    /**
-     * Constructs a new AddImageryDialog.
-     * @param parent The parent element that will be used for position and maximum size
-     * @param panel  The content that will be displayed in the message dialog
-     */
-    public AddImageryDialog(Component parent, AddImageryPanel panel) {
-        super(parent, tr("Add Imagery URL"), new String[] {tr("OK"), tr("Cancel")});
-        setButtonIcons(new String[] {"ok", "cancel"});
-        setCancelButton(2);
-        configureContextsensitiveHelp("/Dialog/AddImagery", true /* show help button */);
-        setContent(panel, false);
-        setMinimumSize(new Dimension(300, 400));
-        panel.addContentValidationListener(this);
-    }
-
-    @Override
-    public void setupDialog() {
-        super.setupDialog();
-        contentChanged(false);
-    }
-
-    @Override
-    public void contentChanged(boolean isValid) {
-        buttons.get(0).setEnabled(isValid);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.preferences.imagery.AddImageryPanel.ContentValidationListener;
+
+/**
+ * Dialog shown to add a new imagery (WMS/TMS) source from imagery preferences.
+ * @since 5731
+ */
+public class AddImageryDialog extends ExtendedDialog implements ContentValidationListener {
+    
+    /**
+     * Constructs a new AddImageryDialog.
+     * @param parent The parent element that will be used for position and maximum size
+     * @param panel  The content that will be displayed in the message dialog
+     */
+    public AddImageryDialog(Component parent, AddImageryPanel panel) {
+        super(parent, tr("Add Imagery URL"), new String[] {tr("OK"), tr("Cancel")});
+        setButtonIcons(new String[] {"ok", "cancel"});
+        setCancelButton(2);
+        configureContextsensitiveHelp("/Dialog/AddImagery", true /* show help button */);
+        setContent(panel, false);
+        setMinimumSize(new Dimension(300, 400));
+        panel.addContentValidationListener(this);
+    }
+
+    @Override
+    public void setupDialog() {
+        super.setupDialog();
+        contentChanged(false);
+    }
+
+    @Override
+    public void contentChanged(boolean isValid) {
+        buttons.get(0).setEnabled(isValid);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
index 533051c..72679f7 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
@@ -1,97 +1,97 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.imagery;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JColorChooser;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JSlider;
-
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
-import org.openstreetmap.josm.tools.ColorHelper;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * {@code JPanel} giving access to common imagery settings.
- * @since 5465
- */
-public class CommonSettingsPanel extends JPanel {
-
-    // Common Settings
-    private final JButton btnFadeColor;
-    private final JSlider fadeAmount = new JSlider(0, 100);
-    private final JosmComboBox<String> sharpen;
-
-    /**
-     * Constructs a new {@code CommonSettingsPanel}.
-     */
-    public CommonSettingsPanel() {
-        super(new GridBagLayout());
-        
-        this.btnFadeColor = new JButton();
-
-        this.btnFadeColor.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                JColorChooser chooser = new JColorChooser(btnFadeColor.getBackground());
-                int answer = JOptionPane.showConfirmDialog(
-                        CommonSettingsPanel.this, chooser,
-                        tr("Choose a color for {0}", tr("imagery fade")),
-                        JOptionPane.OK_CANCEL_OPTION,
-                        JOptionPane.PLAIN_MESSAGE);
-                if (answer == JOptionPane.OK_OPTION) {
-                    Color colFadeColor = chooser.getColor();
-                    btnFadeColor.setBackground(colFadeColor);
-                    btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
-                }
-            }
-        });
-
-        add(new JLabel(tr("Fade Color: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL));
-
-        add(new JLabel(tr("Fade amount: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL));
-
-        this.sharpen = new JosmComboBox<>(new String[] {
-                tr("None"),
-                tr("Soft"),
-                tr("Strong")});
-        add(new JLabel(tr("Sharpen (requires layer re-add): ")));
-        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL));
-    }
-    
-    /**
-     * Loads the common settings.
-     */
-    public void loadSettings() {
-        Color colFadeColor = ImageryLayer.PROP_FADE_COLOR.get();
-        this.btnFadeColor.setBackground(colFadeColor);
-        this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
-        this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get());
-        this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get())));
-    }
-    
-    /**
-     * Saves the common settings.
-     * @return true when restart is required
-     */
-    public boolean saveSettings() {
-        ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue());
-        ImageryLayer.PROP_FADE_COLOR.put(this.btnFadeColor.getBackground());
-        ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
-        return false;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JColorChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * {@code JPanel} giving access to common imagery settings.
+ * @since 5465
+ */
+public class CommonSettingsPanel extends JPanel {
+
+    // Common Settings
+    private final JButton btnFadeColor;
+    private final JSlider fadeAmount = new JSlider(0, 100);
+    private final JosmComboBox<String> sharpen;
+
+    /**
+     * Constructs a new {@code CommonSettingsPanel}.
+     */
+    public CommonSettingsPanel() {
+        super(new GridBagLayout());
+        
+        this.btnFadeColor = new JButton();
+
+        this.btnFadeColor.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JColorChooser chooser = new JColorChooser(btnFadeColor.getBackground());
+                int answer = JOptionPane.showConfirmDialog(
+                        CommonSettingsPanel.this, chooser,
+                        tr("Choose a color for {0}", tr("imagery fade")),
+                        JOptionPane.OK_CANCEL_OPTION,
+                        JOptionPane.PLAIN_MESSAGE);
+                if (answer == JOptionPane.OK_OPTION) {
+                    Color colFadeColor = chooser.getColor();
+                    btnFadeColor.setBackground(colFadeColor);
+                    btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
+                }
+            }
+        });
+
+        add(new JLabel(tr("Fade Color: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Fade amount: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL));
+
+        this.sharpen = new JosmComboBox<>(new String[] {
+                tr("None"),
+                tr("Soft"),
+                tr("Strong")});
+        add(new JLabel(tr("Sharpen (requires layer re-add): ")));
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL));
+    }
+    
+    /**
+     * Loads the common settings.
+     */
+    public void loadSettings() {
+        Color colFadeColor = ImageryLayer.PROP_FADE_COLOR.get();
+        this.btnFadeColor.setBackground(colFadeColor);
+        this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
+        this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get());
+        this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get())));
+    }
+    
+    /**
+     * Saves the common settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue());
+        ImageryLayer.PROP_FADE_COLOR.put(this.btnFadeColor.getBackground());
+        ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
index f16c209..56efbfd 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
@@ -1,96 +1,96 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.imagery;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.GridBagLayout;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-
-import org.openstreetmap.josm.gui.layer.TMSLayer;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
-
-/**
- * {@code JPanel} giving access to TMS settings.
- * @since 5465
- */
-public class TMSSettingsPanel extends JPanel {
-
-    // TMS Settings
-    private final JCheckBox autozoomActive = new JCheckBox();
-    private final JCheckBox autoloadTiles = new JCheckBox();
-    private final JSpinner minZoomLvl;
-    private final JSpinner maxZoomLvl;
-    private final JCheckBox addToSlippyMapChosser = new JCheckBox();
-    private final JosmTextField tilecacheDir = new JosmTextField();
-
-    /**
-     * Constructs a new {@code TMSSettingsPanel}.
-     */
-    public TMSSettingsPanel() {
-        super(new GridBagLayout());
-        minZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MIN_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
-        maxZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MAX_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
-
-        add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
-
-        add(new JLabel(tr("Autoload tiles by default: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(autoloadTiles, GBC.eol().fill(GBC.HORIZONTAL));
-
-        add(new JLabel(tr("Min. zoom level: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(this.minZoomLvl, GBC.eol());
-
-        add(new JLabel(tr("Max. zoom level: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(this.maxZoomLvl, GBC.eol());
-
-        add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
-
-        add(new JLabel(tr("Tile cache directory: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(tilecacheDir, GBC.eol().fill(GBC.HORIZONTAL));
-    }
-    
-    /**
-     * Loads the TMS settings.
-     */
-    public void loadSettings() {
-        this.autozoomActive.setSelected(TMSLayer.PROP_DEFAULT_AUTOZOOM.get());
-        this.autoloadTiles.setSelected(TMSLayer.PROP_DEFAULT_AUTOLOAD.get());
-        this.addToSlippyMapChosser.setSelected(TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
-        this.maxZoomLvl.setValue(TMSLayer.getMaxZoomLvl(null));
-        this.minZoomLvl.setValue(TMSLayer.getMinZoomLvl(null));
-        this.tilecacheDir.setText(TMSLayer.PROP_TILECACHE_DIR.get());
-    }
-    
-    /**
-     * Saves the TMS settings.
-     * @return true when restart is required
-     */
-    public boolean saveSettings() {
-        boolean restartRequired = false;
-        
-        if (TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get() != this.addToSlippyMapChosser.isSelected()) {
-            restartRequired = true;
-        }
-        TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
-        TMSLayer.setMaxZoomLvl((Integer)this.maxZoomLvl.getValue());
-        TMSLayer.setMinZoomLvl((Integer)this.minZoomLvl.getValue());
-        TMSLayer.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText());
-        
-        return restartRequired;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagLayout;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+
+import org.openstreetmap.josm.gui.layer.TMSLayer;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
+
+/**
+ * {@code JPanel} giving access to TMS settings.
+ * @since 5465
+ */
+public class TMSSettingsPanel extends JPanel {
+
+    // TMS Settings
+    private final JCheckBox autozoomActive = new JCheckBox();
+    private final JCheckBox autoloadTiles = new JCheckBox();
+    private final JSpinner minZoomLvl;
+    private final JSpinner maxZoomLvl;
+    private final JCheckBox addToSlippyMapChosser = new JCheckBox();
+    private final JosmTextField tilecacheDir = new JosmTextField();
+
+    /**
+     * Constructs a new {@code TMSSettingsPanel}.
+     */
+    public TMSSettingsPanel() {
+        super(new GridBagLayout());
+        minZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MIN_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
+        maxZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MAX_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
+
+        add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Autoload tiles by default: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(autoloadTiles, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Min. zoom level: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(this.minZoomLvl, GBC.eol());
+
+        add(new JLabel(tr("Max. zoom level: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(this.maxZoomLvl, GBC.eol());
+
+        add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Tile cache directory: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(tilecacheDir, GBC.eol().fill(GBC.HORIZONTAL));
+    }
+    
+    /**
+     * Loads the TMS settings.
+     */
+    public void loadSettings() {
+        this.autozoomActive.setSelected(TMSLayer.PROP_DEFAULT_AUTOZOOM.get());
+        this.autoloadTiles.setSelected(TMSLayer.PROP_DEFAULT_AUTOLOAD.get());
+        this.addToSlippyMapChosser.setSelected(TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
+        this.maxZoomLvl.setValue(TMSLayer.getMaxZoomLvl(null));
+        this.minZoomLvl.setValue(TMSLayer.getMinZoomLvl(null));
+        this.tilecacheDir.setText(TMSLayer.PROP_TILECACHE_DIR.get());
+    }
+    
+    /**
+     * Saves the TMS settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        boolean restartRequired = false;
+        
+        if (TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get() != this.addToSlippyMapChosser.isSelected()) {
+            restartRequired = true;
+        }
+        TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
+        TMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
+        TMSLayer.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
+        TMSLayer.setMaxZoomLvl((Integer)this.maxZoomLvl.getValue());
+        TMSLayer.setMinZoomLvl((Integer)this.minZoomLvl.getValue());
+        TMSLayer.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText());
+        
+        return restartRequired;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
index 4ee7d97..044c91b 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
@@ -1,112 +1,112 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.imagery;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.FlowLayout;
-import java.awt.GridBagLayout;
-
-import javax.swing.Box;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-
-import org.openstreetmap.josm.gui.layer.WMSLayer;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
-import org.openstreetmap.josm.io.imagery.HTMLGrabber;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * {@code JPanel} giving access to WMS settings.
- * @since 5465
- */
-public class WMSSettingsPanel extends JPanel {
-
-    // WMS Settings
-    private final JCheckBox autozoomActive;
-    private final JosmComboBox<String> browser;
-    private final JCheckBox overlapCheckBox;
-    private final JSpinner spinEast;
-    private final JSpinner spinNorth;
-    private final JSpinner spinSimConn;
-
-    /**
-     * Constructs a new {@code WMSSettingsPanel}.
-     */
-    public WMSSettingsPanel() {
-        super(new GridBagLayout());
-
-        // Auto zoom
-        autozoomActive = new JCheckBox();
-        add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
-
-        // Downloader
-        browser = new JosmComboBox<>(new String[] {
-                "webkit-image {0}",
-                "gnome-web-photo --mode=photo --format=png {0} /dev/stdout",
-                "gnome-web-photo-fixed {0}",
-        "webkit-image-gtk {0}"});
-        browser.setEditable(true);
-        add(new JLabel(tr("Downloader:")), GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(browser, GBC.eol().fill(GBC.HORIZONTAL));
-
-        // Simultaneous connections
-        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
-        JLabel labelSimConn = new JLabel(tr("Simultaneous connections:"));
-        spinSimConn = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get().intValue(), 1, 30, 1));
-        add(labelSimConn, GBC.std());
-        add(GBC.glue(5, 0), GBC.std());
-        add(spinSimConn, GBC.eol());
-
-        // Overlap
-        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
-
-        overlapCheckBox = new JCheckBox(tr("Overlap tiles"));
-        JLabel labelEast = new JLabel(tr("% of east:"));
-        JLabel labelNorth = new JLabel(tr("% of north:"));
-        spinEast = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_EAST.get().intValue(), 1, 50, 1));
-        spinNorth = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_NORTH.get().intValue(), 1, 50, 1));
-
-        JPanel overlapPanel = new JPanel(new FlowLayout());
-        overlapPanel.add(overlapCheckBox);
-        overlapPanel.add(labelEast);
-        overlapPanel.add(spinEast);
-        overlapPanel.add(labelNorth);
-        overlapPanel.add(spinNorth);
-
-        add(overlapPanel, GBC.eop());
-    }
-    
-    /**
-     * Loads the WMS settings.
-     */
-    public void loadSettings() {
-        this.autozoomActive.setSelected(WMSLayer.PROP_DEFAULT_AUTOZOOM.get());
-        this.browser.setSelectedItem(HTMLGrabber.PROP_BROWSER.get());
-        this.overlapCheckBox.setSelected(WMSLayer.PROP_OVERLAP.get());
-        this.spinEast.setValue(WMSLayer.PROP_OVERLAP_EAST.get());
-        this.spinNorth.setValue(WMSLayer.PROP_OVERLAP_NORTH.get());
-        this.spinSimConn.setValue(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get());
-    }
-    
-    /**
-     * Saves the WMS settings.
-     * @return true when restart is required
-     */
-    public boolean saveSettings() {
-        WMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
-        WMSLayer.PROP_OVERLAP.put(overlapCheckBox.getModel().isSelected());
-        WMSLayer.PROP_OVERLAP_EAST.put((Integer) spinEast.getModel().getValue());
-        WMSLayer.PROP_OVERLAP_NORTH.put((Integer) spinNorth.getModel().getValue());
-        WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.put((Integer) spinSimConn.getModel().getValue());
-
-        HTMLGrabber.PROP_BROWSER.put(browser.getEditor().getItem().toString());
-        
-        return false;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.FlowLayout;
+import java.awt.GridBagLayout;
+
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+
+import org.openstreetmap.josm.gui.layer.WMSLayer;
+import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.io.imagery.HTMLGrabber;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * {@code JPanel} giving access to WMS settings.
+ * @since 5465
+ */
+public class WMSSettingsPanel extends JPanel {
+
+    // WMS Settings
+    private final JCheckBox autozoomActive;
+    private final JosmComboBox<String> browser;
+    private final JCheckBox overlapCheckBox;
+    private final JSpinner spinEast;
+    private final JSpinner spinNorth;
+    private final JSpinner spinSimConn;
+
+    /**
+     * Constructs a new {@code WMSSettingsPanel}.
+     */
+    public WMSSettingsPanel() {
+        super(new GridBagLayout());
+
+        // Auto zoom
+        autozoomActive = new JCheckBox();
+        add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
+
+        // Downloader
+        browser = new JosmComboBox<>(new String[] {
+                "webkit-image {0}",
+                "gnome-web-photo --mode=photo --format=png {0} /dev/stdout",
+                "gnome-web-photo-fixed {0}",
+        "webkit-image-gtk {0}"});
+        browser.setEditable(true);
+        add(new JLabel(tr("Downloader:")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(browser, GBC.eol().fill(GBC.HORIZONTAL));
+
+        // Simultaneous connections
+        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
+        JLabel labelSimConn = new JLabel(tr("Simultaneous connections:"));
+        spinSimConn = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get().intValue(), 1, 30, 1));
+        add(labelSimConn, GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(spinSimConn, GBC.eol());
+
+        // Overlap
+        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
+
+        overlapCheckBox = new JCheckBox(tr("Overlap tiles"));
+        JLabel labelEast = new JLabel(tr("% of east:"));
+        JLabel labelNorth = new JLabel(tr("% of north:"));
+        spinEast = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_EAST.get().intValue(), 1, 50, 1));
+        spinNorth = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_NORTH.get().intValue(), 1, 50, 1));
+
+        JPanel overlapPanel = new JPanel(new FlowLayout());
+        overlapPanel.add(overlapCheckBox);
+        overlapPanel.add(labelEast);
+        overlapPanel.add(spinEast);
+        overlapPanel.add(labelNorth);
+        overlapPanel.add(spinNorth);
+
+        add(overlapPanel, GBC.eop());
+    }
+    
+    /**
+     * Loads the WMS settings.
+     */
+    public void loadSettings() {
+        this.autozoomActive.setSelected(WMSLayer.PROP_DEFAULT_AUTOZOOM.get());
+        this.browser.setSelectedItem(HTMLGrabber.PROP_BROWSER.get());
+        this.overlapCheckBox.setSelected(WMSLayer.PROP_OVERLAP.get());
+        this.spinEast.setValue(WMSLayer.PROP_OVERLAP_EAST.get());
+        this.spinNorth.setValue(WMSLayer.PROP_OVERLAP_NORTH.get());
+        this.spinSimConn.setValue(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get());
+    }
+    
+    /**
+     * Saves the WMS settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        WMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
+        WMSLayer.PROP_OVERLAP.put(overlapCheckBox.getModel().isSelected());
+        WMSLayer.PROP_OVERLAP_EAST.put((Integer) spinEast.getModel().getValue());
+        WMSLayer.PROP_OVERLAP_NORTH.put((Integer) spinNorth.getModel().getValue());
+        WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.put((Integer) spinSimConn.getModel().getValue());
+
+        HTMLGrabber.PROP_BROWSER.put(browser.getEditor().getItem().toString());
+        
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/package-info.java b/src/org/openstreetmap/josm/gui/preferences/imagery/package-info.java
index 359d49d..e7958d6 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling imagery preferences.
- */
-package org.openstreetmap.josm.gui.preferences.imagery;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling imagery preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.imagery;
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
index a4849f3..59341bf 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
@@ -1,42 +1,42 @@
-//License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.map;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.JTabbedPane;
-
-import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Map preferences, including map paint styles, tagging presets and autosave sub-preferences.
- */
-public final class MapPreference extends DefaultTabPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code MapPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new MapPreference();
-        }
-    }
-    
-    private MapPreference() {
-        super(/* ICON(preferences/) */ "map", tr("Map Settings"), tr("Settings for the map projection and data interpretation."), false, new JTabbedPane());
-    }
-    
-    @Override
-    public boolean ok() {
-        return false;
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
-    }
-}
+//License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.map;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.JTabbedPane;
+
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Map preferences, including map paint styles, tagging presets and autosave sub-preferences.
+ */
+public final class MapPreference extends DefaultTabPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code MapPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new MapPreference();
+        }
+    }
+    
+    private MapPreference() {
+        super(/* ICON(preferences/) */ "map", tr("Map Settings"), tr("Settings for the map projection and data interpretation."), false, new JTabbedPane());
+    }
+    
+    @Override
+    public boolean ok() {
+        return false;
+    }
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/package-info.java b/src/org/openstreetmap/josm/gui/preferences/map/package-info.java
index 05343a0..035ccb3 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling map preferences.
- */
-package org.openstreetmap.josm.gui.preferences.map;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling map preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.map;
diff --git a/src/org/openstreetmap/josm/gui/preferences/package-info.java b/src/org/openstreetmap/josm/gui/preferences/package-info.java
index 193aa78..a9d20a7 100644
--- a/src/org/openstreetmap/josm/gui/preferences/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/package-info.java
@@ -1,7 +1,7 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides generic classes for handling JOSM preferences.
- * Functional classes for the different components are located in sub-packages.
- */
-package org.openstreetmap.josm.gui.preferences;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides generic classes for handling JOSM preferences.
+ * Functional classes for the different components are located in sub-packages.
+ */
+package org.openstreetmap.josm.gui.preferences;
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/package-info.java b/src/org/openstreetmap/josm/gui/preferences/plugin/package-info.java
index 2c857b8..0bbffda 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling plugin preferences.
- */
-package org.openstreetmap.josm.gui.preferences.plugin;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling plugin preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.plugin;
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java b/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
index 95e3726..1c18d57 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
@@ -187,7 +187,7 @@ public class CustomProjectionChoice extends AbstractProjectionChoice implements
             s.append("    "+tr("Built-in:")+" ");
             s.append(listKeys(Projections.nadgrids)+"<br>");
             s.append("<b>+bounds=</b>minlon,minlat,maxlon,maxlat - <i>"+tr("Projection bounds (in degrees)")+"</i><br>");
-            s.append("<b>+wmssrs=</b>EPSG:123456 - <i>"+tr("WMS SRS (EPSG code)")+"</i><br>");
+            s.append("<b>+wmssrs=</b>EPSG:123456 - <i>"+tr("Sets the SRS=... parameter in the WMS request")+"</i><br>");
 
             return new HtmlPanel(s.toString());
         }
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/package-info.java b/src/org/openstreetmap/josm/gui/preferences/projection/package-info.java
index 7bc515b..fbf343c 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling projection preferences.
- */
-package org.openstreetmap.josm.gui.preferences.projection;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling projection preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.projection;
diff --git a/src/org/openstreetmap/josm/gui/preferences/remotecontrol/package-info.java b/src/org/openstreetmap/josm/gui/preferences/remotecontrol/package-info.java
index d422514..b85a438 100644
--- a/src/org/openstreetmap/josm/gui/preferences/remotecontrol/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/remotecontrol/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling Remote Control preferences.
- */
-package org.openstreetmap.josm.gui.preferences.remotecontrol;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling Remote Control preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.remotecontrol;
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java
index 88f8176..5e5707d 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java
@@ -1,58 +1,58 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.server;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-
-/**
- * Authentication sub-preferences in server preferences.
- * @since 6523
- */
-public final class AuthenticationPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code AuthenticationPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new AuthenticationPreference();
-        }
-    }
-
-    AuthenticationPreferencesPanel pnlAuthPreferences;
-
-    private AuthenticationPreference() {
-        super();
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        pnlAuthPreferences = new AuthenticationPreferencesPanel();
-        gui.getServerPreference().addApiUrlChangeListener(pnlAuthPreferences);
-        gui.getServerPreference().addSubTab(this, tr("Authentication"),
-                pnlAuthPreferences.getVerticalScrollPane(),
-                tr("Configure your identity and how to authenticate at the OSM server"));
-    }
-
-    @Override
-    public boolean ok() {
-        pnlAuthPreferences.saveToPreferences();
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getServerPreference();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.server;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+
+/**
+ * Authentication sub-preferences in server preferences.
+ * @since 6523
+ */
+public final class AuthenticationPreference implements SubPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code AuthenticationPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new AuthenticationPreference();
+        }
+    }
+
+    AuthenticationPreferencesPanel pnlAuthPreferences;
+
+    private AuthenticationPreference() {
+        super();
+    }
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        pnlAuthPreferences = new AuthenticationPreferencesPanel();
+        gui.getServerPreference().addApiUrlChangeListener(pnlAuthPreferences);
+        gui.getServerPreference().addSubTab(this, tr("Authentication"),
+                pnlAuthPreferences.getVerticalScrollPane(),
+                tr("Configure your identity and how to authenticate at the OSM server"));
+    }
+
+    @Override
+    public boolean ok() {
+        pnlAuthPreferences.saveToPreferences();
+        return false;
+    }
+
+    @Override
+    public boolean isExpert() {
+        return false;
+    }
+
+    @Override
+    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
+        return gui.getServerPreference();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/MessagesNotifierPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/MessagesNotifierPanel.java
index 58f92ec..4338a18 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/MessagesNotifierPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/MessagesNotifierPanel.java
@@ -1,98 +1,98 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.server;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.GridBagLayout;
-
-import javax.swing.BorderFactory;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
-import org.openstreetmap.josm.io.MessageNotifier;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Preferences panel for OSM messages notifier.
- * @since 6349
- */
-public class MessagesNotifierPanel extends JPanel {
-
-    private JCheckBox notifier;
-    private JLabel intervalLabel;
-    private final JosmTextField notifierInterval = new JosmTextField(4);
-
-    /**
-     * Constructs a new {@code MessagesNotifierPanel}.
-     */
-    public MessagesNotifierPanel() {
-        build();
-        initFromPreferences();
-        updateEnabledState();
-    }
-
-    private void build() {
-        setLayout(new GridBagLayout());
-        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-
-        notifier = new JCheckBox(tr("Periodically check for new messages"));
-        add(notifier, GBC.eol());
-        notifier.addChangeListener(new ChangeListener() {
-            @Override
-            public void stateChanged(ChangeEvent e) {
-                updateEnabledState();
-            }
-        });
-        
-        intervalLabel = new JLabel(tr("Check interval (minutes):"));
-        add(intervalLabel, GBC.std().insets(25,0,0,0));
-
-        notifierInterval.setToolTipText(tr("Default value: {0}", MessageNotifier.PROP_INTERVAL.getDefaultValue()));
-        notifierInterval.setMinimumSize(notifierInterval.getPreferredSize());
-        add(notifierInterval, GBC.eol().insets(5,0,0,0));
-    }
-    
-    private void updateEnabledState() {
-        boolean enabled = notifier.isSelected();
-        intervalLabel.setEnabled(enabled);
-        notifierInterval.setEnabled(enabled);
-        notifierInterval.setEditable(enabled);
-    }
-
-    /**
-     * Initializes the panel from preferences
-     */
-    public final void initFromPreferences() {
-        notifier.setSelected(MessageNotifier.PROP_NOTIFIER_ENABLED.get());
-        notifierInterval.setText(Integer.toString(MessageNotifier.PROP_INTERVAL.get()));
-    }
-
-    /**
-     * Saves the current values to preferences
-     */
-    public void saveToPreferences() {
-        final boolean enabled = notifier.isSelected();
-        boolean changed = MessageNotifier.PROP_NOTIFIER_ENABLED.put(enabled);
-        changed |= MessageNotifier.PROP_INTERVAL.parseAndPut(notifierInterval.getText());
-        // If parameters have changed, restart notifier
-        if (changed) {
-            MessageNotifier.stop();
-            if (enabled) {
-                MessageNotifier.start();
-            }
-        // Even if they have not changed,
-        } else {
-            // notifier should be stopped if user is no more identified enough 
-            if (!MessageNotifier.isUserEnoughIdentified()) {
-                MessageNotifier.stop();
-            // or restarted if user is again identified and notifier was enabled in preferences
-            } else if (enabled && !MessageNotifier.isRunning()) {
-                MessageNotifier.start();
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.server;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagLayout;
+
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.io.MessageNotifier;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Preferences panel for OSM messages notifier.
+ * @since 6349
+ */
+public class MessagesNotifierPanel extends JPanel {
+
+    private JCheckBox notifier;
+    private JLabel intervalLabel;
+    private final JosmTextField notifierInterval = new JosmTextField(4);
+
+    /**
+     * Constructs a new {@code MessagesNotifierPanel}.
+     */
+    public MessagesNotifierPanel() {
+        build();
+        initFromPreferences();
+        updateEnabledState();
+    }
+
+    private void build() {
+        setLayout(new GridBagLayout());
+        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+        notifier = new JCheckBox(tr("Periodically check for new messages"));
+        add(notifier, GBC.eol());
+        notifier.addChangeListener(new ChangeListener() {
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                updateEnabledState();
+            }
+        });
+        
+        intervalLabel = new JLabel(tr("Check interval (minutes):"));
+        add(intervalLabel, GBC.std().insets(25,0,0,0));
+
+        notifierInterval.setToolTipText(tr("Default value: {0}", MessageNotifier.PROP_INTERVAL.getDefaultValue()));
+        notifierInterval.setMinimumSize(notifierInterval.getPreferredSize());
+        add(notifierInterval, GBC.eol().insets(5,0,0,0));
+    }
+    
+    private void updateEnabledState() {
+        boolean enabled = notifier.isSelected();
+        intervalLabel.setEnabled(enabled);
+        notifierInterval.setEnabled(enabled);
+        notifierInterval.setEditable(enabled);
+    }
+
+    /**
+     * Initializes the panel from preferences
+     */
+    public final void initFromPreferences() {
+        notifier.setSelected(MessageNotifier.PROP_NOTIFIER_ENABLED.get());
+        notifierInterval.setText(Integer.toString(MessageNotifier.PROP_INTERVAL.get()));
+    }
+
+    /**
+     * Saves the current values to preferences
+     */
+    public void saveToPreferences() {
+        final boolean enabled = notifier.isSelected();
+        boolean changed = MessageNotifier.PROP_NOTIFIER_ENABLED.put(enabled);
+        changed |= MessageNotifier.PROP_INTERVAL.parseAndPut(notifierInterval.getText());
+        // If parameters have changed, restart notifier
+        if (changed) {
+            MessageNotifier.stop();
+            if (enabled) {
+                MessageNotifier.start();
+            }
+        // Even if they have not changed,
+        } else {
+            // notifier should be stopped if user is no more identified enough 
+            if (!MessageNotifier.isUserEnoughIdentified()) {
+                MessageNotifier.stop();
+            // or restarted if user is again identified and notifier was enabled in preferences
+            } else if (enabled && !MessageNotifier.isRunning()) {
+                MessageNotifier.start();
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
index ddbaa4b..f0d31fe 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
@@ -1,91 +1,91 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.server;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-
-/**
- * Proxy sub-preferences in server preferences.
- * @since 6523
- */
-public final class ProxyPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code ProxyPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new ProxyPreference();
-        }
-    }
-
-    private static Set<ProxyPreferenceListener> listeners = new HashSet<>();
-    
-    private ProxyPreferencesPanel pnlProxyPreferences;
-
-    private ProxyPreference() {
-        super();
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        pnlProxyPreferences = new ProxyPreferencesPanel();
-        gui.getServerPreference().addSubTab(this, tr("Proxy settings"),
-                pnlProxyPreferences.getVerticalScrollPane(),
-                tr("Configure whether to use a proxy server"));
-    }
-
-    @Override
-    public boolean ok() {
-        pnlProxyPreferences.saveToPreferences();
-        for (ProxyPreferenceListener listener : listeners) {
-            listener.proxyPreferenceChanged();
-        }
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getServerPreference();
-    }
-    
-    /**
-     * Adds a new ProxyPreferenceListener.
-     * @param listener the listener to add
-     * @return {@code true} if the listener has been added, {@code false} otherwise
-     * @since 6525
-     */
-    public static boolean addProxyPreferenceListener(ProxyPreferenceListener listener) {
-        if (listener != null) {
-            return listeners.add(listener);
-        }
-        return false;
-    }
-
-    /**
-     * Removes a ProxyPreferenceListener.
-     * @param listener the listener to remove
-     * @return {@code true} if the listener has been removed, {@code false} otherwise
-     * @since 6525
-     */
-    public static boolean removeProxyPreferenceListener(ProxyPreferenceListener listener) {
-        if (listener != null) {
-            return listeners.remove(listener);
-        }
-        return false;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.server;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+
+/**
+ * Proxy sub-preferences in server preferences.
+ * @since 6523
+ */
+public final class ProxyPreference implements SubPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code ProxyPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new ProxyPreference();
+        }
+    }
+
+    private static Set<ProxyPreferenceListener> listeners = new HashSet<>();
+    
+    private ProxyPreferencesPanel pnlProxyPreferences;
+
+    private ProxyPreference() {
+        super();
+    }
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        pnlProxyPreferences = new ProxyPreferencesPanel();
+        gui.getServerPreference().addSubTab(this, tr("Proxy settings"),
+                pnlProxyPreferences.getVerticalScrollPane(),
+                tr("Configure whether to use a proxy server"));
+    }
+
+    @Override
+    public boolean ok() {
+        pnlProxyPreferences.saveToPreferences();
+        for (ProxyPreferenceListener listener : listeners) {
+            listener.proxyPreferenceChanged();
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isExpert() {
+        return false;
+    }
+
+    @Override
+    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
+        return gui.getServerPreference();
+    }
+    
+    /**
+     * Adds a new ProxyPreferenceListener.
+     * @param listener the listener to add
+     * @return {@code true} if the listener has been added, {@code false} otherwise
+     * @since 6525
+     */
+    public static boolean addProxyPreferenceListener(ProxyPreferenceListener listener) {
+        if (listener != null) {
+            return listeners.add(listener);
+        }
+        return false;
+    }
+
+    /**
+     * Removes a ProxyPreferenceListener.
+     * @param listener the listener to remove
+     * @return {@code true} if the listener has been removed, {@code false} otherwise
+     * @since 6525
+     */
+    public static boolean removeProxyPreferenceListener(ProxyPreferenceListener listener) {
+        if (listener != null) {
+            return listeners.remove(listener);
+        }
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceListener.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceListener.java
index f43d2bd..bf00e9e 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceListener.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceListener.java
@@ -1,14 +1,14 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.server;
-
-/**
- * Listener called when proxy settings are updated.
- * @since 6525
- */
-public interface ProxyPreferenceListener {
-
-    /**
-     * Method called when proxy settings are updated.
-     */
-    public void proxyPreferenceChanged();
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.server;
+
+/**
+ * Listener called when proxy settings are updated.
+ * @since 6525
+ */
+public interface ProxyPreferenceListener {
+
+    /**
+     * Method called when proxy settings are updated.
+     */
+    public void proxyPreferenceChanged();
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/package-info.java b/src/org/openstreetmap/josm/gui/preferences/server/package-info.java
index 5533da4..700fa3b 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling connection preferences, including server authentication and proxy settings.
- */
-package org.openstreetmap.josm.gui.preferences.server;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling connection preferences, including server authentication and proxy settings.
+ */
+package org.openstreetmap.josm.gui.preferences.server;
diff --git a/src/org/openstreetmap/josm/gui/preferences/shortcut/package-info.java b/src/org/openstreetmap/josm/gui/preferences/shortcut/package-info.java
index 85b4234..f953630 100644
--- a/src/org/openstreetmap/josm/gui/preferences/shortcut/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/shortcut/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling shortcut preferences.
- */
-package org.openstreetmap.josm.gui.preferences.shortcut;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling shortcut preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.shortcut;
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
index 295503c..e90ba1e 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
@@ -1,211 +1,211 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.validator;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.validation.OsmValidator;
-import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SourceEditor;
-import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
-import org.openstreetmap.josm.gui.preferences.SourceEntry;
-import org.openstreetmap.josm.gui.preferences.SourceProvider;
-import org.openstreetmap.josm.gui.preferences.SourceType;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-
-/**
- * The general validator preferences, allowing to enable/disable tests.
- * @since 6669
- */
-public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code ValidatorTagCheckerRulesPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new ValidatorTagCheckerRulesPreference();
-        }
-    }
-
-    private static final List<SourceProvider> ruleSourceProviders = new ArrayList<>();
-
-    /**
-     * Registers a new additional rule source provider.
-     * @param provider The rule source provider
-     * @return {@code true}, if the provider has been added, {@code false} otherwise
-     */
-    public static final boolean registerSourceProvider(SourceProvider provider) {
-        if (provider != null)
-            return ruleSourceProviders.add(provider);
-        return false;
-    }
-    
-    static class TagCheckerRulesSourceEditor extends SourceEditor {
-
-        public TagCheckerRulesSourceEditor() {
-            super(SourceType.TAGCHECKER_RULE, Main.getJOSMWebsite()+"/rules", ruleSourceProviders, false);
-        }
-
-        @Override
-        public Collection<? extends SourceEntry> getInitialSourcesList() {
-            return RulePrefHelper.INSTANCE.get();
-        }
-
-        @Override
-        public boolean finish() {
-            return RulePrefHelper.INSTANCE.put(activeSourcesModel.getSources());
-        }
-
-        @Override
-        public Collection<ExtendedSourceEntry> getDefault() {
-            return RulePrefHelper.INSTANCE.getDefault();
-        }
-
-        @Override
-        public Collection<String> getInitialIconPathsList() {
-            return null;
-        }
-
-        @Override
-        public String getStr(I18nString ident) {
-            switch (ident) {
-            case AVAILABLE_SOURCES:
-                return tr("Available rules:");
-            case ACTIVE_SOURCES:
-                return tr("Active rules:");
-            case NEW_SOURCE_ENTRY_TOOLTIP:
-                return tr("Add a new rule by entering filename or URL");
-            case NEW_SOURCE_ENTRY:
-                return tr("New rule entry:");
-            case REMOVE_SOURCE_TOOLTIP:
-                return tr("Remove the selected rules from the list of active rules");
-            case EDIT_SOURCE_TOOLTIP:
-                return tr("Edit the filename or URL for the selected active rule");
-            case ACTIVATE_TOOLTIP:
-                return tr("Add the selected available rules to the list of active rules");
-            case RELOAD_ALL_AVAILABLE:
-                return marktr("Reloads the list of available rules from ''{0}''");
-            case LOADING_SOURCES_FROM:
-                return marktr("Loading rule sources from ''{0}''");
-            case FAILED_TO_LOAD_SOURCES_FROM:
-                return marktr("<html>Failed to load the list of rule sources from<br>"
-                        + "''{0}''.<br>"
-                        + "<br>"
-                        + "Details (untranslated):<br>{1}</html>");
-            case FAILED_TO_LOAD_SOURCES_FROM_HELP_TOPIC:
-                return "/Preferences/Rules#FailedToLoadRuleSources";
-            case ILLEGAL_FORMAT_OF_ENTRY:
-                return marktr("Warning: illegal format of entry in rule list ''{0}''. Got ''{1}''");
-            default: throw new AssertionError();
-            }
-        }
-    }
-    
-    /**
-     * Helper class for validator tag checker rules preferences.
-     */
-    public static class RulePrefHelper extends SourceEditor.SourcePrefHelper {
-
-        /**
-         * The unique instance.
-         */
-        public static final RulePrefHelper INSTANCE = new RulePrefHelper();
-
-        /**
-         * Constructs a new {@code PresetPrefHelper}.
-         */
-        public RulePrefHelper() {
-            super(MapCSSTagChecker.ENTRIES_PREF_KEY);
-        }
-
-        @Override
-        public Collection<ExtendedSourceEntry> getDefault() {
-            List<ExtendedSourceEntry> def = new ArrayList<>();
-            
-            addDefault(def, "addresses",    tr("Addresses"),           tr("Checks for errors on addresses"));
-            addDefault(def, "combinations", tr("Tag combinations"),    tr("Checks for missing tag or suspicious combinations"));
-            addDefault(def, "deprecated",   tr("Deprecated features"), tr("Checks for deprecated features"));
-            addDefault(def, "geometry",     tr("Geometry"),            tr("Checks for geometry errors"));
-            addDefault(def, "highway",      tr("Highways"),            tr("Checks for errors on highways"));
-            addDefault(def, "multiple",     tr("Multiple values"),     tr("Checks for wrong multiple values"));
-            addDefault(def, "numeric",      tr("Numeric values"),      tr("Checks for wrong numeric values"));
-            addDefault(def, "power",        tr("Power"),               tr("Checks for errors on power infrastructures"));
-            addDefault(def, "religion",     tr("Religion"),            tr("Checks for errors on religious objects"));
-            addDefault(def, "relation",     tr("Relations"),           tr("Checks for errors on relations"));
-            addDefault(def, "unnecessary",  tr("Unnecessary tags"),    tr("Checks for unnecessary tags"));
-            addDefault(def, "wikipedia",    tr("Wikipedia"),           tr("Checks for wrong wikipedia tags"));
-            
-            return def;
-        }
-        
-        private void addDefault(List<ExtendedSourceEntry> defaults, String filename, String title, String description) {
-            ExtendedSourceEntry i = new ExtendedSourceEntry(filename+".mapcss", "resource://data/validator/"+filename+".mapcss");
-            i.title = title;
-            i.description = description;
-            defaults.add(i);
-        }
-
-        @Override
-        public Map<String, String> serialize(SourceEntry entry) {
-            Map<String, String> res = new HashMap<>();
-            res.put("url", entry.url);
-            res.put("title", entry.title == null ? "" : entry.title);
-            res.put("active", Boolean.toString(entry.active));
-            return res;
-        }
-
-        @Override
-        public SourceEntry deserialize(Map<String, String> s) {
-            return new SourceEntry(s.get("url"), null, s.get("title"), Boolean.parseBoolean(s.get("active")));
-        }
-    }
-
-    private SourceEditor sources;
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        final ValidatorPreference valPref = gui.getValidatorPreference();
-        sources = new TagCheckerRulesSourceEditor();
-        
-        valPref.addSubTab(this, tr("Tag checker rules"),
-                sources, tr("Choose Tag checker rules to enable"));
-        sources.deferLoading(valPref, sources);
-    }
-
-    @Override
-    public boolean ok() {
-        if (sources.finish()) {
-            // Reload sources
-            MapCSSTagChecker tagChecker = OsmValidator.getTest(MapCSSTagChecker.class);
-            if (tagChecker != null) {
-                OsmValidator.initializeTests(Collections.singleton(tagChecker));
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getValidatorPreference();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.validator;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.gui.preferences.SourceEditor;
+import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
+import org.openstreetmap.josm.gui.preferences.SourceEntry;
+import org.openstreetmap.josm.gui.preferences.SourceProvider;
+import org.openstreetmap.josm.gui.preferences.SourceType;
+import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+
+/**
+ * The general validator preferences, allowing to enable/disable tests.
+ * @since 6669
+ */
+public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code ValidatorTagCheckerRulesPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new ValidatorTagCheckerRulesPreference();
+        }
+    }
+
+    private static final List<SourceProvider> ruleSourceProviders = new ArrayList<>();
+
+    /**
+     * Registers a new additional rule source provider.
+     * @param provider The rule source provider
+     * @return {@code true}, if the provider has been added, {@code false} otherwise
+     */
+    public static final boolean registerSourceProvider(SourceProvider provider) {
+        if (provider != null)
+            return ruleSourceProviders.add(provider);
+        return false;
+    }
+    
+    static class TagCheckerRulesSourceEditor extends SourceEditor {
+
+        public TagCheckerRulesSourceEditor() {
+            super(SourceType.TAGCHECKER_RULE, Main.getJOSMWebsite()+"/rules", ruleSourceProviders, false);
+        }
+
+        @Override
+        public Collection<? extends SourceEntry> getInitialSourcesList() {
+            return RulePrefHelper.INSTANCE.get();
+        }
+
+        @Override
+        public boolean finish() {
+            return RulePrefHelper.INSTANCE.put(activeSourcesModel.getSources());
+        }
+
+        @Override
+        public Collection<ExtendedSourceEntry> getDefault() {
+            return RulePrefHelper.INSTANCE.getDefault();
+        }
+
+        @Override
+        public Collection<String> getInitialIconPathsList() {
+            return null;
+        }
+
+        @Override
+        public String getStr(I18nString ident) {
+            switch (ident) {
+            case AVAILABLE_SOURCES:
+                return tr("Available rules:");
+            case ACTIVE_SOURCES:
+                return tr("Active rules:");
+            case NEW_SOURCE_ENTRY_TOOLTIP:
+                return tr("Add a new rule by entering filename or URL");
+            case NEW_SOURCE_ENTRY:
+                return tr("New rule entry:");
+            case REMOVE_SOURCE_TOOLTIP:
+                return tr("Remove the selected rules from the list of active rules");
+            case EDIT_SOURCE_TOOLTIP:
+                return tr("Edit the filename or URL for the selected active rule");
+            case ACTIVATE_TOOLTIP:
+                return tr("Add the selected available rules to the list of active rules");
+            case RELOAD_ALL_AVAILABLE:
+                return marktr("Reloads the list of available rules from ''{0}''");
+            case LOADING_SOURCES_FROM:
+                return marktr("Loading rule sources from ''{0}''");
+            case FAILED_TO_LOAD_SOURCES_FROM:
+                return marktr("<html>Failed to load the list of rule sources from<br>"
+                        + "''{0}''.<br>"
+                        + "<br>"
+                        + "Details (untranslated):<br>{1}</html>");
+            case FAILED_TO_LOAD_SOURCES_FROM_HELP_TOPIC:
+                return "/Preferences/Rules#FailedToLoadRuleSources";
+            case ILLEGAL_FORMAT_OF_ENTRY:
+                return marktr("Warning: illegal format of entry in rule list ''{0}''. Got ''{1}''");
+            default: throw new AssertionError();
+            }
+        }
+    }
+    
+    /**
+     * Helper class for validator tag checker rules preferences.
+     */
+    public static class RulePrefHelper extends SourceEditor.SourcePrefHelper {
+
+        /**
+         * The unique instance.
+         */
+        public static final RulePrefHelper INSTANCE = new RulePrefHelper();
+
+        /**
+         * Constructs a new {@code PresetPrefHelper}.
+         */
+        public RulePrefHelper() {
+            super(MapCSSTagChecker.ENTRIES_PREF_KEY);
+        }
+
+        @Override
+        public Collection<ExtendedSourceEntry> getDefault() {
+            List<ExtendedSourceEntry> def = new ArrayList<>();
+            
+            addDefault(def, "addresses",    tr("Addresses"),           tr("Checks for errors on addresses"));
+            addDefault(def, "combinations", tr("Tag combinations"),    tr("Checks for missing tag or suspicious combinations"));
+            addDefault(def, "deprecated",   tr("Deprecated features"), tr("Checks for deprecated features"));
+            addDefault(def, "geometry",     tr("Geometry"),            tr("Checks for geometry errors"));
+            addDefault(def, "highway",      tr("Highways"),            tr("Checks for errors on highways"));
+            addDefault(def, "multiple",     tr("Multiple values"),     tr("Checks for wrong multiple values"));
+            addDefault(def, "numeric",      tr("Numeric values"),      tr("Checks for wrong numeric values"));
+            addDefault(def, "power",        tr("Power"),               tr("Checks for errors on power infrastructures"));
+            addDefault(def, "religion",     tr("Religion"),            tr("Checks for errors on religious objects"));
+            addDefault(def, "relation",     tr("Relations"),           tr("Checks for errors on relations"));
+            addDefault(def, "unnecessary",  tr("Unnecessary tags"),    tr("Checks for unnecessary tags"));
+            addDefault(def, "wikipedia",    tr("Wikipedia"),           tr("Checks for wrong wikipedia tags"));
+            
+            return def;
+        }
+        
+        private void addDefault(List<ExtendedSourceEntry> defaults, String filename, String title, String description) {
+            ExtendedSourceEntry i = new ExtendedSourceEntry(filename+".mapcss", "resource://data/validator/"+filename+".mapcss");
+            i.title = title;
+            i.description = description;
+            defaults.add(i);
+        }
+
+        @Override
+        public Map<String, String> serialize(SourceEntry entry) {
+            Map<String, String> res = new HashMap<>();
+            res.put("url", entry.url);
+            res.put("title", entry.title == null ? "" : entry.title);
+            res.put("active", Boolean.toString(entry.active));
+            return res;
+        }
+
+        @Override
+        public SourceEntry deserialize(Map<String, String> s) {
+            return new SourceEntry(s.get("url"), null, s.get("title"), Boolean.parseBoolean(s.get("active")));
+        }
+    }
+
+    private SourceEditor sources;
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        final ValidatorPreference valPref = gui.getValidatorPreference();
+        sources = new TagCheckerRulesSourceEditor();
+        
+        valPref.addSubTab(this, tr("Tag checker rules"),
+                sources, tr("Choose Tag checker rules to enable"));
+        sources.deferLoading(valPref, sources);
+    }
+
+    @Override
+    public boolean ok() {
+        if (sources.finish()) {
+            // Reload sources
+            MapCSSTagChecker tagChecker = OsmValidator.getTest(MapCSSTagChecker.class);
+            if (tagChecker != null) {
+                OsmValidator.initializeTests(Collections.singleton(tagChecker));
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean isExpert() {
+        return false;
+    }
+
+    @Override
+    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
+        return gui.getValidatorPreference();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
index 864018e..b5c3889 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
@@ -1,139 +1,139 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.validator;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.validation.OsmValidator;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * The general validator preferences, allowing to enable/disable tests.
- * @since 6666
- */
-public class ValidatorTestsPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code ValidatorTestsPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new ValidatorTestsPreference();
-        }
-    }
-
-    private JCheckBox prefUseIgnore;
-    private JCheckBox prefUseLayer;
-    private JCheckBox prefOtherUpload;
-    private JCheckBox prefOther;
-
-    /** The list of all tests */
-    private Collection<Test> allTests;
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        JPanel testPanel = new JPanel(new GridBagLayout());
-        testPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-
-        prefUseIgnore = new JCheckBox(tr("Use ignore list."), Main.pref.getBoolean(ValidatorPreference.PREF_USE_IGNORE, true));
-        prefUseIgnore.setToolTipText(tr("Use the ignore list to suppress warnings."));
-        testPanel.add(prefUseIgnore, GBC.eol());
-
-        prefUseLayer = new JCheckBox(tr("Use error layer."), Main.pref.getBoolean(ValidatorPreference.PREF_LAYER, true));
-        prefUseLayer.setToolTipText(tr("Use the error layer to display problematic elements."));
-        testPanel.add(prefUseLayer, GBC.eol());
-
-        prefOther = new JCheckBox(tr("Show informational level."), ValidatorPreference.PREF_OTHER.get());
-        prefOther.setToolTipText(tr("Show the informational tests."));
-        testPanel.add(prefOther, GBC.eol());
-
-        prefOtherUpload = new JCheckBox(tr("Show informational level on upload."), Main.pref.getBoolean(ValidatorPreference.PREF_OTHER_UPLOAD, false));
-        prefOtherUpload.setToolTipText(tr("Show the informational tests in the upload check windows."));
-        testPanel.add(prefOtherUpload, GBC.eol());
-
-        ActionListener otherUploadEnabled = new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                prefOtherUpload.setEnabled(prefOther.isSelected());
-            }
-        };
-        prefOther.addActionListener(otherUploadEnabled);
-        otherUploadEnabled.actionPerformed(null);
-
-        GBC a = GBC.eol().insets(-5,0,0,0);
-        a.anchor = GBC.EAST;
-        testPanel.add( new JLabel(tr("On demand")), GBC.std() );
-        testPanel.add( new JLabel(tr("On upload")), a );
-
-        allTests = OsmValidator.getTests();
-        for (Test test: allTests) {
-            test.addGui(testPanel);
-        }
-
-        gui.getValidatorPreference().addSubTab(this, tr("Tests"),
-                GuiHelper.embedInVerticalScrollPane(testPanel),
-                tr("Choose tests to enable"));
-    }
-
-    @Override
-    public boolean ok() {
-        Collection<String> tests = new LinkedList<>();
-        Collection<String> testsBeforeUpload = new LinkedList<>();
-
-        for (Test test : allTests) {
-            test.ok();
-            String name = test.getClass().getName();
-            if(!test.enabled)
-                tests.add(name);
-            if(!test.testBeforeUpload)
-                testsBeforeUpload.add(name);
-        }
-
-        // Initializes all tests but MapCSSTagChecker because it is initialized
-        // later in ValidatorTagCheckerRulesPreference.ok(),
-        // after its list of rules has been saved to preferences
-        List<Test> testsToInitialize = new ArrayList<>(allTests);
-        testsToInitialize.remove(OsmValidator.getTest(MapCSSTagChecker.class));
-        OsmValidator.initializeTests(testsToInitialize);
-
-        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS, tests);
-        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
-        Main.pref.put(ValidatorPreference.PREF_USE_IGNORE, prefUseIgnore.isSelected());
-        ValidatorPreference.PREF_OTHER.put(prefOther.isSelected());
-        Main.pref.put(ValidatorPreference.PREF_OTHER_UPLOAD, prefOtherUpload.isSelected());
-        Main.pref.put(ValidatorPreference.PREF_LAYER, prefUseLayer.isSelected());
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getValidatorPreference();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.validator;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * The general validator preferences, allowing to enable/disable tests.
+ * @since 6666
+ */
+public class ValidatorTestsPreference implements SubPreferenceSetting {
+
+    /**
+     * Factory used to create a new {@code ValidatorTestsPreference}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new ValidatorTestsPreference();
+        }
+    }
+
+    private JCheckBox prefUseIgnore;
+    private JCheckBox prefUseLayer;
+    private JCheckBox prefOtherUpload;
+    private JCheckBox prefOther;
+
+    /** The list of all tests */
+    private Collection<Test> allTests;
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        JPanel testPanel = new JPanel(new GridBagLayout());
+        testPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+        prefUseIgnore = new JCheckBox(tr("Use ignore list."), Main.pref.getBoolean(ValidatorPreference.PREF_USE_IGNORE, true));
+        prefUseIgnore.setToolTipText(tr("Use the ignore list to suppress warnings."));
+        testPanel.add(prefUseIgnore, GBC.eol());
+
+        prefUseLayer = new JCheckBox(tr("Use error layer."), Main.pref.getBoolean(ValidatorPreference.PREF_LAYER, true));
+        prefUseLayer.setToolTipText(tr("Use the error layer to display problematic elements."));
+        testPanel.add(prefUseLayer, GBC.eol());
+
+        prefOther = new JCheckBox(tr("Show informational level."), ValidatorPreference.PREF_OTHER.get());
+        prefOther.setToolTipText(tr("Show the informational tests."));
+        testPanel.add(prefOther, GBC.eol());
+
+        prefOtherUpload = new JCheckBox(tr("Show informational level on upload."), Main.pref.getBoolean(ValidatorPreference.PREF_OTHER_UPLOAD, false));
+        prefOtherUpload.setToolTipText(tr("Show the informational tests in the upload check windows."));
+        testPanel.add(prefOtherUpload, GBC.eol());
+
+        ActionListener otherUploadEnabled = new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                prefOtherUpload.setEnabled(prefOther.isSelected());
+            }
+        };
+        prefOther.addActionListener(otherUploadEnabled);
+        otherUploadEnabled.actionPerformed(null);
+
+        GBC a = GBC.eol().insets(-5,0,0,0);
+        a.anchor = GBC.EAST;
+        testPanel.add( new JLabel(tr("On demand")), GBC.std() );
+        testPanel.add( new JLabel(tr("On upload")), a );
+
+        allTests = OsmValidator.getTests();
+        for (Test test: allTests) {
+            test.addGui(testPanel);
+        }
+
+        gui.getValidatorPreference().addSubTab(this, tr("Tests"),
+                GuiHelper.embedInVerticalScrollPane(testPanel),
+                tr("Choose tests to enable"));
+    }
+
+    @Override
+    public boolean ok() {
+        Collection<String> tests = new LinkedList<>();
+        Collection<String> testsBeforeUpload = new LinkedList<>();
+
+        for (Test test : allTests) {
+            test.ok();
+            String name = test.getClass().getName();
+            if(!test.enabled)
+                tests.add(name);
+            if(!test.testBeforeUpload)
+                testsBeforeUpload.add(name);
+        }
+
+        // Initializes all tests but MapCSSTagChecker because it is initialized
+        // later in ValidatorTagCheckerRulesPreference.ok(),
+        // after its list of rules has been saved to preferences
+        List<Test> testsToInitialize = new ArrayList<>(allTests);
+        testsToInitialize.remove(OsmValidator.getTest(MapCSSTagChecker.class));
+        OsmValidator.initializeTests(testsToInitialize);
+
+        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS, tests);
+        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
+        Main.pref.put(ValidatorPreference.PREF_USE_IGNORE, prefUseIgnore.isSelected());
+        ValidatorPreference.PREF_OTHER.put(prefOther.isSelected());
+        Main.pref.put(ValidatorPreference.PREF_OTHER_UPLOAD, prefOtherUpload.isSelected());
+        Main.pref.put(ValidatorPreference.PREF_LAYER, prefUseLayer.isSelected());
+        return false;
+    }
+
+    @Override
+    public boolean isExpert() {
+        return false;
+    }
+
+    @Override
+    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
+        return gui.getValidatorPreference();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/package-info.java b/src/org/openstreetmap/josm/gui/preferences/validator/package-info.java
index 869a8ed..96d26e2 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/package-info.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling validator preferences.
- */
-package org.openstreetmap.josm.gui.preferences.validator;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling validator preferences.
+ */
+package org.openstreetmap.josm.gui.preferences.validator;
diff --git a/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java b/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java
index 7aa9cd0..f159a12 100644
--- a/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java
+++ b/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java
@@ -7,6 +7,12 @@ import java.util.concurrent.TimeUnit;
 
 import org.openstreetmap.josm.Main;
 
+/**
+ * Executor that displays the progress monitor to the user.
+ * 
+ * Similar to Executors.newSingleThreadExecutor(), but displays the
+ * progress monitor whenever a new task is executed.
+ */
 public class ProgressMonitorExecutor extends ThreadPoolExecutor {
 
     public ProgressMonitorExecutor() {
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
index a581657..19bfb43 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
@@ -1,1541 +1,1544 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trc;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.GridBagLayout;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-import javax.swing.ButtonGroup;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
-import javax.swing.JToggleButton;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.search.SearchCompiler;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPriority;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
-import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
-import org.openstreetmap.josm.gui.widgets.UrlLabel;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.Predicate;
-import org.openstreetmap.josm.tools.Utils;
-import org.xml.sax.SAXException;
-
-/**
- * Class that contains all subtypes of TaggingPresetItem, static supplementary data, types and methods
- * @since 6068
- */
-public final class TaggingPresetItems {
-    private TaggingPresetItems() {
-    }
-
-    private static int auto_increment_selected = 0;
-    /** Translatation of "<different>". Use in combo boxes to display en entry matching several different values. */
-    public static final String DIFFERENT = tr("<different>");
-
-    private static final BooleanProperty PROP_FILL_DEFAULT = new BooleanProperty("taggingpreset.fill-default-for-tagged-primitives", false);
-
-    // cache the parsing of types using a LRU cache (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
-    private static final Map<String,EnumSet<TaggingPresetType>> TYPE_CACHE = new LinkedHashMap<>(16, 1.1f, true);
-
-    /**
-     * Last value of each key used in presets, used for prefilling corresponding fields
-     */
-    private static final Map<String,String> LAST_VALUES = new HashMap<>();
-
-    public static class PresetListEntry {
-        public String value;
-        /** The context used for translating {@link #value} */
-        public String value_context;
-        public String display_value;
-        public String short_description;
-        /** The location of icon file to display */
-        public String icon;
-        /** The size of displayed icon. If not set, default is size from icon file */
-        public String icon_size;
-        /** The localized version of {@link #display_value}. */
-        public String locale_display_value;
-        /** The localized version of {@link #short_description}. */
-        public String locale_short_description;
-        private final File zipIcons = TaggingPresetReader.getZipIcons();
-
-        // Cached size (currently only for Combo) to speed up preset dialog initialization
-        private int prefferedWidth = -1;
-        private int prefferedHeight = -1;
-
-        public String getListDisplay() {
-            if (value.equals(DIFFERENT))
-                return "<b>"+DIFFERENT.replaceAll("<", "<").replaceAll(">", ">")+"</b>";
-
-            if (value.isEmpty())
-                return " ";
-
-            final StringBuilder res = new StringBuilder("<b>");
-            res.append(getDisplayValue(true).replaceAll("<", "<").replaceAll(">", ">"));
-            res.append("</b>");
-            if (getShortDescription(true) != null) {
-                // wrap in table to restrict the text width
-                res.append("<div style=\"width:300px; padding:0 0 5px 5px\">");
-                res.append(getShortDescription(true));
-                res.append("</div>");
-            }
-            return res.toString();
-        }
-
-        /**
-         * Returns the entry icon, if any.
-         * @return the entry icon, or {@code null}
-         */
-        public ImageIcon getIcon() {
-            return icon == null ? null : loadImageIcon(icon, zipIcons, parseInteger(icon_size));
-        }
-
-        /**
-         * Construxts a new {@code PresetListEntry}, uninitialized.
-         */
-        public PresetListEntry() {
-        }
-
-        public PresetListEntry(String value) {
-            this.value = value;
-        }
-
-        public String getDisplayValue(boolean translated) {
-            return translated
-                    ? Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value))
-                            : Utils.firstNonNull(display_value, value);
-        }
-
-        public String getShortDescription(boolean translated) {
-            return translated
-                    ? Utils.firstNonNull(locale_short_description, tr(short_description))
-                            : short_description;
-        }
-
-        // toString is mainly used to initialize the Editor
-        @Override
-        public String toString() {
-            if (value.equals(DIFFERENT))
-                return DIFFERENT;
-            return getDisplayValue(true).replaceAll("<.*>", ""); // remove additional markup, e.g. <br>
-        }
-    }
-
-    public static class Role {
-        public EnumSet<TaggingPresetType> types;
-        public String key;
-        /** The text to display */
-        public String text;
-        /** The context used for translating {@link #text} */
-        public String text_context;
-        /** The localized version of {@link #text}. */
-        public String locale_text;
-        public SearchCompiler.Match memberExpression;
-
-        public boolean required = false;
-        private long count = 0;
-
-        public void setType(String types) throws SAXException {
-            this.types = getType(types);
-        }
-
-        public void setRequisite(String str) throws SAXException {
-            if("required".equals(str)) {
-                required = true;
-            } else if(!"optional".equals(str))
-                throw new SAXException(tr("Unknown requisite: {0}", str));
-        }
-
-        public void setMember_expression(String member_expression) throws SAXException {
-            try {
-                this.memberExpression = SearchCompiler.compile(member_expression, true, true);
-            } catch (SearchCompiler.ParseError ex) {
-                throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
-            }
-        }
-
-        public void setCount(String count) {
-            this.count = Long.parseLong(count);
-        }
-
-        /**
-         * Return either argument, the highest possible value or the lowest allowed value
-         */
-        public long getValidCount(long c) {
-            if (count > 0 && !required)
-                return c != 0 ? count : 0;
-            else if (count > 0)
-                return count;
-            else if (!required)
-                return c != 0 ? c : 0;
-            else
-                return c != 0 ? c : 1;
-        }
-
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
-            String cstring;
-            if (count > 0 && !required) {
-                cstring = "0,"+count;
-            } else if(count > 0) {
-                cstring = String.valueOf(count);
-            } else if(!required) {
-                cstring = "0-...";
-            } else {
-                cstring = "1-...";
-            }
-            if (locale_text == null) {
-                locale_text = getLocaleText(text, text_context, null);
-            }
-            p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
-            p.add(new JLabel(key), GBC.std().insets(0,0,10,0));
-            p.add(new JLabel(cstring), types == null ? GBC.eol() : GBC.std().insets(0,0,10,0));
-            if (types != null) {
-                JPanel pp = new JPanel();
-                for(TaggingPresetType t : types) {
-                    pp.add(new JLabel(ImageProvider.get(t.getIconName())));
-                }
-                p.add(pp, GBC.eol());
-            }
-            return true;
-        }
-    }
-
-    /**
-     * Enum denoting how a match (see {@link TaggingPresetItem#matches}) is performed.
-     */
-    public static enum MatchType {
-
-        /** Neutral, i.e., do not consider this item for matching. */
-        NONE("none"),
-        /** Positive if key matches, neutral otherwise. */
-        KEY("key"),
-        /** Positive if key matches, negative otherwise. */
-        KEY_REQUIRED("key!"),
-        /** Positive if key and value matches, neutral otherwise. */
-        KEY_VALUE("keyvalue"),
-        /** Positive if key and value matches, negative otherwise. */
-        KEY_VALUE_REQUIRED("keyvalue!");
-
-        private final String value;
-
-        private MatchType(String value) {
-            this.value = value;
-        }
-
-        /**
-         * Replies the associated textual value.
-         * @return the associated textual value
-         */
-        public String getValue() {
-            return value;
-        }
-
-        /**
-         * Determines the {@code MatchType} for the given textual value.
-         * @param type the textual value
-         * @return the {@code MatchType} for the given textual value
-         */
-        public static MatchType ofString(String type) {
-            for (MatchType i : EnumSet.allOf(MatchType.class)) {
-                if (i.getValue().equals(type))
-                    return i;
-            }
-            throw new IllegalArgumentException(type + " is not allowed");
-        }
-    }
-
-    public static class Usage {
-        TreeSet<String> values;
-        boolean hadKeys = false;
-        boolean hadEmpty = false;
-
-        public boolean hasUniqueValue() {
-            return values.size() == 1 && !hadEmpty;
-        }
-
-        public boolean unused() {
-            return values.isEmpty();
-        }
-
-        public String getFirst() {
-            return values.first();
-        }
-
-        public boolean hadKeys() {
-            return hadKeys;
-        }
-    }
-
-    /**
-     * A tagging preset item displaying a localizable text.
-     * @since 6190
-     */
-    public abstract static class TaggingPresetTextItem extends TaggingPresetItem {
-
-        /** The text to display */
-        public String text;
-
-        /** The context used for translating {@link #text} */
-        public String text_context;
-
-        /** The localized version of {@link #text} */
-        public String locale_text;
-
-        protected final void initializeLocaleText(String defaultText) {
-            if (locale_text == null) {
-                locale_text = getLocaleText(text, text_context, defaultText);
-            }
-        }
-
-        @Override
-        void addCommands(List<Tag> changedTags) {
-        }
-
-        protected String fieldsToString() {
-            return (text != null ? "text=" + text + ", " : "")
-                    + (text_context != null ? "text_context=" + text_context + ", " : "")
-                    + (locale_text != null ? "locale_text=" + locale_text : "");
-        }
-
-        @Override
-        public String toString() {
-            return getClass().getSimpleName() + " [" + fieldsToString() + "]";
-        }
-    }
-
-    /**
-     * Label type.
-     */
-    public static class Label extends TaggingPresetTextItem {
-
-        /** The location of icon file to display (optional) */
-        public String icon;
-        /** The size of displayed icon. If not set, default is 16px */
-        public String icon_size;
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            initializeLocaleText(null);
-            addLabel(p, getIcon(), locale_text);
-            return true;
-        }
-
-        /**
-         * Adds a new {@code JLabel} to the given panel.
-         * @param p The panel
-         * @param icon the icon (optional, can be null)
-         * @param label The text label
-         */
-        public static void addLabel(JPanel p, Icon icon, String label) {
-            p.add(new JLabel(label, icon, JLabel.LEADING), GBC.eol().fill(GBC.HORIZONTAL));
-        }
-
-        /**
-         * Returns the label icon, if any.
-         * @return the label icon, or {@code null}
-         */
-        public ImageIcon getIcon() {
-            Integer size = parseInteger(icon_size);
-            return icon == null ? null : loadImageIcon(icon, TaggingPresetReader.getZipIcons(), size != null ? size : 16);
-        }
-    }
-
-    /**
-     * Hyperlink type.
-     */
-    public static class Link extends TaggingPresetTextItem {
-
-        /** The link to display. */
-        public String href;
-
-        /** The localized version of {@link #href}. */
-        public String locale_href;
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            initializeLocaleText(tr("More information about this feature"));
-            String url = locale_href;
-            if (url == null) {
-                url = href;
-            }
-            if (url != null) {
-                p.add(new UrlLabel(url, locale_text, 2), GBC.eol().insets(0, 10, 0, 0).fill(GBC.HORIZONTAL));
-            }
-            return false;
-        }
-
-        @Override
-        protected String fieldsToString() {
-            return super.fieldsToString()
-                    + (href != null ? "href=" + href + ", " : "")
-                    + (locale_href != null ? "locale_href=" + locale_href + ", " : "");
-        }
-    }
-
-    public static class PresetLink extends TaggingPresetItem {
-
-        public String preset_name = "";
-
-        @Override
-        boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            final String presetName = preset_name;
-            final TaggingPreset t = Utils.filter(TaggingPresets.getTaggingPresets(), new Predicate<TaggingPreset>() {
-                @Override
-                public boolean evaluate(TaggingPreset object) {
-                    return presetName.equals(object.name);
-                }
-            }).iterator().next();
-            if (t == null) return false;
-            JLabel lbl = new PresetLabel(t);
-            lbl.addMouseListener(new MouseAdapter() {
-                @Override
-                public void mouseClicked(MouseEvent arg0) {
-                    t.actionPerformed(null);
-                }
-            });
-            p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
-            return false;
-        }
-
-        @Override
-        void addCommands(List<Tag> changedTags) {
-        }
-    }
-
-    public static class Roles extends TaggingPresetItem {
-
-        public final List<Role> roles = new LinkedList<>();
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            p.add(new JLabel(" "), GBC.eol()); // space
-            if (!roles.isEmpty()) {
-                JPanel proles = new JPanel(new GridBagLayout());
-                proles.add(new JLabel(tr("Available roles")), GBC.std().insets(0, 0, 10, 0));
-                proles.add(new JLabel(tr("role")), GBC.std().insets(0, 0, 10, 0));
-                proles.add(new JLabel(tr("count")), GBC.std().insets(0, 0, 10, 0));
-                proles.add(new JLabel(tr("elements")), GBC.eol());
-                for (Role i : roles) {
-                    i.addToPanel(proles, sel);
-                }
-                p.add(proles, GBC.eol());
-            }
-            return false;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-        }
-    }
-
-    public static class Optional extends TaggingPresetTextItem {
-
-        // TODO: Draw a box around optional stuff
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            initializeLocaleText(tr("Optional Attributes:"));
-            p.add(new JLabel(" "), GBC.eol()); // space
-            p.add(new JLabel(locale_text), GBC.eol());
-            p.add(new JLabel(" "), GBC.eol()); // space
-            return false;
-        }
-    }
-
-    /**
-     * Horizontal separator type.
-     */
-    public static class Space extends TaggingPresetItem {
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            p.add(new JLabel(" "), GBC.eol()); // space
-            return false;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-        }
-
-        @Override
-        public String toString() {
-            return "Space";
-        }
-    }
-
-    /**
-     * Class used to represent a {@link JSeparator} inside tagging preset window.
-     * @since 6198
-     */
-    public static class ItemSeparator extends TaggingPresetItem {
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            p.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 5));
-            return false;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-        }
-
-        @Override
-        public String toString() {
-            return "ItemSeparator";
-        }
-    }
-
-    /**
-     * Preset item associated to an OSM key.
-     */
-    public abstract static class KeyedItem extends TaggingPresetItem {
-
-        public String key;
-        /** The text to display */
-        public String text;
-        /** The context used for translating {@link #text} */
-        public String text_context;
-        public String match = getDefaultMatch().getValue();
-
-        public abstract MatchType getDefaultMatch();
-        public abstract Collection<String> getValues();
-
-        @Override
-        Boolean matches(Map<String, String> tags) {
-            switch (MatchType.ofString(match)) {
-            case NONE:
-                return null;
-            case KEY:
-                return tags.containsKey(key) ? true : null;
-            case KEY_REQUIRED:
-                return tags.containsKey(key);
-            case KEY_VALUE:
-                return tags.containsKey(key) && getValues().contains(tags.get(key)) ? true : null;
-            case KEY_VALUE_REQUIRED:
-                return tags.containsKey(key) && getValues().contains(tags.get(key));
-            default:
-                throw new IllegalStateException();
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "KeyedItem [key=" + key + ", text=" + text
-                    + ", text_context=" + text_context + ", match=" + match
-                    + "]";
-        }
-    }
-
-    /**
-     * Invisible type allowing to hardcode an OSM key/value from the preset definition.
-     */
-    public static class Key extends KeyedItem {
-
-        /** The hardcoded value for key */
-        public String value;
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            return false;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-            changedTags.add(new Tag(key, value));
-        }
-
-        @Override
-        public MatchType getDefaultMatch() {
-            return MatchType.KEY_VALUE_REQUIRED;
-        }
-
-        @Override
-        public Collection<String> getValues() {
-            return Collections.singleton(value);
-        }
-
-        @Override
-        public String toString() {
-            return "Key [key=" + key + ", value=" + value + ", text=" + text
-                    + ", text_context=" + text_context + ", match=" + match
-                    + "]";
-        }
-    }
-
-    /**
-     * Text field type.
-     */
-    public static class Text extends KeyedItem {
-
-        /** The localized version of {@link #text}. */
-        public String locale_text;
-        public String default_;
-        public String originalValue;
-        public String use_last_as_default = "false";
-        public String auto_increment;
-        public String length;
-        public String alternative_autocomplete_keys;
-
-        private JComponent value;
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-
-            // find out if our key is already used in the selection.
-            Usage usage = determineTextUsage(sel, key);
-            AutoCompletingTextField textField = new AutoCompletingTextField();
-            if (alternative_autocomplete_keys != null) {
-                initAutoCompletionField(textField, (key + "," + alternative_autocomplete_keys).split(","));
-            } else {
-                initAutoCompletionField(textField, key);
-            }
-            if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
-                textField.setHint(key);
-            }
-            if (length != null && !length.isEmpty()) {
-                textField.setMaxChars(Integer.valueOf(length));
-            }
-            if (usage.unused()){
-                if (auto_increment_selected != 0  && auto_increment != null) {
-                    try {
-                        textField.setText(Integer.toString(Integer.parseInt(LAST_VALUES.get(key)) + auto_increment_selected));
-                    } catch (NumberFormatException ex) {
-                        // Ignore - cannot auto-increment if last was non-numeric
-                    }
-                }
-                else if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
-                    // selected osm primitives are untagged or filling default values feature is enabled
-                    if (!"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
-                        textField.setText(LAST_VALUES.get(key));
-                    } else {
-                        textField.setText(default_);
-                    }
-                } else {
-                    // selected osm primitives are tagged and filling default values feature is disabled
-                    textField.setText("");
-                }
-                value = textField;
-                originalValue = null;
-            } else if (usage.hasUniqueValue()) {
-                // all objects use the same value
-                textField.setText(usage.getFirst());
-                value = textField;
-                originalValue = usage.getFirst();
-            } else {
-                // the objects have different values
-                JosmComboBox<String> comboBox = new JosmComboBox<>(usage.values.toArray(new String[0]));
-                comboBox.setEditable(true);
-                comboBox.setEditor(textField);
-                comboBox.getEditor().setItem(DIFFERENT);
-                value=comboBox;
-                originalValue = DIFFERENT;
-            }
-            if (locale_text == null) {
-                locale_text = getLocaleText(text, text_context, null);
-            }
-
-            // if there's an auto_increment setting, then wrap the text field
-            // into a panel, appending a number of buttons.
-            // auto_increment has a format like -2,-1,1,2
-            // the text box being the first component in the panel is relied
-            // on in a rather ugly fashion further down.
-            if (auto_increment != null) {
-                ButtonGroup bg = new ButtonGroup();
-                JPanel pnl = new JPanel(new GridBagLayout());
-                pnl.add(value, GBC.std().fill(GBC.HORIZONTAL));
-
-                // first, one button for each auto_increment value
-                for (final String ai : auto_increment.split(",")) {
-                    JToggleButton aibutton = new JToggleButton(ai);
-                    aibutton.setToolTipText(tr("Select auto-increment of {0} for this field", ai));
-                    aibutton.setMargin(new java.awt.Insets(0,0,0,0));
-                    aibutton.setFocusable(false);
-                    bg.add(aibutton);
-                    try {
-                        // TODO there must be a better way to parse a number like "+3" than this.
-                        final int buttonvalue = (NumberFormat.getIntegerInstance().parse(ai.replace("+", ""))).intValue();
-                        if (auto_increment_selected == buttonvalue) aibutton.setSelected(true);
-                        aibutton.addActionListener(new ActionListener() {
-                            @Override
-                            public void actionPerformed(ActionEvent e) {
-                                auto_increment_selected = buttonvalue;
-                            }
-                        });
-                        pnl.add(aibutton, GBC.std());
-                    } catch (ParseException x) {
-                        Main.error("Cannot parse auto-increment value of '" + ai + "' into an integer");
-                    }
-                }
-
-                // an invisible toggle button for "release" of the button group
-                final JToggleButton clearbutton = new JToggleButton("X");
-                clearbutton.setVisible(false);
-                clearbutton.setFocusable(false);
-                bg.add(clearbutton);
-                // and its visible counterpart. - this mechanism allows us to
-                // have *no* button selected after the X is clicked, instead
-                // of the X remaining selected
-                JButton releasebutton = new JButton("X");
-                releasebutton.setToolTipText(tr("Cancel auto-increment for this field"));
-                releasebutton.setMargin(new java.awt.Insets(0,0,0,0));
-                releasebutton.setFocusable(false);
-                releasebutton.addActionListener(new ActionListener() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        auto_increment_selected = 0;
-                        clearbutton.setSelected(true);
-                    }
-                });
-                pnl.add(releasebutton, GBC.eol());
-                value = pnl;
-            }
-            p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
-            p.add(value, GBC.eol().fill(GBC.HORIZONTAL));
-            return true;
-        }
-
-        private static String getValue(Component comp) {
-            if (comp instanceof JosmComboBox) {
-                return ((JosmComboBox<?>) comp).getEditor().getItem().toString();
-            } else if (comp instanceof JosmTextField) {
-                return ((JosmTextField) comp).getText();
-            } else if (comp instanceof JPanel) {
-                return getValue(((JPanel)comp).getComponent(0));
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-
-            // return if unchanged
-            String v = getValue(value);
-            if (v == null) {
-                Main.error("No 'last value' support for component " + value);
-                return;
-            }
-
-            v = Tag.removeWhiteSpaces(v);
-
-            if (!"false".equals(use_last_as_default) || auto_increment != null) {
-                LAST_VALUES.put(key, v);
-            }
-            if (v.equals(originalValue) || (originalValue == null && v.length() == 0))
-                return;
-
-            changedTags.add(new Tag(key, v));
-            AutoCompletionManager.rememberUserInput(key, v, true);
-        }
-
-        @Override
-        boolean requestFocusInWindow() {
-            return value.requestFocusInWindow();
-        }
-
-        @Override
-        public MatchType getDefaultMatch() {
-            return MatchType.NONE;
-        }
-
-        @Override
-        public Collection<String> getValues() {
-            if (default_ == null || default_.isEmpty())
-                return Collections.emptyList();
-            return Collections.singleton(default_);
-        }
-    }
-
-    /**
-     * A group of {@link Check}s.
-     * @since 6114
-     */
-    public static class CheckGroup extends TaggingPresetItem {
-
-        /**
-         * Number of columns (positive integer)
-         */
-        public String columns;
-
-        /**
-         * List of checkboxes
-         */
-        public final List<Check> checks = new LinkedList<>();
-
-        @Override
-        boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-            Integer cols = Integer.valueOf(columns);
-            int rows = (int) Math.ceil(checks.size()/cols.doubleValue());
-            JPanel panel = new JPanel(new GridLayout(rows, cols));
-
-            for (Check check : checks) {
-                check.addToPanel(panel, sel, presetInitiallyMatches);
-            }
-
-            p.add(panel, GBC.eol());
-            return false;
-        }
-
-        @Override
-        void addCommands(List<Tag> changedTags) {
-            for (Check check : checks) {
-                check.addCommands(changedTags);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "CheckGroup [columns=" + columns + "]";
-        }
-    }
-
-    /**
-     * Checkbox type.
-     */
-    public static class Check extends KeyedItem {
-
-        /** The localized version of {@link #text}. */
-        public String locale_text;
-        /** the value to set when checked (default is "yes") */
-        public String value_on = OsmUtils.trueval;
-        /** the value to set when unchecked (default is "no") */
-        public String value_off = OsmUtils.falseval;
-        /** whether the off value is disabled in the dialog, i.e., only unset or yes are provided */
-        public boolean disable_off = false;
-        /** ticked on/off (default is "off") */
-        public boolean default_ = false; // only used for tagless objects
-
-        private QuadStateCheckBox check;
-        private QuadStateCheckBox.State initialState;
-        private boolean def;
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-
-            // find out if our key is already used in the selection.
-            final Usage usage = determineBooleanUsage(sel, key);
-            final String oneValue = usage.values.isEmpty() ? null : usage.values.last();
-            def = default_;
-
-            if (locale_text == null) {
-                locale_text = getLocaleText(text, text_context, null);
-            }
-
-            if (usage.values.size() < 2 && (oneValue == null || value_on.equals(oneValue) || value_off.equals(oneValue))) {
-                if (def && !PROP_FILL_DEFAULT.get()) {
-                    // default is set and filling default values feature is disabled - check if all primitives are untagged
-                    for (OsmPrimitive s : sel)
-                        if (s.hasKeys()) {
-                            def = false;
-                        }
-                }
-
-                // all selected objects share the same value which is either true or false or unset,
-                // we can display a standard check box.
-                initialState = value_on.equals(oneValue)
-                        ? QuadStateCheckBox.State.SELECTED
-                        : value_off.equals(oneValue)
-                        ? QuadStateCheckBox.State.NOT_SELECTED
-                        : def
-                        ? QuadStateCheckBox.State.SELECTED
-                        : QuadStateCheckBox.State.UNSET;
-            } else {
-                def = false;
-                // the objects have different values, or one or more objects have something
-                // else than true/false. we display a quad-state check box
-                // in "partial" state.
-                initialState = QuadStateCheckBox.State.PARTIAL;
-            }
-
-            final List<QuadStateCheckBox.State> allowedStates = new ArrayList<>(4);
-            if (QuadStateCheckBox.State.PARTIAL.equals(initialState))
-                allowedStates.add(QuadStateCheckBox.State.PARTIAL);
-            allowedStates.add(QuadStateCheckBox.State.SELECTED);
-            if (!disable_off || value_off.equals(oneValue))
-                allowedStates.add(QuadStateCheckBox.State.NOT_SELECTED);
-            allowedStates.add(QuadStateCheckBox.State.UNSET);
-            check = new QuadStateCheckBox(locale_text, initialState,
-                    allowedStates.toArray(new QuadStateCheckBox.State[allowedStates.size()]));
-
-            p.add(check, GBC.eol().fill(GBC.HORIZONTAL));
-            return true;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-            // if the user hasn't changed anything, don't create a command.
-            if (check.getState() == initialState && !def) return;
-
-            // otherwise change things according to the selected value.
-            changedTags.add(new Tag(key,
-                    check.getState() == QuadStateCheckBox.State.SELECTED ? value_on :
-                        check.getState() == QuadStateCheckBox.State.NOT_SELECTED ? value_off :
-                            null));
-        }
-
-        @Override
-        boolean requestFocusInWindow() {return check.requestFocusInWindow();}
-
-        @Override
-        public MatchType getDefaultMatch() {
-            return MatchType.NONE;
-        }
-
-        @Override
-        public Collection<String> getValues() {
-            return disable_off ? Arrays.asList(value_on) : Arrays.asList(value_on, value_off);
-        }
-
-        @Override
-        public String toString() {
-            return "Check ["
-                    + (locale_text != null ? "locale_text=" + locale_text + ", " : "")
-                    + (value_on != null ? "value_on=" + value_on + ", " : "")
-                    + (value_off != null ? "value_off=" + value_off + ", " : "")
-                    + "default_=" + default_ + ", "
-                    + (check != null ? "check=" + check + ", " : "")
-                    + (initialState != null ? "initialState=" + initialState
-                            + ", " : "") + "def=" + def + "]";
-        }
-    }
-
-    /**
-     * Abstract superclass for combo box and multi-select list types.
-     */
-    public abstract static class ComboMultiSelect extends KeyedItem {
-
-        /** The localized version of {@link #text}. */
-        public String locale_text;
-        public String values;
-        public String values_from;
-        /** The context used for translating {@link #values} */
-        public String values_context;
-        public String display_values;
-        /** The localized version of {@link #display_values}. */
-        public String locale_display_values;
-        public String short_descriptions;
-        /** The localized version of {@link #short_descriptions}. */
-        public String locale_short_descriptions;
-        public String default_;
-        public String delimiter = ";";
-        public String use_last_as_default = "false";
-        /** whether to use values for search via {@link TaggingPresetSelector} */
-        public String values_searchable = "false";
-
-        protected JComponent component;
-        protected final Map<String, PresetListEntry> lhm = new LinkedHashMap<>();
-        private boolean initialized = false;
-        protected Usage usage;
-        protected Object originalValue;
-
-        protected abstract Object getSelectedItem();
-        protected abstract void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches);
-
-        protected char getDelChar() {
-            return delimiter.isEmpty() ? ';' : delimiter.charAt(0);
-        }
-
-        @Override
-        public Collection<String> getValues() {
-            initListEntries();
-            return lhm.keySet();
-        }
-
-        public Collection<String> getDisplayValues() {
-            initListEntries();
-            return Utils.transform(lhm.values(), new Utils.Function<PresetListEntry, String>() {
-                @Override
-                public String apply(PresetListEntry x) {
-                    return x.getDisplayValue(true);
-                }
-            });
-        }
-
-        @Override
-        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
-
-            initListEntries();
-
-            // find out if our key is already used in the selection.
-            usage = determineTextUsage(sel, key);
-            if (!usage.hasUniqueValue() && !usage.unused()) {
-                lhm.put(DIFFERENT, new PresetListEntry(DIFFERENT));
-            }
-
-            p.add(new JLabel(tr("{0}:", locale_text)), GBC.std().insets(0, 0, 10, 0));
-            addToPanelAnchor(p, default_, presetInitiallyMatches);
-
-            return true;
-
-        }
-
-        private void initListEntries() {
-            if (initialized) {
-                lhm.remove(DIFFERENT); // possibly added in #addToPanel
-                return;
-            } else if (lhm.isEmpty()) {
-                initListEntriesFromAttributes();
-            } else {
-                if (values != null) {
-                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
-                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
-                            key, text, "values", "list_entry"));
-                }
-                if (display_values != null || locale_display_values != null) {
-                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
-                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
-                            key, text, "display_values", "list_entry"));
-                }
-                if (short_descriptions != null || locale_short_descriptions != null) {
-                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
-                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
-                            key, text, "short_descriptions", "list_entry"));
-                }
-                for (PresetListEntry e : lhm.values()) {
-                    if (e.value_context == null) {
-                        e.value_context = values_context;
-                    }
-                }
-            }
-            if (locale_text == null) {
-                locale_text = getLocaleText(text, text_context, null);
-            }
-            initialized = true;
-        }
-
-        private String[] initListEntriesFromAttributes() {
-            char delChar = getDelChar();
-
-            String[] value_array = null;
-
-            if (values_from != null) {
-                String[] class_method = values_from.split("#");
-                if (class_method != null && class_method.length == 2) {
-                    try {
-                        Method method = Class.forName(class_method[0]).getMethod(class_method[1]);
-                        // Check method is public static String[] methodName()
-                        int mod = method.getModifiers();
-                        if (Modifier.isPublic(mod) && Modifier.isStatic(mod)
-                                && method.getReturnType().equals(String[].class) && method.getParameterTypes().length == 0) {
-                            value_array = (String[]) method.invoke(null);
-                        } else {
-                            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) {
-                        Main.error(tr("Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' threw {2} ({3})", key, text,
-                                e.getClass().getName(), e.getMessage()));
-                    }
-                }
-            }
-
-            if (value_array == null) {
-                value_array = splitEscaped(delChar, values);
-            }
-
-            final String displ = Utils.firstNonNull(locale_display_values, display_values);
-            String[] display_array = displ == null ? value_array : splitEscaped(delChar, displ);
-
-            final String descr = Utils.firstNonNull(locale_short_descriptions, short_descriptions);
-            String[] short_descriptions_array = descr == null ? null : splitEscaped(delChar, descr);
-
-            if (display_array.length != value_array.length) {
-                Main.error(tr("Broken tagging preset \"{0}-{1}\" - number of items in ''display_values'' must be the same as in ''values''", key, text));
-                display_array = value_array;
-            }
-
-            if (short_descriptions_array != null && short_descriptions_array.length != value_array.length) {
-                Main.error(tr("Broken tagging preset \"{0}-{1}\" - number of items in ''short_descriptions'' must be the same as in ''values''", key, text));
-                short_descriptions_array = null;
-            }
-
-            for (int i = 0; i < value_array.length; i++) {
-                final PresetListEntry e = new PresetListEntry(value_array[i]);
-                e.locale_display_value = locale_display_values != null
-                        ? display_array[i]
-                                : trc(values_context, fixPresetString(display_array[i]));
-                        if (short_descriptions_array != null) {
-                            e.locale_short_description = locale_short_descriptions != null
-                                    ? short_descriptions_array[i]
-                                            : tr(fixPresetString(short_descriptions_array[i]));
-                        }
-                        lhm.put(value_array[i], e);
-                        display_array[i] = e.getDisplayValue(true);
-            }
-
-            return display_array;
-        }
-
-        protected String getDisplayIfNull() {
-            return null;
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-            Object obj = getSelectedItem();
-            String display = (obj == null) ? null : obj.toString();
-            String value = null;
-            if (display == null) {
-                display = getDisplayIfNull();
-            }
-
-            if (display != null) {
-                for (String val : lhm.keySet()) {
-                    String k = lhm.get(val).toString();
-                    if (k != null && k.equals(display)) {
-                        value = val;
-                        break;
-                    }
-                }
-                if (value == null) {
-                    value = display;
-                }
-            } else {
-                value = "";
-            }
-            value = Tag.removeWhiteSpaces(value);
-
-            // no change if same as before
-            if (originalValue == null) {
-                if (value.length() == 0)
-                    return;
-            } else if (value.equals(originalValue.toString()))
-                return;
-
-            if (!"false".equals(use_last_as_default)) {
-                LAST_VALUES.put(key, value);
-            }
-            changedTags.add(new Tag(key, value));
-        }
-
-        public void addListEntry(PresetListEntry e) {
-            lhm.put(e.value, e);
-        }
-
-        public void addListEntries(Collection<PresetListEntry> e) {
-            for (PresetListEntry i : e) {
-                addListEntry(i);
-            }
-        }
-
-        @Override
-        boolean requestFocusInWindow() {
-            return component.requestFocusInWindow();
-        }
-
-        private static final ListCellRenderer<PresetListEntry> RENDERER = new ListCellRenderer<PresetListEntry>() {
-
-            JLabel lbl = new JLabel();
-
-            @Override
-            public Component getListCellRendererComponent(
-                    JList<? extends PresetListEntry> list,
-                    PresetListEntry item,
-                    int index,
-                    boolean isSelected,
-                    boolean cellHasFocus) {
-
-                // Only return cached size, item is not shown
-                if (!list.isShowing() && item.prefferedWidth != -1 && item.prefferedHeight != -1) {
-                    if (index == -1) {
-                        lbl.setPreferredSize(new Dimension(item.prefferedWidth, 10));
-                    } else {
-                        lbl.setPreferredSize(new Dimension(item.prefferedWidth, item.prefferedHeight));
-                    }
-                    return lbl;
-                }
-
-                lbl.setPreferredSize(null);
-
-
-                if (isSelected) {
-                    lbl.setBackground(list.getSelectionBackground());
-                    lbl.setForeground(list.getSelectionForeground());
-                } else {
-                    lbl.setBackground(list.getBackground());
-                    lbl.setForeground(list.getForeground());
-                }
-
-                lbl.setOpaque(true);
-                lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN));
-                lbl.setText("<html>" + item.getListDisplay() + "</html>");
-                lbl.setIcon(item.getIcon());
-                lbl.setEnabled(list.isEnabled());
-
-                // Cache size
-                item.prefferedWidth = lbl.getPreferredSize().width;
-                item.prefferedHeight = lbl.getPreferredSize().height;
-
-                // We do not want the editor to have the maximum height of all
-                // entries. Return a dummy with bogus height.
-                if (index == -1) {
-                    lbl.setPreferredSize(new Dimension(lbl.getPreferredSize().width, 10));
-                }
-                return lbl;
-            }
-        };
-
-        protected ListCellRenderer<PresetListEntry> getListCellRenderer() {
-            return RENDERER;
-        }
-
-        @Override
-        public MatchType getDefaultMatch() {
-            return MatchType.NONE;
-        }
-    }
-
-    /**
-     * Combobox type.
-     */
-    public static class Combo extends ComboMultiSelect {
-
-        public boolean editable = true;
-        protected JosmComboBox<PresetListEntry> combo;
-        public String length;
-
-        /**
-         * Constructs a new {@code Combo}.
-         */
-        public Combo() {
-            delimiter = ",";
-        }
-
-        @Override
-        protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
-            if (!usage.unused()) {
-                for (String s : usage.values) {
-                    if (!lhm.containsKey(s)) {
-                        lhm.put(s, new PresetListEntry(s));
-                    }
-                }
-            }
-            if (def != null && !lhm.containsKey(def)) {
-                lhm.put(def, new PresetListEntry(def));
-            }
-            lhm.put("", new PresetListEntry(""));
-
-            combo = new JosmComboBox<>(lhm.values().toArray(new PresetListEntry[0]));
-            component = combo;
-            combo.setRenderer(getListCellRenderer());
-            combo.setEditable(editable);
-            combo.reinitialize(lhm.values());
-            AutoCompletingTextField tf = new AutoCompletingTextField();
-            initAutoCompletionField(tf, key);
-            if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
-                tf.setHint(key);
-            }
-            if (length != null && !length.isEmpty()) {
-                tf.setMaxChars(Integer.valueOf(length));
-            }
-            AutoCompletionList acList = tf.getAutoCompletionList();
-            if (acList != null) {
-                acList.add(getDisplayValues(), AutoCompletionItemPriority.IS_IN_STANDARD);
-            }
-            combo.setEditor(tf);
-
-            if (usage.hasUniqueValue()) {
-                // all items have the same value (and there were no unset items)
-                originalValue = lhm.get(usage.getFirst());
-                combo.setSelectedItem(originalValue);
-            } else if (def != null && usage.unused()) {
-                // default is set and all items were unset
-                if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
-                    // selected osm primitives are untagged or filling default feature is enabled
-                    combo.setSelectedItem(lhm.get(def).getDisplayValue(true));
-                } else {
-                    // selected osm primitives are tagged and filling default feature is disabled
-                    combo.setSelectedItem("");
-                }
-                originalValue = lhm.get(DIFFERENT);
-            } else if (usage.unused()) {
-                // all items were unset (and so is default)
-                originalValue = lhm.get("");
-                if ("force".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
-                    combo.setSelectedItem(lhm.get(LAST_VALUES.get(key)));
-                } else {
-                    combo.setSelectedItem(originalValue);
-                }
-            } else {
-                originalValue = lhm.get(DIFFERENT);
-                combo.setSelectedItem(originalValue);
-            }
-            p.add(combo, GBC.eol().fill(GBC.HORIZONTAL));
-
-        }
-
-        @Override
-        protected Object getSelectedItem() {
-            return combo.getSelectedItem();
-
-        }
-
-        @Override
-        protected String getDisplayIfNull() {
-            if (combo.isEditable())
-                return combo.getEditor().getItem().toString();
-            else
-                return null;
-        }
-    }
-
-    /**
-     * Multi-select list type.
-     */
-    public static class MultiSelect extends ComboMultiSelect {
-
-        public long rows = -1;
-        protected ConcatenatingJList list;
-
-        @Override
-        protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
-            list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[0]));
-            component = list;
-            ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
-            list.setCellRenderer(renderer);
-
-            if (usage.hasUniqueValue() && !usage.unused()) {
-                originalValue = usage.getFirst();
-                list.setSelectedItem(originalValue);
-            } else if (def != null && !usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
-                originalValue = DIFFERENT;
-                list.setSelectedItem(def);
-            } else if (usage.unused()) {
-                originalValue = null;
-                list.setSelectedItem(originalValue);
-            } else {
-                originalValue = DIFFERENT;
-                list.setSelectedItem(originalValue);
-            }
-
-            JScrollPane sp = new JScrollPane(list);
-            // if a number of rows has been specified in the preset,
-            // modify preferred height of scroll pane to match that row count.
-            if (rows != -1) {
-                double height = renderer.getListCellRendererComponent(list,
-                        new PresetListEntry("x"), 0, false, false).getPreferredSize().getHeight() * rows;
-                sp.setPreferredSize(new Dimension((int) sp.getPreferredSize().getWidth(), (int) height));
-            }
-            p.add(sp, GBC.eol().fill(GBC.HORIZONTAL));
-        }
-
-        @Override
-        protected Object getSelectedItem() {
-            return list.getSelectedItem();
-        }
-
-        @Override
-        public void addCommands(List<Tag> changedTags) {
-            // Do not create any commands if list has been disabled because of an unknown value (fix #8605)
-            if (list.isEnabled()) {
-                super.addCommands(changedTags);
-            }
-        }
-    }
-
-    /**
-    * Class that allows list values to be assigned and retrieved as a comma-delimited
-    * string (extracted from TaggingPreset)
-    */
-    private static class ConcatenatingJList extends JList<PresetListEntry> {
-        private String delimiter;
-        public ConcatenatingJList(String del, PresetListEntry[] o) {
-            super(o);
-            delimiter = del;
-        }
-
-        public void setSelectedItem(Object o) {
-            if (o == null) {
-                clearSelection();
-            } else {
-                String s = o.toString();
-                TreeSet<String> parts = new TreeSet<>(Arrays.asList(s.split(delimiter)));
-                ListModel<PresetListEntry> lm = getModel();
-                int[] intParts = new int[lm.getSize()];
-                int j = 0;
-                for (int i = 0; i < lm.getSize(); i++) {
-                    final String value = lm.getElementAt(i).value;
-                    if (parts.contains(value)) {
-                        intParts[j++]=i;
-                        parts.remove(value);
-                    }
-                }
-                setSelectedIndices(Arrays.copyOf(intParts, j));
-                // check if we have actually managed to represent the full
-                // value with our presets. if not, cop out; we will not offer
-                // a selection list that threatens to ruin the value.
-                setEnabled(parts.isEmpty());
-            }
-        }
-
-        public String getSelectedItem() {
-            ListModel<PresetListEntry> lm = getModel();
-            int[] si = getSelectedIndices();
-            StringBuilder builder = new StringBuilder();
-            for (int i=0; i<si.length; i++) {
-                if (i>0) {
-                    builder.append(delimiter);
-                }
-                builder.append(lm.getElementAt(si[i]).value);
-            }
-            return builder.toString();
-        }
-    }
-
-    public static EnumSet<TaggingPresetType> getType(String types) throws SAXException {
-        if (TYPE_CACHE.containsKey(types))
-            return TYPE_CACHE.get(types);
-        EnumSet<TaggingPresetType> result = EnumSet.noneOf(TaggingPresetType.class);
-        for (String type : Arrays.asList(types.split(","))) {
-            try {
-                TaggingPresetType presetType = TaggingPresetType.fromString(type);
-                result.add(presetType);
-            } catch (IllegalArgumentException e) {
-                throw new SAXException(tr("Unknown type: {0}", type), e);
-            }
-        }
-        TYPE_CACHE.put(types, result);
-        return result;
-    }
-
-    static String fixPresetString(String s) {
-        return s == null ? s : s.replaceAll("'","''");
-    }
-
-    private static String getLocaleText(String text, String text_context, String defaultText) {
-        if (text == null) {
-            return defaultText;
-        } else if (text_context != null) {
-            return trc(text_context, fixPresetString(text));
-        } else {
-            return tr(fixPresetString(text));
-        }
-    }
-
-    /**
-     * allow escaped comma in comma separated list:
-     * "A\, B\, C,one\, two" --> ["A, B, C", "one, two"]
-     * @param delimiter the delimiter, e.g. a comma. separates the entries and
-     *      must be escaped within one entry
-     * @param s the string
-     */
-    private static String[] splitEscaped(char delimiter, String s) {
-        if (s == null)
-            return new String[0];
-        List<String> result = new ArrayList<>();
-        boolean backslash = false;
-        StringBuilder item = new StringBuilder();
-        for (int i=0; i<s.length(); i++) {
-            char ch = s.charAt(i);
-            if (backslash) {
-                item.append(ch);
-                backslash = false;
-            } else if (ch == '\\') {
-                backslash = true;
-            } else if (ch == delimiter) {
-                result.add(item.toString());
-                item.setLength(0);
-            } else {
-                item.append(ch);
-            }
-        }
-        if (item.length() > 0) {
-            result.add(item.toString());
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-    static Usage determineTextUsage(Collection<OsmPrimitive> sel, String key) {
-        Usage returnValue = new Usage();
-        returnValue.values = new TreeSet<>();
-        for (OsmPrimitive s : sel) {
-            String v = s.get(key);
-            if (v != null) {
-                returnValue.values.add(v);
-            } else {
-                returnValue.hadEmpty = true;
-            }
-            if(s.hasKeys()) {
-                returnValue.hadKeys = true;
-            }
-        }
-        return returnValue;
-    }
-
-    static Usage determineBooleanUsage(Collection<OsmPrimitive> sel, String key) {
-
-        Usage returnValue = new Usage();
-        returnValue.values = new TreeSet<>();
-        for (OsmPrimitive s : sel) {
-            String booleanValue = OsmUtils.getNamedOsmBoolean(s.get(key));
-            if (booleanValue != null) {
-                returnValue.values.add(booleanValue);
-            }
-        }
-        return returnValue;
-    }
-
-    protected static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
-        final Collection<String> s = Main.pref.getCollection("taggingpreset.icon.sources", null);
-        ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
-        if (maxSize != null) {
-            imgProv.setMaxSize(maxSize);
-        }
-        return imgProv.get();
-    }
-
-    protected static Integer parseInteger(String str) {
-        if (str == null || str.isEmpty())
-            return null;
-        try {
-            return Integer.parseInt(str);
-        } catch (Exception e) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
-        }
-        return null;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+
+import javax.swing.ButtonGroup;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JToggleButton;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPriority;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
+import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+import org.xml.sax.SAXException;
+
+/**
+ * Class that contains all subtypes of TaggingPresetItem, static supplementary data, types and methods
+ * @since 6068
+ */
+public final class TaggingPresetItems {
+    private TaggingPresetItems() {
+    }
+
+    private static int auto_increment_selected = 0;
+    /** Translatation of "<different>". Use in combo boxes to display en entry matching several different values. */
+    public static final String DIFFERENT = tr("<different>");
+
+    private static final BooleanProperty PROP_FILL_DEFAULT = new BooleanProperty("taggingpreset.fill-default-for-tagged-primitives", false);
+
+    // cache the parsing of types using a LRU cache (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
+    private static final Map<String,EnumSet<TaggingPresetType>> TYPE_CACHE = new LinkedHashMap<>(16, 1.1f, true);
+
+    /**
+     * Last value of each key used in presets, used for prefilling corresponding fields
+     */
+    private static final Map<String,String> LAST_VALUES = new HashMap<>();
+
+    public static class PresetListEntry {
+        public String value;
+        /** The context used for translating {@link #value} */
+        public String value_context;
+        public String display_value;
+        public String short_description;
+        /** The location of icon file to display */
+        public String icon;
+        /** The size of displayed icon. If not set, default is size from icon file */
+        public String icon_size;
+        /** The localized version of {@link #display_value}. */
+        public String locale_display_value;
+        /** The localized version of {@link #short_description}. */
+        public String locale_short_description;
+        private final File zipIcons = TaggingPresetReader.getZipIcons();
+
+        // Cached size (currently only for Combo) to speed up preset dialog initialization
+        private int prefferedWidth = -1;
+        private int prefferedHeight = -1;
+
+        public String getListDisplay() {
+            if (value.equals(DIFFERENT))
+                return "<b>"+DIFFERENT.replaceAll("<", "<").replaceAll(">", ">")+"</b>";
+
+            if (value.isEmpty())
+                return " ";
+
+            final StringBuilder res = new StringBuilder("<b>");
+            res.append(getDisplayValue(true).replaceAll("<", "<").replaceAll(">", ">"));
+            res.append("</b>");
+            if (getShortDescription(true) != null) {
+                // wrap in table to restrict the text width
+                res.append("<div style=\"width:300px; padding:0 0 5px 5px\">");
+                res.append(getShortDescription(true));
+                res.append("</div>");
+            }
+            return res.toString();
+        }
+
+        /**
+         * Returns the entry icon, if any.
+         * @return the entry icon, or {@code null}
+         */
+        public ImageIcon getIcon() {
+            return icon == null ? null : loadImageIcon(icon, zipIcons, parseInteger(icon_size));
+        }
+
+        /**
+         * Construxts a new {@code PresetListEntry}, uninitialized.
+         */
+        public PresetListEntry() {
+        }
+
+        public PresetListEntry(String value) {
+            this.value = value;
+        }
+
+        public String getDisplayValue(boolean translated) {
+            return translated
+                    ? Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value))
+                            : Utils.firstNonNull(display_value, value);
+        }
+
+        public String getShortDescription(boolean translated) {
+            return translated
+                    ? Utils.firstNonNull(locale_short_description, tr(short_description))
+                            : short_description;
+        }
+
+        // toString is mainly used to initialize the Editor
+        @Override
+        public String toString() {
+            if (value.equals(DIFFERENT))
+                return DIFFERENT;
+            return getDisplayValue(true).replaceAll("<.*>", ""); // remove additional markup, e.g. <br>
+        }
+    }
+
+    public static class Role {
+        public EnumSet<TaggingPresetType> types;
+        public String key;
+        /** The text to display */
+        public String text;
+        /** The context used for translating {@link #text} */
+        public String text_context;
+        /** The localized version of {@link #text}. */
+        public String locale_text;
+        public SearchCompiler.Match memberExpression;
+
+        public boolean required = false;
+        private long count = 0;
+
+        public void setType(String types) throws SAXException {
+            this.types = getType(types);
+        }
+
+        public void setRequisite(String str) throws SAXException {
+            if("required".equals(str)) {
+                required = true;
+            } else if(!"optional".equals(str))
+                throw new SAXException(tr("Unknown requisite: {0}", str));
+        }
+
+        public void setMember_expression(String member_expression) throws SAXException {
+            try {
+                this.memberExpression = SearchCompiler.compile(member_expression, true, true);
+            } catch (SearchCompiler.ParseError ex) {
+                throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
+            }
+        }
+
+        public void setCount(String count) {
+            this.count = Long.parseLong(count);
+        }
+
+        /**
+         * Return either argument, the highest possible value or the lowest allowed value
+         */
+        public long getValidCount(long c) {
+            if (count > 0 && !required)
+                return c != 0 ? count : 0;
+            else if (count > 0)
+                return count;
+            else if (!required)
+                return c != 0 ? c : 0;
+            else
+                return c != 0 ? c : 1;
+        }
+
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
+            String cstring;
+            if (count > 0 && !required) {
+                cstring = "0,"+count;
+            } else if(count > 0) {
+                cstring = String.valueOf(count);
+            } else if(!required) {
+                cstring = "0-...";
+            } else {
+                cstring = "1-...";
+            }
+            if (locale_text == null) {
+                locale_text = getLocaleText(text, text_context, null);
+            }
+            p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
+            p.add(new JLabel(key), GBC.std().insets(0,0,10,0));
+            p.add(new JLabel(cstring), types == null ? GBC.eol() : GBC.std().insets(0,0,10,0));
+            if (types != null) {
+                JPanel pp = new JPanel();
+                for(TaggingPresetType t : types) {
+                    pp.add(new JLabel(ImageProvider.get(t.getIconName())));
+                }
+                p.add(pp, GBC.eol());
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Enum denoting how a match (see {@link TaggingPresetItem#matches}) is performed.
+     */
+    public static enum MatchType {
+
+        /** Neutral, i.e., do not consider this item for matching. */
+        NONE("none"),
+        /** Positive if key matches, neutral otherwise. */
+        KEY("key"),
+        /** Positive if key matches, negative otherwise. */
+        KEY_REQUIRED("key!"),
+        /** Positive if key and value matches, neutral otherwise. */
+        KEY_VALUE("keyvalue"),
+        /** Positive if key and value matches, negative otherwise. */
+        KEY_VALUE_REQUIRED("keyvalue!");
+
+        private final String value;
+
+        private MatchType(String value) {
+            this.value = value;
+        }
+
+        /**
+         * Replies the associated textual value.
+         * @return the associated textual value
+         */
+        public String getValue() {
+            return value;
+        }
+
+        /**
+         * Determines the {@code MatchType} for the given textual value.
+         * @param type the textual value
+         * @return the {@code MatchType} for the given textual value
+         */
+        public static MatchType ofString(String type) {
+            for (MatchType i : EnumSet.allOf(MatchType.class)) {
+                if (i.getValue().equals(type))
+                    return i;
+            }
+            throw new IllegalArgumentException(type + " is not allowed");
+        }
+    }
+
+    public static class Usage {
+        TreeSet<String> values;
+        boolean hadKeys = false;
+        boolean hadEmpty = false;
+
+        public boolean hasUniqueValue() {
+            return values.size() == 1 && !hadEmpty;
+        }
+
+        public boolean unused() {
+            return values.isEmpty();
+        }
+
+        public String getFirst() {
+            return values.first();
+        }
+
+        public boolean hadKeys() {
+            return hadKeys;
+        }
+    }
+
+    /**
+     * A tagging preset item displaying a localizable text.
+     * @since 6190
+     */
+    public abstract static class TaggingPresetTextItem extends TaggingPresetItem {
+
+        /** The text to display */
+        public String text;
+
+        /** The context used for translating {@link #text} */
+        public String text_context;
+
+        /** The localized version of {@link #text} */
+        public String locale_text;
+
+        protected final void initializeLocaleText(String defaultText) {
+            if (locale_text == null) {
+                locale_text = getLocaleText(text, text_context, defaultText);
+            }
+        }
+
+        @Override
+        void addCommands(List<Tag> changedTags) {
+        }
+
+        protected String fieldsToString() {
+            return (text != null ? "text=" + text + ", " : "")
+                    + (text_context != null ? "text_context=" + text_context + ", " : "")
+                    + (locale_text != null ? "locale_text=" + locale_text : "");
+        }
+
+        @Override
+        public String toString() {
+            return getClass().getSimpleName() + " [" + fieldsToString() + "]";
+        }
+    }
+
+    /**
+     * Label type.
+     */
+    public static class Label extends TaggingPresetTextItem {
+
+        /** The location of icon file to display (optional) */
+        public String icon;
+        /** The size of displayed icon. If not set, default is 16px */
+        public String icon_size;
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            initializeLocaleText(null);
+            addLabel(p, getIcon(), locale_text);
+            return true;
+        }
+
+        /**
+         * Adds a new {@code JLabel} to the given panel.
+         * @param p The panel
+         * @param icon the icon (optional, can be null)
+         * @param label The text label
+         */
+        public static void addLabel(JPanel p, Icon icon, String label) {
+            p.add(new JLabel(label, icon, JLabel.LEADING), GBC.eol().fill(GBC.HORIZONTAL));
+        }
+
+        /**
+         * Returns the label icon, if any.
+         * @return the label icon, or {@code null}
+         */
+        public ImageIcon getIcon() {
+            Integer size = parseInteger(icon_size);
+            return icon == null ? null : loadImageIcon(icon, TaggingPresetReader.getZipIcons(), size != null ? size : 16);
+        }
+    }
+
+    /**
+     * Hyperlink type.
+     */
+    public static class Link extends TaggingPresetTextItem {
+
+        /** The link to display. */
+        public String href;
+
+        /** The localized version of {@link #href}. */
+        public String locale_href;
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            initializeLocaleText(tr("More information about this feature"));
+            String url = locale_href;
+            if (url == null) {
+                url = href;
+            }
+            if (url != null) {
+                p.add(new UrlLabel(url, locale_text, 2), GBC.eol().insets(0, 10, 0, 0).fill(GBC.HORIZONTAL));
+            }
+            return false;
+        }
+
+        @Override
+        protected String fieldsToString() {
+            return super.fieldsToString()
+                    + (href != null ? "href=" + href + ", " : "")
+                    + (locale_href != null ? "locale_href=" + locale_href + ", " : "");
+        }
+    }
+
+    public static class PresetLink extends TaggingPresetItem {
+
+        public String preset_name = "";
+
+        @Override
+        boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            final String presetName = preset_name;
+            final TaggingPreset t = Utils.filter(TaggingPresets.getTaggingPresets(), new Predicate<TaggingPreset>() {
+                @Override
+                public boolean evaluate(TaggingPreset object) {
+                    return presetName.equals(object.name);
+                }
+            }).iterator().next();
+            if (t == null) return false;
+            JLabel lbl = new PresetLabel(t);
+            lbl.addMouseListener(new MouseAdapter() {
+                @Override
+                public void mouseClicked(MouseEvent arg0) {
+                    t.actionPerformed(null);
+                }
+            });
+            p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
+            return false;
+        }
+
+        @Override
+        void addCommands(List<Tag> changedTags) {
+        }
+    }
+
+    public static class Roles extends TaggingPresetItem {
+
+        public final List<Role> roles = new LinkedList<>();
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            p.add(new JLabel(" "), GBC.eol()); // space
+            if (!roles.isEmpty()) {
+                JPanel proles = new JPanel(new GridBagLayout());
+                proles.add(new JLabel(tr("Available roles")), GBC.std().insets(0, 0, 10, 0));
+                proles.add(new JLabel(tr("role")), GBC.std().insets(0, 0, 10, 0));
+                proles.add(new JLabel(tr("count")), GBC.std().insets(0, 0, 10, 0));
+                proles.add(new JLabel(tr("elements")), GBC.eol());
+                for (Role i : roles) {
+                    i.addToPanel(proles, sel);
+                }
+                p.add(proles, GBC.eol());
+            }
+            return false;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+        }
+    }
+
+    public static class Optional extends TaggingPresetTextItem {
+
+        // TODO: Draw a box around optional stuff
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            initializeLocaleText(tr("Optional Attributes:"));
+            p.add(new JLabel(" "), GBC.eol()); // space
+            p.add(new JLabel(locale_text), GBC.eol());
+            p.add(new JLabel(" "), GBC.eol()); // space
+            return false;
+        }
+    }
+
+    /**
+     * Horizontal separator type.
+     */
+    public static class Space extends TaggingPresetItem {
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            p.add(new JLabel(" "), GBC.eol()); // space
+            return false;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+        }
+
+        @Override
+        public String toString() {
+            return "Space";
+        }
+    }
+
+    /**
+     * Class used to represent a {@link JSeparator} inside tagging preset window.
+     * @since 6198
+     */
+    public static class ItemSeparator extends TaggingPresetItem {
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            p.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 5));
+            return false;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+        }
+
+        @Override
+        public String toString() {
+            return "ItemSeparator";
+        }
+    }
+
+    /**
+     * Preset item associated to an OSM key.
+     */
+    public abstract static class KeyedItem extends TaggingPresetItem {
+
+        public String key;
+        /** The text to display */
+        public String text;
+        /** The context used for translating {@link #text} */
+        public String text_context;
+        public String match = getDefaultMatch().getValue();
+
+        public abstract MatchType getDefaultMatch();
+        public abstract Collection<String> getValues();
+
+        @Override
+        Boolean matches(Map<String, String> tags) {
+            switch (MatchType.ofString(match)) {
+            case NONE:
+                return null;
+            case KEY:
+                return tags.containsKey(key) ? true : null;
+            case KEY_REQUIRED:
+                return tags.containsKey(key);
+            case KEY_VALUE:
+                return tags.containsKey(key) && getValues().contains(tags.get(key)) ? true : null;
+            case KEY_VALUE_REQUIRED:
+                return tags.containsKey(key) && getValues().contains(tags.get(key));
+            default:
+                throw new IllegalStateException();
+            }
+        }
+
+        @Override
+        public String toString() {
+            return "KeyedItem [key=" + key + ", text=" + text
+                    + ", text_context=" + text_context + ", match=" + match
+                    + "]";
+        }
+    }
+
+    /**
+     * Invisible type allowing to hardcode an OSM key/value from the preset definition.
+     */
+    public static class Key extends KeyedItem {
+
+        /** The hardcoded value for key */
+        public String value;
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            return false;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+            changedTags.add(new Tag(key, value));
+        }
+
+        @Override
+        public MatchType getDefaultMatch() {
+            return MatchType.KEY_VALUE_REQUIRED;
+        }
+
+        @Override
+        public Collection<String> getValues() {
+            return Collections.singleton(value);
+        }
+
+        @Override
+        public String toString() {
+            return "Key [key=" + key + ", value=" + value + ", text=" + text
+                    + ", text_context=" + text_context + ", match=" + match
+                    + "]";
+        }
+    }
+
+    /**
+     * Text field type.
+     */
+    public static class Text extends KeyedItem {
+
+        /** The localized version of {@link #text}. */
+        public String locale_text;
+        public String default_;
+        public String originalValue;
+        public String use_last_as_default = "false";
+        public String auto_increment;
+        public String length;
+        public String alternative_autocomplete_keys;
+
+        private JComponent value;
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+
+            // find out if our key is already used in the selection.
+            Usage usage = determineTextUsage(sel, key);
+            AutoCompletingTextField textField = new AutoCompletingTextField();
+            if (alternative_autocomplete_keys != null) {
+                initAutoCompletionField(textField, (key + "," + alternative_autocomplete_keys).split(","));
+            } else {
+                initAutoCompletionField(textField, key);
+            }
+            if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
+                textField.setHint(key);
+            }
+            if (length != null && !length.isEmpty()) {
+                textField.setMaxChars(Integer.valueOf(length));
+            }
+            if (usage.unused()){
+                if (auto_increment_selected != 0  && auto_increment != null) {
+                    try {
+                        textField.setText(Integer.toString(Integer.parseInt(LAST_VALUES.get(key)) + auto_increment_selected));
+                    } catch (NumberFormatException ex) {
+                        // Ignore - cannot auto-increment if last was non-numeric
+                    }
+                }
+                else if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
+                    // selected osm primitives are untagged or filling default values feature is enabled
+                    if (!"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
+                        textField.setText(LAST_VALUES.get(key));
+                    } else {
+                        textField.setText(default_);
+                    }
+                } else {
+                    // selected osm primitives are tagged and filling default values feature is disabled
+                    textField.setText("");
+                }
+                value = textField;
+                originalValue = null;
+            } else if (usage.hasUniqueValue()) {
+                // all objects use the same value
+                textField.setText(usage.getFirst());
+                value = textField;
+                originalValue = usage.getFirst();
+            } else {
+                // the objects have different values
+                JosmComboBox<String> comboBox = new JosmComboBox<>(usage.values.toArray(new String[0]));
+                comboBox.setEditable(true);
+                comboBox.setEditor(textField);
+                comboBox.getEditor().setItem(DIFFERENT);
+                value=comboBox;
+                originalValue = DIFFERENT;
+            }
+            if (locale_text == null) {
+                locale_text = getLocaleText(text, text_context, null);
+            }
+
+            // if there's an auto_increment setting, then wrap the text field
+            // into a panel, appending a number of buttons.
+            // auto_increment has a format like -2,-1,1,2
+            // the text box being the first component in the panel is relied
+            // on in a rather ugly fashion further down.
+            if (auto_increment != null) {
+                ButtonGroup bg = new ButtonGroup();
+                JPanel pnl = new JPanel(new GridBagLayout());
+                pnl.add(value, GBC.std().fill(GBC.HORIZONTAL));
+
+                // first, one button for each auto_increment value
+                for (final String ai : auto_increment.split(",")) {
+                    JToggleButton aibutton = new JToggleButton(ai);
+                    aibutton.setToolTipText(tr("Select auto-increment of {0} for this field", ai));
+                    aibutton.setMargin(new java.awt.Insets(0,0,0,0));
+                    aibutton.setFocusable(false);
+                    bg.add(aibutton);
+                    try {
+                        // TODO there must be a better way to parse a number like "+3" than this.
+                        final int buttonvalue = (NumberFormat.getIntegerInstance().parse(ai.replace("+", ""))).intValue();
+                        if (auto_increment_selected == buttonvalue) aibutton.setSelected(true);
+                        aibutton.addActionListener(new ActionListener() {
+                            @Override
+                            public void actionPerformed(ActionEvent e) {
+                                auto_increment_selected = buttonvalue;
+                            }
+                        });
+                        pnl.add(aibutton, GBC.std());
+                    } catch (ParseException x) {
+                        Main.error("Cannot parse auto-increment value of '" + ai + "' into an integer");
+                    }
+                }
+
+                // an invisible toggle button for "release" of the button group
+                final JToggleButton clearbutton = new JToggleButton("X");
+                clearbutton.setVisible(false);
+                clearbutton.setFocusable(false);
+                bg.add(clearbutton);
+                // and its visible counterpart. - this mechanism allows us to
+                // have *no* button selected after the X is clicked, instead
+                // of the X remaining selected
+                JButton releasebutton = new JButton("X");
+                releasebutton.setToolTipText(tr("Cancel auto-increment for this field"));
+                releasebutton.setMargin(new java.awt.Insets(0,0,0,0));
+                releasebutton.setFocusable(false);
+                releasebutton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        auto_increment_selected = 0;
+                        clearbutton.setSelected(true);
+                    }
+                });
+                pnl.add(releasebutton, GBC.eol());
+                value = pnl;
+            }
+            p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
+            p.add(value, GBC.eol().fill(GBC.HORIZONTAL));
+            return true;
+        }
+
+        private static String getValue(Component comp) {
+            if (comp instanceof JosmComboBox) {
+                return ((JosmComboBox<?>) comp).getEditor().getItem().toString();
+            } else if (comp instanceof JosmTextField) {
+                return ((JosmTextField) comp).getText();
+            } else if (comp instanceof JPanel) {
+                return getValue(((JPanel)comp).getComponent(0));
+            } else {
+                return null;
+            }
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+
+            // return if unchanged
+            String v = getValue(value);
+            if (v == null) {
+                Main.error("No 'last value' support for component " + value);
+                return;
+            }
+
+            v = Tag.removeWhiteSpaces(v);
+
+            if (!"false".equals(use_last_as_default) || auto_increment != null) {
+                LAST_VALUES.put(key, v);
+            }
+            if (v.equals(originalValue) || (originalValue == null && v.length() == 0))
+                return;
+
+            changedTags.add(new Tag(key, v));
+            AutoCompletionManager.rememberUserInput(key, v, true);
+        }
+
+        @Override
+        boolean requestFocusInWindow() {
+            return value.requestFocusInWindow();
+        }
+
+        @Override
+        public MatchType getDefaultMatch() {
+            return MatchType.NONE;
+        }
+
+        @Override
+        public Collection<String> getValues() {
+            if (default_ == null || default_.isEmpty())
+                return Collections.emptyList();
+            return Collections.singleton(default_);
+        }
+    }
+
+    /**
+     * A group of {@link Check}s.
+     * @since 6114
+     */
+    public static class CheckGroup extends TaggingPresetItem {
+
+        /**
+         * Number of columns (positive integer)
+         */
+        public String columns;
+
+        /**
+         * List of checkboxes
+         */
+        public final List<Check> checks = new LinkedList<>();
+
+        @Override
+        boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+            Integer cols = Integer.valueOf(columns);
+            int rows = (int) Math.ceil(checks.size()/cols.doubleValue());
+            JPanel panel = new JPanel(new GridLayout(rows, cols));
+
+            for (Check check : checks) {
+                check.addToPanel(panel, sel, presetInitiallyMatches);
+            }
+
+            p.add(panel, GBC.eol());
+            return false;
+        }
+
+        @Override
+        void addCommands(List<Tag> changedTags) {
+            for (Check check : checks) {
+                check.addCommands(changedTags);
+            }
+        }
+
+        @Override
+        public String toString() {
+            return "CheckGroup [columns=" + columns + "]";
+        }
+    }
+
+    /**
+     * Checkbox type.
+     */
+    public static class Check extends KeyedItem {
+
+        /** The localized version of {@link #text}. */
+        public String locale_text;
+        /** the value to set when checked (default is "yes") */
+        public String value_on = OsmUtils.trueval;
+        /** the value to set when unchecked (default is "no") */
+        public String value_off = OsmUtils.falseval;
+        /** whether the off value is disabled in the dialog, i.e., only unset or yes are provided */
+        public boolean disable_off = false;
+        /** ticked on/off (default is "off") */
+        public boolean default_ = false; // only used for tagless objects
+
+        private QuadStateCheckBox check;
+        private QuadStateCheckBox.State initialState;
+        private boolean def;
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+
+            // find out if our key is already used in the selection.
+            final Usage usage = determineBooleanUsage(sel, key);
+            final String oneValue = usage.values.isEmpty() ? null : usage.values.last();
+            def = default_;
+
+            if (locale_text == null) {
+                locale_text = getLocaleText(text, text_context, null);
+            }
+
+            if (usage.values.size() < 2 && (oneValue == null || value_on.equals(oneValue) || value_off.equals(oneValue))) {
+                if (def && !PROP_FILL_DEFAULT.get()) {
+                    // default is set and filling default values feature is disabled - check if all primitives are untagged
+                    for (OsmPrimitive s : sel)
+                        if (s.hasKeys()) {
+                            def = false;
+                        }
+                }
+
+                // all selected objects share the same value which is either true or false or unset,
+                // we can display a standard check box.
+                initialState = value_on.equals(oneValue)
+                        ? QuadStateCheckBox.State.SELECTED
+                        : value_off.equals(oneValue)
+                        ? QuadStateCheckBox.State.NOT_SELECTED
+                        : def
+                        ? QuadStateCheckBox.State.SELECTED
+                        : QuadStateCheckBox.State.UNSET;
+            } else {
+                def = false;
+                // the objects have different values, or one or more objects have something
+                // else than true/false. we display a quad-state check box
+                // in "partial" state.
+                initialState = QuadStateCheckBox.State.PARTIAL;
+            }
+
+            final List<QuadStateCheckBox.State> allowedStates = new ArrayList<>(4);
+            if (QuadStateCheckBox.State.PARTIAL.equals(initialState))
+                allowedStates.add(QuadStateCheckBox.State.PARTIAL);
+            allowedStates.add(QuadStateCheckBox.State.SELECTED);
+            if (!disable_off || value_off.equals(oneValue))
+                allowedStates.add(QuadStateCheckBox.State.NOT_SELECTED);
+            allowedStates.add(QuadStateCheckBox.State.UNSET);
+            check = new QuadStateCheckBox(locale_text, initialState,
+                    allowedStates.toArray(new QuadStateCheckBox.State[allowedStates.size()]));
+
+            p.add(check, GBC.eol().fill(GBC.HORIZONTAL));
+            return true;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+            // if the user hasn't changed anything, don't create a command.
+            if (check.getState() == initialState && !def) return;
+
+            // otherwise change things according to the selected value.
+            changedTags.add(new Tag(key,
+                    check.getState() == QuadStateCheckBox.State.SELECTED ? value_on :
+                        check.getState() == QuadStateCheckBox.State.NOT_SELECTED ? value_off :
+                            null));
+        }
+
+        @Override
+        boolean requestFocusInWindow() {return check.requestFocusInWindow();}
+
+        @Override
+        public MatchType getDefaultMatch() {
+            return MatchType.NONE;
+        }
+
+        @Override
+        public Collection<String> getValues() {
+            return disable_off ? Arrays.asList(value_on) : Arrays.asList(value_on, value_off);
+        }
+
+        @Override
+        public String toString() {
+            return "Check ["
+                    + (locale_text != null ? "locale_text=" + locale_text + ", " : "")
+                    + (value_on != null ? "value_on=" + value_on + ", " : "")
+                    + (value_off != null ? "value_off=" + value_off + ", " : "")
+                    + "default_=" + default_ + ", "
+                    + (check != null ? "check=" + check + ", " : "")
+                    + (initialState != null ? "initialState=" + initialState
+                            + ", " : "") + "def=" + def + "]";
+        }
+    }
+
+    /**
+     * Abstract superclass for combo box and multi-select list types.
+     */
+    public abstract static class ComboMultiSelect extends KeyedItem {
+
+        /** The localized version of {@link #text}. */
+        public String locale_text;
+        public String values;
+        public String values_from;
+        /** The context used for translating {@link #values} */
+        public String values_context;
+        public String display_values;
+        /** The localized version of {@link #display_values}. */
+        public String locale_display_values;
+        public String short_descriptions;
+        /** The localized version of {@link #short_descriptions}. */
+        public String locale_short_descriptions;
+        public String default_;
+        public String delimiter = ";";
+        public String use_last_as_default = "false";
+        /** whether to use values for search via {@link TaggingPresetSelector} */
+        public String values_searchable = "false";
+
+        protected JComponent component;
+        protected final Map<String, PresetListEntry> lhm = new LinkedHashMap<>();
+        private boolean initialized = false;
+        protected Usage usage;
+        protected Object originalValue;
+
+        protected abstract Object getSelectedItem();
+        protected abstract void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches);
+
+        protected char getDelChar() {
+            return delimiter.isEmpty() ? ';' : delimiter.charAt(0);
+        }
+
+        @Override
+        public Collection<String> getValues() {
+            initListEntries();
+            return lhm.keySet();
+        }
+
+        public Collection<String> getDisplayValues() {
+            initListEntries();
+            return Utils.transform(lhm.values(), new Utils.Function<PresetListEntry, String>() {
+                @Override
+                public String apply(PresetListEntry x) {
+                    return x.getDisplayValue(true);
+                }
+            });
+        }
+
+        @Override
+        public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+
+            initListEntries();
+
+            // find out if our key is already used in the selection.
+            usage = determineTextUsage(sel, key);
+            if (!usage.hasUniqueValue() && !usage.unused()) {
+                lhm.put(DIFFERENT, new PresetListEntry(DIFFERENT));
+            }
+
+            p.add(new JLabel(tr("{0}:", locale_text)), GBC.std().insets(0, 0, 10, 0));
+            addToPanelAnchor(p, default_, presetInitiallyMatches);
+
+            return true;
+
+        }
+
+        private void initListEntries() {
+            if (initialized) {
+                lhm.remove(DIFFERENT); // possibly added in #addToPanel
+                return;
+            } else if (lhm.isEmpty()) {
+                initListEntriesFromAttributes();
+            } else {
+                if (values != null) {
+                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
+                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
+                            key, text, "values", "list_entry"));
+                }
+                if (display_values != null || locale_display_values != null) {
+                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
+                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
+                            key, text, "display_values", "list_entry"));
+                }
+                if (short_descriptions != null || locale_short_descriptions != null) {
+                    Main.warn(tr("Warning in tagging preset \"{0}-{1}\": "
+                            + "Ignoring ''{2}'' attribute as ''{3}'' elements are given.",
+                            key, text, "short_descriptions", "list_entry"));
+                }
+                for (PresetListEntry e : lhm.values()) {
+                    if (e.value_context == null) {
+                        e.value_context = values_context;
+                    }
+                }
+            }
+            if (locale_text == null) {
+                locale_text = getLocaleText(text, text_context, null);
+            }
+            initialized = true;
+        }
+
+        private String[] initListEntriesFromAttributes() {
+            char delChar = getDelChar();
+
+            String[] value_array = null;
+
+            if (values_from != null) {
+                String[] class_method = values_from.split("#");
+                if (class_method != null && class_method.length == 2) {
+                    try {
+                        Method method = Class.forName(class_method[0]).getMethod(class_method[1]);
+                        // Check method is public static String[] methodName()
+                        int mod = method.getModifiers();
+                        if (Modifier.isPublic(mod) && Modifier.isStatic(mod)
+                                && method.getReturnType().equals(String[].class) && method.getParameterTypes().length == 0) {
+                            value_array = (String[]) method.invoke(null);
+                        } else {
+                            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) {
+                        Main.error(tr("Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' threw {2} ({3})", key, text,
+                                e.getClass().getName(), e.getMessage()));
+                    }
+                }
+            }
+
+            if (value_array == null) {
+                value_array = splitEscaped(delChar, values);
+            }
+
+            final String displ = Utils.firstNonNull(locale_display_values, display_values);
+            String[] display_array = displ == null ? value_array : splitEscaped(delChar, displ);
+
+            final String descr = Utils.firstNonNull(locale_short_descriptions, short_descriptions);
+            String[] short_descriptions_array = descr == null ? null : splitEscaped(delChar, descr);
+
+            if (display_array.length != value_array.length) {
+                Main.error(tr("Broken tagging preset \"{0}-{1}\" - number of items in ''display_values'' must be the same as in ''values''", key, text));
+                display_array = value_array;
+            }
+
+            if (short_descriptions_array != null && short_descriptions_array.length != value_array.length) {
+                Main.error(tr("Broken tagging preset \"{0}-{1}\" - number of items in ''short_descriptions'' must be the same as in ''values''", key, text));
+                short_descriptions_array = null;
+            }
+
+            for (int i = 0; i < value_array.length; i++) {
+                final PresetListEntry e = new PresetListEntry(value_array[i]);
+                e.locale_display_value = locale_display_values != null
+                        ? display_array[i]
+                                : trc(values_context, fixPresetString(display_array[i]));
+                        if (short_descriptions_array != null) {
+                            e.locale_short_description = locale_short_descriptions != null
+                                    ? short_descriptions_array[i]
+                                            : tr(fixPresetString(short_descriptions_array[i]));
+                        }
+                        lhm.put(value_array[i], e);
+                        display_array[i] = e.getDisplayValue(true);
+            }
+
+            return display_array;
+        }
+
+        protected String getDisplayIfNull() {
+            return null;
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+            Object obj = getSelectedItem();
+            String display = (obj == null) ? null : obj.toString();
+            String value = null;
+            if (display == null) {
+                display = getDisplayIfNull();
+            }
+
+            if (display != null) {
+                for (String val : lhm.keySet()) {
+                    String k = lhm.get(val).toString();
+                    if (k != null && k.equals(display)) {
+                        value = val;
+                        break;
+                    }
+                }
+                if (value == null) {
+                    value = display;
+                }
+            } else {
+                value = "";
+            }
+            value = Tag.removeWhiteSpaces(value);
+
+            // no change if same as before
+            if (originalValue == null) {
+                if (value.length() == 0)
+                    return;
+            } else if (value.equals(originalValue.toString()))
+                return;
+
+            if (!"false".equals(use_last_as_default)) {
+                LAST_VALUES.put(key, value);
+            }
+            changedTags.add(new Tag(key, value));
+        }
+
+        public void addListEntry(PresetListEntry e) {
+            lhm.put(e.value, e);
+        }
+
+        public void addListEntries(Collection<PresetListEntry> e) {
+            for (PresetListEntry i : e) {
+                addListEntry(i);
+            }
+        }
+
+        @Override
+        boolean requestFocusInWindow() {
+            return component.requestFocusInWindow();
+        }
+
+        private static final ListCellRenderer<PresetListEntry> RENDERER = new ListCellRenderer<PresetListEntry>() {
+
+            JLabel lbl = new JLabel();
+
+            @Override
+            public Component getListCellRendererComponent(
+                    JList<? extends PresetListEntry> list,
+                    PresetListEntry item,
+                    int index,
+                    boolean isSelected,
+                    boolean cellHasFocus) {
+
+                // Only return cached size, item is not shown
+                if (!list.isShowing() && item.prefferedWidth != -1 && item.prefferedHeight != -1) {
+                    if (index == -1) {
+                        lbl.setPreferredSize(new Dimension(item.prefferedWidth, 10));
+                    } else {
+                        lbl.setPreferredSize(new Dimension(item.prefferedWidth, item.prefferedHeight));
+                    }
+                    return lbl;
+                }
+
+                lbl.setPreferredSize(null);
+
+
+                if (isSelected) {
+                    lbl.setBackground(list.getSelectionBackground());
+                    lbl.setForeground(list.getSelectionForeground());
+                } else {
+                    lbl.setBackground(list.getBackground());
+                    lbl.setForeground(list.getForeground());
+                }
+
+                lbl.setOpaque(true);
+                lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN));
+                lbl.setText("<html>" + item.getListDisplay() + "</html>");
+                lbl.setIcon(item.getIcon());
+                lbl.setEnabled(list.isEnabled());
+
+                // Cache size
+                item.prefferedWidth = lbl.getPreferredSize().width;
+                item.prefferedHeight = lbl.getPreferredSize().height;
+
+                // We do not want the editor to have the maximum height of all
+                // entries. Return a dummy with bogus height.
+                if (index == -1) {
+                    lbl.setPreferredSize(new Dimension(lbl.getPreferredSize().width, 10));
+                }
+                return lbl;
+            }
+        };
+
+        protected ListCellRenderer<PresetListEntry> getListCellRenderer() {
+            return RENDERER;
+        }
+
+        @Override
+        public MatchType getDefaultMatch() {
+            return MatchType.NONE;
+        }
+    }
+
+    /**
+     * Combobox type.
+     */
+    public static class Combo extends ComboMultiSelect {
+
+        public boolean editable = true;
+        protected JosmComboBox<PresetListEntry> combo;
+        public String length;
+
+        /**
+         * Constructs a new {@code Combo}.
+         */
+        public Combo() {
+            delimiter = ",";
+        }
+
+        @Override
+        protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
+            if (!usage.unused()) {
+                for (String s : usage.values) {
+                    if (!lhm.containsKey(s)) {
+                        lhm.put(s, new PresetListEntry(s));
+                    }
+                }
+            }
+            if (def != null && !lhm.containsKey(def)) {
+                lhm.put(def, new PresetListEntry(def));
+            }
+            lhm.put("", new PresetListEntry(""));
+
+            combo = new JosmComboBox<>(lhm.values().toArray(new PresetListEntry[0]));
+            component = combo;
+            combo.setRenderer(getListCellRenderer());
+            combo.setEditable(editable);
+            combo.reinitialize(lhm.values());
+            AutoCompletingTextField tf = new AutoCompletingTextField();
+            initAutoCompletionField(tf, key);
+            if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
+                tf.setHint(key);
+            }
+            if (length != null && !length.isEmpty()) {
+                tf.setMaxChars(Integer.valueOf(length));
+            }
+            AutoCompletionList acList = tf.getAutoCompletionList();
+            if (acList != null) {
+                acList.add(getDisplayValues(), AutoCompletionItemPriority.IS_IN_STANDARD);
+            }
+            combo.setEditor(tf);
+
+            if (usage.hasUniqueValue()) {
+                // all items have the same value (and there were no unset items)
+                originalValue = lhm.get(usage.getFirst());
+                combo.setSelectedItem(originalValue);
+            } else if (def != null && usage.unused()) {
+                // default is set and all items were unset
+                if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
+                    // selected osm primitives are untagged or filling default feature is enabled
+                    combo.setSelectedItem(lhm.get(def).getDisplayValue(true));
+                } else {
+                    // selected osm primitives are tagged and filling default feature is disabled
+                    combo.setSelectedItem("");
+                }
+                originalValue = lhm.get(DIFFERENT);
+            } else if (usage.unused()) {
+                // all items were unset (and so is default)
+                originalValue = lhm.get("");
+                if ("force".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
+                    combo.setSelectedItem(lhm.get(LAST_VALUES.get(key)));
+                } else {
+                    combo.setSelectedItem(originalValue);
+                }
+            } else {
+                originalValue = lhm.get(DIFFERENT);
+                combo.setSelectedItem(originalValue);
+            }
+            p.add(combo, GBC.eol().fill(GBC.HORIZONTAL));
+
+        }
+
+        @Override
+        protected Object getSelectedItem() {
+            return combo.getSelectedItem();
+
+        }
+
+        @Override
+        protected String getDisplayIfNull() {
+            if (combo.isEditable())
+                return combo.getEditor().getItem().toString();
+            else
+                return null;
+        }
+    }
+
+    /**
+     * Multi-select list type.
+     */
+    public static class MultiSelect extends ComboMultiSelect {
+
+        /**
+         * Number of rows to display (positive integer, optional).
+         */
+        public String rows;
+        protected ConcatenatingJList list;
+
+        @Override
+        protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
+            list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[0]));
+            component = list;
+            ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
+            list.setCellRenderer(renderer);
+
+            if (usage.hasUniqueValue() && !usage.unused()) {
+                originalValue = usage.getFirst();
+                list.setSelectedItem(originalValue);
+            } else if (def != null && !usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
+                originalValue = DIFFERENT;
+                list.setSelectedItem(def);
+            } else if (usage.unused()) {
+                originalValue = null;
+                list.setSelectedItem(originalValue);
+            } else {
+                originalValue = DIFFERENT;
+                list.setSelectedItem(originalValue);
+            }
+
+            JScrollPane sp = new JScrollPane(list);
+            // if a number of rows has been specified in the preset,
+            // modify preferred height of scroll pane to match that row count.
+            if (rows != null) {
+                double height = renderer.getListCellRendererComponent(list,
+                        new PresetListEntry("x"), 0, false, false).getPreferredSize().getHeight() * Integer.valueOf(rows);
+                sp.setPreferredSize(new Dimension((int) sp.getPreferredSize().getWidth(), (int) height));
+            }
+            p.add(sp, GBC.eol().fill(GBC.HORIZONTAL));
+        }
+
+        @Override
+        protected Object getSelectedItem() {
+            return list.getSelectedItem();
+        }
+
+        @Override
+        public void addCommands(List<Tag> changedTags) {
+            // Do not create any commands if list has been disabled because of an unknown value (fix #8605)
+            if (list.isEnabled()) {
+                super.addCommands(changedTags);
+            }
+        }
+    }
+
+    /**
+    * Class that allows list values to be assigned and retrieved as a comma-delimited
+    * string (extracted from TaggingPreset)
+    */
+    private static class ConcatenatingJList extends JList<PresetListEntry> {
+        private String delimiter;
+        public ConcatenatingJList(String del, PresetListEntry[] o) {
+            super(o);
+            delimiter = del;
+        }
+
+        public void setSelectedItem(Object o) {
+            if (o == null) {
+                clearSelection();
+            } else {
+                String s = o.toString();
+                TreeSet<String> parts = new TreeSet<>(Arrays.asList(s.split(delimiter)));
+                ListModel<PresetListEntry> lm = getModel();
+                int[] intParts = new int[lm.getSize()];
+                int j = 0;
+                for (int i = 0; i < lm.getSize(); i++) {
+                    final String value = lm.getElementAt(i).value;
+                    if (parts.contains(value)) {
+                        intParts[j++]=i;
+                        parts.remove(value);
+                    }
+                }
+                setSelectedIndices(Arrays.copyOf(intParts, j));
+                // check if we have actually managed to represent the full
+                // value with our presets. if not, cop out; we will not offer
+                // a selection list that threatens to ruin the value.
+                setEnabled(parts.isEmpty());
+            }
+        }
+
+        public String getSelectedItem() {
+            ListModel<PresetListEntry> lm = getModel();
+            int[] si = getSelectedIndices();
+            StringBuilder builder = new StringBuilder();
+            for (int i=0; i<si.length; i++) {
+                if (i>0) {
+                    builder.append(delimiter);
+                }
+                builder.append(lm.getElementAt(si[i]).value);
+            }
+            return builder.toString();
+        }
+    }
+
+    public static EnumSet<TaggingPresetType> getType(String types) throws SAXException {
+        if (TYPE_CACHE.containsKey(types))
+            return TYPE_CACHE.get(types);
+        EnumSet<TaggingPresetType> result = EnumSet.noneOf(TaggingPresetType.class);
+        for (String type : Arrays.asList(types.split(","))) {
+            try {
+                TaggingPresetType presetType = TaggingPresetType.fromString(type);
+                result.add(presetType);
+            } catch (IllegalArgumentException e) {
+                throw new SAXException(tr("Unknown type: {0}", type), e);
+            }
+        }
+        TYPE_CACHE.put(types, result);
+        return result;
+    }
+
+    static String fixPresetString(String s) {
+        return s == null ? s : s.replaceAll("'","''");
+    }
+
+    private static String getLocaleText(String text, String text_context, String defaultText) {
+        if (text == null) {
+            return defaultText;
+        } else if (text_context != null) {
+            return trc(text_context, fixPresetString(text));
+        } else {
+            return tr(fixPresetString(text));
+        }
+    }
+
+    /**
+     * allow escaped comma in comma separated list:
+     * "A\, B\, C,one\, two" --> ["A, B, C", "one, two"]
+     * @param delimiter the delimiter, e.g. a comma. separates the entries and
+     *      must be escaped within one entry
+     * @param s the string
+     */
+    private static String[] splitEscaped(char delimiter, String s) {
+        if (s == null)
+            return new String[0];
+        List<String> result = new ArrayList<>();
+        boolean backslash = false;
+        StringBuilder item = new StringBuilder();
+        for (int i=0; i<s.length(); i++) {
+            char ch = s.charAt(i);
+            if (backslash) {
+                item.append(ch);
+                backslash = false;
+            } else if (ch == '\\') {
+                backslash = true;
+            } else if (ch == delimiter) {
+                result.add(item.toString());
+                item.setLength(0);
+            } else {
+                item.append(ch);
+            }
+        }
+        if (item.length() > 0) {
+            result.add(item.toString());
+        }
+        return result.toArray(new String[result.size()]);
+    }
+
+    static Usage determineTextUsage(Collection<OsmPrimitive> sel, String key) {
+        Usage returnValue = new Usage();
+        returnValue.values = new TreeSet<>();
+        for (OsmPrimitive s : sel) {
+            String v = s.get(key);
+            if (v != null) {
+                returnValue.values.add(v);
+            } else {
+                returnValue.hadEmpty = true;
+            }
+            if(s.hasKeys()) {
+                returnValue.hadKeys = true;
+            }
+        }
+        return returnValue;
+    }
+
+    static Usage determineBooleanUsage(Collection<OsmPrimitive> sel, String key) {
+
+        Usage returnValue = new Usage();
+        returnValue.values = new TreeSet<>();
+        for (OsmPrimitive s : sel) {
+            String booleanValue = OsmUtils.getNamedOsmBoolean(s.get(key));
+            if (booleanValue != null) {
+                returnValue.values.add(booleanValue);
+            }
+        }
+        return returnValue;
+    }
+
+    protected static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
+        final Collection<String> s = Main.pref.getCollection("taggingpreset.icon.sources", null);
+        ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
+        if (maxSize != null) {
+            imgProv.setMaxSize(maxSize);
+        }
+        return imgProv.get();
+    }
+
+    protected static Integer parseInteger(String str) {
+        if (str == null || str.isEmpty())
+            return null;
+        try {
+            return Integer.parseInt(str);
+        } catch (Exception e) {
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java
index 350d6da..711713e 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java
@@ -1,14 +1,14 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging;
-
-/**
- * Notification of tagging presets events.
- * @since 7100
- */
-public interface TaggingPresetListener {
-
-    /**
-     * Called after list of tagging presets has been modified.
-     */
-    public void taggingPresetsModified();
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+/**
+ * Notification of tagging presets events.
+ * @since 7100
+ */
+public interface TaggingPresetListener {
+
+    /**
+     * Called after list of tagging presets has been modified.
+     */
+    public void taggingPresetsModified();
+}
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
index ec3c649..01bccca 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetReader.java
@@ -1,334 +1,334 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
-import org.openstreetmap.josm.io.CachedFile;
-import org.openstreetmap.josm.io.UTFInputStreamReader;
-import org.openstreetmap.josm.tools.XmlObjectParser;
-import org.xml.sax.SAXException;
-
-/**
- * The tagging presets reader.
- * @since 6068
- */
-public final class TaggingPresetReader {
-
-    /**
-     * The accepted MIME types sent in the HTTP Accept header.
-     * @since 6867
-     */
-    public static final String PRESET_MIME_TYPES = "application/xml, text/xml, text/plain; q=0.8, application/zip, application/octet-stream; q=0.5";
-
-    private TaggingPresetReader() {
-        // Hide default constructor for utils classes
-    }
-
-    private static File zipIcons = null;
-
-    /**
-     * Returns the set of preset source URLs.
-     * @return The set of preset source URLs.
-     */
-    public static Set<String> getPresetSources() {
-        return new TaggingPresetPreference.PresetPrefHelper().getActiveUrls();
-    }
-
-    /**
-     * Holds a reference to a chunk of items/objects.
-     */
-    public static class Chunk {
-        /** The chunk id, can be referenced later */
-        public String id;
-    }
-
-    /**
-     * Holds a reference to an earlier item/object.
-     */
-    public static class Reference {
-        /** Reference matching a chunk id defined earlier **/
-        public String ref;
-    }
-
-    private static XmlObjectParser buildParser() {
-        XmlObjectParser parser = new XmlObjectParser();
-        parser.mapOnStart("item", TaggingPreset.class);
-        parser.mapOnStart("separator", TaggingPresetSeparator.class);
-        parser.mapBoth("group", TaggingPresetMenu.class);
-        parser.map("text", TaggingPresetItems.Text.class);
-        parser.map("link", TaggingPresetItems.Link.class);
-        parser.map("preset_link", TaggingPresetItems.PresetLink.class);
-        parser.mapOnStart("optional", TaggingPresetItems.Optional.class);
-        parser.mapOnStart("roles", TaggingPresetItems.Roles.class);
-        parser.map("role", TaggingPresetItems.Role.class);
-        parser.map("checkgroup", TaggingPresetItems.CheckGroup.class);
-        parser.map("check", TaggingPresetItems.Check.class);
-        parser.map("combo", TaggingPresetItems.Combo.class);
-        parser.map("multiselect", TaggingPresetItems.MultiSelect.class);
-        parser.map("label", TaggingPresetItems.Label.class);
-        parser.map("space", TaggingPresetItems.Space.class);
-        parser.map("key", TaggingPresetItems.Key.class);
-        parser.map("list_entry", TaggingPresetItems.PresetListEntry.class);
-        parser.map("item_separator", TaggingPresetItems.ItemSeparator.class);
-        parser.mapBoth("chunk", Chunk.class);
-        parser.map("reference", Reference.class);
-        return parser;
-    }
-
-    /**
-     * Reads all tagging presets from the input reader.
-     * @param in The input reader
-     * @param validate if {@code true}, XML validation will be performed
-     * @return collection of tagging presets
-     * @throws SAXException if any XML error occurs
-     */
-    public static Collection<TaggingPreset> readAll(Reader in, boolean validate) throws SAXException {
-        XmlObjectParser parser = buildParser();
-
-        Deque<TaggingPreset> all = new LinkedList<>();
-        TaggingPresetMenu lastmenu = null;
-        TaggingPresetItems.Roles lastrole = null;
-        final List<TaggingPresetItems.Check> checks = new LinkedList<>();
-        List<TaggingPresetItems.PresetListEntry> listEntries = new LinkedList<>();
-        final Map<String, List<Object>> byId = new HashMap<>();
-        final Deque<String> lastIds = new ArrayDeque<>();
-        /** lastIdIterators contains non empty iterators of items to be handled before obtaining the next item from the XML parser */
-        final Deque<Iterator<Object>> lastIdIterators = new ArrayDeque<>();
-
-        if (validate) {
-            parser.startWithValidation(in, Main.getXMLBase()+"/tagging-preset-1.0", "resource://data/tagging-preset.xsd");
-        } else {
-            parser.start(in);
-        }
-        while (parser.hasNext() || !lastIdIterators.isEmpty()) {
-            final Object o;
-            if (!lastIdIterators.isEmpty()) {
-                // obtain elements from lastIdIterators with higher priority
-                o = lastIdIterators.peek().next();
-                if (!lastIdIterators.peek().hasNext()) {
-                    // remove iterator if is empty
-                    lastIdIterators.pop();
-                }
-            } else {
-                o = parser.next();
-            }
-            if (o instanceof Chunk) {
-                if (!lastIds.isEmpty() && ((Chunk) o).id.equals(lastIds.peek())) {
-                    // pop last id on end of object, don't process further
-                    lastIds.pop();
-                    ((Chunk) o).id = null;
-                    continue;
-                } else {
-                    // if preset item contains an id, store a mapping for later usage
-                    String lastId = ((Chunk) o).id;
-                    lastIds.push(lastId);
-                    byId.put(lastId, new ArrayList<>());
-                    continue;
-                }
-            } else if (!lastIds.isEmpty()) {
-                // add object to mapping for later usage
-                byId.get(lastIds.peek()).add(o);
-                continue;
-            }
-            if (o instanceof Reference) {
-                // if o is a reference, obtain the corresponding objects from the mapping,
-                // and iterate over those before consuming the next element from parser.
-                final String ref = ((Reference) o).ref;
-                if (byId.get(ref) == null) {
-                    throw new SAXException(tr("Reference {0} is being used before it was defined", ref));
-                }
-                Iterator<Object> it = byId.get(ref).iterator();
-                if (it.hasNext()) {
-                    lastIdIterators.push(it);
-                } else {
-                    Main.warn("Ignoring reference '"+ref+"' denoting an empty chunk");
-                }
-                continue;
-            }
-            if (!(o instanceof TaggingPresetItem) && !checks.isEmpty()) {
-                all.getLast().data.addAll(checks);
-                checks.clear();
-            }
-            if (o instanceof TaggingPresetMenu) {
-                TaggingPresetMenu tp = (TaggingPresetMenu) o;
-                if (tp == lastmenu) {
-                    lastmenu = tp.group;
-                } else {
-                    tp.group = lastmenu;
-                    tp.setDisplayName();
-                    lastmenu = tp;
-                    all.add(tp);
-                }
-                lastrole = null;
-            } else if (o instanceof TaggingPresetSeparator) {
-                TaggingPresetSeparator tp = (TaggingPresetSeparator) o;
-                tp.group = lastmenu;
-                all.add(tp);
-                lastrole = null;
-            } else if (o instanceof TaggingPreset) {
-                TaggingPreset tp = (TaggingPreset) o;
-                tp.group = lastmenu;
-                tp.setDisplayName();
-                all.add(tp);
-                lastrole = null;
-            } else {
-                if (!all.isEmpty()) {
-                    if (o instanceof TaggingPresetItems.Roles) {
-                        all.getLast().data.add((TaggingPresetItem) o);
-                        if (all.getLast().roles != null) {
-                            throw new SAXException(tr("Roles cannot appear more than once"));
-                        }
-                        all.getLast().roles = (TaggingPresetItems.Roles) o;
-                        lastrole = (TaggingPresetItems.Roles) o;
-                    } else if (o instanceof TaggingPresetItems.Role) {
-                        if (lastrole == null)
-                            throw new SAXException(tr("Preset role element without parent"));
-                        lastrole.roles.add((TaggingPresetItems.Role) o);
-                    } else if (o instanceof TaggingPresetItems.Check) {
-                        checks.add((TaggingPresetItems.Check) o);
-                    } else if (o instanceof TaggingPresetItems.PresetListEntry) {
-                        listEntries.add((TaggingPresetItems.PresetListEntry) o);
-                    } else if (o instanceof TaggingPresetItems.CheckGroup) {
-                        all.getLast().data.add((TaggingPresetItem) o);
-                        // Make sure list of checks is empty to avoid adding checks several times
-                        // when used in chunks (fix #10801)
-                        ((TaggingPresetItems.CheckGroup) o).checks.clear();
-                        ((TaggingPresetItems.CheckGroup) o).checks.addAll(checks);
-                        checks.clear();
-                    } else {
-                        if (!checks.isEmpty()) {
-                            all.getLast().data.addAll(checks);
-                            checks.clear();
-                        }
-                        all.getLast().data.add((TaggingPresetItem) o);
-                        if (o instanceof TaggingPresetItems.ComboMultiSelect) {
-                            ((TaggingPresetItems.ComboMultiSelect) o).addListEntries(listEntries);
-                        } else if (o instanceof TaggingPresetItems.Key) {
-                            if (((TaggingPresetItems.Key) o).value == null) {
-                                ((TaggingPresetItems.Key) o).value = ""; // Fix #8530
-                            }
-                        }
-                        listEntries = new LinkedList<>();
-                        lastrole = null;
-                    }
-                } else
-                    throw new SAXException(tr("Preset sub element without parent"));
-            }
-        }
-        if (!all.isEmpty() && !checks.isEmpty()) {
-            all.getLast().data.addAll(checks);
-            checks.clear();
-        }
-        return all;
-    }
-
-    /**
-     * Reads all tagging presets from the given source.
-     * @param source a given filename, URL or internal resource
-     * @param validate if {@code true}, XML validation will be performed
-     * @return collection of tagging presets
-     * @throws SAXException if any XML error occurs
-     * @throws IOException if any I/O error occurs
-     */
-    public static Collection<TaggingPreset> readAll(String source, boolean validate) throws SAXException, IOException {
-        Collection<TaggingPreset> tp;
-        CachedFile cf = new CachedFile(source).setHttpAccept(PRESET_MIME_TYPES);
-        try (
-            // zip may be null, but Java 7 allows it: https://blogs.oracle.com/darcy/entry/project_coin_null_try_with
-            InputStream zip = cf.findZipEntryInputStream("xml", "preset")
-        ) {
-            if (zip != null) {
-                zipIcons = cf.getFile();
-            }
-            try (InputStreamReader r = UTFInputStreamReader.create(zip == null ? cf.getInputStream() : zip)) {
-                tp = readAll(new BufferedReader(r), validate);
-            }
-        }
-        return tp;
-    }
-
-    /**
-     * Reads all tagging presets from the given sources.
-     * @param sources Collection of tagging presets sources.
-     * @param validate if {@code true}, presets will be validated against XML schema
-     * @return Collection of all presets successfully read
-     */
-    public static Collection<TaggingPreset> readAll(Collection<String> sources, boolean validate) {
-        return readAll(sources, validate, true);
-    }
-
-    /**
-     * Reads all tagging presets from the given sources.
-     * @param sources Collection of tagging presets sources.
-     * @param validate if {@code true}, presets will be validated against XML schema
-     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
-     * @return Collection of all presets successfully read
-     */
-    public static Collection<TaggingPreset> readAll(Collection<String> sources, boolean validate, boolean displayErrMsg) {
-        LinkedList<TaggingPreset> allPresets = new LinkedList<>();
-        for(String source : sources)  {
-            try {
-                allPresets.addAll(readAll(source, validate));
-            } catch (IOException e) {
-                Main.error(e, false);
-                Main.error(source);
-                if (source.startsWith("http")) {
-                    Main.addNetworkError(source, e);
-                }
-                if (displayErrMsg) {
-                    JOptionPane.showMessageDialog(
-                            Main.parent,
-                            tr("Could not read tagging preset source: {0}",source),
-                            tr("Error"),
-                            JOptionPane.ERROR_MESSAGE
-                            );
-                }
-            } catch (SAXException e) {
-                Main.error(e);
-                Main.error(source);
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        "<html>" + tr("Error parsing {0}: ", source) + "<br><br><table width=600>" + e.getMessage() + "</table></html>",
-                        tr("Error"),
-                        JOptionPane.ERROR_MESSAGE
-                        );
-            }
-        }
-        return allPresets;
-    }
-
-    /**
-     * Reads all tagging presets from sources stored in preferences.
-     * @param validate if {@code true}, presets will be validated against XML schema
-     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
-     * @return Collection of all presets successfully read
-     */
-    public static Collection<TaggingPreset> readFromPreferences(boolean validate, boolean displayErrMsg) {
-        return readAll(getPresetSources(), validate, displayErrMsg);
-    }
-
-    public static File getZipIcons() {
-        return zipIcons;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
+import org.openstreetmap.josm.io.CachedFile;
+import org.openstreetmap.josm.io.UTFInputStreamReader;
+import org.openstreetmap.josm.tools.XmlObjectParser;
+import org.xml.sax.SAXException;
+
+/**
+ * The tagging presets reader.
+ * @since 6068
+ */
+public final class TaggingPresetReader {
+
+    /**
+     * The accepted MIME types sent in the HTTP Accept header.
+     * @since 6867
+     */
+    public static final String PRESET_MIME_TYPES = "application/xml, text/xml, text/plain; q=0.8, application/zip, application/octet-stream; q=0.5";
+
+    private TaggingPresetReader() {
+        // Hide default constructor for utils classes
+    }
+
+    private static File zipIcons = null;
+
+    /**
+     * Returns the set of preset source URLs.
+     * @return The set of preset source URLs.
+     */
+    public static Set<String> getPresetSources() {
+        return new TaggingPresetPreference.PresetPrefHelper().getActiveUrls();
+    }
+
+    /**
+     * Holds a reference to a chunk of items/objects.
+     */
+    public static class Chunk {
+        /** The chunk id, can be referenced later */
+        public String id;
+    }
+
+    /**
+     * Holds a reference to an earlier item/object.
+     */
+    public static class Reference {
+        /** Reference matching a chunk id defined earlier **/
+        public String ref;
+    }
+
+    private static XmlObjectParser buildParser() {
+        XmlObjectParser parser = new XmlObjectParser();
+        parser.mapOnStart("item", TaggingPreset.class);
+        parser.mapOnStart("separator", TaggingPresetSeparator.class);
+        parser.mapBoth("group", TaggingPresetMenu.class);
+        parser.map("text", TaggingPresetItems.Text.class);
+        parser.map("link", TaggingPresetItems.Link.class);
+        parser.map("preset_link", TaggingPresetItems.PresetLink.class);
+        parser.mapOnStart("optional", TaggingPresetItems.Optional.class);
+        parser.mapOnStart("roles", TaggingPresetItems.Roles.class);
+        parser.map("role", TaggingPresetItems.Role.class);
+        parser.map("checkgroup", TaggingPresetItems.CheckGroup.class);
+        parser.map("check", TaggingPresetItems.Check.class);
+        parser.map("combo", TaggingPresetItems.Combo.class);
+        parser.map("multiselect", TaggingPresetItems.MultiSelect.class);
+        parser.map("label", TaggingPresetItems.Label.class);
+        parser.map("space", TaggingPresetItems.Space.class);
+        parser.map("key", TaggingPresetItems.Key.class);
+        parser.map("list_entry", TaggingPresetItems.PresetListEntry.class);
+        parser.map("item_separator", TaggingPresetItems.ItemSeparator.class);
+        parser.mapBoth("chunk", Chunk.class);
+        parser.map("reference", Reference.class);
+        return parser;
+    }
+
+    /**
+     * Reads all tagging presets from the input reader.
+     * @param in The input reader
+     * @param validate if {@code true}, XML validation will be performed
+     * @return collection of tagging presets
+     * @throws SAXException if any XML error occurs
+     */
+    public static Collection<TaggingPreset> readAll(Reader in, boolean validate) throws SAXException {
+        XmlObjectParser parser = buildParser();
+
+        Deque<TaggingPreset> all = new LinkedList<>();
+        TaggingPresetMenu lastmenu = null;
+        TaggingPresetItems.Roles lastrole = null;
+        final List<TaggingPresetItems.Check> checks = new LinkedList<>();
+        List<TaggingPresetItems.PresetListEntry> listEntries = new LinkedList<>();
+        final Map<String, List<Object>> byId = new HashMap<>();
+        final Deque<String> lastIds = new ArrayDeque<>();
+        /** lastIdIterators contains non empty iterators of items to be handled before obtaining the next item from the XML parser */
+        final Deque<Iterator<Object>> lastIdIterators = new ArrayDeque<>();
+
+        if (validate) {
+            parser.startWithValidation(in, Main.getXMLBase()+"/tagging-preset-1.0", "resource://data/tagging-preset.xsd");
+        } else {
+            parser.start(in);
+        }
+        while (parser.hasNext() || !lastIdIterators.isEmpty()) {
+            final Object o;
+            if (!lastIdIterators.isEmpty()) {
+                // obtain elements from lastIdIterators with higher priority
+                o = lastIdIterators.peek().next();
+                if (!lastIdIterators.peek().hasNext()) {
+                    // remove iterator if is empty
+                    lastIdIterators.pop();
+                }
+            } else {
+                o = parser.next();
+            }
+            if (o instanceof Chunk) {
+                if (!lastIds.isEmpty() && ((Chunk) o).id.equals(lastIds.peek())) {
+                    // pop last id on end of object, don't process further
+                    lastIds.pop();
+                    ((Chunk) o).id = null;
+                    continue;
+                } else {
+                    // if preset item contains an id, store a mapping for later usage
+                    String lastId = ((Chunk) o).id;
+                    lastIds.push(lastId);
+                    byId.put(lastId, new ArrayList<>());
+                    continue;
+                }
+            } else if (!lastIds.isEmpty()) {
+                // add object to mapping for later usage
+                byId.get(lastIds.peek()).add(o);
+                continue;
+            }
+            if (o instanceof Reference) {
+                // if o is a reference, obtain the corresponding objects from the mapping,
+                // and iterate over those before consuming the next element from parser.
+                final String ref = ((Reference) o).ref;
+                if (byId.get(ref) == null) {
+                    throw new SAXException(tr("Reference {0} is being used before it was defined", ref));
+                }
+                Iterator<Object> it = byId.get(ref).iterator();
+                if (it.hasNext()) {
+                    lastIdIterators.push(it);
+                } else {
+                    Main.warn("Ignoring reference '"+ref+"' denoting an empty chunk");
+                }
+                continue;
+            }
+            if (!(o instanceof TaggingPresetItem) && !checks.isEmpty()) {
+                all.getLast().data.addAll(checks);
+                checks.clear();
+            }
+            if (o instanceof TaggingPresetMenu) {
+                TaggingPresetMenu tp = (TaggingPresetMenu) o;
+                if (tp == lastmenu) {
+                    lastmenu = tp.group;
+                } else {
+                    tp.group = lastmenu;
+                    tp.setDisplayName();
+                    lastmenu = tp;
+                    all.add(tp);
+                }
+                lastrole = null;
+            } else if (o instanceof TaggingPresetSeparator) {
+                TaggingPresetSeparator tp = (TaggingPresetSeparator) o;
+                tp.group = lastmenu;
+                all.add(tp);
+                lastrole = null;
+            } else if (o instanceof TaggingPreset) {
+                TaggingPreset tp = (TaggingPreset) o;
+                tp.group = lastmenu;
+                tp.setDisplayName();
+                all.add(tp);
+                lastrole = null;
+            } else {
+                if (!all.isEmpty()) {
+                    if (o instanceof TaggingPresetItems.Roles) {
+                        all.getLast().data.add((TaggingPresetItem) o);
+                        if (all.getLast().roles != null) {
+                            throw new SAXException(tr("Roles cannot appear more than once"));
+                        }
+                        all.getLast().roles = (TaggingPresetItems.Roles) o;
+                        lastrole = (TaggingPresetItems.Roles) o;
+                    } else if (o instanceof TaggingPresetItems.Role) {
+                        if (lastrole == null)
+                            throw new SAXException(tr("Preset role element without parent"));
+                        lastrole.roles.add((TaggingPresetItems.Role) o);
+                    } else if (o instanceof TaggingPresetItems.Check) {
+                        checks.add((TaggingPresetItems.Check) o);
+                    } else if (o instanceof TaggingPresetItems.PresetListEntry) {
+                        listEntries.add((TaggingPresetItems.PresetListEntry) o);
+                    } else if (o instanceof TaggingPresetItems.CheckGroup) {
+                        all.getLast().data.add((TaggingPresetItem) o);
+                        // Make sure list of checks is empty to avoid adding checks several times
+                        // when used in chunks (fix #10801)
+                        ((TaggingPresetItems.CheckGroup) o).checks.clear();
+                        ((TaggingPresetItems.CheckGroup) o).checks.addAll(checks);
+                        checks.clear();
+                    } else {
+                        if (!checks.isEmpty()) {
+                            all.getLast().data.addAll(checks);
+                            checks.clear();
+                        }
+                        all.getLast().data.add((TaggingPresetItem) o);
+                        if (o instanceof TaggingPresetItems.ComboMultiSelect) {
+                            ((TaggingPresetItems.ComboMultiSelect) o).addListEntries(listEntries);
+                        } else if (o instanceof TaggingPresetItems.Key) {
+                            if (((TaggingPresetItems.Key) o).value == null) {
+                                ((TaggingPresetItems.Key) o).value = ""; // Fix #8530
+                            }
+                        }
+                        listEntries = new LinkedList<>();
+                        lastrole = null;
+                    }
+                } else
+                    throw new SAXException(tr("Preset sub element without parent"));
+            }
+        }
+        if (!all.isEmpty() && !checks.isEmpty()) {
+            all.getLast().data.addAll(checks);
+            checks.clear();
+        }
+        return all;
+    }
+
+    /**
+     * Reads all tagging presets from the given source.
+     * @param source a given filename, URL or internal resource
+     * @param validate if {@code true}, XML validation will be performed
+     * @return collection of tagging presets
+     * @throws SAXException if any XML error occurs
+     * @throws IOException if any I/O error occurs
+     */
+    public static Collection<TaggingPreset> readAll(String source, boolean validate) throws SAXException, IOException {
+        Collection<TaggingPreset> tp;
+        CachedFile cf = new CachedFile(source).setHttpAccept(PRESET_MIME_TYPES);
+        try (
+            // zip may be null, but Java 7 allows it: https://blogs.oracle.com/darcy/entry/project_coin_null_try_with
+            InputStream zip = cf.findZipEntryInputStream("xml", "preset")
+        ) {
+            if (zip != null) {
+                zipIcons = cf.getFile();
+            }
+            try (InputStreamReader r = UTFInputStreamReader.create(zip == null ? cf.getInputStream() : zip)) {
+                tp = readAll(new BufferedReader(r), validate);
+            }
+        }
+        return tp;
+    }
+
+    /**
+     * Reads all tagging presets from the given sources.
+     * @param sources Collection of tagging presets sources.
+     * @param validate if {@code true}, presets will be validated against XML schema
+     * @return Collection of all presets successfully read
+     */
+    public static Collection<TaggingPreset> readAll(Collection<String> sources, boolean validate) {
+        return readAll(sources, validate, true);
+    }
+
+    /**
+     * Reads all tagging presets from the given sources.
+     * @param sources Collection of tagging presets sources.
+     * @param validate if {@code true}, presets will be validated against XML schema
+     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
+     * @return Collection of all presets successfully read
+     */
+    public static Collection<TaggingPreset> readAll(Collection<String> sources, boolean validate, boolean displayErrMsg) {
+        LinkedList<TaggingPreset> allPresets = new LinkedList<>();
+        for(String source : sources)  {
+            try {
+                allPresets.addAll(readAll(source, validate));
+            } catch (IOException e) {
+                Main.error(e, false);
+                Main.error(source);
+                if (source.startsWith("http")) {
+                    Main.addNetworkError(source, e);
+                }
+                if (displayErrMsg) {
+                    JOptionPane.showMessageDialog(
+                            Main.parent,
+                            tr("Could not read tagging preset source: {0}",source),
+                            tr("Error"),
+                            JOptionPane.ERROR_MESSAGE
+                            );
+                }
+            } catch (SAXException e) {
+                Main.error(e);
+                Main.error(source);
+                JOptionPane.showMessageDialog(
+                        Main.parent,
+                        "<html>" + tr("Error parsing {0}: ", source) + "<br><br><table width=600>" + e.getMessage() + "</table></html>",
+                        tr("Error"),
+                        JOptionPane.ERROR_MESSAGE
+                        );
+            }
+        }
+        return allPresets;
+    }
+
+    /**
+     * Reads all tagging presets from sources stored in preferences.
+     * @param validate if {@code true}, presets will be validated against XML schema
+     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
+     * @return Collection of all presets successfully read
+     */
+    public static Collection<TaggingPreset> readFromPreferences(boolean validate, boolean displayErrMsg) {
+        return readAll(getPresetSources(), validate, displayErrMsg);
+    }
+
+    public static File getZipIcons() {
+        return zipIcons;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
index 6b993a2..0895632 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
@@ -1,560 +1,560 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
-
-import javax.swing.AbstractAction;
-import javax.swing.AbstractListModel;
-import javax.swing.Action;
-import javax.swing.BoxLayout;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.Icon;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.ListCellRenderer;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Key;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.KeyedItem;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Role;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Roles;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
-import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
-import org.openstreetmap.josm.tools.Predicate;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * GUI component to select tagging preset: the list with filter and two checkboxes
- * @since 6068
- */
-public class TaggingPresetSelector extends JPanel implements SelectionChangedListener {
-
-    private static final int CLASSIFICATION_IN_FAVORITES = 300;
-    private static final int CLASSIFICATION_NAME_MATCH = 300;
-    private static final int CLASSIFICATION_GROUP_MATCH = 200;
-    private static final int CLASSIFICATION_TAGS_MATCH = 100;
-
-    private static final BooleanProperty SEARCH_IN_TAGS = new BooleanProperty("taggingpreset.dialog.search-in-tags", true);
-    private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
-
-    private final JosmTextField edSearchText;
-    private final JList<TaggingPreset> lsResult;
-    private final JCheckBox ckOnlyApplicable;
-    private final JCheckBox ckSearchInTags;
-    private final EnumSet<TaggingPresetType> typesInSelection = EnumSet.noneOf(TaggingPresetType.class);
-    private boolean typesInSelectionDirty = true;
-    private final PresetClassifications classifications = new PresetClassifications();
-    private final ResultListModel lsResultModel = new ResultListModel();
-
-    private final List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
-
-    private ActionListener dblClickListener;
-    private ActionListener clickListener;
-
-    private static class ResultListCellRenderer implements ListCellRenderer<TaggingPreset> {
-        final DefaultListCellRenderer def = new DefaultListCellRenderer();
-        @Override
-        public Component getListCellRendererComponent(JList<? extends TaggingPreset> list, TaggingPreset tp, int index, boolean isSelected, boolean cellHasFocus) {
-            JLabel result = (JLabel) def.getListCellRendererComponent(list, tp, index, isSelected, cellHasFocus);
-            result.setText(tp.getName());
-            result.setIcon((Icon) tp.getValue(Action.SMALL_ICON));
-            return result;
-        }
-    }
-
-    private static class ResultListModel extends AbstractListModel<TaggingPreset> {
-
-        private List<PresetClassification> presets = new ArrayList<>();
-
-        public synchronized void setPresets(List<PresetClassification> presets) {
-            this.presets = presets;
-            fireContentsChanged(this, 0, Integer.MAX_VALUE);
-        }
-
-        @Override
-        public synchronized TaggingPreset getElementAt(int index) {
-            return presets.get(index).preset;
-        }
-
-        @Override
-        public synchronized int getSize() {
-            return presets.size();
-        }
-
-        public synchronized boolean isEmpty() {
-            return presets.isEmpty();
-        }
-    }
-
-    /**
-     * Computes the match ration of a {@link TaggingPreset} wrt. a searchString.
-     */
-    static class PresetClassification implements Comparable<PresetClassification> {
-        public final TaggingPreset preset;
-        public int classification;
-        public int favoriteIndex;
-        private final Collection<String> groups = new HashSet<>();
-        private final Collection<String> names = new HashSet<>();
-        private final Collection<String> tags = new HashSet<>();
-
-        PresetClassification(TaggingPreset preset) {
-            this.preset = preset;
-            TaggingPreset group = preset.group;
-            while (group != null) {
-                Collections.addAll(groups, group.getLocaleName().toLowerCase().split("\\s"));
-                group = group.group;
-            }
-            Collections.addAll(names, preset.getLocaleName().toLowerCase().split("\\s"));
-            for (TaggingPresetItem item: preset.data) {
-                if (item instanceof KeyedItem) {
-                    tags.add(((KeyedItem) item).key);
-                    if (item instanceof TaggingPresetItems.ComboMultiSelect) {
-                        final TaggingPresetItems.ComboMultiSelect cms = (TaggingPresetItems.ComboMultiSelect) item;
-                        if (Boolean.parseBoolean(cms.values_searchable)) {
-                            tags.addAll(cms.getDisplayValues());
-                        }
-                    }
-                    if (item instanceof Key && ((Key) item).value != null) {
-                        tags.add(((Key) item).value);
-                    }
-                } else if (item instanceof Roles) {
-                    for (Role role : ((Roles) item).roles) {
-                        tags.add(role.key);
-                    }
-                }
-            }
-        }
-
-        private int isMatching(Collection<String> values, String[] searchString) {
-            int sum = 0;
-            for (String word: searchString) {
-                boolean found = false;
-                boolean foundFirst = false;
-                for (String value: values) {
-                    int index = value.toLowerCase().indexOf(word);
-                    if (index == 0) {
-                        foundFirst = true;
-                        break;
-                    } else if (index > 0) {
-                        found = true;
-                    }
-                }
-                if (foundFirst) {
-                    sum += 2;
-                } else if (found) {
-                    sum += 1;
-                } else
-                    return 0;
-            }
-            return sum;
-        }
-
-        int isMatchingGroup(String[] words) {
-            return isMatching(groups, words);
-        }
-
-        int isMatchingName(String[] words) {
-            return isMatching(names, words);
-        }
-
-        int isMatchingTags(String[] words) {
-            return isMatching(tags, words);
-        }
-
-        @Override
-        public int compareTo(PresetClassification o) {
-            int result = o.classification - classification;
-            if (result == 0)
-                return preset.getName().compareTo(o.preset.getName());
-            else
-                return result;
-        }
-
-        @Override
-        public String toString() {
-            return classification + " " + preset.toString();
-        }
-    }
-
-    /**
-     * Constructs a new {@code TaggingPresetSelector}.
-     */
-    public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) {
-        super(new BorderLayout());
-        classifications.loadPresets(TaggingPresets.getTaggingPresets());
-
-        edSearchText = new JosmTextField();
-        edSearchText.getDocument().addDocumentListener(new DocumentListener() {
-            @Override public void removeUpdate(DocumentEvent e) { filterPresets(); }
-            @Override public void insertUpdate(DocumentEvent e) { filterPresets(); }
-            @Override public void changedUpdate(DocumentEvent e) { filterPresets(); }
-        });
-        edSearchText.addKeyListener(new KeyAdapter() {
-            @Override
-            public void keyPressed(KeyEvent e) {
-                switch (e.getKeyCode()) {
-                case KeyEvent.VK_DOWN:
-                    selectPreset(lsResult.getSelectedIndex() + 1);
-                    break;
-                case KeyEvent.VK_UP:
-                    selectPreset(lsResult.getSelectedIndex() - 1);
-                    break;
-                case KeyEvent.VK_PAGE_DOWN:
-                    selectPreset(lsResult.getSelectedIndex() + 10);
-                    break;
-                case KeyEvent.VK_PAGE_UP:
-                    selectPreset(lsResult.getSelectedIndex() - 10);
-                    break;
-                case KeyEvent.VK_HOME:
-                    selectPreset(0);
-                    break;
-                case KeyEvent.VK_END:
-                    selectPreset(lsResultModel.getSize());
-                    break;
-                }
-            }
-        });
-        add(edSearchText, BorderLayout.NORTH);
-
-        lsResult = new JList<>(lsResultModel);
-        lsResult.setCellRenderer(new ResultListCellRenderer());
-        lsResult.addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseClicked(MouseEvent e) {
-                if (e.getClickCount()>1) {
-                    if (dblClickListener!=null)
-                        dblClickListener.actionPerformed(null);
-                } else {
-                    if (clickListener!=null)
-                        clickListener.actionPerformed(null);
-                }
-            }
-        });
-        add(new JScrollPane(lsResult), BorderLayout.CENTER);
-
-        JPanel pnChecks = new JPanel();
-        pnChecks.setLayout(new BoxLayout(pnChecks, BoxLayout.Y_AXIS));
-
-        if (displayOnlyApplicable) {
-            ckOnlyApplicable = new JCheckBox();
-            ckOnlyApplicable.setText(tr("Show only applicable to selection"));
-            pnChecks.add(ckOnlyApplicable);
-            ckOnlyApplicable.addItemListener(new ItemListener() {
-                @Override
-                public void itemStateChanged(ItemEvent e) {
-                    filterPresets();
-                }
-            });
-        } else {
-            ckOnlyApplicable = null;
-        }
-
-        if (displaySearchInTags) {
-            ckSearchInTags = new JCheckBox();
-            ckSearchInTags.setText(tr("Search in tags"));
-            ckSearchInTags.setSelected(SEARCH_IN_TAGS.get());
-            ckSearchInTags.addItemListener(new ItemListener() {
-                @Override
-                public void itemStateChanged(ItemEvent e) {
-                    filterPresets();
-                }
-            });
-            pnChecks.add(ckSearchInTags);
-        } else {
-            ckSearchInTags = null;
-        }
-
-        add(pnChecks, BorderLayout.SOUTH);
-
-        setPreferredSize(new Dimension(400, 300));
-        filterPresets();
-        JPopupMenu popupMenu = new JPopupMenu();
-        popupMenu.add(new AbstractAction(tr("Add toolbar button")) {
-            @Override
-            public void actionPerformed(ActionEvent ae) {
-                String res = getSelectedPreset().getToolbarString();
-                Main.toolbar.addCustomButton(res, -1, false);
-            }
-        });
-        lsResult.addMouseListener(new PopupMenuLauncher(popupMenu));
-    }
-
-    private synchronized void selectPreset(int newIndex) {
-        if (newIndex < 0) {
-            newIndex = 0;
-        }
-        if (newIndex > lsResultModel.getSize() - 1) {
-            newIndex = lsResultModel.getSize() - 1;
-        }
-        lsResult.setSelectedIndex(newIndex);
-        lsResult.ensureIndexIsVisible(newIndex);
-    }
-
-    /**
-     * Search expression can be in form: "group1/group2/name" where names can contain multiple words
-     */
-    private synchronized void filterPresets() {
-        //TODO Save favorites to file
-        String text = edSearchText.getText().toLowerCase();
-        boolean onlyApplicable = ckOnlyApplicable != null && ckOnlyApplicable.isSelected();
-        boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
-
-        DataSet ds = Main.main.getCurrentDataSet();
-        Collection<OsmPrimitive> selected = (ds==null)? Collections.<OsmPrimitive>emptyList() : ds.getSelected();
-        final List<PresetClassification> result = classifications.getMatchingPresets(
-                text, onlyApplicable, inTags, getTypesInSelection(), selected);
-
-        TaggingPreset oldPreset = getSelectedPreset();
-        lsResultModel.setPresets(result);
-        TaggingPreset newPreset = getSelectedPreset();
-        if (!Objects.equals(oldPreset, newPreset)) {
-            int[] indices = lsResult.getSelectedIndices();
-            for (ListSelectionListener listener : listSelectionListeners) {
-                listener.valueChanged(new ListSelectionEvent(lsResult, lsResult.getSelectedIndex(),
-                        indices.length > 0 ? indices[indices.length-1] : -1, false));
-            }
-        }
-    }
-
-    /**
-     * A collection of {@link PresetClassification}s with the functionality of filtering wrt. searchString.
-     */
-    static class PresetClassifications implements Iterable<PresetClassification> {
-
-        private final List<PresetClassification> classifications = new ArrayList<>();
-
-        public List<PresetClassification> getMatchingPresets(String searchText, boolean onlyApplicable, boolean inTags, EnumSet<TaggingPresetType> presetTypes, final Collection<? extends OsmPrimitive> selectedPrimitives) {
-            final String[] groupWords;
-            final String[] nameWords;
-
-            if (searchText.contains("/")) {
-                groupWords = searchText.substring(0, searchText.lastIndexOf('/')).split("[\\s/]");
-                nameWords = searchText.substring(searchText.indexOf('/') + 1).split("\\s");
-            } else {
-                groupWords = null;
-                nameWords = searchText.split("\\s");
-            }
-
-            return getMatchingPresets(groupWords, nameWords, onlyApplicable, inTags, presetTypes, selectedPrimitives);
-        }
-
-        public List<PresetClassification> getMatchingPresets(String[] groupWords, String[] nameWords, boolean onlyApplicable, boolean inTags, EnumSet<TaggingPresetType> presetTypes, final Collection<? extends OsmPrimitive> selectedPrimitives) {
-
-            final List<PresetClassification> result = new ArrayList<>();
-            for (PresetClassification presetClassification : classifications) {
-                TaggingPreset preset = presetClassification.preset;
-                presetClassification.classification = 0;
-
-                if (onlyApplicable) {
-                    boolean suitable = preset.typeMatches(presetTypes);
-
-                    if (!suitable && preset.types.contains(TaggingPresetType.RELATION) && preset.roles != null && !preset.roles.roles.isEmpty()) {
-                        final Predicate<Role> memberExpressionMatchesOnePrimitive = new Predicate<Role>() {
-
-                            @Override
-                            public boolean evaluate(Role object) {
-                                return object.memberExpression != null
-                                        && Utils.exists(selectedPrimitives, object.memberExpression);
-                            }
-                        };
-                        suitable = Utils.exists(preset.roles.roles, memberExpressionMatchesOnePrimitive);
-                        // keep the preset to allow the creation of new relations
-                    }
-                    if (!suitable) {
-                        continue;
-                    }
-                }
-
-                if (groupWords != null && presetClassification.isMatchingGroup(groupWords) == 0) {
-                    continue;
-                }
-
-                int matchName = presetClassification.isMatchingName(nameWords);
-
-                if (matchName == 0) {
-                    if (groupWords == null) {
-                        int groupMatch = presetClassification.isMatchingGroup(nameWords);
-                        if (groupMatch > 0) {
-                            presetClassification.classification = CLASSIFICATION_GROUP_MATCH + groupMatch;
-                        }
-                    }
-                    if (presetClassification.classification == 0 && inTags) {
-                        int tagsMatch = presetClassification.isMatchingTags(nameWords);
-                        if (tagsMatch > 0) {
-                            presetClassification.classification = CLASSIFICATION_TAGS_MATCH + tagsMatch;
-                        }
-                    }
-                } else {
-                    presetClassification.classification = CLASSIFICATION_NAME_MATCH + matchName;
-                }
-
-                if (presetClassification.classification > 0) {
-                    presetClassification.classification += presetClassification.favoriteIndex;
-                    result.add(presetClassification);
-                }
-            }
-
-            Collections.sort(result);
-            return result;
-
-        }
-
-        public void clear() {
-            classifications.clear();
-        }
-
-        public void loadPresets(Collection<TaggingPreset> presets) {
-            for (TaggingPreset preset : presets) {
-                if (preset instanceof TaggingPresetSeparator || preset instanceof TaggingPresetMenu) {
-                    continue;
-                }
-                classifications.add(new PresetClassification(preset));
-            }
-        }
-
-        @Override
-        public Iterator<PresetClassification> iterator() {
-            return classifications.iterator();
-        }
-    }
-
-    private EnumSet<TaggingPresetType> getTypesInSelection() {
-        if (typesInSelectionDirty) {
-            synchronized (typesInSelection) {
-                typesInSelectionDirty = false;
-                typesInSelection.clear();
-                if (Main.main==null || Main.main.getCurrentDataSet() == null) return typesInSelection;
-                for (OsmPrimitive primitive : Main.main.getCurrentDataSet().getSelected()) {
-                    typesInSelection.add(TaggingPresetType.forPrimitive(primitive));
-                }
-            }
-        }
-        return typesInSelection;
-    }
-
-    @Override
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        typesInSelectionDirty = true;
-    }
-
-    public synchronized void init() {
-        if (ckOnlyApplicable != null) {
-            ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
-            ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
-        }
-        listSelectionListeners.clear();
-        edSearchText.setText("");
-        filterPresets();
-    }
-
-    public void init(Collection<TaggingPreset> presets) {
-        classifications.clear();
-        classifications.loadPresets(presets);
-        init();
-    }
-
-    public synchronized void clearSelection() {
-        lsResult.getSelectionModel().clearSelection();
-    }
-
-    /**
-     * Save checkbox values in preferences for future reuse
-     */
-    public void savePreferences() {
-        if (ckSearchInTags != null) {
-            SEARCH_IN_TAGS.put(ckSearchInTags.isSelected());
-        }
-        if (ckOnlyApplicable != null && ckOnlyApplicable.isEnabled()) {
-            ONLY_APPLICABLE.put(ckOnlyApplicable.isSelected());
-        }
-    }
-
-    /**
-     * Determines, which preset is selected at the current moment
-     * @return selected preset (as action)
-     */
-    public synchronized TaggingPreset getSelectedPreset() {
-        if (lsResultModel.isEmpty()) return null;
-        int idx = lsResult.getSelectedIndex();
-        if (idx < 0 || idx >= lsResultModel.getSize()) {
-            idx = 0;
-        }
-        TaggingPreset preset = lsResultModel.getElementAt(idx);
-        for (PresetClassification pc: classifications) {
-            if (pc.preset == preset) {
-                pc.favoriteIndex = CLASSIFICATION_IN_FAVORITES;
-            } else if (pc.favoriteIndex > 0) {
-                pc.favoriteIndex--;
-            }
-        }
-        return preset;
-    }
-
-    public synchronized void setSelectedPreset(TaggingPreset p) {
-        lsResult.setSelectedValue(p, true);
-    }
-
-    public synchronized int getItemCount() {
-        return lsResultModel.getSize();
-    }
-
-    public void setDblClickListener(ActionListener dblClickListener) {
-        this.dblClickListener = dblClickListener;
-    }
-
-    public void setClickListener(ActionListener clickListener) {
-        this.clickListener = clickListener;
-    }
-
-    /**
-     * Adds a selection listener to the presets list.
-     * @param selectListener The list selection listener
-     * @since 7412
-     */
-    public synchronized void addSelectionListener(ListSelectionListener selectListener) {
-        lsResult.getSelectionModel().addListSelectionListener(selectListener);
-        listSelectionListeners.add(selectListener);
-    }
-
-    /**
-     * Removes a selection listener from the presets list.
-     * @param selectListener The list selection listener
-     * @since 7412
-     */
-    public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
-        listSelectionListeners.remove(selectListener);
-        lsResult.getSelectionModel().removeListSelectionListener(selectListener);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import javax.swing.AbstractAction;
+import javax.swing.AbstractListModel;
+import javax.swing.Action;
+import javax.swing.BoxLayout;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.Icon;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Key;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.KeyedItem;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Role;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Roles;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * GUI component to select tagging preset: the list with filter and two checkboxes
+ * @since 6068
+ */
+public class TaggingPresetSelector extends JPanel implements SelectionChangedListener {
+
+    private static final int CLASSIFICATION_IN_FAVORITES = 300;
+    private static final int CLASSIFICATION_NAME_MATCH = 300;
+    private static final int CLASSIFICATION_GROUP_MATCH = 200;
+    private static final int CLASSIFICATION_TAGS_MATCH = 100;
+
+    private static final BooleanProperty SEARCH_IN_TAGS = new BooleanProperty("taggingpreset.dialog.search-in-tags", true);
+    private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
+
+    private final JosmTextField edSearchText;
+    private final JList<TaggingPreset> lsResult;
+    private final JCheckBox ckOnlyApplicable;
+    private final JCheckBox ckSearchInTags;
+    private final EnumSet<TaggingPresetType> typesInSelection = EnumSet.noneOf(TaggingPresetType.class);
+    private boolean typesInSelectionDirty = true;
+    private final PresetClassifications classifications = new PresetClassifications();
+    private final ResultListModel lsResultModel = new ResultListModel();
+
+    private final List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
+
+    private ActionListener dblClickListener;
+    private ActionListener clickListener;
+
+    private static class ResultListCellRenderer implements ListCellRenderer<TaggingPreset> {
+        final DefaultListCellRenderer def = new DefaultListCellRenderer();
+        @Override
+        public Component getListCellRendererComponent(JList<? extends TaggingPreset> list, TaggingPreset tp, int index, boolean isSelected, boolean cellHasFocus) {
+            JLabel result = (JLabel) def.getListCellRendererComponent(list, tp, index, isSelected, cellHasFocus);
+            result.setText(tp.getName());
+            result.setIcon((Icon) tp.getValue(Action.SMALL_ICON));
+            return result;
+        }
+    }
+
+    private static class ResultListModel extends AbstractListModel<TaggingPreset> {
+
+        private List<PresetClassification> presets = new ArrayList<>();
+
+        public synchronized void setPresets(List<PresetClassification> presets) {
+            this.presets = presets;
+            fireContentsChanged(this, 0, Integer.MAX_VALUE);
+        }
+
+        @Override
+        public synchronized TaggingPreset getElementAt(int index) {
+            return presets.get(index).preset;
+        }
+
+        @Override
+        public synchronized int getSize() {
+            return presets.size();
+        }
+
+        public synchronized boolean isEmpty() {
+            return presets.isEmpty();
+        }
+    }
+
+    /**
+     * Computes the match ration of a {@link TaggingPreset} wrt. a searchString.
+     */
+    static class PresetClassification implements Comparable<PresetClassification> {
+        public final TaggingPreset preset;
+        public int classification;
+        public int favoriteIndex;
+        private final Collection<String> groups = new HashSet<>();
+        private final Collection<String> names = new HashSet<>();
+        private final Collection<String> tags = new HashSet<>();
+
+        PresetClassification(TaggingPreset preset) {
+            this.preset = preset;
+            TaggingPreset group = preset.group;
+            while (group != null) {
+                Collections.addAll(groups, group.getLocaleName().toLowerCase().split("\\s"));
+                group = group.group;
+            }
+            Collections.addAll(names, preset.getLocaleName().toLowerCase().split("\\s"));
+            for (TaggingPresetItem item: preset.data) {
+                if (item instanceof KeyedItem) {
+                    tags.add(((KeyedItem) item).key);
+                    if (item instanceof TaggingPresetItems.ComboMultiSelect) {
+                        final TaggingPresetItems.ComboMultiSelect cms = (TaggingPresetItems.ComboMultiSelect) item;
+                        if (Boolean.parseBoolean(cms.values_searchable)) {
+                            tags.addAll(cms.getDisplayValues());
+                        }
+                    }
+                    if (item instanceof Key && ((Key) item).value != null) {
+                        tags.add(((Key) item).value);
+                    }
+                } else if (item instanceof Roles) {
+                    for (Role role : ((Roles) item).roles) {
+                        tags.add(role.key);
+                    }
+                }
+            }
+        }
+
+        private int isMatching(Collection<String> values, String[] searchString) {
+            int sum = 0;
+            for (String word: searchString) {
+                boolean found = false;
+                boolean foundFirst = false;
+                for (String value: values) {
+                    int index = value.toLowerCase().indexOf(word);
+                    if (index == 0) {
+                        foundFirst = true;
+                        break;
+                    } else if (index > 0) {
+                        found = true;
+                    }
+                }
+                if (foundFirst) {
+                    sum += 2;
+                } else if (found) {
+                    sum += 1;
+                } else
+                    return 0;
+            }
+            return sum;
+        }
+
+        int isMatchingGroup(String[] words) {
+            return isMatching(groups, words);
+        }
+
+        int isMatchingName(String[] words) {
+            return isMatching(names, words);
+        }
+
+        int isMatchingTags(String[] words) {
+            return isMatching(tags, words);
+        }
+
+        @Override
+        public int compareTo(PresetClassification o) {
+            int result = o.classification - classification;
+            if (result == 0)
+                return preset.getName().compareTo(o.preset.getName());
+            else
+                return result;
+        }
+
+        @Override
+        public String toString() {
+            return classification + " " + preset.toString();
+        }
+    }
+
+    /**
+     * Constructs a new {@code TaggingPresetSelector}.
+     */
+    public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) {
+        super(new BorderLayout());
+        classifications.loadPresets(TaggingPresets.getTaggingPresets());
+
+        edSearchText = new JosmTextField();
+        edSearchText.getDocument().addDocumentListener(new DocumentListener() {
+            @Override public void removeUpdate(DocumentEvent e) { filterPresets(); }
+            @Override public void insertUpdate(DocumentEvent e) { filterPresets(); }
+            @Override public void changedUpdate(DocumentEvent e) { filterPresets(); }
+        });
+        edSearchText.addKeyListener(new KeyAdapter() {
+            @Override
+            public void keyPressed(KeyEvent e) {
+                switch (e.getKeyCode()) {
+                case KeyEvent.VK_DOWN:
+                    selectPreset(lsResult.getSelectedIndex() + 1);
+                    break;
+                case KeyEvent.VK_UP:
+                    selectPreset(lsResult.getSelectedIndex() - 1);
+                    break;
+                case KeyEvent.VK_PAGE_DOWN:
+                    selectPreset(lsResult.getSelectedIndex() + 10);
+                    break;
+                case KeyEvent.VK_PAGE_UP:
+                    selectPreset(lsResult.getSelectedIndex() - 10);
+                    break;
+                case KeyEvent.VK_HOME:
+                    selectPreset(0);
+                    break;
+                case KeyEvent.VK_END:
+                    selectPreset(lsResultModel.getSize());
+                    break;
+                }
+            }
+        });
+        add(edSearchText, BorderLayout.NORTH);
+
+        lsResult = new JList<>(lsResultModel);
+        lsResult.setCellRenderer(new ResultListCellRenderer());
+        lsResult.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                if (e.getClickCount()>1) {
+                    if (dblClickListener!=null)
+                        dblClickListener.actionPerformed(null);
+                } else {
+                    if (clickListener!=null)
+                        clickListener.actionPerformed(null);
+                }
+            }
+        });
+        add(new JScrollPane(lsResult), BorderLayout.CENTER);
+
+        JPanel pnChecks = new JPanel();
+        pnChecks.setLayout(new BoxLayout(pnChecks, BoxLayout.Y_AXIS));
+
+        if (displayOnlyApplicable) {
+            ckOnlyApplicable = new JCheckBox();
+            ckOnlyApplicable.setText(tr("Show only applicable to selection"));
+            pnChecks.add(ckOnlyApplicable);
+            ckOnlyApplicable.addItemListener(new ItemListener() {
+                @Override
+                public void itemStateChanged(ItemEvent e) {
+                    filterPresets();
+                }
+            });
+        } else {
+            ckOnlyApplicable = null;
+        }
+
+        if (displaySearchInTags) {
+            ckSearchInTags = new JCheckBox();
+            ckSearchInTags.setText(tr("Search in tags"));
+            ckSearchInTags.setSelected(SEARCH_IN_TAGS.get());
+            ckSearchInTags.addItemListener(new ItemListener() {
+                @Override
+                public void itemStateChanged(ItemEvent e) {
+                    filterPresets();
+                }
+            });
+            pnChecks.add(ckSearchInTags);
+        } else {
+            ckSearchInTags = null;
+        }
+
+        add(pnChecks, BorderLayout.SOUTH);
+
+        setPreferredSize(new Dimension(400, 300));
+        filterPresets();
+        JPopupMenu popupMenu = new JPopupMenu();
+        popupMenu.add(new AbstractAction(tr("Add toolbar button")) {
+            @Override
+            public void actionPerformed(ActionEvent ae) {
+                String res = getSelectedPreset().getToolbarString();
+                Main.toolbar.addCustomButton(res, -1, false);
+            }
+        });
+        lsResult.addMouseListener(new PopupMenuLauncher(popupMenu));
+    }
+
+    private synchronized void selectPreset(int newIndex) {
+        if (newIndex < 0) {
+            newIndex = 0;
+        }
+        if (newIndex > lsResultModel.getSize() - 1) {
+            newIndex = lsResultModel.getSize() - 1;
+        }
+        lsResult.setSelectedIndex(newIndex);
+        lsResult.ensureIndexIsVisible(newIndex);
+    }
+
+    /**
+     * Search expression can be in form: "group1/group2/name" where names can contain multiple words
+     */
+    private synchronized void filterPresets() {
+        //TODO Save favorites to file
+        String text = edSearchText.getText().toLowerCase();
+        boolean onlyApplicable = ckOnlyApplicable != null && ckOnlyApplicable.isSelected();
+        boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
+
+        DataSet ds = Main.main.getCurrentDataSet();
+        Collection<OsmPrimitive> selected = (ds==null)? Collections.<OsmPrimitive>emptyList() : ds.getSelected();
+        final List<PresetClassification> result = classifications.getMatchingPresets(
+                text, onlyApplicable, inTags, getTypesInSelection(), selected);
+
+        TaggingPreset oldPreset = getSelectedPreset();
+        lsResultModel.setPresets(result);
+        TaggingPreset newPreset = getSelectedPreset();
+        if (!Objects.equals(oldPreset, newPreset)) {
+            int[] indices = lsResult.getSelectedIndices();
+            for (ListSelectionListener listener : listSelectionListeners) {
+                listener.valueChanged(new ListSelectionEvent(lsResult, lsResult.getSelectedIndex(),
+                        indices.length > 0 ? indices[indices.length-1] : -1, false));
+            }
+        }
+    }
+
+    /**
+     * A collection of {@link PresetClassification}s with the functionality of filtering wrt. searchString.
+     */
+    static class PresetClassifications implements Iterable<PresetClassification> {
+
+        private final List<PresetClassification> classifications = new ArrayList<>();
+
+        public List<PresetClassification> getMatchingPresets(String searchText, boolean onlyApplicable, boolean inTags, EnumSet<TaggingPresetType> presetTypes, final Collection<? extends OsmPrimitive> selectedPrimitives) {
+            final String[] groupWords;
+            final String[] nameWords;
+
+            if (searchText.contains("/")) {
+                groupWords = searchText.substring(0, searchText.lastIndexOf('/')).split("[\\s/]");
+                nameWords = searchText.substring(searchText.indexOf('/') + 1).split("\\s");
+            } else {
+                groupWords = null;
+                nameWords = searchText.split("\\s");
+            }
+
+            return getMatchingPresets(groupWords, nameWords, onlyApplicable, inTags, presetTypes, selectedPrimitives);
+        }
+
+        public List<PresetClassification> getMatchingPresets(String[] groupWords, String[] nameWords, boolean onlyApplicable, boolean inTags, EnumSet<TaggingPresetType> presetTypes, final Collection<? extends OsmPrimitive> selectedPrimitives) {
+
+            final List<PresetClassification> result = new ArrayList<>();
+            for (PresetClassification presetClassification : classifications) {
+                TaggingPreset preset = presetClassification.preset;
+                presetClassification.classification = 0;
+
+                if (onlyApplicable) {
+                    boolean suitable = preset.typeMatches(presetTypes);
+
+                    if (!suitable && preset.types.contains(TaggingPresetType.RELATION) && preset.roles != null && !preset.roles.roles.isEmpty()) {
+                        final Predicate<Role> memberExpressionMatchesOnePrimitive = new Predicate<Role>() {
+
+                            @Override
+                            public boolean evaluate(Role object) {
+                                return object.memberExpression != null
+                                        && Utils.exists(selectedPrimitives, object.memberExpression);
+                            }
+                        };
+                        suitable = Utils.exists(preset.roles.roles, memberExpressionMatchesOnePrimitive);
+                        // keep the preset to allow the creation of new relations
+                    }
+                    if (!suitable) {
+                        continue;
+                    }
+                }
+
+                if (groupWords != null && presetClassification.isMatchingGroup(groupWords) == 0) {
+                    continue;
+                }
+
+                int matchName = presetClassification.isMatchingName(nameWords);
+
+                if (matchName == 0) {
+                    if (groupWords == null) {
+                        int groupMatch = presetClassification.isMatchingGroup(nameWords);
+                        if (groupMatch > 0) {
+                            presetClassification.classification = CLASSIFICATION_GROUP_MATCH + groupMatch;
+                        }
+                    }
+                    if (presetClassification.classification == 0 && inTags) {
+                        int tagsMatch = presetClassification.isMatchingTags(nameWords);
+                        if (tagsMatch > 0) {
+                            presetClassification.classification = CLASSIFICATION_TAGS_MATCH + tagsMatch;
+                        }
+                    }
+                } else {
+                    presetClassification.classification = CLASSIFICATION_NAME_MATCH + matchName;
+                }
+
+                if (presetClassification.classification > 0) {
+                    presetClassification.classification += presetClassification.favoriteIndex;
+                    result.add(presetClassification);
+                }
+            }
+
+            Collections.sort(result);
+            return result;
+
+        }
+
+        public void clear() {
+            classifications.clear();
+        }
+
+        public void loadPresets(Collection<TaggingPreset> presets) {
+            for (TaggingPreset preset : presets) {
+                if (preset instanceof TaggingPresetSeparator || preset instanceof TaggingPresetMenu) {
+                    continue;
+                }
+                classifications.add(new PresetClassification(preset));
+            }
+        }
+
+        @Override
+        public Iterator<PresetClassification> iterator() {
+            return classifications.iterator();
+        }
+    }
+
+    private EnumSet<TaggingPresetType> getTypesInSelection() {
+        if (typesInSelectionDirty) {
+            synchronized (typesInSelection) {
+                typesInSelectionDirty = false;
+                typesInSelection.clear();
+                if (Main.main==null || Main.main.getCurrentDataSet() == null) return typesInSelection;
+                for (OsmPrimitive primitive : Main.main.getCurrentDataSet().getSelected()) {
+                    typesInSelection.add(TaggingPresetType.forPrimitive(primitive));
+                }
+            }
+        }
+        return typesInSelection;
+    }
+
+    @Override
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        typesInSelectionDirty = true;
+    }
+
+    public synchronized void init() {
+        if (ckOnlyApplicable != null) {
+            ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
+            ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
+        }
+        listSelectionListeners.clear();
+        edSearchText.setText("");
+        filterPresets();
+    }
+
+    public void init(Collection<TaggingPreset> presets) {
+        classifications.clear();
+        classifications.loadPresets(presets);
+        init();
+    }
+
+    public synchronized void clearSelection() {
+        lsResult.getSelectionModel().clearSelection();
+    }
+
+    /**
+     * Save checkbox values in preferences for future reuse
+     */
+    public void savePreferences() {
+        if (ckSearchInTags != null) {
+            SEARCH_IN_TAGS.put(ckSearchInTags.isSelected());
+        }
+        if (ckOnlyApplicable != null && ckOnlyApplicable.isEnabled()) {
+            ONLY_APPLICABLE.put(ckOnlyApplicable.isSelected());
+        }
+    }
+
+    /**
+     * Determines, which preset is selected at the current moment
+     * @return selected preset (as action)
+     */
+    public synchronized TaggingPreset getSelectedPreset() {
+        if (lsResultModel.isEmpty()) return null;
+        int idx = lsResult.getSelectedIndex();
+        if (idx < 0 || idx >= lsResultModel.getSize()) {
+            idx = 0;
+        }
+        TaggingPreset preset = lsResultModel.getElementAt(idx);
+        for (PresetClassification pc: classifications) {
+            if (pc.preset == preset) {
+                pc.favoriteIndex = CLASSIFICATION_IN_FAVORITES;
+            } else if (pc.favoriteIndex > 0) {
+                pc.favoriteIndex--;
+            }
+        }
+        return preset;
+    }
+
+    public synchronized void setSelectedPreset(TaggingPreset p) {
+        lsResult.setSelectedValue(p, true);
+    }
+
+    public synchronized int getItemCount() {
+        return lsResultModel.getSize();
+    }
+
+    public void setDblClickListener(ActionListener dblClickListener) {
+        this.dblClickListener = dblClickListener;
+    }
+
+    public void setClickListener(ActionListener clickListener) {
+        this.clickListener = clickListener;
+    }
+
+    /**
+     * Adds a selection listener to the presets list.
+     * @param selectListener The list selection listener
+     * @since 7412
+     */
+    public synchronized void addSelectionListener(ListSelectionListener selectListener) {
+        lsResult.getSelectionModel().addListSelectionListener(selectListener);
+        listSelectionListeners.add(selectListener);
+    }
+
+    /**
+     * Removes a selection listener from the presets list.
+     * @param selectListener The list selection listener
+     * @since 7412
+     */
+    public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
+        listSelectionListeners.remove(selectListener);
+        lsResult.getSelectionModel().removeListSelectionListener(selectListener);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java
index 00174fc..bfb149f 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java
@@ -1,117 +1,117 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JSeparator;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
-
-/**
- * Class holding Tagging Presets and allowing to manage them.
- * @since 7100
- */
-public final class TaggingPresets {
-
-    /** The collection of tagging presets */
-    private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>();
-
-    /** The collection of listeners */
-    private static final Collection<TaggingPresetListener> listeners = new ArrayList<>();
-
-    private TaggingPresets() {
-        // Hide constructor for utility classes
-    }
-
-    /**
-     * Initializes tagging presets from preferences.
-     */
-    public static void readFromPreferences() {
-        taggingPresets.clear();
-        taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
-    }
-
-    /**
-     * Initialize the tagging presets (load and may display error)
-     */
-    public static void initialize() {
-        readFromPreferences();
-        for (TaggingPreset tp: taggingPresets) {
-            if (!(tp instanceof TaggingPresetSeparator)) {
-                Main.toolbar.register(tp);
-            }
-        }
-        if (taggingPresets.isEmpty()) {
-            Main.main.menu.presetsMenu.setVisible(false);
-        } else {
-            AutoCompletionManager.cachePresets(taggingPresets);
-            HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<>();
-            for (final TaggingPreset p : taggingPresets) {
-                JMenu m = p.group != null ? submenus.get(p.group) : Main.main.menu.presetsMenu;
-                if (p instanceof TaggingPresetSeparator) {
-                    m.add(new JSeparator());
-                } else if (p instanceof TaggingPresetMenu) {
-                    JMenu submenu = new JMenu(p);
-                    submenu.setText(p.getLocaleName());
-                    ((TaggingPresetMenu)p).menu = submenu;
-                    submenus.put((TaggingPresetMenu)p, submenu);
-                    m.add(submenu);
-                } else {
-                    JMenuItem mi = new JMenuItem(p);
-                    mi.setText(p.getLocaleName());
-                    m.add(mi);
-                }
-            }
-        }
-        if (Main.pref.getBoolean("taggingpreset.sortmenu")) {
-            TaggingPresetMenu.sortMenu(Main.main.menu.presetsMenu);
-        }
-    }
-
-    /**
-     * Replies a new collection containing all tagging presets.
-     * @return a new collection containing all tagging presets. Empty if presets are not initialized (never null)
-     */
-    public static Collection<TaggingPreset> getTaggingPresets() {
-        return new ArrayList<>(taggingPresets);
-    }
-
-    /**
-     * Adds a list of tagging presets to the current list.
-     * @param presets The tagging presets to add
-     */
-    public static void addTaggingPresets(Collection<TaggingPreset> presets) {
-        if (presets != null) {
-            if (taggingPresets.addAll(presets)) {
-                for (TaggingPresetListener listener : listeners) {
-                    listener.taggingPresetsModified();
-                }
-            }
-        }
-    }
-
-    /**
-     * Adds a tagging preset listener.
-     * @param listener The listener to add
-     */
-    public static void addListener(TaggingPresetListener listener) {
-        if (listener != null) {
-            listeners.add(listener);
-        }
-    }
-
-    /**
-     * Removes a tagging preset listener.
-     * @param listener The listener to remove
-     */
-    public static void removeListener(TaggingPresetListener listener) {
-        if (listener != null) {
-            listeners.remove(listener);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JSeparator;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+
+/**
+ * Class holding Tagging Presets and allowing to manage them.
+ * @since 7100
+ */
+public final class TaggingPresets {
+
+    /** The collection of tagging presets */
+    private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>();
+
+    /** The collection of listeners */
+    private static final Collection<TaggingPresetListener> listeners = new ArrayList<>();
+
+    private TaggingPresets() {
+        // Hide constructor for utility classes
+    }
+
+    /**
+     * Initializes tagging presets from preferences.
+     */
+    public static void readFromPreferences() {
+        taggingPresets.clear();
+        taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
+    }
+
+    /**
+     * Initialize the tagging presets (load and may display error)
+     */
+    public static void initialize() {
+        readFromPreferences();
+        for (TaggingPreset tp: taggingPresets) {
+            if (!(tp instanceof TaggingPresetSeparator)) {
+                Main.toolbar.register(tp);
+            }
+        }
+        if (taggingPresets.isEmpty()) {
+            Main.main.menu.presetsMenu.setVisible(false);
+        } else {
+            AutoCompletionManager.cachePresets(taggingPresets);
+            HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<>();
+            for (final TaggingPreset p : taggingPresets) {
+                JMenu m = p.group != null ? submenus.get(p.group) : Main.main.menu.presetsMenu;
+                if (p instanceof TaggingPresetSeparator) {
+                    m.add(new JSeparator());
+                } else if (p instanceof TaggingPresetMenu) {
+                    JMenu submenu = new JMenu(p);
+                    submenu.setText(p.getLocaleName());
+                    ((TaggingPresetMenu)p).menu = submenu;
+                    submenus.put((TaggingPresetMenu)p, submenu);
+                    m.add(submenu);
+                } else {
+                    JMenuItem mi = new JMenuItem(p);
+                    mi.setText(p.getLocaleName());
+                    m.add(mi);
+                }
+            }
+        }
+        if (Main.pref.getBoolean("taggingpreset.sortmenu")) {
+            TaggingPresetMenu.sortMenu(Main.main.menu.presetsMenu);
+        }
+    }
+
+    /**
+     * Replies a new collection containing all tagging presets.
+     * @return a new collection containing all tagging presets. Empty if presets are not initialized (never null)
+     */
+    public static Collection<TaggingPreset> getTaggingPresets() {
+        return new ArrayList<>(taggingPresets);
+    }
+
+    /**
+     * Adds a list of tagging presets to the current list.
+     * @param presets The tagging presets to add
+     */
+    public static void addTaggingPresets(Collection<TaggingPreset> presets) {
+        if (presets != null) {
+            if (taggingPresets.addAll(presets)) {
+                for (TaggingPresetListener listener : listeners) {
+                    listener.taggingPresetsModified();
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a tagging preset listener.
+     * @param listener The listener to add
+     */
+    public static void addListener(TaggingPresetListener listener) {
+        if (listener != null) {
+            listeners.add(listener);
+        }
+    }
+
+    /**
+     * Removes a tagging preset listener.
+     * @param listener The listener to remove
+     */
+    public static void removeListener(TaggingPresetListener listener) {
+        if (listener != null) {
+            listeners.remove(listener);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java b/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
index 7e138fa..f9e555e 100644
--- a/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
+++ b/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
@@ -1,199 +1,199 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.AWTEvent;
-import java.awt.Component;
-import java.awt.KeyboardFocusManager;
-import java.awt.Toolkit;
-import java.awt.event.AWTEventListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.swing.JFrame;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * Helper object that allows cross-platform detection of key press and realease events
- * instance is available globally as Main.map.keyDetector
- * @since 7217
- */
-public class AdvancedKeyPressDetector implements AWTEventListener {
-
-    // events for crossplatform key holding processing
-    // thanks to http://www.arco.in-berlin.de/keyevent.html
-    private final Set<Integer> set = new TreeSet<>();
-    private KeyEvent releaseEvent;
-    private Timer timer;
-
-    private final ArrayList<KeyPressReleaseListener> keyListeners = new ArrayList<>();
-    private final ArrayList<ModifierListener> modifierListeners = new ArrayList<>();
-    private int previousModifiers;
-
-    private boolean enabled = true;
-
-    /**
-     * Adds an object that wants to receive key press and release events.
-     * @param l listener to add
-     */
-    public synchronized void addKeyListener(KeyPressReleaseListener l) {
-        keyListeners.add(l);
-    }
-
-    /**
-     * Adds an object that wants to receive key modifier changed events.
-     * @param l listener to add
-     */
-    public synchronized void addModifierListener(ModifierListener l) {
-        modifierListeners.add(l);
-    }
-
-    /**
-     * Removes the listener.
-     * @param l listener to remove
-     */
-    public synchronized void removeKeyListener(KeyPressReleaseListener l) {
-        keyListeners.remove(l);
-    }
-
-    /**
-     * Removes the key modifier listener.
-     * @param l listener to remove
-     */
-    public synchronized void removeModifierListener(ModifierListener l) {
-        modifierListeners.remove(l);
-    }
-
-    /**
-     * Register this object as AWTEventListener
-     */
-    public void register() {
-        try {
-            Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
-        } catch (SecurityException ex) {
-            Main.warn(ex);
-        }
-        timer = new Timer(0, new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                timer.stop();
-                if (set.remove(releaseEvent.getKeyCode()) && enabled) {
-                    synchronized (AdvancedKeyPressDetector.this) {
-                        if (isFocusInMainWindow()) {
-                            for (KeyPressReleaseListener q: keyListeners) {
-                                q.doKeyReleased(releaseEvent);
-                            }
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Unregister this object as AWTEventListener
-     * lists of listeners are not cleared!
-     */
-    public void unregister() {
-        timer.stop();
-        set.clear();
-        synchronized (this) {
-            if (!keyListeners.isEmpty()) {
-                Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
-            }
-            if (!modifierListeners.isEmpty()) {
-                Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
-            }
-        }
-        try {
-            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
-        } catch (SecurityException ex) {
-            Main.warn(ex);
-        }
-    }
-
-    private void processKeyEvent(KeyEvent e) {
-        if (e.getID() == KeyEvent.KEY_PRESSED) {
-            if (timer.isRunning()) {
-                timer.stop();
-            } else if (set.add((e.getKeyCode())) && enabled) {
-                synchronized (this) {
-                    if (isFocusInMainWindow()) {
-                        for (KeyPressReleaseListener q: keyListeners) {
-                            q.doKeyPressed(e);
-                        }
-                    }
-                }
-            }
-        } else if (e.getID() == KeyEvent.KEY_RELEASED) {
-            if (timer.isRunning()) {
-                timer.stop();
-                if (set.remove(e.getKeyCode()) && enabled) {
-                    synchronized (this) {
-                        if (isFocusInMainWindow()) {
-                            for (KeyPressReleaseListener q: keyListeners) {
-                                q.doKeyReleased(e);
-                            }
-                        }
-                    }
-                }
-            } else {
-                releaseEvent = e;
-                timer.restart();
-            }
-        }
-    }
-
-    @Override
-    public void eventDispatched(AWTEvent e) {
-        if (!(e instanceof KeyEvent)) {
-            return;
-        }
-        KeyEvent ke = (KeyEvent) e;
-
-        // check if ctrl, alt, shift modifiers are changed
-        int modif = ke.getModifiers();
-        if (previousModifiers != modif) {
-            previousModifiers = modif;
-            synchronized (this) {
-                for (ModifierListener m: modifierListeners) {
-                    m.modifiersChanged(modif);
-                }
-            }
-        }
-
-        processKeyEvent(ke);
-    }
-
-    /**
-     * Allows to determine if the key with specific code is pressed now
-     * @param keyCode the key code, for example KeyEvent.VK_ENTER
-     * @return true if the key is pressed now
-     */
-    public boolean isKeyPressed(int keyCode) {
-        return set.contains(keyCode);
-    }
-
-    /**
-     * Sets the enabled state of the key detector. We need to disable it when text fields that disable
-     * shortcuts gain focus.
-     * @param enabled if {@code true}, enables this key detector. If {@code false}, disables it
-     * @since 7539
-     */
-    public final void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    private boolean isFocusInMainWindow() {
-        Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
-        return focused != null && SwingUtilities.getWindowAncestor(focused) instanceof JFrame;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.KeyboardFocusManager;
+import java.awt.Toolkit;
+import java.awt.event.AWTEventListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * Helper object that allows cross-platform detection of key press and realease events
+ * instance is available globally as Main.map.keyDetector
+ * @since 7217
+ */
+public class AdvancedKeyPressDetector implements AWTEventListener {
+
+    // events for crossplatform key holding processing
+    // thanks to http://www.arco.in-berlin.de/keyevent.html
+    private final Set<Integer> set = new TreeSet<>();
+    private KeyEvent releaseEvent;
+    private Timer timer;
+
+    private final ArrayList<KeyPressReleaseListener> keyListeners = new ArrayList<>();
+    private final ArrayList<ModifierListener> modifierListeners = new ArrayList<>();
+    private int previousModifiers;
+
+    private boolean enabled = true;
+
+    /**
+     * Adds an object that wants to receive key press and release events.
+     * @param l listener to add
+     */
+    public synchronized void addKeyListener(KeyPressReleaseListener l) {
+        keyListeners.add(l);
+    }
+
+    /**
+     * Adds an object that wants to receive key modifier changed events.
+     * @param l listener to add
+     */
+    public synchronized void addModifierListener(ModifierListener l) {
+        modifierListeners.add(l);
+    }
+
+    /**
+     * Removes the listener.
+     * @param l listener to remove
+     */
+    public synchronized void removeKeyListener(KeyPressReleaseListener l) {
+        keyListeners.remove(l);
+    }
+
+    /**
+     * Removes the key modifier listener.
+     * @param l listener to remove
+     */
+    public synchronized void removeModifierListener(ModifierListener l) {
+        modifierListeners.remove(l);
+    }
+
+    /**
+     * Register this object as AWTEventListener
+     */
+    public void register() {
+        try {
+            Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
+        } catch (SecurityException ex) {
+            Main.warn(ex);
+        }
+        timer = new Timer(0, new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                timer.stop();
+                if (set.remove(releaseEvent.getKeyCode()) && enabled) {
+                    synchronized (AdvancedKeyPressDetector.this) {
+                        if (isFocusInMainWindow()) {
+                            for (KeyPressReleaseListener q: keyListeners) {
+                                q.doKeyReleased(releaseEvent);
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * Unregister this object as AWTEventListener
+     * lists of listeners are not cleared!
+     */
+    public void unregister() {
+        timer.stop();
+        set.clear();
+        synchronized (this) {
+            if (!keyListeners.isEmpty()) {
+                Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
+            }
+            if (!modifierListeners.isEmpty()) {
+                Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
+            }
+        }
+        try {
+            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
+        } catch (SecurityException ex) {
+            Main.warn(ex);
+        }
+    }
+
+    private void processKeyEvent(KeyEvent e) {
+        if (e.getID() == KeyEvent.KEY_PRESSED) {
+            if (timer.isRunning()) {
+                timer.stop();
+            } else if (set.add((e.getKeyCode())) && enabled) {
+                synchronized (this) {
+                    if (isFocusInMainWindow()) {
+                        for (KeyPressReleaseListener q: keyListeners) {
+                            q.doKeyPressed(e);
+                        }
+                    }
+                }
+            }
+        } else if (e.getID() == KeyEvent.KEY_RELEASED) {
+            if (timer.isRunning()) {
+                timer.stop();
+                if (set.remove(e.getKeyCode()) && enabled) {
+                    synchronized (this) {
+                        if (isFocusInMainWindow()) {
+                            for (KeyPressReleaseListener q: keyListeners) {
+                                q.doKeyReleased(e);
+                            }
+                        }
+                    }
+                }
+            } else {
+                releaseEvent = e;
+                timer.restart();
+            }
+        }
+    }
+
+    @Override
+    public void eventDispatched(AWTEvent e) {
+        if (!(e instanceof KeyEvent)) {
+            return;
+        }
+        KeyEvent ke = (KeyEvent) e;
+
+        // check if ctrl, alt, shift modifiers are changed
+        int modif = ke.getModifiers();
+        if (previousModifiers != modif) {
+            previousModifiers = modif;
+            synchronized (this) {
+                for (ModifierListener m: modifierListeners) {
+                    m.modifiersChanged(modif);
+                }
+            }
+        }
+
+        processKeyEvent(ke);
+    }
+
+    /**
+     * Allows to determine if the key with specific code is pressed now
+     * @param keyCode the key code, for example KeyEvent.VK_ENTER
+     * @return true if the key is pressed now
+     */
+    public boolean isKeyPressed(int keyCode) {
+        return set.contains(keyCode);
+    }
+
+    /**
+     * Sets the enabled state of the key detector. We need to disable it when text fields that disable
+     * shortcuts gain focus.
+     * @param enabled if {@code true}, enables this key detector. If {@code false}, disables it
+     * @since 7539
+     */
+    public final void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    private boolean isFocusInMainWindow() {
+        Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+        return focused != null && SwingUtilities.getWindowAncestor(focused) instanceof JFrame;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/util/HighlightHelper.java b/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
index b8af0f4..3bee7da 100644
--- a/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
+++ b/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
@@ -1,136 +1,136 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-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.Relation;
-
-/**
- * This class stores the set of highlited primitives and
- * allows easy and fast change of highlighting
- */
-public class HighlightHelper {
-    Set<OsmPrimitive> highlightedPrimitives = new HashSet<>();
-
-    /**
-     * Highlight and remember given primitives
-     * @param prims - primitives to highlight/unhighlight
-     */
-    public boolean highlight(Collection <? extends OsmPrimitive> prims) {
-        return highlight(prims, false);
-    }
-
-    /**
-     * Highlight and remember given primitives
-     * @param prims - primitives to highlight/unhighlight
-     * @param only - remove previous highlighting
-     */
-    public boolean highlight(Collection <? extends OsmPrimitive> prims, boolean only) {
-        boolean needsRepaint = false;
-        if (only) {
-            Iterator<OsmPrimitive> it = highlightedPrimitives.iterator();
-            while (it.hasNext()) {
-                OsmPrimitive p = it.next();
-                if (!prims.contains(p)) {
-                    p.setHighlighted(false);
-                    it.remove();
-                    needsRepaint = true;
-                }
-            }
-        }
-        for (OsmPrimitive p: prims) {
-            needsRepaint |= setHighlight(p, true);
-        }
-
-        return needsRepaint;
-    }
-
-    /**
-     * Highlight and remember given primitives, forgetting previously highlighted by this instance
-     * @param prims - primitives to highlight/unhighlight
-     */
-    public boolean highlightOnly(Collection <? extends OsmPrimitive> prims) {
-        return highlight(prims, true);
-    }
-
-    /**
-     * Highlight and remember given primitive, forgetting previously highlighted by this instance
-     * @param p - primitives to highlight/unhighlight
-     */
-    public boolean highlightOnly(OsmPrimitive p) {
-        return highlight(Collections.singleton(p), true);
-    }
-
-    /**
-     * Highlight and remember given primitive
-     * @param p - primitive to highlight/unhighlight
-     * @param flag - true to highlight
-     */
-    public boolean setHighlight(OsmPrimitive p, boolean flag) {
-        return setHighlight(p, flag, new HashSet<Relation>());
-    }
-
-    private boolean setHighlight(OsmPrimitive p, boolean flag, Set<Relation> seenRelations) {
-        if (p instanceof Relation) {
-            Relation r = (Relation) p;
-            seenRelations.add(r);
-            boolean needRepaint = false;
-            for (OsmPrimitive m : r.getMemberPrimitives()) {
-                if (!(m instanceof Relation) || !seenRelations.contains(m)) {
-                    needRepaint |= setHighlight(m, flag, seenRelations);
-                }
-            }
-            return needRepaint;
-        } else if (flag) {
-            if (highlightedPrimitives.add(p)) {
-                p.setHighlighted(true);
-                return true;
-            }
-        } else {
-            if (highlightedPrimitives.remove(p)) {
-                p.setHighlighted(false);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Clear highlighting of all remembered primitives
-     */
-    public void clear() {
-        for (OsmPrimitive p: highlightedPrimitives) {
-            p.setHighlighted(false);
-        }
-        highlightedPrimitives.clear();
-    }
-
-    /**
-     * Slow method to import all currently highlighted primitives into this instance
-     */
-    public void findAllHighlighted() {
-        DataSet ds = Main.main.getCurrentDataSet();
-        if (ds!=null) {
-            highlightedPrimitives.addAll( ds.allNonDeletedPrimitives() );
-        }
-    }
-
-    /**
-     * Slow method to remove highlights from all primitives
-     */
-    public static void clearAllHighlighted() {
-        DataSet ds = Main.main.getCurrentDataSet();
-        if (ds!=null) {
-            for (OsmPrimitive p: ds.allNonDeletedPrimitives()) {
-                p.setHighlighted(false);
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+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.Relation;
+
+/**
+ * This class stores the set of highlited primitives and
+ * allows easy and fast change of highlighting
+ */
+public class HighlightHelper {
+    Set<OsmPrimitive> highlightedPrimitives = new HashSet<>();
+
+    /**
+     * Highlight and remember given primitives
+     * @param prims - primitives to highlight/unhighlight
+     */
+    public boolean highlight(Collection <? extends OsmPrimitive> prims) {
+        return highlight(prims, false);
+    }
+
+    /**
+     * Highlight and remember given primitives
+     * @param prims - primitives to highlight/unhighlight
+     * @param only - remove previous highlighting
+     */
+    public boolean highlight(Collection <? extends OsmPrimitive> prims, boolean only) {
+        boolean needsRepaint = false;
+        if (only) {
+            Iterator<OsmPrimitive> it = highlightedPrimitives.iterator();
+            while (it.hasNext()) {
+                OsmPrimitive p = it.next();
+                if (!prims.contains(p)) {
+                    p.setHighlighted(false);
+                    it.remove();
+                    needsRepaint = true;
+                }
+            }
+        }
+        for (OsmPrimitive p: prims) {
+            needsRepaint |= setHighlight(p, true);
+        }
+
+        return needsRepaint;
+    }
+
+    /**
+     * Highlight and remember given primitives, forgetting previously highlighted by this instance
+     * @param prims - primitives to highlight/unhighlight
+     */
+    public boolean highlightOnly(Collection <? extends OsmPrimitive> prims) {
+        return highlight(prims, true);
+    }
+
+    /**
+     * Highlight and remember given primitive, forgetting previously highlighted by this instance
+     * @param p - primitives to highlight/unhighlight
+     */
+    public boolean highlightOnly(OsmPrimitive p) {
+        return highlight(Collections.singleton(p), true);
+    }
+
+    /**
+     * Highlight and remember given primitive
+     * @param p - primitive to highlight/unhighlight
+     * @param flag - true to highlight
+     */
+    public boolean setHighlight(OsmPrimitive p, boolean flag) {
+        return setHighlight(p, flag, new HashSet<Relation>());
+    }
+
+    private boolean setHighlight(OsmPrimitive p, boolean flag, Set<Relation> seenRelations) {
+        if (p instanceof Relation) {
+            Relation r = (Relation) p;
+            seenRelations.add(r);
+            boolean needRepaint = false;
+            for (OsmPrimitive m : r.getMemberPrimitives()) {
+                if (!(m instanceof Relation) || !seenRelations.contains(m)) {
+                    needRepaint |= setHighlight(m, flag, seenRelations);
+                }
+            }
+            return needRepaint;
+        } else if (flag) {
+            if (highlightedPrimitives.add(p)) {
+                p.setHighlighted(true);
+                return true;
+            }
+        } else {
+            if (highlightedPrimitives.remove(p)) {
+                p.setHighlighted(false);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Clear highlighting of all remembered primitives
+     */
+    public void clear() {
+        for (OsmPrimitive p: highlightedPrimitives) {
+            p.setHighlighted(false);
+        }
+        highlightedPrimitives.clear();
+    }
+
+    /**
+     * Slow method to import all currently highlighted primitives into this instance
+     */
+    public void findAllHighlighted() {
+        DataSet ds = Main.main.getCurrentDataSet();
+        if (ds!=null) {
+            highlightedPrimitives.addAll( ds.allNonDeletedPrimitives() );
+        }
+    }
+
+    /**
+     * Slow method to remove highlights from all primitives
+     */
+    public static void clearAllHighlighted() {
+        DataSet ds = Main.main.getCurrentDataSet();
+        if (ds!=null) {
+            for (OsmPrimitive p: ds.allNonDeletedPrimitives()) {
+                p.setHighlighted(false);
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/util/KeyPressReleaseListener.java b/src/org/openstreetmap/josm/gui/util/KeyPressReleaseListener.java
index adbfcef..8412571 100644
--- a/src/org/openstreetmap/josm/gui/util/KeyPressReleaseListener.java
+++ b/src/org/openstreetmap/josm/gui/util/KeyPressReleaseListener.java
@@ -1,20 +1,20 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import java.awt.event.KeyEvent;
-
-/**
- * Interface that is used to detect key pressing and releasing
- */
-public interface KeyPressReleaseListener {
-    /**
-     * This is called when key press event is actually pressed
-     * (no fake events while holding key)
-     */
-    public void doKeyPressed(KeyEvent e);
-    /**
-     * This is called when key press event is actually released
-     * (no fake events while holding key)
-     */
-    public void doKeyReleased(KeyEvent e);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.awt.event.KeyEvent;
+
+/**
+ * Interface that is used to detect key pressing and releasing
+ */
+public interface KeyPressReleaseListener {
+    /**
+     * This is called when key press event is actually pressed
+     * (no fake events while holding key)
+     */
+    public void doKeyPressed(KeyEvent e);
+    /**
+     * This is called when key press event is actually released
+     * (no fake events while holding key)
+     */
+    public void doKeyReleased(KeyEvent e);
+}
diff --git a/src/org/openstreetmap/josm/gui/util/ModifierListener.java b/src/org/openstreetmap/josm/gui/util/ModifierListener.java
index 33cd092..2f24081 100644
--- a/src/org/openstreetmap/josm/gui/util/ModifierListener.java
+++ b/src/org/openstreetmap/josm/gui/util/ModifierListener.java
@@ -1,10 +1,10 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-/**
- * Listener called when pressed modifier keys change is detected
- * @since 7217
- */
-public interface ModifierListener {
-    public void modifiersChanged(int modifiers);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+/**
+ * Listener called when pressed modifier keys change is detected
+ * @since 7217
+ */
+public interface ModifierListener {
+    public void modifiersChanged(int modifiers);
+}
diff --git a/src/org/openstreetmap/josm/gui/util/TableHelper.java b/src/org/openstreetmap/josm/gui/util/TableHelper.java
index 5d7043c..84d44b0 100644
--- a/src/org/openstreetmap/josm/gui/util/TableHelper.java
+++ b/src/org/openstreetmap/josm/gui/util/TableHelper.java
@@ -1,33 +1,33 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import java.awt.Component;
-
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-
-/**
- * The class that provide common JTable customization methods
- */
-public final class TableHelper {
-    
-    private TableHelper() {
-        // Hide default constructor for utils classes
-    }
-    
-    /**
-     * (originally from @class org.openstreetmap.josm.gui.preferences.SourceEditor)
-     * adjust the preferred width of column col to the maximum preferred width of the cells
-     * requires JTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-     */
-    public static void adjustColumnWidth(JTable tbl, int col, int maxColumnWidth) {
-        int maxwidth = 0;
-        for (int row=0; row<tbl.getRowCount(); row++) {
-            TableCellRenderer tcr = tbl.getCellRenderer(row, col);
-            Object val = tbl.getValueAt(row, col);
-            Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, row, col);
-            maxwidth = Math.max(comp.getPreferredSize().width, maxwidth);
-        }
-        tbl.getColumnModel().getColumn(col).setPreferredWidth(Math.min(maxwidth+10, maxColumnWidth));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.TableCellRenderer;
+
+/**
+ * The class that provide common JTable customization methods
+ */
+public final class TableHelper {
+    
+    private TableHelper() {
+        // Hide default constructor for utils classes
+    }
+    
+    /**
+     * (originally from @class org.openstreetmap.josm.gui.preferences.SourceEditor)
+     * adjust the preferred width of column col to the maximum preferred width of the cells
+     * requires JTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+     */
+    public static void adjustColumnWidth(JTable tbl, int col, int maxColumnWidth) {
+        int maxwidth = 0;
+        for (int row=0; row<tbl.getRowCount(); row++) {
+            TableCellRenderer tcr = tbl.getCellRenderer(row, col);
+            Object val = tbl.getValueAt(row, col);
+            Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, row, col);
+            maxwidth = Math.max(comp.getPreferredSize().width, maxwidth);
+        }
+        tbl.getColumnModel().getColumn(col).setPreferredWidth(Math.min(maxwidth+10, maxColumnWidth));
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/AbstractFileChooser.java b/src/org/openstreetmap/josm/gui/widgets/AbstractFileChooser.java
index 98bd8d2..28dd507 100644
--- a/src/org/openstreetmap/josm/gui/widgets/AbstractFileChooser.java
+++ b/src/org/openstreetmap/josm/gui/widgets/AbstractFileChooser.java
@@ -1,225 +1,225 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.awt.HeadlessException;
-import java.io.File;
-import java.util.Locale;
-
-import javax.swing.filechooser.FileFilter;
-
-/**
- * Abstract class to allow different file chooser implementations.
- * @since 7578
- */
-public abstract class AbstractFileChooser {
-
-    /** The locale for both implementations */
-    protected static Locale locale;
-
-    /**
-     * Sets the default locale for all implementations.
-     * @param l locale
-     */
-    public static void setDefaultLocale(Locale l) {
-        locale = l;
-    }
-
-    /**
-     * Adds a filter to the list of user choosable file filters.
-     * For information on setting the file selection mode, see
-     * {@link #setFileSelectionMode setFileSelectionMode}.
-     *
-     * @param filter the <code>FileFilter</code> to add to the choosable file
-     *               filter list
-     *
-     * @see #getChoosableFileFilters
-     * @see #setFileSelectionMode
-     */
-    public abstract void addChoosableFileFilter(FileFilter filter);
-
-    /**
-     * Gets the list of user choosable file filters.
-     *
-     * @return a <code>FileFilter</code> array containing all the choosable
-     *         file filters
-     *
-     * @see #addChoosableFileFilter
-     */
-    public abstract FileFilter[] getChoosableFileFilters();
-
-    /**
-     * Returns the current directory.
-     *
-     * @return the current directory
-     * @see #setCurrentDirectory
-     */
-    public abstract File getCurrentDirectory();
-
-    /**
-     * Returns the currently selected file filter.
-     *
-     * @return the current file filter
-     * @see #setFileFilter
-     * @see #addChoosableFileFilter
-     */
-    public abstract FileFilter getFileFilter();
-
-    /**
-     * Returns the selected file. This can be set either by the
-     * programmer via <code>setSelectedFile</code> or by a user action, such as
-     * either typing the filename into the UI or selecting the
-     * file from a list in the UI.
-     *
-     * @see #setSelectedFile
-     * @return the selected file
-     */
-    public abstract File getSelectedFile();
-
-    /**
-     * Returns a list of selected files if the file chooser is
-     * set to allow multiple selection.
-     * @return a list of selected files if the file chooser is
-     * set to allow multiple selection, or an empty array otherwise.
-     */
-    public abstract File[] getSelectedFiles();
-
-    /**
-     * Returns true if multiple files can be selected.
-     * @return true if multiple files can be selected
-     * @see #setMultiSelectionEnabled
-     */
-    public abstract boolean isMultiSelectionEnabled();
-
-    /**
-     * Determines whether the <code>AcceptAll FileFilter</code> is used
-     * as an available choice in the choosable filter list.
-     * If false, the <code>AcceptAll</code> file filter is removed from
-     * the list of available file filters.
-     * If true, the <code>AcceptAll</code> file filter will become the
-     * the actively used file filter.
-     * @param b whether the <code>AcceptAll FileFilter</code> is used
-     * as an available choice in the choosable filter list
-     *
-     * @see #setFileFilter
-     */
-    public abstract void setAcceptAllFileFilterUsed(boolean b);
-
-    /**
-     * Sets the current directory. Passing in <code>null</code> sets the
-     * file chooser to point to the user's default directory.
-     * This default depends on the operating system. It is
-     * typically the "My Documents" folder on Windows, and the user's
-     * home directory on Unix.
-     *
-     * If the file passed in as <code>currentDirectory</code> is not a
-     * directory, the parent of the file will be used as the currentDirectory.
-     * If the parent is not traversable, then it will walk up the parent tree
-     * until it finds a traversable directory, or hits the root of the
-     * file system.
-     *
-     * @param dir the current directory to point to
-     * @see #getCurrentDirectory
-     */
-    public abstract void setCurrentDirectory(File dir);
-
-    /**
-     * Sets the string that goes in the <code>JFileChooser</code> window's
-     * title bar.
-     *
-     * @param title the new <code>String</code> for the title bar
-     */
-    public abstract void setDialogTitle(String title);
-
-    /**
-     * Sets the current file filter. The file filter is used by the
-     * file chooser to filter out files from the user's view.
-     *
-     * @param filter the new current file filter to use
-     * @see #getFileFilter
-     */
-    public abstract void setFileFilter(final FileFilter filter);
-
-    /**
-     * Sets the <code>JFileChooser</code> to allow the user to just
-     * select files, just select
-     * directories, or select both files and directories.  The default is
-     * <code>JFilesChooser.FILES_ONLY</code>.
-     *
-     * @param selectionMode the type of files to be displayed:
-     * <ul>
-     * <li>JFileChooser.FILES_ONLY
-     * <li>JFileChooser.DIRECTORIES_ONLY
-     * <li>JFileChooser.FILES_AND_DIRECTORIES
-     * </ul>
-     *
-     * @exception IllegalArgumentException  if <code>mode</code> is an
-     *                          illegal file selection mode
-     */
-    public abstract void setFileSelectionMode(int selectionMode);
-
-    /**
-     * Sets the file chooser to allow multiple file selections.
-     *
-     * @param multiple true if multiple files may be selected
-     * @beaninfo
-     *       bound: true
-     * description: Sets multiple file selection mode.
-     *
-     * @see #isMultiSelectionEnabled
-     */
-    public abstract void setMultiSelectionEnabled(boolean multiple);
-
-    /**
-     * Sets the selected file. If the file's parent directory is
-     * not the current directory, changes the current directory
-     * to be the file's parent directory.
-     *
-     * @see #getSelectedFile
-     *
-     * @param file the selected file
-     */
-    public abstract void setSelectedFile(File file);
-
-    /**
-     * Pops up an "Open File" file chooser dialog. Note that the
-     * text that appears in the approve button is determined by
-     * the L&F.
-     *
-     * @param    parent  the parent component of the dialog,
-     *                  can be <code>null</code>;
-     *                  see <code>showDialog</code> for details
-     * @return   the return state of the file chooser on popdown:
-     * <ul>
-     * <li>JFileChooser.CANCEL_OPTION
-     * <li>JFileChooser.APPROVE_OPTION
-     * <li>JFileChooser.ERROR_OPTION if an error occurs or the
-     *                  dialog is dismissed
-     * </ul>
-     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
-     * returns true.
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     */
-    public abstract int showOpenDialog(Component parent);
-
-    /**
-     * Pops up a "Save File" file chooser dialog. Note that the
-     * text that appears in the approve button is determined by
-     * the L&F.
-     *
-     * @param    parent  the parent component of the dialog,
-     *                  can be <code>null</code>;
-     *                  see <code>showDialog</code> for details
-     * @return   the return state of the file chooser on popdown:
-     * <ul>
-     * <li>JFileChooser.CANCEL_OPTION
-     * <li>JFileChooser.APPROVE_OPTION
-     * <li>JFileChooser.ERROR_OPTION if an error occurs or the
-     *                  dialog is dismissed
-     * </ul>
-     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
-     * returns true.
-     * @see java.awt.GraphicsEnvironment#isHeadless
-     */
-    public abstract int showSaveDialog(Component parent);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.awt.HeadlessException;
+import java.io.File;
+import java.util.Locale;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * Abstract class to allow different file chooser implementations.
+ * @since 7578
+ */
+public abstract class AbstractFileChooser {
+
+    /** The locale for both implementations */
+    protected static Locale locale;
+
+    /**
+     * Sets the default locale for all implementations.
+     * @param l locale
+     */
+    public static void setDefaultLocale(Locale l) {
+        locale = l;
+    }
+
+    /**
+     * Adds a filter to the list of user choosable file filters.
+     * For information on setting the file selection mode, see
+     * {@link #setFileSelectionMode setFileSelectionMode}.
+     *
+     * @param filter the <code>FileFilter</code> to add to the choosable file
+     *               filter list
+     *
+     * @see #getChoosableFileFilters
+     * @see #setFileSelectionMode
+     */
+    public abstract void addChoosableFileFilter(FileFilter filter);
+
+    /**
+     * Gets the list of user choosable file filters.
+     *
+     * @return a <code>FileFilter</code> array containing all the choosable
+     *         file filters
+     *
+     * @see #addChoosableFileFilter
+     */
+    public abstract FileFilter[] getChoosableFileFilters();
+
+    /**
+     * Returns the current directory.
+     *
+     * @return the current directory
+     * @see #setCurrentDirectory
+     */
+    public abstract File getCurrentDirectory();
+
+    /**
+     * Returns the currently selected file filter.
+     *
+     * @return the current file filter
+     * @see #setFileFilter
+     * @see #addChoosableFileFilter
+     */
+    public abstract FileFilter getFileFilter();
+
+    /**
+     * Returns the selected file. This can be set either by the
+     * programmer via <code>setSelectedFile</code> or by a user action, such as
+     * either typing the filename into the UI or selecting the
+     * file from a list in the UI.
+     *
+     * @see #setSelectedFile
+     * @return the selected file
+     */
+    public abstract File getSelectedFile();
+
+    /**
+     * Returns a list of selected files if the file chooser is
+     * set to allow multiple selection.
+     * @return a list of selected files if the file chooser is
+     * set to allow multiple selection, or an empty array otherwise.
+     */
+    public abstract File[] getSelectedFiles();
+
+    /**
+     * Returns true if multiple files can be selected.
+     * @return true if multiple files can be selected
+     * @see #setMultiSelectionEnabled
+     */
+    public abstract boolean isMultiSelectionEnabled();
+
+    /**
+     * Determines whether the <code>AcceptAll FileFilter</code> is used
+     * as an available choice in the choosable filter list.
+     * If false, the <code>AcceptAll</code> file filter is removed from
+     * the list of available file filters.
+     * If true, the <code>AcceptAll</code> file filter will become the
+     * the actively used file filter.
+     * @param b whether the <code>AcceptAll FileFilter</code> is used
+     * as an available choice in the choosable filter list
+     *
+     * @see #setFileFilter
+     */
+    public abstract void setAcceptAllFileFilterUsed(boolean b);
+
+    /**
+     * Sets the current directory. Passing in <code>null</code> sets the
+     * file chooser to point to the user's default directory.
+     * This default depends on the operating system. It is
+     * typically the "My Documents" folder on Windows, and the user's
+     * home directory on Unix.
+     *
+     * If the file passed in as <code>currentDirectory</code> is not a
+     * directory, the parent of the file will be used as the currentDirectory.
+     * If the parent is not traversable, then it will walk up the parent tree
+     * until it finds a traversable directory, or hits the root of the
+     * file system.
+     *
+     * @param dir the current directory to point to
+     * @see #getCurrentDirectory
+     */
+    public abstract void setCurrentDirectory(File dir);
+
+    /**
+     * Sets the string that goes in the <code>JFileChooser</code> window's
+     * title bar.
+     *
+     * @param title the new <code>String</code> for the title bar
+     */
+    public abstract void setDialogTitle(String title);
+
+    /**
+     * Sets the current file filter. The file filter is used by the
+     * file chooser to filter out files from the user's view.
+     *
+     * @param filter the new current file filter to use
+     * @see #getFileFilter
+     */
+    public abstract void setFileFilter(final FileFilter filter);
+
+    /**
+     * Sets the <code>JFileChooser</code> to allow the user to just
+     * select files, just select
+     * directories, or select both files and directories.  The default is
+     * <code>JFilesChooser.FILES_ONLY</code>.
+     *
+     * @param selectionMode the type of files to be displayed:
+     * <ul>
+     * <li>JFileChooser.FILES_ONLY
+     * <li>JFileChooser.DIRECTORIES_ONLY
+     * <li>JFileChooser.FILES_AND_DIRECTORIES
+     * </ul>
+     *
+     * @exception IllegalArgumentException  if <code>mode</code> is an
+     *                          illegal file selection mode
+     */
+    public abstract void setFileSelectionMode(int selectionMode);
+
+    /**
+     * Sets the file chooser to allow multiple file selections.
+     *
+     * @param multiple true if multiple files may be selected
+     * @beaninfo
+     *       bound: true
+     * description: Sets multiple file selection mode.
+     *
+     * @see #isMultiSelectionEnabled
+     */
+    public abstract void setMultiSelectionEnabled(boolean multiple);
+
+    /**
+     * Sets the selected file. If the file's parent directory is
+     * not the current directory, changes the current directory
+     * to be the file's parent directory.
+     *
+     * @see #getSelectedFile
+     *
+     * @param file the selected file
+     */
+    public abstract void setSelectedFile(File file);
+
+    /**
+     * Pops up an "Open File" file chooser dialog. Note that the
+     * text that appears in the approve button is determined by
+     * the L&F.
+     *
+     * @param    parent  the parent component of the dialog,
+     *                  can be <code>null</code>;
+     *                  see <code>showDialog</code> for details
+     * @return   the return state of the file chooser on popdown:
+     * <ul>
+     * <li>JFileChooser.CANCEL_OPTION
+     * <li>JFileChooser.APPROVE_OPTION
+     * <li>JFileChooser.ERROR_OPTION if an error occurs or the
+     *                  dialog is dismissed
+     * </ul>
+     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+     * returns true.
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    public abstract int showOpenDialog(Component parent);
+
+    /**
+     * Pops up a "Save File" file chooser dialog. Note that the
+     * text that appears in the approve button is determined by
+     * the L&F.
+     *
+     * @param    parent  the parent component of the dialog,
+     *                  can be <code>null</code>;
+     *                  see <code>showDialog</code> for details
+     * @return   the return state of the file chooser on popdown:
+     * <ul>
+     * <li>JFileChooser.CANCEL_OPTION
+     * <li>JFileChooser.APPROVE_OPTION
+     * <li>JFileChooser.ERROR_OPTION if an error occurs or the
+     *                  dialog is dismissed
+     * </ul>
+     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+     * returns true.
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    public abstract int showSaveDialog(Component parent);
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java b/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
index 7b7028b..9eeb57b 100644
--- a/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
+++ b/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
@@ -1,89 +1,89 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import javax.swing.text.JTextComponent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * An abstract class for ID text fields.
- *
- * @param <T> The ID validator class
- * @since 5765
- */
-public abstract class AbstractIdTextField<T extends AbstractTextComponentValidator> extends JosmTextField {
-
-    protected final T validator;
-
-    /**
-     * Constructs a new {@link AbstractIdTextField}
-     * @param klass The validator class
-     */
-    public AbstractIdTextField(Class<T> klass) {
-        this(klass, 0);
-    }
-
-    /**
-     * Constructs a new {@link AbstractIdTextField}
-     * @param klass The validator class
-     * @param columns The number of columns to use to calculate the preferred width
-     * @see JosmTextField#JosmTextField(int)
-     */
-    public AbstractIdTextField(Class<T> klass, int columns) {
-        super(columns);
-        T validator = null;
-        try {
-            if (klass != null) {
-                validator = klass.getConstructor(JTextComponent.class).newInstance(this);
-            }
-        } catch (Exception e) {
-            Main.error(e);
-        } finally {
-            this.validator = validator;
-        }
-    }
-
-    /**
-     * Performs the field validation
-     */
-    public final void performValidation() {
-        validator.validate();
-    }
-
-    /**
-     * Clears field if content is invalid
-     */
-    public final void clearTextIfInvalid() {
-        if (!validator.isValid()) 
-            setText("");
-        validator.validate();
-    }
-    
-    /**
-     * Reads the id(s).
-     * @return true if at least a valid id has been successfully read, false otherwise
-     */
-    public abstract boolean readIds();
-
-    /**
-     * Tries to set text from clipboard (no effect with invalid or empty clipboard)
-     */
-    public void tryToPasteFromClipboard() {
-        tryToPasteFrom(Utils.getClipboardContent());
-    }
-
-    /**
-     * Tries to set text from given contents (no effect with invalid or empty contents)
-     * @param contents The text to interprete as ID(s)
-     * @return true if text has been pasted and valid ids have been read
-     */
-    public boolean tryToPasteFrom(String contents) {
-        if (contents != null && !contents.trim().isEmpty()) {
-            setText(contents.trim());
-            clearTextIfInvalid();
-            return readIds();
-        }
-        return false;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import javax.swing.text.JTextComponent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * An abstract class for ID text fields.
+ *
+ * @param <T> The ID validator class
+ * @since 5765
+ */
+public abstract class AbstractIdTextField<T extends AbstractTextComponentValidator> extends JosmTextField {
+
+    protected final T validator;
+
+    /**
+     * Constructs a new {@link AbstractIdTextField}
+     * @param klass The validator class
+     */
+    public AbstractIdTextField(Class<T> klass) {
+        this(klass, 0);
+    }
+
+    /**
+     * Constructs a new {@link AbstractIdTextField}
+     * @param klass The validator class
+     * @param columns The number of columns to use to calculate the preferred width
+     * @see JosmTextField#JosmTextField(int)
+     */
+    public AbstractIdTextField(Class<T> klass, int columns) {
+        super(columns);
+        T validator = null;
+        try {
+            if (klass != null) {
+                validator = klass.getConstructor(JTextComponent.class).newInstance(this);
+            }
+        } catch (Exception e) {
+            Main.error(e);
+        } finally {
+            this.validator = validator;
+        }
+    }
+
+    /**
+     * Performs the field validation
+     */
+    public final void performValidation() {
+        validator.validate();
+    }
+
+    /**
+     * Clears field if content is invalid
+     */
+    public final void clearTextIfInvalid() {
+        if (!validator.isValid()) 
+            setText("");
+        validator.validate();
+    }
+    
+    /**
+     * Reads the id(s).
+     * @return true if at least a valid id has been successfully read, false otherwise
+     */
+    public abstract boolean readIds();
+
+    /**
+     * Tries to set text from clipboard (no effect with invalid or empty clipboard)
+     */
+    public void tryToPasteFromClipboard() {
+        tryToPasteFrom(Utils.getClipboardContent());
+    }
+
+    /**
+     * Tries to set text from given contents (no effect with invalid or empty contents)
+     * @param contents The text to interprete as ID(s)
+     * @return true if text has been pasted and valid ids have been read
+     */
+    public boolean tryToPasteFrom(String contents) {
+        if (contents != null && !contents.trim().isEmpty()) {
+            setText(contents.trim());
+            clearTextIfInvalid();
+            return readIds();
+        }
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java b/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java
index 6b6bc05..c27a114 100644
--- a/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java
+++ b/src/org/openstreetmap/josm/gui/widgets/ChangesetIdTextField.java
@@ -1,89 +1,89 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.text.JTextComponent;
-
-/**
- * A text field designed to enter a single OSM changeset ID.
- * @since 5765
- */
-public class ChangesetIdTextField extends AbstractIdTextField<ChangesetIdTextField.ChangesetIdValidator> {
-
-    /**
-     * Constructs a new {@link ChangesetIdTextField}
-     */
-    public ChangesetIdTextField() {
-        super(ChangesetIdValidator.class, 10);
-    }
-
-    /**
-     * Gets the entered changeset id.
-     * @return The entered changeset id
-     */
-    public final int getChangesetId() {
-        return validator.id;
-    }
-    
-    /**
-     * Reads the changeset id.
-     * @return true if a valid changeset id has been successfully read, false otherwise
-     * @see ChangesetIdValidator#readChangesetId
-     */
-    @Override
-    public boolean readIds() {
-        return validator.readChangesetId();
-    }
-    
-    /**
-     * Validator for a changeset ID entered in a {@link JTextComponent}.
-     */
-    public static class ChangesetIdValidator extends AbstractTextComponentValidator {
-        
-        private int id = 0;
-
-        /**
-         * Constructs a new {@link ChangesetIdValidator}
-         * @param tc The text component to validate
-         */
-        public ChangesetIdValidator(JTextComponent tc) {
-            super(tc);
-        }
-
-        @Override
-        public boolean isValid() {
-            return readChangesetId();
-        }
-
-        @Override
-        public void validate() {
-            if (!isValid()) {
-                feedbackInvalid(tr("The current value is not a valid changeset ID. Please enter an integer value > 0"));
-            } else {
-                feedbackValid(tr("Please enter an integer value > 0"));
-            }
-        }
-        
-        /**
-         * Reads the changeset id.
-         * @return true if a valid changeset id has been successfully read, false otherwise
-         */
-        public boolean readChangesetId() {
-            String value = getComponent().getText();
-            if (value != null && !value.trim().isEmpty()) {
-                id = 0;
-                try {
-                    int changesetId = Integer.parseInt(value.trim());
-                    if (changesetId > 0) {
-                        id = changesetId;
-                        return true;
-                    }
-                } catch(NumberFormatException e) {
-                    // Ignored
-                }
-            }
-            return false;
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.text.JTextComponent;
+
+/**
+ * A text field designed to enter a single OSM changeset ID.
+ * @since 5765
+ */
+public class ChangesetIdTextField extends AbstractIdTextField<ChangesetIdTextField.ChangesetIdValidator> {
+
+    /**
+     * Constructs a new {@link ChangesetIdTextField}
+     */
+    public ChangesetIdTextField() {
+        super(ChangesetIdValidator.class, 10);
+    }
+
+    /**
+     * Gets the entered changeset id.
+     * @return The entered changeset id
+     */
+    public final int getChangesetId() {
+        return validator.id;
+    }
+    
+    /**
+     * Reads the changeset id.
+     * @return true if a valid changeset id has been successfully read, false otherwise
+     * @see ChangesetIdValidator#readChangesetId
+     */
+    @Override
+    public boolean readIds() {
+        return validator.readChangesetId();
+    }
+    
+    /**
+     * Validator for a changeset ID entered in a {@link JTextComponent}.
+     */
+    public static class ChangesetIdValidator extends AbstractTextComponentValidator {
+        
+        private int id = 0;
+
+        /**
+         * Constructs a new {@link ChangesetIdValidator}
+         * @param tc The text component to validate
+         */
+        public ChangesetIdValidator(JTextComponent tc) {
+            super(tc);
+        }
+
+        @Override
+        public boolean isValid() {
+            return readChangesetId();
+        }
+
+        @Override
+        public void validate() {
+            if (!isValid()) {
+                feedbackInvalid(tr("The current value is not a valid changeset ID. Please enter an integer value > 0"));
+            } else {
+                feedbackValid(tr("Please enter an integer value > 0"));
+            }
+        }
+        
+        /**
+         * Reads the changeset id.
+         * @return true if a valid changeset id has been successfully read, false otherwise
+         */
+        public boolean readChangesetId() {
+            String value = getComponent().getText();
+            if (value != null && !value.trim().isEmpty()) {
+                id = 0;
+                try {
+                    int changesetId = Integer.parseInt(value.trim());
+                    if (changesetId > 0) {
+                        id = changesetId;
+                        return true;
+                    }
+                } catch(NumberFormatException e) {
+                    // Ignored
+                }
+            }
+            return false;
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java b/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java
index ce4339d..0e98866 100644
--- a/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java
+++ b/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java
@@ -1,127 +1,127 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSlider;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerDateModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.date.DateUtils;
-
-/**
- * Widget originally created for date filtering of GPX tracks.
- * Allows to enter the date or choose it by using slider
- * @since 5815
- */
-public class DateEditorWithSlider extends JPanel {
-    private JSpinner spinner;
-    private JSlider slider;
-    private Date dateMin;
-    private Date dateMax;
-    private static final int MAX_SLIDER=300;
-    private boolean watchSlider = true;
-
-    private List<ChangeListener> listeners = new ArrayList<>();
-
-    /**
-     * Constructs a new {@code DateEditorWithSlider} with a given label
-     * @param labelText The label to display
-     */
-    public DateEditorWithSlider(String labelText) {
-        super(new GridBagLayout());
-        spinner = new JSpinner( new SpinnerDateModel() );
-        String pattern = ((SimpleDateFormat)DateUtils.getDateFormat(DateFormat.DEFAULT)).toPattern();
-        JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(spinner,pattern);
-        spinner.setEditor(timeEditor);
-
-        spinner.setPreferredSize(new Dimension(spinner.getPreferredSize().width+5,
-        spinner.getPreferredSize().height));
-
-        slider = new JSlider(0,MAX_SLIDER);
-        spinner.addChangeListener(new ChangeListener() {
-            @Override
-            public void stateChanged(ChangeEvent e) {
-                int i = slider.getValue();
-                Date d = (Date) spinner.getValue();
-                int j = intFromDate(d);
-                if (i!=j) {
-                    watchSlider=false;
-                    slider.setValue(j);
-                    watchSlider=true;
-                }
-                for (ChangeListener l : listeners) {
-                    l.stateChanged(e);
-                }
-            }
-        });
-        slider.addChangeListener(new ChangeListener() {
-            @Override
-            public void stateChanged(ChangeEvent e) {
-                if (!watchSlider) return;
-                Date d = (Date) spinner.getValue();
-                Date d1 = dateFromInt(slider.getValue());
-                if (!d.equals(d1)) {
-                    spinner.setValue(d1);
-                }
-            }
-        });
-        add(new JLabel(labelText),GBC.std());
-        add(spinner,GBC.std().insets(10,0,0,0));
-        add(slider,GBC.eol().insets(10,0,0,0).fill(GBC.HORIZONTAL));
-
-        dateMin = new Date(0);
-        dateMax = new Date();
-    }
-
-    protected Date dateFromInt(int value) {
-        double k = 1.0*value/MAX_SLIDER;
-        return new Date((long)(dateMax.getTime()*k+ dateMin.getTime()*(1-k)));
-    }
-
-    protected int intFromDate(Date date) {
-        return (int)(300.0*(date.getTime()-dateMin.getTime()) /
-                (dateMax.getTime()-dateMin.getTime()));
-    }
-
-    public void setRange(Date dateMin, Date dateMax) {
-        this.dateMin = dateMin;
-        this.dateMax = dateMax;
-    }
-
-    public void setDate(Date date) {
-        spinner.setValue(date);
-    }
-
-    public Date getDate() {
-        return (Date) spinner.getValue();
-    }
-
-    public void addDateListener(ChangeListener l) {
-        listeners.add(l);
-    }
-
-    public void removeDateListener(ChangeListener l) {
-        listeners.remove(l);
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        super.setEnabled(enabled);
-        for (Component c: getComponents()) {
-            c.setEnabled(enabled);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerDateModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.date.DateUtils;
+
+/**
+ * Widget originally created for date filtering of GPX tracks.
+ * Allows to enter the date or choose it by using slider
+ * @since 5815
+ */
+public class DateEditorWithSlider extends JPanel {
+    private JSpinner spinner;
+    private JSlider slider;
+    private Date dateMin;
+    private Date dateMax;
+    private static final int MAX_SLIDER=300;
+    private boolean watchSlider = true;
+
+    private List<ChangeListener> listeners = new ArrayList<>();
+
+    /**
+     * Constructs a new {@code DateEditorWithSlider} with a given label
+     * @param labelText The label to display
+     */
+    public DateEditorWithSlider(String labelText) {
+        super(new GridBagLayout());
+        spinner = new JSpinner( new SpinnerDateModel() );
+        String pattern = ((SimpleDateFormat)DateUtils.getDateFormat(DateFormat.DEFAULT)).toPattern();
+        JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(spinner,pattern);
+        spinner.setEditor(timeEditor);
+
+        spinner.setPreferredSize(new Dimension(spinner.getPreferredSize().width+5,
+        spinner.getPreferredSize().height));
+
+        slider = new JSlider(0,MAX_SLIDER);
+        spinner.addChangeListener(new ChangeListener() {
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                int i = slider.getValue();
+                Date d = (Date) spinner.getValue();
+                int j = intFromDate(d);
+                if (i!=j) {
+                    watchSlider=false;
+                    slider.setValue(j);
+                    watchSlider=true;
+                }
+                for (ChangeListener l : listeners) {
+                    l.stateChanged(e);
+                }
+            }
+        });
+        slider.addChangeListener(new ChangeListener() {
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                if (!watchSlider) return;
+                Date d = (Date) spinner.getValue();
+                Date d1 = dateFromInt(slider.getValue());
+                if (!d.equals(d1)) {
+                    spinner.setValue(d1);
+                }
+            }
+        });
+        add(new JLabel(labelText),GBC.std());
+        add(spinner,GBC.std().insets(10,0,0,0));
+        add(slider,GBC.eol().insets(10,0,0,0).fill(GBC.HORIZONTAL));
+
+        dateMin = new Date(0);
+        dateMax = new Date();
+    }
+
+    protected Date dateFromInt(int value) {
+        double k = 1.0*value/MAX_SLIDER;
+        return new Date((long)(dateMax.getTime()*k+ dateMin.getTime()*(1-k)));
+    }
+
+    protected int intFromDate(Date date) {
+        return (int)(300.0*(date.getTime()-dateMin.getTime()) /
+                (dateMax.getTime()-dateMin.getTime()));
+    }
+
+    public void setRange(Date dateMin, Date dateMax) {
+        this.dateMin = dateMin;
+        this.dateMax = dateMax;
+    }
+
+    public void setDate(Date date) {
+        spinner.setValue(date);
+    }
+
+    public Date getDate() {
+        return (Date) spinner.getValue();
+    }
+
+    public void addDateListener(ChangeListener l) {
+        listeners.add(l);
+    }
+
+    public void removeDateListener(ChangeListener l) {
+        listeners.remove(l);
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        super.setEnabled(enabled);
+        for (Component c: getComponents()) {
+            c.setEnabled(enabled);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/DisableShortcutsOnFocusGainedTextField.java b/src/org/openstreetmap/josm/gui/widgets/DisableShortcutsOnFocusGainedTextField.java
index b83dbbb..a67dc86 100644
--- a/src/org/openstreetmap/josm/gui/widgets/DisableShortcutsOnFocusGainedTextField.java
+++ b/src/org/openstreetmap/josm/gui/widgets/DisableShortcutsOnFocusGainedTextField.java
@@ -1,191 +1,191 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.event.FocusEvent;
-import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.swing.Action;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
-import javax.swing.text.Document;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.tools.Pair;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- * A JTextField that disabled all JOSM shortcuts composed of a single key without modifier (except F1 to F12),
- * in order to avoid them to be triggered while typing.
- * This allows to include text fields in toggle dialogs (needed for relation filter).
- * @since 5696
- */
-public class DisableShortcutsOnFocusGainedTextField extends JosmTextField {
-
-    /**
-     * Constructs a new <code>TextField</code>.  A default model is created,
-     * the initial string is <code>null</code>,
-     * and the number of columns is set to 0.
-     */
-    public DisableShortcutsOnFocusGainedTextField() {
-    }
-
-    /**
-     * Constructs a new <code>TextField</code> initialized with the
-     * specified text. A default model is created and the number of
-     * columns is 0.
-     *
-     * @param text the text to be displayed, or <code>null</code>
-     */
-    public DisableShortcutsOnFocusGainedTextField(String text) {
-        super(text);
-    }
-
-    /**
-     * Constructs a new empty <code>TextField</code> with the specified
-     * number of columns.
-     * A default model is created and the initial string is set to
-     * <code>null</code>.
-     *
-     * @param columns  the number of columns to use to calculate
-     *   the preferred width; if columns is set to zero, the
-     *   preferred width will be whatever naturally results from
-     *   the component implementation
-     */
-    public DisableShortcutsOnFocusGainedTextField(int columns) {
-        super(columns);
-    }
-
-    /**
-     * Constructs a new <code>TextField</code> initialized with the
-     * specified text and columns.  A default model is created.
-     *
-     * @param text the text to be displayed, or <code>null</code>
-     * @param columns  the number of columns to use to calculate
-     *   the preferred width; if columns is set to zero, the
-     *   preferred width will be whatever naturally results from
-     *   the component implementation
-     */
-    public DisableShortcutsOnFocusGainedTextField(String text, int columns) {
-        super(text, columns);
-    }
-
-    /**
-     * Constructs a new <code>JTextField</code> that uses the given text
-     * storage model and the given number of columns.
-     * This is the constructor through which the other constructors feed.
-     * If the document is <code>null</code>, a default model is created.
-     *
-     * @param doc  the text storage to use; if this is <code>null</code>,
-     *      a default will be provided by calling the
-     *      <code>createDefaultModel</code> method
-     * @param text  the initial string to display, or <code>null</code>
-     * @param columns  the number of columns to use to calculate
-     *   the preferred width >= 0; if <code>columns</code>
-     *   is set to zero, the preferred width will be whatever
-     *   naturally results from the component implementation
-     * @exception IllegalArgumentException if <code>columns</code> < 0
-     */
-    public DisableShortcutsOnFocusGainedTextField(Document doc, String text, int columns) {
-        super(doc, text, columns);
-    }
-
-    private final List<Pair<Action,Shortcut>> unregisteredActionShortcuts = new ArrayList<>();
-    private final Set<JosmAction> disabledMenuActions = new HashSet<>();
-
-    @Override
-    public void focusGained(FocusEvent e) {
-        super.focusGained(e);
-        disableMenuActions();
-        unregisterActionShortcuts();
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-        super.focusLost(e);
-        restoreActionShortcuts();
-        restoreMenuActions();
-    }
-
-    /**
-     * Disables all relevant menu actions.
-     * @see #hasToBeDisabled
-     */
-    protected void disableMenuActions() {
-        disabledMenuActions.clear();
-        for (int i = 0; i < Main.main.menu.getMenuCount(); i++) {
-            JMenu menu = Main.main.menu.getMenu(i);
-            if (menu != null) {
-                for (int j = 0; j < menu.getItemCount(); j++) {
-                    JMenuItem item = menu.getItem(j);
-                    if (item != null) {
-                        Action action = item.getAction();
-                        if (action instanceof JosmAction && action.isEnabled()) {
-                            Shortcut shortcut = ((JosmAction) action).getShortcut();
-                            if (shortcut != null) {
-                                KeyStroke ks = shortcut.getKeyStroke();
-                                if (hasToBeDisabled(ks)) {
-                                    action.setEnabled(false);
-                                    disabledMenuActions.add((JosmAction) action);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Unregisters all relevant action shortcuts.
-     * @see #hasToBeDisabled
-     */
-    protected void unregisterActionShortcuts() {
-        unregisteredActionShortcuts.clear();
-        // Unregister all actions without modifiers to avoid them to be triggered by typing in this text field
-        for (Shortcut shortcut : Shortcut.listAll()) {
-            KeyStroke ks = shortcut.getKeyStroke();
-            if (hasToBeDisabled(ks)) {
-                Action action = Main.getRegisteredActionShortcut(shortcut);
-                if (action != null) {
-                    Main.unregisterActionShortcut(action, shortcut);
-                    unregisteredActionShortcuts.add(new Pair<>(action,shortcut));
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns true if the given shortcut has no modifier and is not an actions key.
-     * @see KeyEvent#isActionKey()
-     */
-    protected boolean hasToBeDisabled(KeyStroke ks) {
-        return ks != null && ks.getModifiers() == 0 && !new KeyEvent(
-                this, KeyEvent.KEY_PRESSED, 0, ks.getModifiers(), ks.getKeyCode(), ks.getKeyChar()).isActionKey();
-    }
-
-    /**
-     * Restore all actions previously disabled
-     */
-    protected void restoreMenuActions() {
-        for (JosmAction a : disabledMenuActions) {
-            a.setEnabled(true);
-        }
-        disabledMenuActions.clear();
-    }
-
-    /**
-     * Restore all action shortcuts previously unregistered
-     */
-    protected void restoreActionShortcuts() {
-        for (Pair<Action,Shortcut> p : unregisteredActionShortcuts) {
-            Main.registerActionShortcut(p.a, p.b);
-        }
-        unregisteredActionShortcuts.clear();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.Action;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+import javax.swing.text.Document;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * A JTextField that disabled all JOSM shortcuts composed of a single key without modifier (except F1 to F12),
+ * in order to avoid them to be triggered while typing.
+ * This allows to include text fields in toggle dialogs (needed for relation filter).
+ * @since 5696
+ */
+public class DisableShortcutsOnFocusGainedTextField extends JosmTextField {
+
+    /**
+     * Constructs a new <code>TextField</code>.  A default model is created,
+     * the initial string is <code>null</code>,
+     * and the number of columns is set to 0.
+     */
+    public DisableShortcutsOnFocusGainedTextField() {
+    }
+
+    /**
+     * Constructs a new <code>TextField</code> initialized with the
+     * specified text. A default model is created and the number of
+     * columns is 0.
+     *
+     * @param text the text to be displayed, or <code>null</code>
+     */
+    public DisableShortcutsOnFocusGainedTextField(String text) {
+        super(text);
+    }
+
+    /**
+     * Constructs a new empty <code>TextField</code> with the specified
+     * number of columns.
+     * A default model is created and the initial string is set to
+     * <code>null</code>.
+     *
+     * @param columns  the number of columns to use to calculate
+     *   the preferred width; if columns is set to zero, the
+     *   preferred width will be whatever naturally results from
+     *   the component implementation
+     */
+    public DisableShortcutsOnFocusGainedTextField(int columns) {
+        super(columns);
+    }
+
+    /**
+     * Constructs a new <code>TextField</code> initialized with the
+     * specified text and columns.  A default model is created.
+     *
+     * @param text the text to be displayed, or <code>null</code>
+     * @param columns  the number of columns to use to calculate
+     *   the preferred width; if columns is set to zero, the
+     *   preferred width will be whatever naturally results from
+     *   the component implementation
+     */
+    public DisableShortcutsOnFocusGainedTextField(String text, int columns) {
+        super(text, columns);
+    }
+
+    /**
+     * Constructs a new <code>JTextField</code> that uses the given text
+     * storage model and the given number of columns.
+     * This is the constructor through which the other constructors feed.
+     * If the document is <code>null</code>, a default model is created.
+     *
+     * @param doc  the text storage to use; if this is <code>null</code>,
+     *      a default will be provided by calling the
+     *      <code>createDefaultModel</code> method
+     * @param text  the initial string to display, or <code>null</code>
+     * @param columns  the number of columns to use to calculate
+     *   the preferred width >= 0; if <code>columns</code>
+     *   is set to zero, the preferred width will be whatever
+     *   naturally results from the component implementation
+     * @exception IllegalArgumentException if <code>columns</code> < 0
+     */
+    public DisableShortcutsOnFocusGainedTextField(Document doc, String text, int columns) {
+        super(doc, text, columns);
+    }
+
+    private final List<Pair<Action,Shortcut>> unregisteredActionShortcuts = new ArrayList<>();
+    private final Set<JosmAction> disabledMenuActions = new HashSet<>();
+
+    @Override
+    public void focusGained(FocusEvent e) {
+        super.focusGained(e);
+        disableMenuActions();
+        unregisterActionShortcuts();
+    }
+
+    @Override
+    public void focusLost(FocusEvent e) {
+        super.focusLost(e);
+        restoreActionShortcuts();
+        restoreMenuActions();
+    }
+
+    /**
+     * Disables all relevant menu actions.
+     * @see #hasToBeDisabled
+     */
+    protected void disableMenuActions() {
+        disabledMenuActions.clear();
+        for (int i = 0; i < Main.main.menu.getMenuCount(); i++) {
+            JMenu menu = Main.main.menu.getMenu(i);
+            if (menu != null) {
+                for (int j = 0; j < menu.getItemCount(); j++) {
+                    JMenuItem item = menu.getItem(j);
+                    if (item != null) {
+                        Action action = item.getAction();
+                        if (action instanceof JosmAction && action.isEnabled()) {
+                            Shortcut shortcut = ((JosmAction) action).getShortcut();
+                            if (shortcut != null) {
+                                KeyStroke ks = shortcut.getKeyStroke();
+                                if (hasToBeDisabled(ks)) {
+                                    action.setEnabled(false);
+                                    disabledMenuActions.add((JosmAction) action);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Unregisters all relevant action shortcuts.
+     * @see #hasToBeDisabled
+     */
+    protected void unregisterActionShortcuts() {
+        unregisteredActionShortcuts.clear();
+        // Unregister all actions without modifiers to avoid them to be triggered by typing in this text field
+        for (Shortcut shortcut : Shortcut.listAll()) {
+            KeyStroke ks = shortcut.getKeyStroke();
+            if (hasToBeDisabled(ks)) {
+                Action action = Main.getRegisteredActionShortcut(shortcut);
+                if (action != null) {
+                    Main.unregisterActionShortcut(action, shortcut);
+                    unregisteredActionShortcuts.add(new Pair<>(action,shortcut));
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns true if the given shortcut has no modifier and is not an actions key.
+     * @see KeyEvent#isActionKey()
+     */
+    protected boolean hasToBeDisabled(KeyStroke ks) {
+        return ks != null && ks.getModifiers() == 0 && !new KeyEvent(
+                this, KeyEvent.KEY_PRESSED, 0, ks.getModifiers(), ks.getKeyCode(), ks.getKeyChar()).isActionKey();
+    }
+
+    /**
+     * Restore all actions previously disabled
+     */
+    protected void restoreMenuActions() {
+        for (JosmAction a : disabledMenuActions) {
+            a.setEnabled(true);
+        }
+        disabledMenuActions.clear();
+    }
+
+    /**
+     * Restore all action shortcuts previously unregistered
+     */
+    protected void restoreActionShortcuts() {
+        for (Pair<Action,Shortcut> p : unregisteredActionShortcuts) {
+            Main.registerActionShortcut(p.a, p.b);
+        }
+        unregisteredActionShortcuts.clear();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java b/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java
index e5a6d65..3e4ceb3 100644
--- a/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java
+++ b/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java
@@ -1,233 +1,233 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.DiskAccessAction;
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
-import org.openstreetmap.josm.actions.SaveActionBase;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
-
-/**
- * A chained utility class used to create and open {@link AbstractFileChooser} dialogs.<br>
- * Use only this class if you need to control specifically your AbstractFileChooser dialog.<br>
- * <p>
- * A simpler usage is to call the {@link DiskAccessAction#createAndOpenFileChooser} methods.
- *
- * @since 5438 (creation)
- * @since 7578 (rename)
- */
-public class FileChooserManager {
-
-    /**
-     * Property to enable use of native file dialogs.
-     */
-    public static final BooleanProperty PROP_USE_NATIVE_FILE_DIALOG = new BooleanProperty("use.native.file.dialog",
-            // Native dialogs do not support file filters, so do not set them as default, except for OS X where they never worked
-            Main.isPlatformOsx());
-
-    private final boolean open;
-    private final String lastDirProperty;
-    private final String curDir;
-
-    private AbstractFileChooser fc;
-
-    /**
-     * Creates a new {@code FileChooserManager}.
-     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
-     * @see #createFileChooser
-     */
-    public FileChooserManager(boolean open) {
-        this(open, null);
-    }
-
-    /**
-     * Creates a new {@code FileChooserManager}.
-     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
-     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the AbstractFileChooser.
-     *                        Then, if the user effectively chooses a file or a directory, this property will be updated to the directory path.
-     * @see #createFileChooser
-     */
-    public FileChooserManager(boolean open, String lastDirProperty) {
-        this(open, lastDirProperty, null);
-    }
-
-    /**
-     * Creates a new {@code FileChooserManager}.
-     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
-     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the AbstractFileChooser.
-     *                        Then, if the user effectively chooses a file or a directory, this property will be updated to the directory path.
-     * @param defaultDir The default directory used to initialize the AbstractFileChooser if the {@code lastDirProperty} property value is missing.
-     * @see #createFileChooser
-     */
-    public FileChooserManager(boolean open, String lastDirProperty, String defaultDir) {
-        this.open = open;
-        this.lastDirProperty = lastDirProperty == null || lastDirProperty.isEmpty() ? "lastDirectory" : lastDirProperty;
-        this.curDir = Main.pref.get(this.lastDirProperty).isEmpty() ?
-                (defaultDir == null || defaultDir.isEmpty() ? "." : defaultDir)
-                : Main.pref.get(this.lastDirProperty);
-    }
-
-    /**
-     * Replies the {@code AbstractFileChooser} that has been previously created.
-     * @return The {@code AbstractFileChooser} that has been previously created, or {@code null} if it has not been created yet.
-     * @see #createFileChooser
-     */
-    public final AbstractFileChooser getFileChooser() {
-        return fc;
-    }
-
-    /**
-     * Replies the initial directory used to construct the {@code AbstractFileChooser}.
-     * @return The initial directory used to construct the {@code AbstractFileChooser}.
-     */
-    public final String getInitialDirectory() {
-        return curDir;
-    }
-
-    /**
-     * Creates a new {@link AbstractFileChooser} with default settings. All files will be accepted.
-     * @return this
-     */
-    public final FileChooserManager createFileChooser() {
-        return doCreateFileChooser(false, null, null, null, null, JFileChooser.FILES_ONLY, false);
-    }
-
-    /**
-     * Creates a new {@link AbstractFileChooser} with given settings for a single {@code FileFilter}.
-     *
-     * @param multiple If true, makes the dialog allow multiple file selections
-     * @param title The string that goes in the dialog window's title bar
-     * @param filter The only file filter that will be proposed by the dialog
-     * @param selectionMode The selection mode that allows the user to:<br><ul>
-     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
-     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
-     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
-     * @return this
-     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
-     */
-    public final FileChooserManager createFileChooser(boolean multiple, String title, FileFilter filter, int selectionMode) {
-        doCreateFileChooser(multiple, title, Collections.singleton(filter), filter, null, selectionMode, false);
-        getFileChooser().setAcceptAllFileFilterUsed(false);
-        return this;
-    }
-
-    /**
-     * Creates a new {@link AbstractFileChooser} with given settings for a collection of {@code FileFilter}s.
-     *
-     * @param multiple If true, makes the dialog allow multiple file selections
-     * @param title The string that goes in the dialog window's title bar
-     * @param filters The file filters that will be proposed by the dialog
-     * @param defaultFilter The file filter that will be selected by default
-     * @param selectionMode The selection mode that allows the user to:<br><ul>
-     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
-     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
-     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
-     * @return this
-     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, Collection, FileFilter, int, String)
-     */
-    public final FileChooserManager createFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters,
-            FileFilter defaultFilter, int selectionMode) {
-        return doCreateFileChooser(multiple, title, filters, defaultFilter, null, selectionMode, false);
-    }
-
-    /**
-     * Creates a new {@link AbstractFileChooser} with given settings for a file extension.
-     *
-     * @param multiple If true, makes the dialog allow multiple file selections
-     * @param title The string that goes in the dialog window's title bar
-     * @param extension The file extension that will be selected as the default file filter
-     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox.
-     *                 If false, only the file filters that include {@code extension} will be proposed
-     * @param selectionMode The selection mode that allows the user to:<br><ul>
-     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
-     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
-     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
-     * @return this
-     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
-     */
-    public final FileChooserManager createFileChooser(boolean multiple, String title, String extension, boolean allTypes, int selectionMode) {
-        return doCreateFileChooser(multiple, title, null, null, extension, selectionMode, allTypes);
-    }
-
-    private final FileChooserManager doCreateFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters,
-            FileFilter defaultFilter, String extension, int selectionMode, boolean allTypes) {
-        File file = new File(curDir);
-        // Use native dialog is preference is set, unless an unsupported selection mode is specifically wanted
-        if (PROP_USE_NATIVE_FILE_DIALOG.get() && NativeFileChooser.supportsSelectionMode(selectionMode)) {
-            fc = new NativeFileChooser(file);
-        } else {
-            fc = new SwingFileChooser(file);
-        }
-
-        if (title != null) {
-            fc.setDialogTitle(title);
-        }
-
-        fc.setFileSelectionMode(selectionMode);
-        fc.setMultiSelectionEnabled(multiple);
-        fc.setAcceptAllFileFilterUsed(false);
-
-        if (filters != null) {
-            for (FileFilter filter : filters) {
-                fc.addChoosableFileFilter(filter);
-            }
-            if (defaultFilter != null) {
-                fc.setFileFilter(defaultFilter);
-            }
-        } else if (open) {
-            ExtensionFileFilter.applyChoosableImportFileFilters(fc, extension, allTypes);
-        } else {
-            ExtensionFileFilter.applyChoosableExportFileFilters(fc, extension, allTypes);
-        }
-        return this;
-    }
-
-    /**
-     * Opens the {@code AbstractFileChooser} that has been created. Nothing happens if it has not been created yet.
-     * @return the {@code AbstractFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog.
-     */
-    public final AbstractFileChooser openFileChooser() {
-        return openFileChooser(null);
-    }
-
-    /**
-     * Opens the {@code AbstractFileChooser} that has been created and waits for the user to choose a file/directory, or cancel the dialog.<br>
-     * Nothing happens if the dialog has not been created yet.<br>
-     * When the user choses a file or directory, the {@code lastDirProperty} is updated to the chosen directory path.
-     *
-     * @param parent The Component used as the parent of the AbstractFileChooser. If null, uses {@code Main.parent}.
-     * @return the {@code AbstractFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog.
-     */
-    public AbstractFileChooser openFileChooser(Component parent) {
-        if (fc != null) {
-            if (parent == null) {
-                parent = Main.parent;
-            }
-
-            int answer = open ? fc.showOpenDialog(parent) : fc.showSaveDialog(parent);
-            if (answer != JFileChooser.APPROVE_OPTION) {
-                return null;
-            }
-
-            if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-                Main.pref.put(lastDirProperty, fc.getCurrentDirectory().getAbsolutePath());
-            }
-
-            if (!open) {
-                File file = fc.getSelectedFile();
-                if (!SaveActionBase.confirmOverwrite(file)) {
-                    return null;
-                }
-            }
-        }
-        return fc;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DiskAccessAction;
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.actions.SaveActionBase;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+
+/**
+ * A chained utility class used to create and open {@link AbstractFileChooser} dialogs.<br>
+ * Use only this class if you need to control specifically your AbstractFileChooser dialog.<br>
+ * <p>
+ * A simpler usage is to call the {@link DiskAccessAction#createAndOpenFileChooser} methods.
+ *
+ * @since 5438 (creation)
+ * @since 7578 (rename)
+ */
+public class FileChooserManager {
+
+    /**
+     * Property to enable use of native file dialogs.
+     */
+    public static final BooleanProperty PROP_USE_NATIVE_FILE_DIALOG = new BooleanProperty("use.native.file.dialog",
+            // Native dialogs do not support file filters, so do not set them as default, except for OS X where they never worked
+            Main.isPlatformOsx());
+
+    private final boolean open;
+    private final String lastDirProperty;
+    private final String curDir;
+
+    private AbstractFileChooser fc;
+
+    /**
+     * Creates a new {@code FileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @see #createFileChooser
+     */
+    public FileChooserManager(boolean open) {
+        this(open, null);
+    }
+
+    /**
+     * Creates a new {@code FileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the AbstractFileChooser.
+     *                        Then, if the user effectively chooses a file or a directory, this property will be updated to the directory path.
+     * @see #createFileChooser
+     */
+    public FileChooserManager(boolean open, String lastDirProperty) {
+        this(open, lastDirProperty, null);
+    }
+
+    /**
+     * Creates a new {@code FileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the AbstractFileChooser.
+     *                        Then, if the user effectively chooses a file or a directory, this property will be updated to the directory path.
+     * @param defaultDir The default directory used to initialize the AbstractFileChooser if the {@code lastDirProperty} property value is missing.
+     * @see #createFileChooser
+     */
+    public FileChooserManager(boolean open, String lastDirProperty, String defaultDir) {
+        this.open = open;
+        this.lastDirProperty = lastDirProperty == null || lastDirProperty.isEmpty() ? "lastDirectory" : lastDirProperty;
+        this.curDir = Main.pref.get(this.lastDirProperty).isEmpty() ?
+                (defaultDir == null || defaultDir.isEmpty() ? "." : defaultDir)
+                : Main.pref.get(this.lastDirProperty);
+    }
+
+    /**
+     * Replies the {@code AbstractFileChooser} that has been previously created.
+     * @return The {@code AbstractFileChooser} that has been previously created, or {@code null} if it has not been created yet.
+     * @see #createFileChooser
+     */
+    public final AbstractFileChooser getFileChooser() {
+        return fc;
+    }
+
+    /**
+     * Replies the initial directory used to construct the {@code AbstractFileChooser}.
+     * @return The initial directory used to construct the {@code AbstractFileChooser}.
+     */
+    public final String getInitialDirectory() {
+        return curDir;
+    }
+
+    /**
+     * Creates a new {@link AbstractFileChooser} with default settings. All files will be accepted.
+     * @return this
+     */
+    public final FileChooserManager createFileChooser() {
+        return doCreateFileChooser(false, null, null, null, null, JFileChooser.FILES_ONLY, false);
+    }
+
+    /**
+     * Creates a new {@link AbstractFileChooser} with given settings for a single {@code FileFilter}.
+     *
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filter The only file filter that will be proposed by the dialog
+     * @param selectionMode The selection mode that allows the user to:<br><ul>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
+     */
+    public final FileChooserManager createFileChooser(boolean multiple, String title, FileFilter filter, int selectionMode) {
+        doCreateFileChooser(multiple, title, Collections.singleton(filter), filter, null, selectionMode, false);
+        getFileChooser().setAcceptAllFileFilterUsed(false);
+        return this;
+    }
+
+    /**
+     * Creates a new {@link AbstractFileChooser} with given settings for a collection of {@code FileFilter}s.
+     *
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filters The file filters that will be proposed by the dialog
+     * @param defaultFilter The file filter that will be selected by default
+     * @param selectionMode The selection mode that allows the user to:<br><ul>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, Collection, FileFilter, int, String)
+     */
+    public final FileChooserManager createFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters,
+            FileFilter defaultFilter, int selectionMode) {
+        return doCreateFileChooser(multiple, title, filters, defaultFilter, null, selectionMode, false);
+    }
+
+    /**
+     * Creates a new {@link AbstractFileChooser} with given settings for a file extension.
+     *
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param extension The file extension that will be selected as the default file filter
+     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox.
+     *                 If false, only the file filters that include {@code extension} will be proposed
+     * @param selectionMode The selection mode that allows the user to:<br><ul>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li>
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li>
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li></ul>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
+     */
+    public final FileChooserManager createFileChooser(boolean multiple, String title, String extension, boolean allTypes, int selectionMode) {
+        return doCreateFileChooser(multiple, title, null, null, extension, selectionMode, allTypes);
+    }
+
+    private final FileChooserManager doCreateFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters,
+            FileFilter defaultFilter, String extension, int selectionMode, boolean allTypes) {
+        File file = new File(curDir);
+        // Use native dialog is preference is set, unless an unsupported selection mode is specifically wanted
+        if (PROP_USE_NATIVE_FILE_DIALOG.get() && NativeFileChooser.supportsSelectionMode(selectionMode)) {
+            fc = new NativeFileChooser(file);
+        } else {
+            fc = new SwingFileChooser(file);
+        }
+
+        if (title != null) {
+            fc.setDialogTitle(title);
+        }
+
+        fc.setFileSelectionMode(selectionMode);
+        fc.setMultiSelectionEnabled(multiple);
+        fc.setAcceptAllFileFilterUsed(false);
+
+        if (filters != null) {
+            for (FileFilter filter : filters) {
+                fc.addChoosableFileFilter(filter);
+            }
+            if (defaultFilter != null) {
+                fc.setFileFilter(defaultFilter);
+            }
+        } else if (open) {
+            ExtensionFileFilter.applyChoosableImportFileFilters(fc, extension, allTypes);
+        } else {
+            ExtensionFileFilter.applyChoosableExportFileFilters(fc, extension, allTypes);
+        }
+        return this;
+    }
+
+    /**
+     * Opens the {@code AbstractFileChooser} that has been created. Nothing happens if it has not been created yet.
+     * @return the {@code AbstractFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog.
+     */
+    public final AbstractFileChooser openFileChooser() {
+        return openFileChooser(null);
+    }
+
+    /**
+     * Opens the {@code AbstractFileChooser} that has been created and waits for the user to choose a file/directory, or cancel the dialog.<br>
+     * Nothing happens if the dialog has not been created yet.<br>
+     * When the user choses a file or directory, the {@code lastDirProperty} is updated to the chosen directory path.
+     *
+     * @param parent The Component used as the parent of the AbstractFileChooser. If null, uses {@code Main.parent}.
+     * @return the {@code AbstractFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog.
+     */
+    public AbstractFileChooser openFileChooser(Component parent) {
+        if (fc != null) {
+            if (parent == null) {
+                parent = Main.parent;
+            }
+
+            int answer = open ? fc.showOpenDialog(parent) : fc.showSaveDialog(parent);
+            if (answer != JFileChooser.APPROVE_OPTION) {
+                return null;
+            }
+
+            if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
+                Main.pref.put(lastDirProperty, fc.getCurrentDirectory().getAbsolutePath());
+            }
+
+            if (!open) {
+                File file = fc.getSelectedFile();
+                if (!SaveActionBase.confirmOverwrite(file)) {
+                    return null;
+                }
+            }
+        }
+        return fc;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java b/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
index 315b442..fcd7faa 100644
--- a/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
@@ -1,56 +1,56 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.GridBagLayout;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * A small user interface component that consists of an image label and
- * a fixed text content to the right of the image.
- * @since 5965
- */
-public class ImageLabel extends JPanel {
-    private JLabel tf;
-    private int charCount;
-
-    /**
-     * Constructs a new {@code ImageLabel}.
-     * @param img Image name (without .png extension) to find in {@code statusline} directory
-     * @param tooltip Tooltip text to display
-     * @param charCount Character count used to compute min/preferred size
-     * @param background The background color
-     */
-    public ImageLabel(String img, String tooltip, int charCount, Color background) {
-        setLayout(new GridBagLayout());
-        setBackground(background);
-        add(new JLabel(ImageProvider.get("statusline/"+img+".png")), GBC.std().anchor(GBC.WEST).insets(0,1,1,0));
-        add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2,1,1,0));
-        setToolTipText(tooltip);
-        this.charCount = charCount;
-    }
-
-    /**
-     * Sets the text to display.
-     * @param t text to display
-     */
-    public void setText(String t) {
-        tf.setText(t);
-    }
-
-    @Override
-    public Dimension getPreferredSize() {
-        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getPreferredSize().height);
-    }
-
-    @Override
-    public Dimension getMinimumSize() {
-        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getMinimumSize().height);
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * A small user interface component that consists of an image label and
+ * a fixed text content to the right of the image.
+ * @since 5965
+ */
+public class ImageLabel extends JPanel {
+    private JLabel tf;
+    private int charCount;
+
+    /**
+     * Constructs a new {@code ImageLabel}.
+     * @param img Image name (without .png extension) to find in {@code statusline} directory
+     * @param tooltip Tooltip text to display
+     * @param charCount Character count used to compute min/preferred size
+     * @param background The background color
+     */
+    public ImageLabel(String img, String tooltip, int charCount, Color background) {
+        setLayout(new GridBagLayout());
+        setBackground(background);
+        add(new JLabel(ImageProvider.get("statusline/"+img+".png")), GBC.std().anchor(GBC.WEST).insets(0,1,1,0));
+        add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2,1,1,0));
+        setToolTipText(tooltip);
+        this.charCount = charCount;
+    }
+
+    /**
+     * Sets the text to display.
+     * @param t text to display
+     */
+    public void setText(String t) {
+        tf.setText(t);
+    }
+
+    @Override
+    public Dimension getPreferredSize() {
+        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getPreferredSize().height);
+    }
+
+    @Override
+    public Dimension getMinimumSize() {
+        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getMinimumSize().height);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java b/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
index af8ccbd..0f6d0ad 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
@@ -1,243 +1,243 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Toolkit;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import javax.accessibility.Accessible;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.JList;
-import javax.swing.plaf.basic.ComboPopup;
-import javax.swing.text.JTextComponent;
-
-/**
- * Class overriding each {@link JComboBox} in JOSM to control consistently the number of displayed items at once.<br>
- * This is needed because of the default Java behaviour that may display the top-down list off the screen (see #7917).
- * @param <E> the type of the elements of this combo box
- *
- * @since 5429 (creation)
- * @since 7015 (generics for Java 7)
- */
-public class JosmComboBox<E> extends JComboBox<E> {
-
-    /**
-     * Creates a <code>JosmComboBox</code> with a default data model.
-     * The default data model is an empty list of objects.
-     * Use <code>addItem</code> to add items. By default the first item
-     * in the data model becomes selected.
-     *
-     * @see DefaultComboBoxModel
-     */
-    public JosmComboBox() {
-        init(null);
-    }
-
-    /**
-     * Creates a <code>JosmComboBox</code> with a default data model and
-     * the specified prototype display value.
-     * The default data model is an empty list of objects.
-     * Use <code>addItem</code> to add items. By default the first item
-     * in the data model becomes selected.
-     *
-     * @param prototypeDisplayValue the <code>Object</code> used to compute
-     *      the maximum number of elements to be displayed at once before
-     *      displaying a scroll bar
-     *
-     * @see DefaultComboBoxModel
-     * @since 5450
-     */
-    public JosmComboBox(E prototypeDisplayValue) {
-        init(prototypeDisplayValue);
-    }
-
-    /**
-     * Creates a <code>JosmComboBox</code> that takes its items from an
-     * existing <code>ComboBoxModel</code>. Since the
-     * <code>ComboBoxModel</code> is provided, a combo box created using
-     * this constructor does not create a default combo box model and
-     * may impact how the insert, remove and add methods behave.
-     *
-     * @param aModel the <code>ComboBoxModel</code> that provides the
-     *      displayed list of items
-     * @see DefaultComboBoxModel
-     */
-    public JosmComboBox(ComboBoxModel<E> aModel) {
-        super(aModel);
-        List<E> list = new ArrayList<>(aModel.getSize());
-        for (int i = 0; i<aModel.getSize(); i++) {
-            list.add(aModel.getElementAt(i));
-        }
-        init(findPrototypeDisplayValue(list));
-    }
-
-    /**
-     * Creates a <code>JosmComboBox</code> that contains the elements
-     * in the specified array. By default the first item in the array
-     * (and therefore the data model) becomes selected.
-     *
-     * @param items  an array of objects to insert into the combo box
-     * @see DefaultComboBoxModel
-     */
-    public JosmComboBox(E[] items) {
-        super(items);
-        init(findPrototypeDisplayValue(Arrays.asList(items)));
-    }
-
-    /**
-     * Finds the prototype display value to use among the given possible candidates.
-     * @param possibleValues The possible candidates that will be iterated.
-     * @return The value that needs the largest display height on screen.
-     * @since 5558
-     */
-    protected final E findPrototypeDisplayValue(Collection<E> possibleValues) {
-        E result = null;
-        int maxHeight = -1;
-        if (possibleValues != null) {
-            // Remind old prototype to restore it later
-            E oldPrototype = getPrototypeDisplayValue();
-            // Get internal JList to directly call the renderer
-            JList<E> list = getList();
-            try {
-                // Index to give to renderer
-                int i = 0;
-                for (E value : possibleValues) {
-                    if (value != null) {
-                        // With a "classic" renderer, we could call setPrototypeDisplayValue(value) + getPreferredSize()
-                        // but not with TaggingPreset custom renderer that return a dummy height if index is equal to -1
-                        // So we explicitely call the renderer by simulating a correct index for the current value
-                        Component c = getRenderer().getListCellRendererComponent(list, value, i, true, true);
-                        if (c != null) {
-                            // Get the real preferred size for the current value
-                            Dimension dim = c.getPreferredSize();
-                            if (dim.height > maxHeight) {
-                                // Larger ? This is our new prototype
-                                maxHeight = dim.height;
-                                result = value;
-                            }
-                        }
-                    }
-                    i++;
-                }
-            } finally {
-                // Restore original prototype
-                setPrototypeDisplayValue(oldPrototype);
-            }
-        }
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    protected final JList<E> getList() {
-        for (int i = 0; i < getUI().getAccessibleChildrenCount(this); i++) {
-            Accessible child = getUI().getAccessibleChild(this, i);
-            if (child instanceof ComboPopup) {
-                return ((ComboPopup)child).getList();
-            }
-        }
-        return null;
-    }
-
-    protected final void init(E prototype) {
-        if (prototype != null) {
-            setPrototypeDisplayValue(prototype);
-            int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
-            // Compute maximum number of visible items based on the preferred size of the combo box.
-            // This assumes that items have the same height as the combo box, which is not granted by the look and feel
-            int maxsize = (screenHeight/getPreferredSize().height) / 2;
-            // If possible, adjust the maximum number of items with the real height of items
-            // It is not granted this works on every platform (tested OK on Windows)
-            JList<E> list = getList();
-            if (list != null) {
-                if (!prototype.equals(list.getPrototypeCellValue())) {
-                    list.setPrototypeCellValue(prototype);
-                }
-                int height = list.getFixedCellHeight();
-                if (height > 0) {
-                    maxsize = (screenHeight/height) / 2;
-                }
-            }
-            setMaximumRowCount(Math.max(getMaximumRowCount(), maxsize));
-        }
-        // Handle text contextual menus for editable comboboxes
-        ContextMenuHandler handler = new ContextMenuHandler();
-        addPropertyChangeListener("editable", handler);
-        addPropertyChangeListener("editor", handler);
-    }
-
-    protected class ContextMenuHandler extends MouseAdapter implements PropertyChangeListener {
-
-        private JTextComponent component;
-        private PopupMenuLauncher launcher;
-
-        @Override public void propertyChange(PropertyChangeEvent evt) {
-            if ("editable".equals(evt.getPropertyName())) {
-                if (evt.getNewValue().equals(true)) {
-                    enableMenu();
-                } else {
-                    disableMenu();
-                }
-            } else if ("editor".equals(evt.getPropertyName())) {
-                disableMenu();
-                if (isEditable()) {
-                    enableMenu();
-                }
-            }
-        }
-
-        private void enableMenu() {
-            if (launcher == null && editor != null) {
-                Component editorComponent = editor.getEditorComponent();
-                if (editorComponent instanceof JTextComponent) {
-                    component = (JTextComponent) editorComponent;
-                    component.addMouseListener(this);
-                    launcher = TextContextualPopupMenu.enableMenuFor(component);
-                }
-            }
-        }
-
-        private void disableMenu() {
-            if (launcher != null) {
-                TextContextualPopupMenu.disableMenuFor(component, launcher);
-                launcher = null;
-                component.removeMouseListener(this);
-                component = null;
-            }
-        }
-
-        @Override
-        public void mousePressed(MouseEvent e) {
-            processEvent(e);
-        }
-
-        @Override
-        public void mouseReleased(MouseEvent e) {
-            processEvent(e);
-        }
-
-        private void processEvent(MouseEvent e) {
-            if (launcher != null && !e.isPopupTrigger() && launcher.getMenu().isShowing()) {
-                launcher.getMenu().setVisible(false);
-            }
-        }
-    }
-
-    /**
-     * Reinitializes this {@link JosmComboBox} to the specified values. This may needed if a custom renderer is used.
-     * @param values The values displayed in the combo box.
-     * @since 5558
-     */
-    public final void reinitialize(Collection<E> values) {
-        init(findPrototypeDisplayValue(values));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import javax.accessibility.Accessible;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.plaf.basic.ComboPopup;
+import javax.swing.text.JTextComponent;
+
+/**
+ * Class overriding each {@link JComboBox} in JOSM to control consistently the number of displayed items at once.<br>
+ * This is needed because of the default Java behaviour that may display the top-down list off the screen (see #7917).
+ * @param <E> the type of the elements of this combo box
+ *
+ * @since 5429 (creation)
+ * @since 7015 (generics for Java 7)
+ */
+public class JosmComboBox<E> extends JComboBox<E> {
+
+    /**
+     * Creates a <code>JosmComboBox</code> with a default data model.
+     * The default data model is an empty list of objects.
+     * Use <code>addItem</code> to add items. By default the first item
+     * in the data model becomes selected.
+     *
+     * @see DefaultComboBoxModel
+     */
+    public JosmComboBox() {
+        init(null);
+    }
+
+    /**
+     * Creates a <code>JosmComboBox</code> with a default data model and
+     * the specified prototype display value.
+     * The default data model is an empty list of objects.
+     * Use <code>addItem</code> to add items. By default the first item
+     * in the data model becomes selected.
+     *
+     * @param prototypeDisplayValue the <code>Object</code> used to compute
+     *      the maximum number of elements to be displayed at once before
+     *      displaying a scroll bar
+     *
+     * @see DefaultComboBoxModel
+     * @since 5450
+     */
+    public JosmComboBox(E prototypeDisplayValue) {
+        init(prototypeDisplayValue);
+    }
+
+    /**
+     * Creates a <code>JosmComboBox</code> that takes its items from an
+     * existing <code>ComboBoxModel</code>. Since the
+     * <code>ComboBoxModel</code> is provided, a combo box created using
+     * this constructor does not create a default combo box model and
+     * may impact how the insert, remove and add methods behave.
+     *
+     * @param aModel the <code>ComboBoxModel</code> that provides the
+     *      displayed list of items
+     * @see DefaultComboBoxModel
+     */
+    public JosmComboBox(ComboBoxModel<E> aModel) {
+        super(aModel);
+        List<E> list = new ArrayList<>(aModel.getSize());
+        for (int i = 0; i<aModel.getSize(); i++) {
+            list.add(aModel.getElementAt(i));
+        }
+        init(findPrototypeDisplayValue(list));
+    }
+
+    /**
+     * Creates a <code>JosmComboBox</code> that contains the elements
+     * in the specified array. By default the first item in the array
+     * (and therefore the data model) becomes selected.
+     *
+     * @param items  an array of objects to insert into the combo box
+     * @see DefaultComboBoxModel
+     */
+    public JosmComboBox(E[] items) {
+        super(items);
+        init(findPrototypeDisplayValue(Arrays.asList(items)));
+    }
+
+    /**
+     * Finds the prototype display value to use among the given possible candidates.
+     * @param possibleValues The possible candidates that will be iterated.
+     * @return The value that needs the largest display height on screen.
+     * @since 5558
+     */
+    protected final E findPrototypeDisplayValue(Collection<E> possibleValues) {
+        E result = null;
+        int maxHeight = -1;
+        if (possibleValues != null) {
+            // Remind old prototype to restore it later
+            E oldPrototype = getPrototypeDisplayValue();
+            // Get internal JList to directly call the renderer
+            JList<E> list = getList();
+            try {
+                // Index to give to renderer
+                int i = 0;
+                for (E value : possibleValues) {
+                    if (value != null) {
+                        // With a "classic" renderer, we could call setPrototypeDisplayValue(value) + getPreferredSize()
+                        // but not with TaggingPreset custom renderer that return a dummy height if index is equal to -1
+                        // So we explicitely call the renderer by simulating a correct index for the current value
+                        Component c = getRenderer().getListCellRendererComponent(list, value, i, true, true);
+                        if (c != null) {
+                            // Get the real preferred size for the current value
+                            Dimension dim = c.getPreferredSize();
+                            if (dim.height > maxHeight) {
+                                // Larger ? This is our new prototype
+                                maxHeight = dim.height;
+                                result = value;
+                            }
+                        }
+                    }
+                    i++;
+                }
+            } finally {
+                // Restore original prototype
+                setPrototypeDisplayValue(oldPrototype);
+            }
+        }
+        return result;
+    }
+
+    @SuppressWarnings("unchecked")
+    protected final JList<E> getList() {
+        for (int i = 0; i < getUI().getAccessibleChildrenCount(this); i++) {
+            Accessible child = getUI().getAccessibleChild(this, i);
+            if (child instanceof ComboPopup) {
+                return ((ComboPopup)child).getList();
+            }
+        }
+        return null;
+    }
+
+    protected final void init(E prototype) {
+        if (prototype != null) {
+            setPrototypeDisplayValue(prototype);
+            int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
+            // Compute maximum number of visible items based on the preferred size of the combo box.
+            // This assumes that items have the same height as the combo box, which is not granted by the look and feel
+            int maxsize = (screenHeight/getPreferredSize().height) / 2;
+            // If possible, adjust the maximum number of items with the real height of items
+            // It is not granted this works on every platform (tested OK on Windows)
+            JList<E> list = getList();
+            if (list != null) {
+                if (!prototype.equals(list.getPrototypeCellValue())) {
+                    list.setPrototypeCellValue(prototype);
+                }
+                int height = list.getFixedCellHeight();
+                if (height > 0) {
+                    maxsize = (screenHeight/height) / 2;
+                }
+            }
+            setMaximumRowCount(Math.max(getMaximumRowCount(), maxsize));
+        }
+        // Handle text contextual menus for editable comboboxes
+        ContextMenuHandler handler = new ContextMenuHandler();
+        addPropertyChangeListener("editable", handler);
+        addPropertyChangeListener("editor", handler);
+    }
+
+    protected class ContextMenuHandler extends MouseAdapter implements PropertyChangeListener {
+
+        private JTextComponent component;
+        private PopupMenuLauncher launcher;
+
+        @Override public void propertyChange(PropertyChangeEvent evt) {
+            if ("editable".equals(evt.getPropertyName())) {
+                if (evt.getNewValue().equals(true)) {
+                    enableMenu();
+                } else {
+                    disableMenu();
+                }
+            } else if ("editor".equals(evt.getPropertyName())) {
+                disableMenu();
+                if (isEditable()) {
+                    enableMenu();
+                }
+            }
+        }
+
+        private void enableMenu() {
+            if (launcher == null && editor != null) {
+                Component editorComponent = editor.getEditorComponent();
+                if (editorComponent instanceof JTextComponent) {
+                    component = (JTextComponent) editorComponent;
+                    component.addMouseListener(this);
+                    launcher = TextContextualPopupMenu.enableMenuFor(component);
+                }
+            }
+        }
+
+        private void disableMenu() {
+            if (launcher != null) {
+                TextContextualPopupMenu.disableMenuFor(component, launcher);
+                launcher = null;
+                component.removeMouseListener(this);
+                component = null;
+            }
+        }
+
+        @Override
+        public void mousePressed(MouseEvent e) {
+            processEvent(e);
+        }
+
+        @Override
+        public void mouseReleased(MouseEvent e) {
+            processEvent(e);
+        }
+
+        private void processEvent(MouseEvent e) {
+            if (launcher != null && !e.isPopupTrigger() && launcher.getMenu().isShowing()) {
+                launcher.getMenu().setVisible(false);
+            }
+        }
+    }
+
+    /**
+     * Reinitializes this {@link JosmComboBox} to the specified values. This may needed if a custom renderer is used.
+     * @param values The values displayed in the combo box.
+     * @since 5558
+     */
+    public final void reinitialize(Collection<E> values) {
+        init(findPrototypeDisplayValue(values));
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmEditorPane.java b/src/org/openstreetmap/josm/gui/widgets/JosmEditorPane.java
index c1532bd..717398b 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmEditorPane.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmEditorPane.java
@@ -1,141 +1,141 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.text.MessageFormat;
-
-import javax.swing.JEditorPane;
-import javax.swing.LookAndFeel;
-import javax.swing.UIDefaults;
-import javax.swing.UIManager;
-import javax.swing.text.html.StyleSheet;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Subclass of {@link JEditorPane} that adds a "native" context menu (cut/copy/paste/select all)
- * and effectively uses JOSM user agent when performing HTTP request in {@link #setPage(URL)} method.
- * @since 5886
- */
-public class JosmEditorPane extends JEditorPane {
-
-    /**
-     * Creates a new <code>JosmEditorPane</code>.
-     * The document model is set to <code>null</code>.
-     */
-    public JosmEditorPane() {
-        TextContextualPopupMenu.enableMenuFor(this);
-    }
-
-    /**
-     * Creates a <code>JosmEditorPane</code> based on a specified URL for input.
-     *
-     * @param initialPage the URL
-     * @exception IOException if the URL is <code>null</code> or cannot be accessed
-     */
-    public JosmEditorPane(URL initialPage) throws IOException {
-        this();
-        setPage(initialPage);
-    }
-
-    /**
-     * Creates a <code>JosmEditorPane</code> based on a string containing
-     * a URL specification.
-     *
-     * @param url the URL
-     * @exception IOException if the URL is <code>null</code> or cannot be accessed
-     */
-    public JosmEditorPane(String url) throws IOException {
-        this();
-        setPage(url);
-    }
-
-    /**
-     * Creates a <code>JosmEditorPane</code> that has been initialized
-     * to the given text.  This is a convenience constructor that calls the
-     * <code>setContentType</code> and <code>setText</code> methods.
-     *
-     * @param type mime type of the given text
-     * @param text the text to initialize with; may be <code>null</code>
-     * @exception NullPointerException if the <code>type</code> parameter
-     *      is <code>null</code>
-     */
-    public JosmEditorPane(String type, String text) {
-        this();
-        setContentType(type);
-        setText(text);
-    }
-
-    @Override
-    protected InputStream getStream(URL page) throws IOException {
-        URLConnection conn = Utils.setupURLConnection(page.openConnection());
-        InputStream result = conn.getInputStream();
-        String type = conn.getContentType();
-        if (type != null) {
-            setContentType(type);
-        }
-        return result;
-    }
-
-    /**
-     * Adapts a {@link JEditorPane} to be used as a powerful replacement of {@link javax.swing.JLabel}.
-     * @param pane The editor pane to adapt
-     * @param allBold If {@code true}, makes all text to be displayed in bold
-     */
-    public static void makeJLabelLike(JEditorPane pane, boolean allBold) {
-        pane.setContentType("text/html");
-        pane.setOpaque(false);
-        pane.setEditable(false);
-        adaptForNimbus(pane);
-
-        JosmHTMLEditorKit kit = new JosmHTMLEditorKit();
-        final Font f = UIManager.getFont("Label.font");
-        final StyleSheet ss = new StyleSheet();
-        ss.addRule((allBold ? "html" : "strong, b") + " {" + getFontRule(f) + "}");
-        ss.addRule("a {text-decoration: underline; color: blue}");
-        ss.addRule("h1 {" + getFontRule(GuiHelper.getTitleFont()) + "}");
-        ss.addRule("ol {margin-left: 1cm; margin-top: 0.1cm; margin-bottom: 0.2cm; list-style-type: decimal}");
-        ss.addRule("ul {margin-left: 1cm; margin-top: 0.1cm; margin-bottom: 0.2cm; list-style-type: disc}");
-        if ("km".equals(Main.pref.get("language"))) {
-            // Fix rendering problem for Khmer script
-            ss.addRule("p {" + getFontRule(UIManager.getFont("Label.font")) + "}");
-        }
-        kit.setStyleSheet(ss);
-        pane.setEditorKit(kit);
-    }
-
-    /**
-     * Adapts a {@link JEditorPane} for Nimbus look and feel.
-     * See <a href="https://stackoverflow.com/q/15228336/2257172">this StackOverflow question</a>.
-     * @param pane The editor pane to adapt
-     * @since 6935
-     */
-    public static void adaptForNimbus(JEditorPane pane) {
-        LookAndFeel currentLAF = UIManager.getLookAndFeel();
-        if (currentLAF != null && "Nimbus".equals(currentLAF.getName())) {
-            Color bgColor = UIManager.getColor("Label.background");
-            UIDefaults defaults = new UIDefaults();
-            defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
-            pane.putClientProperty("Nimbus.Overrides", defaults);
-            pane.putClientProperty("Nimbus.Overrides.InheritDefaults", true);
-            pane.setBackground(bgColor);
-        }
-    }
-
-    private static String getFontRule(Font f) {
-        return MessageFormat.format(
-                "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
-                f.getName(),
-                f.getSize(),
-                "bold",
-                f.isItalic() ? "italic" : "normal"
-        );
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.MessageFormat;
+
+import javax.swing.JEditorPane;
+import javax.swing.LookAndFeel;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.text.html.StyleSheet;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Subclass of {@link JEditorPane} that adds a "native" context menu (cut/copy/paste/select all)
+ * and effectively uses JOSM user agent when performing HTTP request in {@link #setPage(URL)} method.
+ * @since 5886
+ */
+public class JosmEditorPane extends JEditorPane {
+
+    /**
+     * Creates a new <code>JosmEditorPane</code>.
+     * The document model is set to <code>null</code>.
+     */
+    public JosmEditorPane() {
+        TextContextualPopupMenu.enableMenuFor(this);
+    }
+
+    /**
+     * Creates a <code>JosmEditorPane</code> based on a specified URL for input.
+     *
+     * @param initialPage the URL
+     * @exception IOException if the URL is <code>null</code> or cannot be accessed
+     */
+    public JosmEditorPane(URL initialPage) throws IOException {
+        this();
+        setPage(initialPage);
+    }
+
+    /**
+     * Creates a <code>JosmEditorPane</code> based on a string containing
+     * a URL specification.
+     *
+     * @param url the URL
+     * @exception IOException if the URL is <code>null</code> or cannot be accessed
+     */
+    public JosmEditorPane(String url) throws IOException {
+        this();
+        setPage(url);
+    }
+
+    /**
+     * Creates a <code>JosmEditorPane</code> that has been initialized
+     * to the given text.  This is a convenience constructor that calls the
+     * <code>setContentType</code> and <code>setText</code> methods.
+     *
+     * @param type mime type of the given text
+     * @param text the text to initialize with; may be <code>null</code>
+     * @exception NullPointerException if the <code>type</code> parameter
+     *      is <code>null</code>
+     */
+    public JosmEditorPane(String type, String text) {
+        this();
+        setContentType(type);
+        setText(text);
+    }
+
+    @Override
+    protected InputStream getStream(URL page) throws IOException {
+        URLConnection conn = Utils.setupURLConnection(page.openConnection());
+        InputStream result = conn.getInputStream();
+        String type = conn.getContentType();
+        if (type != null) {
+            setContentType(type);
+        }
+        return result;
+    }
+
+    /**
+     * Adapts a {@link JEditorPane} to be used as a powerful replacement of {@link javax.swing.JLabel}.
+     * @param pane The editor pane to adapt
+     * @param allBold If {@code true}, makes all text to be displayed in bold
+     */
+    public static void makeJLabelLike(JEditorPane pane, boolean allBold) {
+        pane.setContentType("text/html");
+        pane.setOpaque(false);
+        pane.setEditable(false);
+        adaptForNimbus(pane);
+
+        JosmHTMLEditorKit kit = new JosmHTMLEditorKit();
+        final Font f = UIManager.getFont("Label.font");
+        final StyleSheet ss = new StyleSheet();
+        ss.addRule((allBold ? "html" : "strong, b") + " {" + getFontRule(f) + "}");
+        ss.addRule("a {text-decoration: underline; color: blue}");
+        ss.addRule("h1 {" + getFontRule(GuiHelper.getTitleFont()) + "}");
+        ss.addRule("ol {margin-left: 1cm; margin-top: 0.1cm; margin-bottom: 0.2cm; list-style-type: decimal}");
+        ss.addRule("ul {margin-left: 1cm; margin-top: 0.1cm; margin-bottom: 0.2cm; list-style-type: disc}");
+        if ("km".equals(Main.pref.get("language"))) {
+            // Fix rendering problem for Khmer script
+            ss.addRule("p {" + getFontRule(UIManager.getFont("Label.font")) + "}");
+        }
+        kit.setStyleSheet(ss);
+        pane.setEditorKit(kit);
+    }
+
+    /**
+     * Adapts a {@link JEditorPane} for Nimbus look and feel.
+     * See <a href="https://stackoverflow.com/q/15228336/2257172">this StackOverflow question</a>.
+     * @param pane The editor pane to adapt
+     * @since 6935
+     */
+    public static void adaptForNimbus(JEditorPane pane) {
+        LookAndFeel currentLAF = UIManager.getLookAndFeel();
+        if (currentLAF != null && "Nimbus".equals(currentLAF.getName())) {
+            Color bgColor = UIManager.getColor("Label.background");
+            UIDefaults defaults = new UIDefaults();
+            defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
+            pane.putClientProperty("Nimbus.Overrides", defaults);
+            pane.putClientProperty("Nimbus.Overrides.InheritDefaults", true);
+            pane.setBackground(bgColor);
+        }
+    }
+
+    private static String getFontRule(Font f) {
+        return MessageFormat.format(
+                "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
+                f.getName(),
+                f.getSize(),
+                "bold",
+                f.isItalic() ? "italic" : "normal"
+        );
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmHTMLEditorKit.java b/src/org/openstreetmap/josm/gui/widgets/JosmHTMLEditorKit.java
index 38bebd9..bb82e01 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmHTMLEditorKit.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmHTMLEditorKit.java
@@ -1,50 +1,50 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import javax.swing.text.html.HTMLEditorKit;
-import javax.swing.text.html.StyleSheet;
-
-/**
- * A subclass of {@link HTMLEditorKit} that fixes an uncommon design choice that shares the set stylesheet between all instances.
- * This class stores a single stylesheet per instance, as it should have be done by Sun in the first place.
- * @since 6040
- */
-public class JosmHTMLEditorKit extends HTMLEditorKit {
-
-    /**
-     * Constructs a new {@code JosmHTMLEditorKit}
-     */
-    public JosmHTMLEditorKit() {
-    }
-    
-    protected StyleSheet ss = super.getStyleSheet();
-
-    /**
-     * Set the set of styles to be used to render the various HTML elements.
-     * These styles are specified in terms of CSS specifications. 
-     * Each document produced by the kit will have a copy of the sheet which
-     * it can add the document specific styles to. 
-     * 
-     * Unlike the base implementation, the StyleSheet specified is NOT shared 
-     * by all HTMLEditorKit instances, to provide a finer granularity.
-
-     * @see #getStyleSheet
-     */
-    @Override
-    public void setStyleSheet(StyleSheet s) {
-        ss = s;
-    }
-
-    /**
-     * Get the set of styles currently being used to render the HTML elements.
-     *  
-     * Unlike the base implementation, the StyleSheet specified is NOT shared 
-     * by all HTMLEditorKit instances, to provide a finer granularity.
-     * 
-     * @see #setStyleSheet
-     */
-    @Override
-    public StyleSheet getStyleSheet() {
-        return ss;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
+
+/**
+ * A subclass of {@link HTMLEditorKit} that fixes an uncommon design choice that shares the set stylesheet between all instances.
+ * This class stores a single stylesheet per instance, as it should have be done by Sun in the first place.
+ * @since 6040
+ */
+public class JosmHTMLEditorKit extends HTMLEditorKit {
+
+    /**
+     * Constructs a new {@code JosmHTMLEditorKit}
+     */
+    public JosmHTMLEditorKit() {
+    }
+    
+    protected StyleSheet ss = super.getStyleSheet();
+
+    /**
+     * Set the set of styles to be used to render the various HTML elements.
+     * These styles are specified in terms of CSS specifications. 
+     * Each document produced by the kit will have a copy of the sheet which
+     * it can add the document specific styles to. 
+     * 
+     * Unlike the base implementation, the StyleSheet specified is NOT shared 
+     * by all HTMLEditorKit instances, to provide a finer granularity.
+
+     * @see #getStyleSheet
+     */
+    @Override
+    public void setStyleSheet(StyleSheet s) {
+        ss = s;
+    }
+
+    /**
+     * Get the set of styles currently being used to render the HTML elements.
+     *  
+     * Unlike the base implementation, the StyleSheet specified is NOT shared 
+     * by all HTMLEditorKit instances, to provide a finer granularity.
+     * 
+     * @see #setStyleSheet
+     */
+    @Override
+    public StyleSheet getStyleSheet() {
+        return ss;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmPasswordField.java b/src/org/openstreetmap/josm/gui/widgets/JosmPasswordField.java
index 72ee18e..536cdca 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmPasswordField.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmPasswordField.java
@@ -1,166 +1,166 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.Action;
-import javax.swing.JPasswordField;
-import javax.swing.TransferHandler;
-import javax.swing.text.Document;
-import javax.swing.text.JTextComponent;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * A subclass of {@link JPasswordField} to implement a workaround to
- * <a href="https://bugs.openjdk.java.net/browse/JDK-6322854">JDK bug 6322854</a>.
- *
- * @since 5752
- * @see <a href="https://josm.openstreetmap.de/ticket/8404">https://josm.openstreetmap.de/ticket/8404</a>
- * @see <a href="https://hg.netbeans.org/main/rev/33cb2e81b640">https://hg.netbeans.org/main/rev/33cb2e81b640</a>
- */
-public class JosmPasswordField extends JPasswordField implements FocusListener {
-
-    /**
-     * Constructs a new <code>JosmPasswordField</code>,
-     * with a default document, <code>null</code> starting
-     * text string, and 0 column width.
-     */
-    public JosmPasswordField() {
-        workaroundJdkBug6322854(this);
-        addFocusListener(this);
-    }
-
-    /**
-     * Constructs a new <code>JosmPasswordField</code> that uses the
-     * given text storage model and the given number of columns.
-     * This is the constructor through which the other constructors feed.
-     * The echo character is set to '*', but may be changed by the current
-     * Look and Feel.  If the document model is
-     * <code>null</code>, a default one will be created.
-     *
-     * @param doc  the text storage to use
-     * @param txt the text to be displayed, <code>null</code> if none
-     * @param columns  the number of columns to use to calculate
-     *   the preferred width >= 0; if columns is set to zero, the
-     *   preferred width will be whatever naturally results from
-     *   the component implementation
-     */
-    public JosmPasswordField(Document doc, String txt, int columns) {
-        super(doc, txt, columns);
-        workaroundJdkBug6322854(this);
-        addFocusListener(this);
-    }
-
-    /**
-     * Constructs a new empty <code>JosmPasswordField</code> with the specified
-     * number of columns.  A default model is created, and the initial string
-     * is set to <code>null</code>.
-     *
-     * @param columns the number of columns >= 0
-     */
-    public JosmPasswordField(int columns) {
-        super(columns);
-        workaroundJdkBug6322854(this);
-        addFocusListener(this);
-    }
-
-    /**
-     * Constructs a new <code>JPasswordField</code> initialized with
-     * the specified text and columns.  The document model is set to
-     * the default.
-     *
-     * @param text the text to be displayed, <code>null</code> if none
-     * @param columns the number of columns >= 0
-     */
-    public JosmPasswordField(String text, int columns) {
-        super(text, columns);
-        workaroundJdkBug6322854(this);
-        addFocusListener(this);
-    }
-
-    /**
-     * Constructs a new <code>JosmPasswordField</code> initialized
-     * with the specified text.  The document model is set to the
-     * default, and the number of columns to 0.
-     *
-     * @param text the text to be displayed, <code>null</code> if none
-     */
-    public JosmPasswordField(String text) {
-        super(text);
-        workaroundJdkBug6322854(this);
-        addFocusListener(this);
-    }
-
-    @Override
-    public void focusGained(FocusEvent e) {
-        if (Main.map != null) {
-            Main.map.keyDetector.setEnabled(false);
-        }
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-        if (Main.map != null) {
-            Main.map.keyDetector.setEnabled(true);
-        }
-    }
-
-    /**
-     * Implements a workaround to <a href="https://bugs.openjdk.java.net/browse/JDK-6322854">JDK bug 6322854</a>.
-     * This method can be deleted after Oracle decides to fix this bug...
-     * @param text The {@link JTextComponent} to protect.
-     */
-    public static final void workaroundJdkBug6322854(final JTextComponent text) {
-        if (text != null) {
-            text.getActionMap().put("paste", new Action() {
-
-                private final Action pasteAction = TransferHandler.getPasteAction();
-
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    try {
-                        pasteAction.actionPerformed(e);
-                    } catch (NullPointerException npe) {
-                        Main.error("NullPointerException occured because of JDK bug 6322854. "
-                                +"Copy/Paste operation has not been performed. Please complain to Oracle: "+
-                                "https://bugs.openjdk.java.net/browse/JDK-6322854");
-                    }
-                }
-
-                @Override
-                public void setEnabled(boolean b) {
-                    pasteAction.setEnabled(b);
-                }
-
-                @Override
-                public void removePropertyChangeListener(PropertyChangeListener listener) {
-                    pasteAction.removePropertyChangeListener(listener);
-                }
-
-                @Override
-                public void putValue(String key, Object value) {
-                    pasteAction.putValue(key, value);
-                }
-
-                @Override
-                public boolean isEnabled() {
-                    return pasteAction.isEnabled();
-                }
-
-                @Override
-                public Object getValue(String key) {
-                    return pasteAction.getValue(key);
-                }
-
-                @Override
-                public void addPropertyChangeListener(PropertyChangeListener listener) {
-                    pasteAction.addPropertyChangeListener(listener);
-                }
-            });
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.Action;
+import javax.swing.JPasswordField;
+import javax.swing.TransferHandler;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * A subclass of {@link JPasswordField} to implement a workaround to
+ * <a href="https://bugs.openjdk.java.net/browse/JDK-6322854">JDK bug 6322854</a>.
+ *
+ * @since 5752
+ * @see <a href="https://josm.openstreetmap.de/ticket/8404">https://josm.openstreetmap.de/ticket/8404</a>
+ * @see <a href="https://hg.netbeans.org/main/rev/33cb2e81b640">https://hg.netbeans.org/main/rev/33cb2e81b640</a>
+ */
+public class JosmPasswordField extends JPasswordField implements FocusListener {
+
+    /**
+     * Constructs a new <code>JosmPasswordField</code>,
+     * with a default document, <code>null</code> starting
+     * text string, and 0 column width.
+     */
+    public JosmPasswordField() {
+        workaroundJdkBug6322854(this);
+        addFocusListener(this);
+    }
+
+    /**
+     * Constructs a new <code>JosmPasswordField</code> that uses the
+     * given text storage model and the given number of columns.
+     * This is the constructor through which the other constructors feed.
+     * The echo character is set to '*', but may be changed by the current
+     * Look and Feel.  If the document model is
+     * <code>null</code>, a default one will be created.
+     *
+     * @param doc  the text storage to use
+     * @param txt the text to be displayed, <code>null</code> if none
+     * @param columns  the number of columns to use to calculate
+     *   the preferred width >= 0; if columns is set to zero, the
+     *   preferred width will be whatever naturally results from
+     *   the component implementation
+     */
+    public JosmPasswordField(Document doc, String txt, int columns) {
+        super(doc, txt, columns);
+        workaroundJdkBug6322854(this);
+        addFocusListener(this);
+    }
+
+    /**
+     * Constructs a new empty <code>JosmPasswordField</code> with the specified
+     * number of columns.  A default model is created, and the initial string
+     * is set to <code>null</code>.
+     *
+     * @param columns the number of columns >= 0
+     */
+    public JosmPasswordField(int columns) {
+        super(columns);
+        workaroundJdkBug6322854(this);
+        addFocusListener(this);
+    }
+
+    /**
+     * Constructs a new <code>JPasswordField</code> initialized with
+     * the specified text and columns.  The document model is set to
+     * the default.
+     *
+     * @param text the text to be displayed, <code>null</code> if none
+     * @param columns the number of columns >= 0
+     */
+    public JosmPasswordField(String text, int columns) {
+        super(text, columns);
+        workaroundJdkBug6322854(this);
+        addFocusListener(this);
+    }
+
+    /**
+     * Constructs a new <code>JosmPasswordField</code> initialized
+     * with the specified text.  The document model is set to the
+     * default, and the number of columns to 0.
+     *
+     * @param text the text to be displayed, <code>null</code> if none
+     */
+    public JosmPasswordField(String text) {
+        super(text);
+        workaroundJdkBug6322854(this);
+        addFocusListener(this);
+    }
+
+    @Override
+    public void focusGained(FocusEvent e) {
+        if (Main.map != null) {
+            Main.map.keyDetector.setEnabled(false);
+        }
+    }
+
+    @Override
+    public void focusLost(FocusEvent e) {
+        if (Main.map != null) {
+            Main.map.keyDetector.setEnabled(true);
+        }
+    }
+
+    /**
+     * Implements a workaround to <a href="https://bugs.openjdk.java.net/browse/JDK-6322854">JDK bug 6322854</a>.
+     * This method can be deleted after Oracle decides to fix this bug...
+     * @param text The {@link JTextComponent} to protect.
+     */
+    public static final void workaroundJdkBug6322854(final JTextComponent text) {
+        if (text != null) {
+            text.getActionMap().put("paste", new Action() {
+
+                private final Action pasteAction = TransferHandler.getPasteAction();
+
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    try {
+                        pasteAction.actionPerformed(e);
+                    } catch (NullPointerException npe) {
+                        Main.error("NullPointerException occured because of JDK bug 6322854. "
+                                +"Copy/Paste operation has not been performed. Please complain to Oracle: "+
+                                "https://bugs.openjdk.java.net/browse/JDK-6322854");
+                    }
+                }
+
+                @Override
+                public void setEnabled(boolean b) {
+                    pasteAction.setEnabled(b);
+                }
+
+                @Override
+                public void removePropertyChangeListener(PropertyChangeListener listener) {
+                    pasteAction.removePropertyChangeListener(listener);
+                }
+
+                @Override
+                public void putValue(String key, Object value) {
+                    pasteAction.putValue(key, value);
+                }
+
+                @Override
+                public boolean isEnabled() {
+                    return pasteAction.isEnabled();
+                }
+
+                @Override
+                public Object getValue(String key) {
+                    return pasteAction.getValue(key);
+                }
+
+                @Override
+                public void addPropertyChangeListener(PropertyChangeListener listener) {
+                    pasteAction.addPropertyChangeListener(listener);
+                }
+            });
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmTextArea.java b/src/org/openstreetmap/josm/gui/widgets/JosmTextArea.java
index 4fc170b..5fa8986 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmTextArea.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmTextArea.java
@@ -1,105 +1,105 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-
-import javax.swing.JTextArea;
-import javax.swing.text.Document;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * Subclass of {@link JTextArea} that adds a "native" context menu (cut/copy/paste/select all).
- * @since 5886
- */
-public class JosmTextArea extends JTextArea implements FocusListener {
-
-    /**
-     * Constructs a new {@code JosmTextArea}. A default model is set, the initial string
-     * is null, and rows/columns are set to 0.
-     */
-    public JosmTextArea() {
-        this(null, null, 0, 0);
-    }
-
-    /**
-     * Constructs a new {@code JosmTextArea} with the specified text displayed.
-     * A default model is created and rows/columns are set to 0.
-     *
-     * @param text the text to be displayed, or null
-     */
-    public JosmTextArea(String text) {
-        this(null, text, 0, 0);
-    }
-
-    /**
-     * Constructs a new {@code JosmTextArea} with the given document model, and defaults
-     * for all of the other arguments (null, 0, 0).
-     *
-     * @param doc  the model to use
-     */
-    public JosmTextArea(Document doc) {
-        this(doc, null, 0, 0);
-    }
-
-    /**
-     * Constructs a new empty {@code JosmTextArea} with the specified number of
-     * rows and columns. A default model is created, and the initial
-     * string is null.
-     *
-     * @param rows the number of rows >= 0
-     * @param columns the number of columns >= 0
-     * @exception IllegalArgumentException if the rows or columns
-     *  arguments are negative.
-     */
-    public JosmTextArea(int rows, int columns) {
-        this(null, null, rows, columns);
-    }
-
-    /**
-     * Constructs a new {@code JosmTextArea} with the specified text and number
-     * of rows and columns. A default model is created.
-     *
-     * @param text the text to be displayed, or null
-     * @param rows the number of rows >= 0
-     * @param columns the number of columns >= 0
-     * @exception IllegalArgumentException if the rows or columns
-     *  arguments are negative.
-     */
-    public JosmTextArea(String text, int rows, int columns) {
-        this(null, text, rows, columns);
-    }
-
-    /**
-     * Constructs a new {@code JosmTextArea} with the specified number of rows
-     * and columns, and the given model.  All of the constructors
-     * feed through this constructor.
-     *
-     * @param doc the model to use, or create a default one if null
-     * @param text the text to be displayed, null if none
-     * @param rows the number of rows >= 0
-     * @param columns the number of columns >= 0
-     * @exception IllegalArgumentException if the rows or columns
-     *  arguments are negative.
-     */
-    public JosmTextArea(Document doc, String text, int rows, int columns) {
-        super(doc, text, rows, columns);
-        TextContextualPopupMenu.enableMenuFor(this);
-        addFocusListener(this);
-    }
-
-    @Override
-    public void focusGained(FocusEvent e) {
-        if (Main.map != null) {
-            Main.map.keyDetector.setEnabled(false);
-        }
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-        if (Main.map != null) {
-            Main.map.keyDetector.setEnabled(true);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+import javax.swing.JTextArea;
+import javax.swing.text.Document;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * Subclass of {@link JTextArea} that adds a "native" context menu (cut/copy/paste/select all).
+ * @since 5886
+ */
+public class JosmTextArea extends JTextArea implements FocusListener {
+
+    /**
+     * Constructs a new {@code JosmTextArea}. A default model is set, the initial string
+     * is null, and rows/columns are set to 0.
+     */
+    public JosmTextArea() {
+        this(null, null, 0, 0);
+    }
+
+    /**
+     * Constructs a new {@code JosmTextArea} with the specified text displayed.
+     * A default model is created and rows/columns are set to 0.
+     *
+     * @param text the text to be displayed, or null
+     */
+    public JosmTextArea(String text) {
+        this(null, text, 0, 0);
+    }
+
+    /**
+     * Constructs a new {@code JosmTextArea} with the given document model, and defaults
+     * for all of the other arguments (null, 0, 0).
+     *
+     * @param doc  the model to use
+     */
+    public JosmTextArea(Document doc) {
+        this(doc, null, 0, 0);
+    }
+
+    /**
+     * Constructs a new empty {@code JosmTextArea} with the specified number of
+     * rows and columns. A default model is created, and the initial
+     * string is null.
+     *
+     * @param rows the number of rows >= 0
+     * @param columns the number of columns >= 0
+     * @exception IllegalArgumentException if the rows or columns
+     *  arguments are negative.
+     */
+    public JosmTextArea(int rows, int columns) {
+        this(null, null, rows, columns);
+    }
+
+    /**
+     * Constructs a new {@code JosmTextArea} with the specified text and number
+     * of rows and columns. A default model is created.
+     *
+     * @param text the text to be displayed, or null
+     * @param rows the number of rows >= 0
+     * @param columns the number of columns >= 0
+     * @exception IllegalArgumentException if the rows or columns
+     *  arguments are negative.
+     */
+    public JosmTextArea(String text, int rows, int columns) {
+        this(null, text, rows, columns);
+    }
+
+    /**
+     * Constructs a new {@code JosmTextArea} with the specified number of rows
+     * and columns, and the given model.  All of the constructors
+     * feed through this constructor.
+     *
+     * @param doc the model to use, or create a default one if null
+     * @param text the text to be displayed, null if none
+     * @param rows the number of rows >= 0
+     * @param columns the number of columns >= 0
+     * @exception IllegalArgumentException if the rows or columns
+     *  arguments are negative.
+     */
+    public JosmTextArea(Document doc, String text, int rows, int columns) {
+        super(doc, text, rows, columns);
+        TextContextualPopupMenu.enableMenuFor(this);
+        addFocusListener(this);
+    }
+
+    @Override
+    public void focusGained(FocusEvent e) {
+        if (Main.map != null) {
+            Main.map.keyDetector.setEnabled(false);
+        }
+    }
+
+    @Override
+    public void focusLost(FocusEvent e) {
+        if (Main.map != null) {
+            Main.map.keyDetector.setEnabled(true);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/NativeFileChooser.java b/src/org/openstreetmap/josm/gui/widgets/NativeFileChooser.java
index eed6a81..4ae074b 100644
--- a/src/org/openstreetmap/josm/gui/widgets/NativeFileChooser.java
+++ b/src/org/openstreetmap/josm/gui/widgets/NativeFileChooser.java
@@ -1,176 +1,176 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.awt.FileDialog;
-import java.awt.Frame;
-import java.io.File;
-import java.io.FilenameFilter;
-
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * File chooser based on the AWT's {@link FileDialog} implementation,
- * which looks like more a native file chooser than the Swing implementation.
- * @since 7578
- */
-public class NativeFileChooser extends AbstractFileChooser {
-
-    /** The instance of the fileDialog */
-    private final FileDialog fileDialog;
-    private FileFilter fileFilter;
-    private int selectionMode;
-
-    /**
-     * Constructs a new {@code NativeFileChooser}.
-     * @param file the current file/directory to point to
-     */
-    public NativeFileChooser(File file) {
-        fileDialog = new FileDialog((Frame) Main.parent);
-        if (file != null) {
-            fileDialog.setDirectory(file.getAbsolutePath());
-            fileDialog.setFile(file.toString());
-        }
-    }
-
-    @Override
-    public void addChoosableFileFilter(FileFilter filter) {
-        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
-        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
-        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
-    }
-
-    @Override
-    public FileFilter[] getChoosableFileFilters() {
-        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
-        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
-        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
-        return new FileFilter[]{};
-    }
-
-    @Override
-    public File getCurrentDirectory() {
-        return new File(fileDialog.getDirectory());
-    }
-
-    @Override
-    public FileFilter getFileFilter() {
-        return fileFilter;
-    }
-
-    @Override
-    public File getSelectedFile() {
-        return new File(fileDialog.getDirectory() + fileDialog.getFile());
-    }
-
-    @Override
-    public File[] getSelectedFiles() {
-        return fileDialog.getFiles();
-    }
-
-    @Override
-    public boolean isMultiSelectionEnabled() {
-        return fileDialog.isMultipleMode();
-    }
-
-    @Override
-    public void setAcceptAllFileFilterUsed(boolean b) {
-        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
-        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
-        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
-    }
-
-    @Override
-    public void setCurrentDirectory(File f) {
-        fileDialog.setDirectory(f.toString());
-    }
-
-    @Override
-    public void setDialogTitle(String title) {
-        fileDialog.setTitle(title);
-    }
-
-    @Override
-    public void setFileFilter(final FileFilter cff) {
-        FilenameFilter filter = new FilenameFilter() {
-            public boolean accept(File Directory, String fileName) {
-                return cff.accept(new File(Directory.getAbsolutePath() + fileName));
-            }
-        };
-        fileDialog.setFilenameFilter(filter);
-        fileFilter = cff;
-    }
-
-    @Override
-    public void setFileSelectionMode(int selectionMode) {
-        // TODO implement this after Oracle fixes JDK-6192906 / JDK-6699863 / JDK-6927978 / JDK-7125172:
-        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
-        // https://bugs.openjdk.java.net/browse/JDK-6699863 : awt filedialog cannot select directories
-        // https://bugs.openjdk.java.net/browse/JDK-6927978 : Directory Selection standard dialog support
-        // https://bugs.openjdk.java.net/browse/JDK-7125172 : FileDialog objects don't allow directory AND files selection simultaneously
-
-        // There is however a basic support for directory selection on OS X, with Java >= 7u40:
-        // http://stackoverflow.com/questions/1224714/how-can-i-make-a-java-filedialog-accept-directories-as-its-filetype-in-os-x/1224744#1224744
-        // https://bugs.openjdk.java.net/browse/JDK-7161437 : [macosx] awt.FileDialog doesn't respond appropriately for mac when selecting folders
-        this.selectionMode = selectionMode;
-    }
-
-    @Override
-    public void setMultiSelectionEnabled(boolean multiple) {
-        fileDialog.setMultipleMode(multiple);
-    }
-
-    @Override
-    public void setSelectedFile(File file) {
-        fileDialog.setDirectory(file.getAbsolutePath());
-        fileDialog.setFile(file.getName());
-    }
-
-    @Override
-    public int showOpenDialog(Component parent) {
-        boolean appleProperty = Main.isPlatformOsx() && selectionMode == JFileChooser.DIRECTORIES_ONLY;
-        if (appleProperty) {
-            System.setProperty("apple.awt.fileDialogForDirectories", "true");
-        }
-        try {
-            fileDialog.setLocale(locale);
-            fileDialog.setMode(FileDialog.LOAD);
-            fileDialog.setVisible(true);
-            return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
-        } finally {
-            if (appleProperty) {
-                System.setProperty("apple.awt.fileDialogForDirectories", "false");
-            }
-        }
-    }
-
-    @Override
-    public int showSaveDialog(Component parent) {
-        fileDialog.setLocale(locale);
-        fileDialog.setMode(FileDialog.SAVE);
-        fileDialog.setVisible(true);
-        return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
-    }
-
-    /**
-     * Determines if the selection mode is suuported by the native file chooser.
-     * @param selectionMode the selection mode
-     * @return {@code true} if the selection mode is supported, {@code false} otherwise
-     */
-    public static boolean supportsSelectionMode(int selectionMode) {
-        switch (selectionMode) {
-        case JFileChooser.FILES_AND_DIRECTORIES:
-            // https://bugs.openjdk.java.net/browse/JDK-7125172 : FileDialog objects don't allow directory AND files selection simultaneously
-            return false;
-        case JFileChooser.DIRECTORIES_ONLY:
-            // http://stackoverflow.com/questions/1224714/how-can-i-make-a-java-filedialog-accept-directories-as-its-filetype-in-os-x/1224744#1224744
-            return Main.isPlatformOsx();
-        case JFileChooser.FILES_ONLY:
-        default:
-            return true;
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.awt.FileDialog;
+import java.awt.Frame;
+import java.io.File;
+import java.io.FilenameFilter;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * File chooser based on the AWT's {@link FileDialog} implementation,
+ * which looks like more a native file chooser than the Swing implementation.
+ * @since 7578
+ */
+public class NativeFileChooser extends AbstractFileChooser {
+
+    /** The instance of the fileDialog */
+    private final FileDialog fileDialog;
+    private FileFilter fileFilter;
+    private int selectionMode;
+
+    /**
+     * Constructs a new {@code NativeFileChooser}.
+     * @param file the current file/directory to point to
+     */
+    public NativeFileChooser(File file) {
+        fileDialog = new FileDialog((Frame) Main.parent);
+        if (file != null) {
+            fileDialog.setDirectory(file.getAbsolutePath());
+            fileDialog.setFile(file.toString());
+        }
+    }
+
+    @Override
+    public void addChoosableFileFilter(FileFilter filter) {
+        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
+        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
+        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
+    }
+
+    @Override
+    public FileFilter[] getChoosableFileFilters() {
+        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
+        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
+        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
+        return new FileFilter[]{};
+    }
+
+    @Override
+    public File getCurrentDirectory() {
+        return new File(fileDialog.getDirectory());
+    }
+
+    @Override
+    public FileFilter getFileFilter() {
+        return fileFilter;
+    }
+
+    @Override
+    public File getSelectedFile() {
+        return new File(fileDialog.getDirectory() + fileDialog.getFile());
+    }
+
+    @Override
+    public File[] getSelectedFiles() {
+        return fileDialog.getFiles();
+    }
+
+    @Override
+    public boolean isMultiSelectionEnabled() {
+        return fileDialog.isMultipleMode();
+    }
+
+    @Override
+    public void setAcceptAllFileFilterUsed(boolean b) {
+        // TODO implement this after Oracle fixes JDK-4811090 / JDK-6192906
+        // https://bugs.openjdk.java.net/browse/JDK-4811090 : Extend awt filedialog
+        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
+    }
+
+    @Override
+    public void setCurrentDirectory(File f) {
+        fileDialog.setDirectory(f.toString());
+    }
+
+    @Override
+    public void setDialogTitle(String title) {
+        fileDialog.setTitle(title);
+    }
+
+    @Override
+    public void setFileFilter(final FileFilter cff) {
+        FilenameFilter filter = new FilenameFilter() {
+            public boolean accept(File Directory, String fileName) {
+                return cff.accept(new File(Directory.getAbsolutePath() + fileName));
+            }
+        };
+        fileDialog.setFilenameFilter(filter);
+        fileFilter = cff;
+    }
+
+    @Override
+    public void setFileSelectionMode(int selectionMode) {
+        // TODO implement this after Oracle fixes JDK-6192906 / JDK-6699863 / JDK-6927978 / JDK-7125172:
+        // https://bugs.openjdk.java.net/browse/JDK-6192906 : Add more features to java.awt.FileDialog
+        // https://bugs.openjdk.java.net/browse/JDK-6699863 : awt filedialog cannot select directories
+        // https://bugs.openjdk.java.net/browse/JDK-6927978 : Directory Selection standard dialog support
+        // https://bugs.openjdk.java.net/browse/JDK-7125172 : FileDialog objects don't allow directory AND files selection simultaneously
+
+        // There is however a basic support for directory selection on OS X, with Java >= 7u40:
+        // http://stackoverflow.com/questions/1224714/how-can-i-make-a-java-filedialog-accept-directories-as-its-filetype-in-os-x/1224744#1224744
+        // https://bugs.openjdk.java.net/browse/JDK-7161437 : [macosx] awt.FileDialog doesn't respond appropriately for mac when selecting folders
+        this.selectionMode = selectionMode;
+    }
+
+    @Override
+    public void setMultiSelectionEnabled(boolean multiple) {
+        fileDialog.setMultipleMode(multiple);
+    }
+
+    @Override
+    public void setSelectedFile(File file) {
+        fileDialog.setDirectory(file.getAbsolutePath());
+        fileDialog.setFile(file.getName());
+    }
+
+    @Override
+    public int showOpenDialog(Component parent) {
+        boolean appleProperty = Main.isPlatformOsx() && selectionMode == JFileChooser.DIRECTORIES_ONLY;
+        if (appleProperty) {
+            System.setProperty("apple.awt.fileDialogForDirectories", "true");
+        }
+        try {
+            fileDialog.setLocale(locale);
+            fileDialog.setMode(FileDialog.LOAD);
+            fileDialog.setVisible(true);
+            return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
+        } finally {
+            if (appleProperty) {
+                System.setProperty("apple.awt.fileDialogForDirectories", "false");
+            }
+        }
+    }
+
+    @Override
+    public int showSaveDialog(Component parent) {
+        fileDialog.setLocale(locale);
+        fileDialog.setMode(FileDialog.SAVE);
+        fileDialog.setVisible(true);
+        return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
+    }
+
+    /**
+     * Determines if the selection mode is suuported by the native file chooser.
+     * @param selectionMode the selection mode
+     * @return {@code true} if the selection mode is supported, {@code false} otherwise
+     */
+    public static boolean supportsSelectionMode(int selectionMode) {
+        switch (selectionMode) {
+        case JFileChooser.FILES_AND_DIRECTORIES:
+            // https://bugs.openjdk.java.net/browse/JDK-7125172 : FileDialog objects don't allow directory AND files selection simultaneously
+            return false;
+        case JFileChooser.DIRECTORIES_ONLY:
+            // http://stackoverflow.com/questions/1224714/how-can-i-make-a-java-filedialog-accept-directories-as-its-filetype-in-os-x/1224744#1224744
+            return Main.isPlatformOsx();
+        case JFileChooser.FILES_ONLY:
+        default:
+            return true;
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
index 167bac1..3ba8033 100644
--- a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
+++ b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
@@ -1,110 +1,110 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.JPopupMenu;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
-import javax.swing.table.TableColumnModel;
-
-import org.openstreetmap.josm.actions.ZoomToAction;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-
-public abstract class OsmPrimitivesTable extends JTable {
-    
-    /**
-     * the data layer in whose context primitives are edited in this table
-     */
-    private OsmDataLayer layer;
-
-    /** the popup menu */
-    private JPopupMenu popupMenu;
-    private ZoomToAction zoomToAction;
-
-    public final OsmDataLayer getLayer() {
-        return layer;
-    }
-
-    public final void setLayer(OsmDataLayer layer) {
-        this.layer = layer;
-    }
-
-    public OsmPrimitivesTable(OsmPrimitivesTableModel dm, TableColumnModel cm, ListSelectionModel sm) {
-        super(dm, cm, sm);
-        addMouseListener(new PopupMenuLauncher(getPopUpMenu()));
-        addMouseListener(new DblClickHandler());
-    }
-    
-    public OsmPrimitivesTableModel getOsmPrimitivesTableModel() {
-        return (OsmPrimitivesTableModel) getModel();
-    }
-
-    /**
-     * Replies the popup menu for this table
-     *
-     * @return the popup menu
-     */
-    protected final JPopupMenu getPopUpMenu() {
-        if (popupMenu == null) {
-            popupMenu = buildPopupMenu();
-        }
-        return popupMenu;
-    }
-    
-    protected abstract ZoomToAction buildZoomToAction();
-
-    protected JPopupMenu buildPopupMenu() {
-        JPopupMenu menu = new JPopupMenu();
-        zoomToAction = buildZoomToAction();
-        MapView.addLayerChangeListener(zoomToAction);
-        getSelectionModel().addListSelectionListener(zoomToAction);
-        menu.add(zoomToAction);
-        return menu;
-    }
-    
-    public void unlinkAsListener() {
-        MapView.removeLayerChangeListener(zoomToAction);
-    }
-        
-    public OsmPrimitive getPrimitiveInLayer(int row, OsmDataLayer layer) {
-        return getOsmPrimitivesTableModel().getReferredPrimitive(row);
-    }
-
-    protected class DblClickHandler extends MouseAdapter {
-
-        protected void setSelection(MouseEvent e) {
-            int row = rowAtPoint(e.getPoint());
-            if (row < 0) return;
-            OsmPrimitive primitive = getPrimitiveInLayer(row, layer);
-            if (layer != null && primitive != null) {
-                layer.data.setSelected(primitive.getPrimitiveId());
-            }
-        }
-
-        protected void addSelection(MouseEvent e) {
-            int row = rowAtPoint(e.getPoint());
-            if (row < 0) return;
-            OsmPrimitive primitive = getPrimitiveInLayer(row, layer);
-            getSelectionModel().addSelectionInterval(row, row);
-            if (layer != null && primitive != null) {
-                layer.data.addSelected(primitive.getPrimitiveId());
-            }
-        }
-
-        @Override
-        public void mouseClicked(MouseEvent e) {
-            if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() > 1) {
-                if (e.isControlDown()) {
-                    addSelection(e);
-                } else {
-                    setSelection(e);
-                }
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JPopupMenu;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
+import javax.swing.table.TableColumnModel;
+
+import org.openstreetmap.josm.actions.ZoomToAction;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+public abstract class OsmPrimitivesTable extends JTable {
+    
+    /**
+     * the data layer in whose context primitives are edited in this table
+     */
+    private OsmDataLayer layer;
+
+    /** the popup menu */
+    private JPopupMenu popupMenu;
+    private ZoomToAction zoomToAction;
+
+    public final OsmDataLayer getLayer() {
+        return layer;
+    }
+
+    public final void setLayer(OsmDataLayer layer) {
+        this.layer = layer;
+    }
+
+    public OsmPrimitivesTable(OsmPrimitivesTableModel dm, TableColumnModel cm, ListSelectionModel sm) {
+        super(dm, cm, sm);
+        addMouseListener(new PopupMenuLauncher(getPopUpMenu()));
+        addMouseListener(new DblClickHandler());
+    }
+    
+    public OsmPrimitivesTableModel getOsmPrimitivesTableModel() {
+        return (OsmPrimitivesTableModel) getModel();
+    }
+
+    /**
+     * Replies the popup menu for this table
+     *
+     * @return the popup menu
+     */
+    protected final JPopupMenu getPopUpMenu() {
+        if (popupMenu == null) {
+            popupMenu = buildPopupMenu();
+        }
+        return popupMenu;
+    }
+    
+    protected abstract ZoomToAction buildZoomToAction();
+
+    protected JPopupMenu buildPopupMenu() {
+        JPopupMenu menu = new JPopupMenu();
+        zoomToAction = buildZoomToAction();
+        MapView.addLayerChangeListener(zoomToAction);
+        getSelectionModel().addListSelectionListener(zoomToAction);
+        menu.add(zoomToAction);
+        return menu;
+    }
+    
+    public void unlinkAsListener() {
+        MapView.removeLayerChangeListener(zoomToAction);
+    }
+        
+    public OsmPrimitive getPrimitiveInLayer(int row, OsmDataLayer layer) {
+        return getOsmPrimitivesTableModel().getReferredPrimitive(row);
+    }
+
+    protected class DblClickHandler extends MouseAdapter {
+
+        protected void setSelection(MouseEvent e) {
+            int row = rowAtPoint(e.getPoint());
+            if (row < 0) return;
+            OsmPrimitive primitive = getPrimitiveInLayer(row, layer);
+            if (layer != null && primitive != null) {
+                layer.data.setSelected(primitive.getPrimitiveId());
+            }
+        }
+
+        protected void addSelection(MouseEvent e) {
+            int row = rowAtPoint(e.getPoint());
+            if (row < 0) return;
+            OsmPrimitive primitive = getPrimitiveInLayer(row, layer);
+            getSelectionModel().addSelectionInterval(row, row);
+            if (layer != null && primitive != null) {
+                layer.data.addSelected(primitive.getPrimitiveId());
+            }
+        }
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() > 1) {
+                if (e.isControlDown()) {
+                    addSelection(e);
+                } else {
+                    setSelection(e);
+                }
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTableModel.java b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTableModel.java
index e0e1fea..61cf637 100644
--- a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTableModel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTableModel.java
@@ -1,11 +1,11 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import javax.swing.table.TableModel;
-
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-
-public interface OsmPrimitivesTableModel extends TableModel {
-    
-    public abstract OsmPrimitive getReferredPrimitive(int idx);
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import javax.swing.table.TableModel;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public interface OsmPrimitivesTableModel extends TableModel {
+    
+    public abstract OsmPrimitive getReferredPrimitive(int idx);
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/SwingFileChooser.java b/src/org/openstreetmap/josm/gui/widgets/SwingFileChooser.java
index 9569ca3..8ec6a7d 100644
--- a/src/org/openstreetmap/josm/gui/widgets/SwingFileChooser.java
+++ b/src/org/openstreetmap/josm/gui/widgets/SwingFileChooser.java
@@ -1,108 +1,108 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import java.awt.Component;
-import java.io.File;
-
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
-/**
- * File chooser based on the Swing's {@link JFileChooser} implementation.
- * @since 7578
- */
-public class SwingFileChooser extends AbstractFileChooser {
-
-    /** The JFileChooser which we use for this. */
-    private final JFileChooser jFileChooser;
-
-    /**
-     * Constructs a new {@code SwingFileChooser}.
-     * @param file the current file/directory to point to
-     */
-    public SwingFileChooser(File file) {
-        jFileChooser = new JFileChooser(file);
-    }
-
-    @Override
-    public void addChoosableFileFilter(FileFilter filter) {
-        jFileChooser.addChoosableFileFilter(filter);
-    }
-
-    @Override
-    public FileFilter[] getChoosableFileFilters() {
-        return jFileChooser.getChoosableFileFilters();
-    }
-
-    @Override
-    public File getCurrentDirectory() {
-        return jFileChooser.getCurrentDirectory();
-    }
-
-    @Override
-    public FileFilter getFileFilter() {
-        return jFileChooser.getFileFilter();
-    }
-
-    @Override
-    public File getSelectedFile() {
-        return jFileChooser.getSelectedFile();
-    }
-
-    @Override
-    public File[] getSelectedFiles() {
-        return jFileChooser.getSelectedFiles();
-    }
-
-    @Override
-    public boolean isMultiSelectionEnabled() {
-        return jFileChooser.isMultiSelectionEnabled();
-    }
-
-    @Override
-    public void setAcceptAllFileFilterUsed(boolean b) {
-        jFileChooser.setAcceptAllFileFilterUsed(b);
-    }
-
-    @Override
-    public void setCurrentDirectory(File f) {
-        jFileChooser.setCurrentDirectory(f);
-    }
-
-    @Override
-    public void setDialogTitle(String title) {
-        jFileChooser.setDialogTitle(title);
-    }
-
-    @Override
-    public void setFileFilter(FileFilter cff) {
-        jFileChooser.setFileFilter(cff);
-    }
-
-    @Override
-    public void setFileSelectionMode(int selectionMode) {
-        jFileChooser.setFileSelectionMode(selectionMode);
-    }
-
-    @Override
-    public void setMultiSelectionEnabled(boolean multiple) {
-        jFileChooser.setMultiSelectionEnabled(multiple);
-    }
-
-    @Override
-    public void setSelectedFile(File file) {
-        jFileChooser.setSelectedFile(file);
-    }
-
-    @Override
-    public int showOpenDialog(Component parent) {
-        jFileChooser.setLocale(locale);
-        return jFileChooser.showOpenDialog(parent);
-    }
-
-    @Override
-    public int showSaveDialog(Component parent) {
-        jFileChooser.setLocale(locale);
-        return jFileChooser.showSaveDialog(parent);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Component;
+import java.io.File;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * File chooser based on the Swing's {@link JFileChooser} implementation.
+ * @since 7578
+ */
+public class SwingFileChooser extends AbstractFileChooser {
+
+    /** The JFileChooser which we use for this. */
+    private final JFileChooser jFileChooser;
+
+    /**
+     * Constructs a new {@code SwingFileChooser}.
+     * @param file the current file/directory to point to
+     */
+    public SwingFileChooser(File file) {
+        jFileChooser = new JFileChooser(file);
+    }
+
+    @Override
+    public void addChoosableFileFilter(FileFilter filter) {
+        jFileChooser.addChoosableFileFilter(filter);
+    }
+
+    @Override
+    public FileFilter[] getChoosableFileFilters() {
+        return jFileChooser.getChoosableFileFilters();
+    }
+
+    @Override
+    public File getCurrentDirectory() {
+        return jFileChooser.getCurrentDirectory();
+    }
+
+    @Override
+    public FileFilter getFileFilter() {
+        return jFileChooser.getFileFilter();
+    }
+
+    @Override
+    public File getSelectedFile() {
+        return jFileChooser.getSelectedFile();
+    }
+
+    @Override
+    public File[] getSelectedFiles() {
+        return jFileChooser.getSelectedFiles();
+    }
+
+    @Override
+    public boolean isMultiSelectionEnabled() {
+        return jFileChooser.isMultiSelectionEnabled();
+    }
+
+    @Override
+    public void setAcceptAllFileFilterUsed(boolean b) {
+        jFileChooser.setAcceptAllFileFilterUsed(b);
+    }
+
+    @Override
+    public void setCurrentDirectory(File f) {
+        jFileChooser.setCurrentDirectory(f);
+    }
+
+    @Override
+    public void setDialogTitle(String title) {
+        jFileChooser.setDialogTitle(title);
+    }
+
+    @Override
+    public void setFileFilter(FileFilter cff) {
+        jFileChooser.setFileFilter(cff);
+    }
+
+    @Override
+    public void setFileSelectionMode(int selectionMode) {
+        jFileChooser.setFileSelectionMode(selectionMode);
+    }
+
+    @Override
+    public void setMultiSelectionEnabled(boolean multiple) {
+        jFileChooser.setMultiSelectionEnabled(multiple);
+    }
+
+    @Override
+    public void setSelectedFile(File file) {
+        jFileChooser.setSelectedFile(file);
+    }
+
+    @Override
+    public int showOpenDialog(Component parent) {
+        jFileChooser.setLocale(locale);
+        return jFileChooser.showOpenDialog(parent);
+    }
+
+    @Override
+    public int showSaveDialog(Component parent) {
+        jFileChooser.setLocale(locale);
+        return jFileChooser.showSaveDialog(parent);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java b/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
index 9abdea2..e83635e 100644
--- a/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
+++ b/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
@@ -1,185 +1,185 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.widgets;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.ImageIcon;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.event.UndoableEditEvent;
-import javax.swing.event.UndoableEditListener;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.JTextComponent;
-import javax.swing.undo.CannotUndoException;
-import javax.swing.undo.UndoManager;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * A popup menu designed for text components. It displays the following actions:
- * <ul>
- * <li>Undo</li>
- * <li>Cut</li>
- * <li>Copy</li>
- * <li>Paste</li>
- * <li>Delete</li>
- * <li>Select All</li>
- * </ul>
- * @since 5886
- */
-public class TextContextualPopupMenu extends JPopupMenu {
-
-    protected JTextComponent component = null;
-    protected UndoAction undoAction = null;
-
-    protected final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
-        @Override public void propertyChange(PropertyChangeEvent evt) {
-            if ("editable".equals(evt.getPropertyName())) {
-                removeAll();
-                addMenuEntries();
-            }
-        }
-    };
-
-    /**
-     * Creates a new {@link TextContextualPopupMenu}.
-     */
-    protected TextContextualPopupMenu() {
-    }
-
-    /**
-     * Attaches this contextual menu to the given text component.
-     * A menu can only be attached to a single component.
-     * @param component The text component that will display the menu and handle its actions.
-     * @return {@code this}
-     * @see #detach()
-     */
-    protected TextContextualPopupMenu attach(JTextComponent component) {
-        if (component != null && !isAttached()) {
-            this.component = component;
-            if (component.isEditable()) {
-                undoAction = new UndoAction();
-                component.getDocument().addUndoableEditListener(undoAction);
-            }
-            addMenuEntries();
-            component.addPropertyChangeListener("editable", propertyChangeListener);
-        }
-        return this;
-    }
-
-    private void addMenuEntries() {
-        if (component.isEditable()) {
-            add(new JMenuItem(undoAction));
-            addSeparator();
-            addMenuEntry(component, tr("Cut"), DefaultEditorKit.cutAction, null);
-        }
-        addMenuEntry(component, tr("Copy"), DefaultEditorKit.copyAction, "copy");
-        if (component.isEditable()) {
-            addMenuEntry(component, tr("Paste"), DefaultEditorKit.pasteAction, "paste");
-            addMenuEntry(component, tr("Delete"), DefaultEditorKit.deleteNextCharAction, null);
-        }
-        addSeparator();
-        addMenuEntry(component, tr("Select All"), DefaultEditorKit.selectAllAction, null);
-    }
-
-    /**
-     * Detaches this contextual menu from its text component.
-     * @return {@code this}
-     * @see #attach(JTextComponent)
-     */
-    protected TextContextualPopupMenu detach() {
-        if (isAttached()) {
-            component.removePropertyChangeListener("editable", propertyChangeListener);
-            removeAll();
-            if (undoAction != null) {
-                component.getDocument().removeUndoableEditListener(undoAction);
-                undoAction = null;
-            }
-            this.component = null;
-        }
-        return this;
-    }
-
-    /**
-     * Creates a new {@link TextContextualPopupMenu} and enables it for the given text component.
-     * @param component The component that will display the menu and handle its actions.
-     * @return The {@link PopupMenuLauncher} responsible of displaying the popup menu.
-     *         Call {@link #disableMenuFor} with this object if you want to disable the menu later.
-     * @see #disableMenuFor(JTextComponent, PopupMenuLauncher)
-     */
-    public static PopupMenuLauncher enableMenuFor(JTextComponent component) {
-        PopupMenuLauncher launcher = new PopupMenuLauncher(new TextContextualPopupMenu().attach(component), true);
-        component.addMouseListener(launcher);
-        return launcher;
-    }
-
-    /**
-     * Disables the {@link TextContextualPopupMenu} attached to the given popup menu launcher and text component.
-     * @param component The component that currently displays the menu and handles its actions.
-     * @param launcher The {@link PopupMenuLauncher} obtained via {@link #enableMenuFor}.
-     * @see #enableMenuFor(JTextComponent)
-     */
-    public static void disableMenuFor(JTextComponent component, PopupMenuLauncher launcher) {
-        if (launcher.getMenu() instanceof TextContextualPopupMenu) {
-            ((TextContextualPopupMenu) launcher.getMenu()).detach();
-            component.removeMouseListener(launcher);
-        }
-    }
-
-    /**
-     * Determines if this popup is currently attached to a component.
-     * @return {@code true} if this popup is currently attached to a component, {@code false} otherwise.
-     */
-    public final boolean isAttached() {
-        return component != null;
-    }
-
-    protected void addMenuEntry(JTextComponent component,  String label, String actionName, String iconName) {
-        Action action = component.getActionMap().get(actionName);
-        if (action != null) {
-            JMenuItem mi = new JMenuItem(action);
-            mi.setText(label);
-            if (iconName != null && Main.pref.getBoolean("text.popupmenu.useicons", true)) {
-                ImageIcon icon = new ImageProvider(iconName).setWidth(16).get();
-                if (icon != null) {
-                    mi.setIcon(icon);
-                }
-            }
-            add(mi);
-        }
-    }
-
-    protected static class UndoAction extends AbstractAction implements UndoableEditListener {
-
-        private final UndoManager undoManager = new UndoManager();
-
-        public UndoAction() {
-            super(tr("Undo"));
-            setEnabled(false);
-        }
-
-        @Override
-        public void undoableEditHappened(UndoableEditEvent e) {
-            undoManager.addEdit(e.getEdit());
-            setEnabled(undoManager.canUndo());
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            try {
-                undoManager.undo();
-            } catch (CannotUndoException ex) {
-                // Ignored
-            } finally {
-                setEnabled(undoManager.canUndo());
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.event.UndoableEditListener;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.JTextComponent;
+import javax.swing.undo.CannotUndoException;
+import javax.swing.undo.UndoManager;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * A popup menu designed for text components. It displays the following actions:
+ * <ul>
+ * <li>Undo</li>
+ * <li>Cut</li>
+ * <li>Copy</li>
+ * <li>Paste</li>
+ * <li>Delete</li>
+ * <li>Select All</li>
+ * </ul>
+ * @since 5886
+ */
+public class TextContextualPopupMenu extends JPopupMenu {
+
+    protected JTextComponent component = null;
+    protected UndoAction undoAction = null;
+
+    protected final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
+        @Override public void propertyChange(PropertyChangeEvent evt) {
+            if ("editable".equals(evt.getPropertyName())) {
+                removeAll();
+                addMenuEntries();
+            }
+        }
+    };
+
+    /**
+     * Creates a new {@link TextContextualPopupMenu}.
+     */
+    protected TextContextualPopupMenu() {
+    }
+
+    /**
+     * Attaches this contextual menu to the given text component.
+     * A menu can only be attached to a single component.
+     * @param component The text component that will display the menu and handle its actions.
+     * @return {@code this}
+     * @see #detach()
+     */
+    protected TextContextualPopupMenu attach(JTextComponent component) {
+        if (component != null && !isAttached()) {
+            this.component = component;
+            if (component.isEditable()) {
+                undoAction = new UndoAction();
+                component.getDocument().addUndoableEditListener(undoAction);
+            }
+            addMenuEntries();
+            component.addPropertyChangeListener("editable", propertyChangeListener);
+        }
+        return this;
+    }
+
+    private void addMenuEntries() {
+        if (component.isEditable()) {
+            add(new JMenuItem(undoAction));
+            addSeparator();
+            addMenuEntry(component, tr("Cut"), DefaultEditorKit.cutAction, null);
+        }
+        addMenuEntry(component, tr("Copy"), DefaultEditorKit.copyAction, "copy");
+        if (component.isEditable()) {
+            addMenuEntry(component, tr("Paste"), DefaultEditorKit.pasteAction, "paste");
+            addMenuEntry(component, tr("Delete"), DefaultEditorKit.deleteNextCharAction, null);
+        }
+        addSeparator();
+        addMenuEntry(component, tr("Select All"), DefaultEditorKit.selectAllAction, null);
+    }
+
+    /**
+     * Detaches this contextual menu from its text component.
+     * @return {@code this}
+     * @see #attach(JTextComponent)
+     */
+    protected TextContextualPopupMenu detach() {
+        if (isAttached()) {
+            component.removePropertyChangeListener("editable", propertyChangeListener);
+            removeAll();
+            if (undoAction != null) {
+                component.getDocument().removeUndoableEditListener(undoAction);
+                undoAction = null;
+            }
+            this.component = null;
+        }
+        return this;
+    }
+
+    /**
+     * Creates a new {@link TextContextualPopupMenu} and enables it for the given text component.
+     * @param component The component that will display the menu and handle its actions.
+     * @return The {@link PopupMenuLauncher} responsible of displaying the popup menu.
+     *         Call {@link #disableMenuFor} with this object if you want to disable the menu later.
+     * @see #disableMenuFor(JTextComponent, PopupMenuLauncher)
+     */
+    public static PopupMenuLauncher enableMenuFor(JTextComponent component) {
+        PopupMenuLauncher launcher = new PopupMenuLauncher(new TextContextualPopupMenu().attach(component), true);
+        component.addMouseListener(launcher);
+        return launcher;
+    }
+
+    /**
+     * Disables the {@link TextContextualPopupMenu} attached to the given popup menu launcher and text component.
+     * @param component The component that currently displays the menu and handles its actions.
+     * @param launcher The {@link PopupMenuLauncher} obtained via {@link #enableMenuFor}.
+     * @see #enableMenuFor(JTextComponent)
+     */
+    public static void disableMenuFor(JTextComponent component, PopupMenuLauncher launcher) {
+        if (launcher.getMenu() instanceof TextContextualPopupMenu) {
+            ((TextContextualPopupMenu) launcher.getMenu()).detach();
+            component.removeMouseListener(launcher);
+        }
+    }
+
+    /**
+     * Determines if this popup is currently attached to a component.
+     * @return {@code true} if this popup is currently attached to a component, {@code false} otherwise.
+     */
+    public final boolean isAttached() {
+        return component != null;
+    }
+
+    protected void addMenuEntry(JTextComponent component,  String label, String actionName, String iconName) {
+        Action action = component.getActionMap().get(actionName);
+        if (action != null) {
+            JMenuItem mi = new JMenuItem(action);
+            mi.setText(label);
+            if (iconName != null && Main.pref.getBoolean("text.popupmenu.useicons", true)) {
+                ImageIcon icon = new ImageProvider(iconName).setWidth(16).get();
+                if (icon != null) {
+                    mi.setIcon(icon);
+                }
+            }
+            add(mi);
+        }
+    }
+
+    protected static class UndoAction extends AbstractAction implements UndoableEditListener {
+
+        private final UndoManager undoManager = new UndoManager();
+
+        public UndoAction() {
+            super(tr("Undo"));
+            setEnabled(false);
+        }
+
+        @Override
+        public void undoableEditHappened(UndoableEditEvent e) {
+            undoManager.addEdit(e.getEdit());
+            setEnabled(undoManager.canUndo());
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                undoManager.undo();
+            } catch (CannotUndoException ex) {
+                // Ignored
+            } finally {
+                setEnabled(undoManager.canUndo());
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/AbstractParser.java b/src/org/openstreetmap/josm/io/AbstractParser.java
index 03702e5..f53b797 100644
--- a/src/org/openstreetmap/josm/io/AbstractParser.java
+++ b/src/org/openstreetmap/josm/io/AbstractParser.java
@@ -1,208 +1,208 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.Date;
-
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.RelationMemberData;
-import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.data.osm.history.HistoryNode;
-import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.data.osm.history.HistoryRelation;
-import org.openstreetmap.josm.data.osm.history.HistoryWay;
-import org.openstreetmap.josm.tools.date.DateUtils;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Base class of {@link OsmChangesetContentParser} and {@link OsmHistoryReader} internal parsers.
- * @since 6201
- */
-public abstract class AbstractParser extends DefaultHandler {
-    
-    /** the current primitive to be read */
-    protected HistoryOsmPrimitive currentPrimitive;
-    protected Locator locator;
-
-    @Override
-    public void setDocumentLocator(Locator locator) {
-        this.locator = locator;
-    }
-    
-    protected abstract void throwException(String message) throws SAXException;
-
-    protected final long getMandatoryAttributeLong(Attributes attr, String name) throws SAXException {
-        String v = attr.getValue(name);
-        if (v == null) {
-            throwException(tr("Missing mandatory attribute ''{0}''.", name));
-        }
-        Long l = 0L;
-        try {
-            l = Long.parseLong(v);
-        } catch(NumberFormatException e) {
-            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v));
-        }
-        if (l < 0) {
-            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
-        }
-        return l;
-    }
-
-    protected final Long getAttributeLong(Attributes attr, String name) throws SAXException {
-        String v = attr.getValue(name);
-        if (v == null)
-            return null;
-        Long l = 0L;
-        try {
-            l = Long.parseLong(v);
-        } catch(NumberFormatException e) {
-            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v));
-        }
-        if (l < 0) {
-            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
-        }
-        return l;
-    }
-
-    protected final Double getAttributeDouble(Attributes attr, String name) throws SAXException {
-        String v = attr.getValue(name);
-        if (v == null) {
-            return null;
-        }
-        double d = 0.0;
-        try {
-            d = Double.parseDouble(v);
-        } catch(NumberFormatException e) {
-            throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
-        }
-        return d;
-    }
-
-    protected final String getMandatoryAttributeString(Attributes attr, String name) throws SAXException {
-        String v = attr.getValue(name);
-        if (v == null) {
-            throwException(tr("Missing mandatory attribute ''{0}''.", name));
-        }
-        return v;
-    }
-
-    protected boolean getMandatoryAttributeBoolean(Attributes attr, String name) throws SAXException {
-        String v = attr.getValue(name);
-        if (v == null) {
-            throwException(tr("Missing mandatory attribute ''{0}''.", name));
-        }
-        if ("true".equals(v)) return true;
-        if ("false".equals(v)) return false;
-        throwException(tr("Illegal value for mandatory attribute ''{0}'' of type boolean. Got ''{1}''.", name, v));
-        return false; // not reached
-    }
-    
-    protected final HistoryOsmPrimitive createPrimitive(Attributes atts, OsmPrimitiveType type) throws SAXException {
-        long id = getMandatoryAttributeLong(atts,"id");
-        long version = getMandatoryAttributeLong(atts,"version");
-        long changesetId = getMandatoryAttributeLong(atts,"changeset");
-        boolean visible= getMandatoryAttributeBoolean(atts, "visible");
-
-        Long uid = getAttributeLong(atts, "uid");
-        String userStr = atts.getValue("user");
-        User user;
-        if (userStr != null) {
-            if (uid != null) {
-                user = User.createOsmUser(uid, userStr);
-            } else {
-                user = User.createLocalUser(userStr);
-            }
-        } else {
-            user = User.getAnonymous();
-        }
-
-        String v = getMandatoryAttributeString(atts, "timestamp");
-        Date timestamp = DateUtils.fromString(v);
-        HistoryOsmPrimitive primitive = null;
-        if (type.equals(OsmPrimitiveType.NODE)) {
-            Double lat = getAttributeDouble(atts, "lat");
-            Double lon = getAttributeDouble(atts, "lon");
-            LatLon coor = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
-            primitive = new HistoryNode(
-                    id,version,visible,user,changesetId,timestamp,coor
-            );
-
-        } else if (type.equals(OsmPrimitiveType.WAY)) {
-            primitive = new HistoryWay(
-                    id,version,visible,user,changesetId,timestamp
-            );
-        } else if (type.equals(OsmPrimitiveType.RELATION)) {
-            primitive = new HistoryRelation(
-                    id,version,visible,user,changesetId,timestamp
-            );
-        }
-        return primitive;
-    }
-
-    protected final void startNode(Attributes atts) throws SAXException {
-        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.NODE);
-    }
-
-    protected final void startWay(Attributes atts) throws SAXException {
-        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.WAY);
-    }
-    
-    protected final void startRelation(Attributes atts) throws SAXException {
-        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.RELATION);
-    }
-
-    protected final void handleTag(Attributes atts) throws SAXException {
-        String key = getMandatoryAttributeString(atts, "k");
-        String value = getMandatoryAttributeString(atts, "v");
-        currentPrimitive.put(key,value);
-    }
-
-    protected final void handleNodeReference(Attributes atts) throws SAXException {
-        long ref = getMandatoryAttributeLong(atts, "ref");
-        ((HistoryWay)currentPrimitive).addNode(ref);
-    }
-
-    protected void handleMember(Attributes atts) throws SAXException {
-        long ref = getMandatoryAttributeLong(atts, "ref");
-        String v = getMandatoryAttributeString(atts, "type");
-        OsmPrimitiveType type = null;
-        try {
-            type = OsmPrimitiveType.fromApiTypeName(v);
-        } catch(IllegalArgumentException e) {
-            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type OsmPrimitiveType. Got ''{1}''.", "type", v));
-        }
-        String role = getMandatoryAttributeString(atts, "role");
-        RelationMemberData member = new RelationMemberData(role, type,ref);
-        ((HistoryRelation)currentPrimitive).addMember(member);
-    }
-    
-    protected final boolean doStartElement(String qName, Attributes atts) throws SAXException {
-        switch (qName) {
-        case "node":
-            startNode(atts);
-            return true;
-        case "way":
-            startWay(atts);
-            return true;
-        case "relation":
-            startRelation(atts);
-            return true;
-        case "tag":
-            handleTag(atts);
-            return true;
-        case "nd":
-            handleNodeReference(atts);
-            return true;
-        case "member":
-            handleMember(atts);
-            return true;
-        default:
-            return false;
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Date;
+
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.data.osm.history.HistoryNode;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryRelation;
+import org.openstreetmap.josm.data.osm.history.HistoryWay;
+import org.openstreetmap.josm.tools.date.DateUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Base class of {@link OsmChangesetContentParser} and {@link OsmHistoryReader} internal parsers.
+ * @since 6201
+ */
+public abstract class AbstractParser extends DefaultHandler {
+    
+    /** the current primitive to be read */
+    protected HistoryOsmPrimitive currentPrimitive;
+    protected Locator locator;
+
+    @Override
+    public void setDocumentLocator(Locator locator) {
+        this.locator = locator;
+    }
+    
+    protected abstract void throwException(String message) throws SAXException;
+
+    protected final long getMandatoryAttributeLong(Attributes attr, String name) throws SAXException {
+        String v = attr.getValue(name);
+        if (v == null) {
+            throwException(tr("Missing mandatory attribute ''{0}''.", name));
+        }
+        Long l = 0L;
+        try {
+            l = Long.parseLong(v);
+        } catch(NumberFormatException e) {
+            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v));
+        }
+        if (l < 0) {
+            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
+        }
+        return l;
+    }
+
+    protected final Long getAttributeLong(Attributes attr, String name) throws SAXException {
+        String v = attr.getValue(name);
+        if (v == null)
+            return null;
+        Long l = 0L;
+        try {
+            l = Long.parseLong(v);
+        } catch(NumberFormatException e) {
+            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v));
+        }
+        if (l < 0) {
+            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
+        }
+        return l;
+    }
+
+    protected final Double getAttributeDouble(Attributes attr, String name) throws SAXException {
+        String v = attr.getValue(name);
+        if (v == null) {
+            return null;
+        }
+        double d = 0.0;
+        try {
+            d = Double.parseDouble(v);
+        } catch(NumberFormatException e) {
+            throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
+        }
+        return d;
+    }
+
+    protected final String getMandatoryAttributeString(Attributes attr, String name) throws SAXException {
+        String v = attr.getValue(name);
+        if (v == null) {
+            throwException(tr("Missing mandatory attribute ''{0}''.", name));
+        }
+        return v;
+    }
+
+    protected boolean getMandatoryAttributeBoolean(Attributes attr, String name) throws SAXException {
+        String v = attr.getValue(name);
+        if (v == null) {
+            throwException(tr("Missing mandatory attribute ''{0}''.", name));
+        }
+        if ("true".equals(v)) return true;
+        if ("false".equals(v)) return false;
+        throwException(tr("Illegal value for mandatory attribute ''{0}'' of type boolean. Got ''{1}''.", name, v));
+        return false; // not reached
+    }
+    
+    protected final HistoryOsmPrimitive createPrimitive(Attributes atts, OsmPrimitiveType type) throws SAXException {
+        long id = getMandatoryAttributeLong(atts,"id");
+        long version = getMandatoryAttributeLong(atts,"version");
+        long changesetId = getMandatoryAttributeLong(atts,"changeset");
+        boolean visible= getMandatoryAttributeBoolean(atts, "visible");
+
+        Long uid = getAttributeLong(atts, "uid");
+        String userStr = atts.getValue("user");
+        User user;
+        if (userStr != null) {
+            if (uid != null) {
+                user = User.createOsmUser(uid, userStr);
+            } else {
+                user = User.createLocalUser(userStr);
+            }
+        } else {
+            user = User.getAnonymous();
+        }
+
+        String v = getMandatoryAttributeString(atts, "timestamp");
+        Date timestamp = DateUtils.fromString(v);
+        HistoryOsmPrimitive primitive = null;
+        if (type.equals(OsmPrimitiveType.NODE)) {
+            Double lat = getAttributeDouble(atts, "lat");
+            Double lon = getAttributeDouble(atts, "lon");
+            LatLon coor = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
+            primitive = new HistoryNode(
+                    id,version,visible,user,changesetId,timestamp,coor
+            );
+
+        } else if (type.equals(OsmPrimitiveType.WAY)) {
+            primitive = new HistoryWay(
+                    id,version,visible,user,changesetId,timestamp
+            );
+        } else if (type.equals(OsmPrimitiveType.RELATION)) {
+            primitive = new HistoryRelation(
+                    id,version,visible,user,changesetId,timestamp
+            );
+        }
+        return primitive;
+    }
+
+    protected final void startNode(Attributes atts) throws SAXException {
+        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.NODE);
+    }
+
+    protected final void startWay(Attributes atts) throws SAXException {
+        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.WAY);
+    }
+    
+    protected final void startRelation(Attributes atts) throws SAXException {
+        currentPrimitive = createPrimitive(atts, OsmPrimitiveType.RELATION);
+    }
+
+    protected final void handleTag(Attributes atts) throws SAXException {
+        String key = getMandatoryAttributeString(atts, "k");
+        String value = getMandatoryAttributeString(atts, "v");
+        currentPrimitive.put(key,value);
+    }
+
+    protected final void handleNodeReference(Attributes atts) throws SAXException {
+        long ref = getMandatoryAttributeLong(atts, "ref");
+        ((HistoryWay)currentPrimitive).addNode(ref);
+    }
+
+    protected void handleMember(Attributes atts) throws SAXException {
+        long ref = getMandatoryAttributeLong(atts, "ref");
+        String v = getMandatoryAttributeString(atts, "type");
+        OsmPrimitiveType type = null;
+        try {
+            type = OsmPrimitiveType.fromApiTypeName(v);
+        } catch(IllegalArgumentException e) {
+            throwException(tr("Illegal value for mandatory attribute ''{0}'' of type OsmPrimitiveType. Got ''{1}''.", "type", v));
+        }
+        String role = getMandatoryAttributeString(atts, "role");
+        RelationMemberData member = new RelationMemberData(role, type,ref);
+        ((HistoryRelation)currentPrimitive).addMember(member);
+    }
+    
+    protected final boolean doStartElement(String qName, Attributes atts) throws SAXException {
+        switch (qName) {
+        case "node":
+            startNode(atts);
+            return true;
+        case "way":
+            startWay(atts);
+            return true;
+        case "relation":
+            startRelation(atts);
+            return true;
+        case "tag":
+            handleTag(atts);
+            return true;
+        case "nd":
+            handleNodeReference(atts);
+            return true;
+        case "member":
+            handleMember(atts);
+            return true;
+        default:
+            return false;
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/AbstractReader.java b/src/org/openstreetmap/josm/io/AbstractReader.java
index c8ee84d..ca6e56c 100644
--- a/src/org/openstreetmap/josm/io/AbstractReader.java
+++ b/src/org/openstreetmap/josm/io/AbstractReader.java
@@ -1,205 +1,205 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-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;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.RelationMemberData;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.Way;
-
-/**
- * Abstract Reader, allowing other implementations than OsmReader (PbfReader in PBF plugin for example)
- * @author Vincent
- *
- */
-public abstract class AbstractReader {
-
-    /**
-     * The dataset to add parsed objects to.
-     */
-    protected DataSet ds = new DataSet();
-
-    protected Changeset uploadChangeset;
-
-    /** the map from external ids to read OsmPrimitives. External ids are
-     * longs too, but in contrast to internal ids negative values are used
-     * to identify primitives unknown to the OSM server
-     */
-    protected final Map<PrimitiveId, OsmPrimitive> externalIdMap = new HashMap<>();
-
-    /**
-     * Data structure for the remaining way objects
-     */
-    protected final Map<Long, Collection<Long>> ways = new HashMap<>();
-
-    /**
-     * Data structure for relation objects
-     */
-    protected final Map<Long, Collection<RelationMemberData>> relations = new HashMap<>();
-    
-    /**
-     * Replies the parsed data set
-     *
-     * @return the parsed data set
-     */
-    public DataSet getDataSet() {
-        return ds;
-    }
-    
-    /**
-     * Processes the parsed nodes after parsing. Just adds them to
-     * the dataset
-     *
-     */
-    protected void processNodesAfterParsing() {
-        for (OsmPrimitive primitive: externalIdMap.values()) {
-            if (primitive instanceof Node) {
-                this.ds.addPrimitive(primitive);
-            }
-        }
-    }
-
-    /**
-     * Processes the ways after parsing. Rebuilds the list of nodes of each way and
-     * adds the way to the dataset
-     *
-     * @throws IllegalDataException thrown if a data integrity problem is detected
-     */
-    protected void processWaysAfterParsing() throws IllegalDataException{
-        for (Long externalWayId: ways.keySet()) {
-            Way w = (Way)externalIdMap.get(new SimplePrimitiveId(externalWayId, OsmPrimitiveType.WAY));
-            List<Node> wayNodes = new ArrayList<>();
-            for (long id : ways.get(externalWayId)) {
-                Node n = (Node)externalIdMap.get(new SimplePrimitiveId(id, OsmPrimitiveType.NODE));
-                if (n == null) {
-                    if (id <= 0)
-                        throw new IllegalDataException (
-                                tr("Way with external ID ''{0}'' includes missing node with external ID ''{1}''.",
-                                        externalWayId,
-                                        id));
-                    // create an incomplete node if necessary
-                    //
-                    n = (Node)ds.getPrimitiveById(id,OsmPrimitiveType.NODE);
-                    if (n == null) {
-                        n = new Node(id);
-                        ds.addPrimitive(n);
-                    }
-                }
-                if (n.isDeleted()) {
-                    Main.info(tr("Deleted node {0} is part of way {1}", id, w.getId()));
-                } else {
-                    wayNodes.add(n);
-                }
-            }
-            w.setNodes(wayNodes);
-            if (w.hasIncompleteNodes()) {
-                Main.info(tr("Way {0} with {1} nodes has incomplete nodes because at least one node was missing in the loaded data.",
-                          externalWayId, w.getNodesCount()));
-            }
-            ds.addPrimitive(w);
-        }
-    }
-
-    /**
-     * Completes the parsed relations with its members.
-     *
-     * @throws IllegalDataException thrown if a data integrity problem is detected, i.e. if a
-     * relation member refers to a local primitive which wasn't available in the data
-     *
-     */
-    protected void processRelationsAfterParsing() throws IllegalDataException {
-
-        // First add all relations to make sure that when relation reference other relation, the referenced will be already in dataset
-        for (Long externalRelationId : relations.keySet()) {
-            Relation relation = (Relation) externalIdMap.get(
-                    new SimplePrimitiveId(externalRelationId, OsmPrimitiveType.RELATION)
-            );
-            ds.addPrimitive(relation);
-        }
-
-        for (Long externalRelationId : relations.keySet()) {
-            Relation relation = (Relation) externalIdMap.get(
-                    new SimplePrimitiveId(externalRelationId, OsmPrimitiveType.RELATION)
-            );
-            List<RelationMember> relationMembers = new ArrayList<>();
-            for (RelationMemberData rm : relations.get(externalRelationId)) {
-                OsmPrimitive primitive = null;
-
-                // lookup the member from the map of already created primitives
-                primitive = externalIdMap.get(new SimplePrimitiveId(rm.getMemberId(), rm.getMemberType()));
-
-                if (primitive == null) {
-                    if (rm.getMemberId() <= 0)
-                        // relation member refers to a primitive with a negative id which was not
-                        // found in the data. This is always a data integrity problem and we abort
-                        // with an exception
-                        //
-                        throw new IllegalDataException(
-                                tr("Relation with external id ''{0}'' refers to a missing primitive with external id ''{1}''.",
-                                        externalRelationId,
-                                        rm.getMemberId()));
-
-                    // member refers to OSM primitive which was not present in the parsed data
-                    // -> create a new incomplete primitive and add it to the dataset
-                    //
-                    primitive = ds.getPrimitiveById(rm.getMemberId(), rm.getMemberType());
-                    if (primitive == null) {
-                        switch (rm.getMemberType()) {
-                        case NODE:
-                            primitive = new Node(rm.getMemberId()); break;
-                        case WAY:
-                            primitive = new Way(rm.getMemberId()); break;
-                        case RELATION:
-                            primitive = new Relation(rm.getMemberId()); break;
-                        default: throw new AssertionError(); // can't happen
-                        }
-
-                        ds.addPrimitive(primitive);
-                        externalIdMap.put(new SimplePrimitiveId(rm.getMemberId(), rm.getMemberType()), primitive);
-                    }
-                }
-                if (primitive.isDeleted()) {
-                    Main.info(tr("Deleted member {0} is used by relation {1}", primitive.getId(), relation.getId()));
-                } else {
-                    relationMembers.add(new RelationMember(rm.getRole(), primitive));
-                }
-            }
-            relation.setMembers(relationMembers);
-        }
-    }
-
-    protected void processChangesetAfterParsing() {
-        if (uploadChangeset != null) {
-            for (Map.Entry<String, String> e : uploadChangeset.getKeys().entrySet()) {
-                ds.addChangeSetTag(e.getKey(), e.getValue());
-            }
-        }
-    }
-    
-    protected final void prepareDataSet() throws IllegalDataException {
-        try {
-            ds.beginUpdate();
-            processNodesAfterParsing();
-            processWaysAfterParsing();
-            processRelationsAfterParsing();
-            processChangesetAfterParsing();
-        } finally {
-            ds.endUpdate();
-        }
-    }
-}
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+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;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * Abstract Reader, allowing other implementations than OsmReader (PbfReader in PBF plugin for example)
+ * @author Vincent
+ *
+ */
+public abstract class AbstractReader {
+
+    /**
+     * The dataset to add parsed objects to.
+     */
+    protected DataSet ds = new DataSet();
+
+    protected Changeset uploadChangeset;
+
+    /** the map from external ids to read OsmPrimitives. External ids are
+     * longs too, but in contrast to internal ids negative values are used
+     * to identify primitives unknown to the OSM server
+     */
+    protected final Map<PrimitiveId, OsmPrimitive> externalIdMap = new HashMap<>();
+
+    /**
+     * Data structure for the remaining way objects
+     */
+    protected final Map<Long, Collection<Long>> ways = new HashMap<>();
+
+    /**
+     * Data structure for relation objects
+     */
+    protected final Map<Long, Collection<RelationMemberData>> relations = new HashMap<>();
+    
+    /**
+     * Replies the parsed data set
+     *
+     * @return the parsed data set
+     */
+    public DataSet getDataSet() {
+        return ds;
+    }
+    
+    /**
+     * Processes the parsed nodes after parsing. Just adds them to
+     * the dataset
+     *
+     */
+    protected void processNodesAfterParsing() {
+        for (OsmPrimitive primitive: externalIdMap.values()) {
+            if (primitive instanceof Node) {
+                this.ds.addPrimitive(primitive);
+            }
+        }
+    }
+
+    /**
+     * Processes the ways after parsing. Rebuilds the list of nodes of each way and
+     * adds the way to the dataset
+     *
+     * @throws IllegalDataException thrown if a data integrity problem is detected
+     */
+    protected void processWaysAfterParsing() throws IllegalDataException{
+        for (Long externalWayId: ways.keySet()) {
+            Way w = (Way)externalIdMap.get(new SimplePrimitiveId(externalWayId, OsmPrimitiveType.WAY));
+            List<Node> wayNodes = new ArrayList<>();
+            for (long id : ways.get(externalWayId)) {
+                Node n = (Node)externalIdMap.get(new SimplePrimitiveId(id, OsmPrimitiveType.NODE));
+                if (n == null) {
+                    if (id <= 0)
+                        throw new IllegalDataException (
+                                tr("Way with external ID ''{0}'' includes missing node with external ID ''{1}''.",
+                                        externalWayId,
+                                        id));
+                    // create an incomplete node if necessary
+                    //
+                    n = (Node)ds.getPrimitiveById(id,OsmPrimitiveType.NODE);
+                    if (n == null) {
+                        n = new Node(id);
+                        ds.addPrimitive(n);
+                    }
+                }
+                if (n.isDeleted()) {
+                    Main.info(tr("Deleted node {0} is part of way {1}", id, w.getId()));
+                } else {
+                    wayNodes.add(n);
+                }
+            }
+            w.setNodes(wayNodes);
+            if (w.hasIncompleteNodes()) {
+                Main.info(tr("Way {0} with {1} nodes has incomplete nodes because at least one node was missing in the loaded data.",
+                          externalWayId, w.getNodesCount()));
+            }
+            ds.addPrimitive(w);
+        }
+    }
+
+    /**
+     * Completes the parsed relations with its members.
+     *
+     * @throws IllegalDataException thrown if a data integrity problem is detected, i.e. if a
+     * relation member refers to a local primitive which wasn't available in the data
+     *
+     */
+    protected void processRelationsAfterParsing() throws IllegalDataException {
+
+        // First add all relations to make sure that when relation reference other relation, the referenced will be already in dataset
+        for (Long externalRelationId : relations.keySet()) {
+            Relation relation = (Relation) externalIdMap.get(
+                    new SimplePrimitiveId(externalRelationId, OsmPrimitiveType.RELATION)
+            );
+            ds.addPrimitive(relation);
+        }
+
+        for (Long externalRelationId : relations.keySet()) {
+            Relation relation = (Relation) externalIdMap.get(
+                    new SimplePrimitiveId(externalRelationId, OsmPrimitiveType.RELATION)
+            );
+            List<RelationMember> relationMembers = new ArrayList<>();
+            for (RelationMemberData rm : relations.get(externalRelationId)) {
+                OsmPrimitive primitive = null;
+
+                // lookup the member from the map of already created primitives
+                primitive = externalIdMap.get(new SimplePrimitiveId(rm.getMemberId(), rm.getMemberType()));
+
+                if (primitive == null) {
+                    if (rm.getMemberId() <= 0)
+                        // relation member refers to a primitive with a negative id which was not
+                        // found in the data. This is always a data integrity problem and we abort
+                        // with an exception
+                        //
+                        throw new IllegalDataException(
+                                tr("Relation with external id ''{0}'' refers to a missing primitive with external id ''{1}''.",
+                                        externalRelationId,
+                                        rm.getMemberId()));
+
+                    // member refers to OSM primitive which was not present in the parsed data
+                    // -> create a new incomplete primitive and add it to the dataset
+                    //
+                    primitive = ds.getPrimitiveById(rm.getMemberId(), rm.getMemberType());
+                    if (primitive == null) {
+                        switch (rm.getMemberType()) {
+                        case NODE:
+                            primitive = new Node(rm.getMemberId()); break;
+                        case WAY:
+                            primitive = new Way(rm.getMemberId()); break;
+                        case RELATION:
+                            primitive = new Relation(rm.getMemberId()); break;
+                        default: throw new AssertionError(); // can't happen
+                        }
+
+                        ds.addPrimitive(primitive);
+                        externalIdMap.put(new SimplePrimitiveId(rm.getMemberId(), rm.getMemberType()), primitive);
+                    }
+                }
+                if (primitive.isDeleted()) {
+                    Main.info(tr("Deleted member {0} is used by relation {1}", primitive.getId(), relation.getId()));
+                } else {
+                    relationMembers.add(new RelationMember(rm.getRole(), primitive));
+                }
+            }
+            relation.setMembers(relationMembers);
+        }
+    }
+
+    protected void processChangesetAfterParsing() {
+        if (uploadChangeset != null) {
+            for (Map.Entry<String, String> e : uploadChangeset.getKeys().entrySet()) {
+                ds.addChangeSetTag(e.getKey(), e.getValue());
+            }
+        }
+    }
+    
+    protected final void prepareDataSet() throws IllegalDataException {
+        try {
+            ds.beginUpdate();
+            processNodesAfterParsing();
+            processWaysAfterParsing();
+            processRelationsAfterParsing();
+            processChangesetAfterParsing();
+        } finally {
+            ds.endUpdate();
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/FileWatcher.java b/src/org/openstreetmap/josm/io/FileWatcher.java
index e041b7f..2d49053 100644
--- a/src/org/openstreetmap/josm/io/FileWatcher.java
+++ b/src/org/openstreetmap/josm/io/FileWatcher.java
@@ -1,162 +1,162 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.StandardWatchEventKinds;
-import java.nio.file.WatchEvent;
-import java.nio.file.WatchEvent.Kind;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchService;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.validation.OsmValidator;
-import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
-import org.openstreetmap.josm.gui.mappaint.StyleSource;
-import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
-import org.openstreetmap.josm.gui.preferences.SourceEntry;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-
-/**
- * Background thread that monitors certain files and perform relevant actions when they change.
- * @since 7185
- */
-public class FileWatcher {
-
-    private WatchService watcher;
-
-    private final Map<Path, StyleSource> styleMap = new HashMap<>();
-    private final Map<Path, SourceEntry> ruleMap = new HashMap<>();
-
-    /**
-     * Constructs a new {@code FileWatcher}.
-     */
-    public FileWatcher() {
-        try {
-            watcher = FileSystems.getDefault().newWatchService();
-            new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    processEvents();
-                }
-            }, "File Watcher").start();
-        } catch (IOException e) {
-            Main.error(e);
-        }
-    }
-
-    /**
-     * Registers a map paint style for local file changes, allowing dynamic reloading.
-     * @param style The style to watch
-     * @throws IllegalArgumentException if {@code style} is null or if it does not provide a local file
-     * @throws IllegalStateException if the watcher service failed to start
-     * @throws IOException if an I/O error occurs
-     */
-    public void registerStyleSource(StyleSource style) throws IOException {
-        register(style, styleMap);
-    }
-
-    /**
-     * Registers a validator rule for local file changes, allowing dynamic reloading.
-     * @param rule The rule to watch
-     * @throws IllegalArgumentException if {@code rule} is null or if it does not provide a local file
-     * @throws IllegalStateException if the watcher service failed to start
-     * @throws IOException if an I/O error occurs
-     * @since 7276
-     */
-    public void registerValidatorRule(SourceEntry rule) throws IOException {
-        register(rule, ruleMap);
-    }
-
-    private <T extends SourceEntry> void register(T obj, Map<Path, T> map) throws IOException {
-        CheckParameterUtil.ensureParameterNotNull(obj, "obj");
-        if (watcher == null) {
-            throw new IllegalStateException("File watcher is not available");
-        }
-        // Get local file, as this method is only called for local style sources
-        File file = new File(obj.url);
-        // Get parent directory as WatchService allows only to monitor directories, not single files
-        File dir = file.getParentFile();
-        if (dir == null) {
-            throw new IllegalArgumentException("Resource "+obj+" does not have a parent directory");
-        }
-        synchronized(this) {
-            // Register directory. Can be called several times for a same directory without problem
-            // (it returns the same key so it should not send events several times)
-            dir.toPath().register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
-            map.put(file.toPath(), obj);
-        }
-    }
-
-    /**
-     * Process all events for the key queued to the watcher.
-     */
-    private void processEvents() {
-        if (Main.isDebugEnabled()) {
-            Main.debug("File watcher thread started");
-        }
-        while (true) {
-
-            // wait for key to be signaled
-            WatchKey key;
-            try {
-                key = watcher.take();
-            } catch (InterruptedException x) {
-                return;
-            }
-
-            for (WatchEvent<?> event: key.pollEvents()) {
-                Kind<?> kind = event.kind();
-
-                if (StandardWatchEventKinds.OVERFLOW.equals(kind)) {
-                    continue;
-                }
-
-                // The filename is the context of the event.
-                @SuppressWarnings("unchecked")
-                WatchEvent<Path> ev = (WatchEvent<Path>)event;
-                Path filename = ev.context();
-                if (filename == null) {
-                    continue;
-                }
-
-                // Only way to get full path (http://stackoverflow.com/a/7802029/2257172)
-                Path fullPath = ((Path)key.watchable()).resolve(filename);
-
-                synchronized(this) {
-                    StyleSource style = styleMap.get(fullPath);
-                    SourceEntry rule = ruleMap.get(fullPath);
-                    if (style != null) {
-                        Main.info("Map style "+style.getDisplayString()+" has been modified. Reloading style...");
-                        Main.worker.submit(new MapPaintStyleLoader(Collections.singleton(style)));
-                    } else if (rule != null) {
-                        Main.info("Validator rule "+rule.getDisplayString()+" has been modified. Reloading rule...");
-                        MapCSSTagChecker tagChecker = OsmValidator.getTest(MapCSSTagChecker.class);
-                        if (tagChecker != null) {
-                            try {
-                                tagChecker.addMapCSS(rule.url);
-                            } catch (IOException | ParseException e) {
-                                Main.warn(e);
-                            }
-                        }
-                    } else if (Main.isDebugEnabled()) {
-                        Main.debug("Received "+kind.name()+" event for unregistered file: "+fullPath);
-                    }
-                }
-            }
-
-            // Reset the key -- this step is critical to receive
-            // further watch events. If the key is no longer valid, the directory
-            // is inaccessible so exit the loop.
-            if (!key.reset()) {
-                break;
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.StandardWatchEventKinds;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchEvent.Kind;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
+import org.openstreetmap.josm.gui.mappaint.StyleSource;
+import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
+import org.openstreetmap.josm.gui.preferences.SourceEntry;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
+/**
+ * Background thread that monitors certain files and perform relevant actions when they change.
+ * @since 7185
+ */
+public class FileWatcher {
+
+    private WatchService watcher;
+
+    private final Map<Path, StyleSource> styleMap = new HashMap<>();
+    private final Map<Path, SourceEntry> ruleMap = new HashMap<>();
+
+    /**
+     * Constructs a new {@code FileWatcher}.
+     */
+    public FileWatcher() {
+        try {
+            watcher = FileSystems.getDefault().newWatchService();
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    processEvents();
+                }
+            }, "File Watcher").start();
+        } catch (IOException e) {
+            Main.error(e);
+        }
+    }
+
+    /**
+     * Registers a map paint style for local file changes, allowing dynamic reloading.
+     * @param style The style to watch
+     * @throws IllegalArgumentException if {@code style} is null or if it does not provide a local file
+     * @throws IllegalStateException if the watcher service failed to start
+     * @throws IOException if an I/O error occurs
+     */
+    public void registerStyleSource(StyleSource style) throws IOException {
+        register(style, styleMap);
+    }
+
+    /**
+     * Registers a validator rule for local file changes, allowing dynamic reloading.
+     * @param rule The rule to watch
+     * @throws IllegalArgumentException if {@code rule} is null or if it does not provide a local file
+     * @throws IllegalStateException if the watcher service failed to start
+     * @throws IOException if an I/O error occurs
+     * @since 7276
+     */
+    public void registerValidatorRule(SourceEntry rule) throws IOException {
+        register(rule, ruleMap);
+    }
+
+    private <T extends SourceEntry> void register(T obj, Map<Path, T> map) throws IOException {
+        CheckParameterUtil.ensureParameterNotNull(obj, "obj");
+        if (watcher == null) {
+            throw new IllegalStateException("File watcher is not available");
+        }
+        // Get local file, as this method is only called for local style sources
+        File file = new File(obj.url);
+        // Get parent directory as WatchService allows only to monitor directories, not single files
+        File dir = file.getParentFile();
+        if (dir == null) {
+            throw new IllegalArgumentException("Resource "+obj+" does not have a parent directory");
+        }
+        synchronized(this) {
+            // Register directory. Can be called several times for a same directory without problem
+            // (it returns the same key so it should not send events several times)
+            dir.toPath().register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
+            map.put(file.toPath(), obj);
+        }
+    }
+
+    /**
+     * Process all events for the key queued to the watcher.
+     */
+    private void processEvents() {
+        if (Main.isDebugEnabled()) {
+            Main.debug("File watcher thread started");
+        }
+        while (true) {
+
+            // wait for key to be signaled
+            WatchKey key;
+            try {
+                key = watcher.take();
+            } catch (InterruptedException x) {
+                return;
+            }
+
+            for (WatchEvent<?> event: key.pollEvents()) {
+                Kind<?> kind = event.kind();
+
+                if (StandardWatchEventKinds.OVERFLOW.equals(kind)) {
+                    continue;
+                }
+
+                // The filename is the context of the event.
+                @SuppressWarnings("unchecked")
+                WatchEvent<Path> ev = (WatchEvent<Path>)event;
+                Path filename = ev.context();
+                if (filename == null) {
+                    continue;
+                }
+
+                // Only way to get full path (http://stackoverflow.com/a/7802029/2257172)
+                Path fullPath = ((Path)key.watchable()).resolve(filename);
+
+                synchronized(this) {
+                    StyleSource style = styleMap.get(fullPath);
+                    SourceEntry rule = ruleMap.get(fullPath);
+                    if (style != null) {
+                        Main.info("Map style "+style.getDisplayString()+" has been modified. Reloading style...");
+                        Main.worker.submit(new MapPaintStyleLoader(Collections.singleton(style)));
+                    } else if (rule != null) {
+                        Main.info("Validator rule "+rule.getDisplayString()+" has been modified. Reloading rule...");
+                        MapCSSTagChecker tagChecker = OsmValidator.getTest(MapCSSTagChecker.class);
+                        if (tagChecker != null) {
+                            try {
+                                tagChecker.addMapCSS(rule.url);
+                            } catch (IOException | ParseException e) {
+                                Main.warn(e);
+                            }
+                        }
+                    } else if (Main.isDebugEnabled()) {
+                        Main.debug("Received "+kind.name()+" event for unregistered file: "+fullPath);
+                    }
+                }
+            }
+
+            // Reset the key -- this step is critical to receive
+            // further watch events. If the key is no longer valid, the directory
+            // is inaccessible so exit the loop.
+            if (!key.reset()) {
+                break;
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/ImportCancelException.java b/src/org/openstreetmap/josm/io/ImportCancelException.java
index 9692ba7..dc6271b 100644
--- a/src/org/openstreetmap/josm/io/ImportCancelException.java
+++ b/src/org/openstreetmap/josm/io/ImportCancelException.java
@@ -1,10 +1,10 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-/**
- * All exceptions resulting from a user cancelation during any import should implement this interface.
- * @since 6621
- */
-public interface ImportCancelException {
-
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+/**
+ * All exceptions resulting from a user cancelation during any import should implement this interface.
+ * @since 6621
+ */
+public interface ImportCancelException {
+
+}
diff --git a/src/org/openstreetmap/josm/io/MessageNotifier.java b/src/org/openstreetmap/josm/io/MessageNotifier.java
index f934761..4eaaf2e 100644
--- a/src/org/openstreetmap/josm/io/MessageNotifier.java
+++ b/src/org/openstreetmap/josm/io/MessageNotifier.java
@@ -1,152 +1,152 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.GridBagLayout;
-import java.net.Authenticator.RequestorType;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.UserInfo;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.data.preferences.IntegerProperty;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
-import org.openstreetmap.josm.gui.Notification;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.gui.widgets.UrlLabel;
-import org.openstreetmap.josm.io.auth.CredentialsAgentException;
-import org.openstreetmap.josm.io.auth.CredentialsAgentResponse;
-import org.openstreetmap.josm.io.auth.CredentialsManager;
-import org.openstreetmap.josm.io.auth.JosmPreferencesCredentialAgent;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Notifies user periodically of new received (unread) messages
- * @since 6349
- */
-public final class MessageNotifier {
-
-    private MessageNotifier() {
-        // Hide default constructor for utils classes
-    }
-
-    /** Property defining if this task is enabled or not */
-    public static final BooleanProperty PROP_NOTIFIER_ENABLED = new BooleanProperty("message.notifier.enabled", true);
-    /** Property defining the update interval in minutes */
-    public static final IntegerProperty PROP_INTERVAL = new IntegerProperty("message.notifier.interval", 5);
-
-    private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor();
-
-    private static final Runnable WORKER = new Worker();
-
-    private static ScheduledFuture<?> task = null;
-
-    private static class Worker implements Runnable {
-
-        private int lastUnreadCount = 0;
-
-        @Override
-        public void run() {
-            try {
-                final UserInfo userInfo = new OsmServerUserInfoReader().fetchUserInfo(NullProgressMonitor.INSTANCE, tr("get number of unread messages"));
-                final int unread = userInfo.getUnreadMessages();
-                if (unread > 0 && unread != lastUnreadCount) {
-                    GuiHelper.runInEDT(new Runnable() {
-                        @Override
-                        public void run() {
-                            JPanel panel = new JPanel(new GridBagLayout());
-                            panel.add(new JLabel(trn("You have {0} unread message.", "You have {0} unread messages.", unread, unread)), GBC.eol());
-                            panel.add(new UrlLabel(Main.getBaseUserUrl() + "/"+userInfo.getDisplayName()+"/inbox", tr("Click here to see your inbox.")), GBC.eol());
-                            panel.setOpaque(false);
-                            new Notification().setContent(panel)
-                                .setIcon(JOptionPane.INFORMATION_MESSAGE)
-                                .setDuration(Notification.TIME_LONG)
-                                .show();
-                        }
-                    });
-                    lastUnreadCount = unread;
-                }
-            } catch (OsmTransferException e) {
-                Main.warn(e);
-            }
-        }
-    }
-
-    /**
-     * Starts the message notifier task if not already started and if user is fully identified
-     */
-    public static void start() {
-        int interval = PROP_INTERVAL.get();
-        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);
-            Main.info("Message notifier active (checks every "+interval+" minute"+(interval>1?"s":"")+")");
-        }
-    }
-
-    /**
-     * Stops the message notifier task if started
-     */
-    public static void stop() {
-        if (isRunning()) {
-            task.cancel(false);
-            Main.info("Message notifier inactive");
-            task = null;
-        }
-    }
-
-    /**
-     * Determines if the message notifier is currently running
-     * @return {@code true} if the notifier is running, {@code false} otherwise
-     */
-    public static boolean isRunning() {
-        return task != null;
-    }
-
-    /**
-     * Determines if user set enough information in JOSM preferences to make the request to OSM API without
-     * prompting him for a password.
-     * @return {@code true} if user chose an OAuth token or supplied both its username and password, {@code false otherwise}
-     */
-    public static boolean isUserEnoughIdentified() {
-        JosmUserIdentityManager identManager = JosmUserIdentityManager.getInstance();
-        if (identManager.isFullyIdentified()) {
-            return true;
-        } else {
-            CredentialsManager credManager = CredentialsManager.getInstance();
-            try {
-                if (JosmPreferencesCredentialAgent.class.equals(credManager.getCredentialsAgentClass())) {
-                    if (OsmApi.isUsingOAuth()) {
-                        return credManager.lookupOAuthAccessToken() != null;
-                    } else {
-                        String username = Main.pref.get("osm-server.username", null);
-                        String password = Main.pref.get("osm-server.password", null);
-                        return username != null && !username.isEmpty() && password != null && !password.isEmpty();
-                    }
-                } else {
-                    CredentialsAgentResponse credentials = credManager.getCredentials(
-                            RequestorType.SERVER, OsmApi.getOsmApi().getHost(), false);
-                    if (credentials != null) {
-                        String username = credentials.getUsername();
-                        char[] password = credentials.getPassword();
-                        return username != null && !username.isEmpty() && password != null && password.length > 0;
-                    }
-                }
-            } catch (CredentialsAgentException e) {
-                Main.warn("Unable to get credentials: "+e.getMessage());
-            }
-        }
-        return false;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.GridBagLayout;
+import java.net.Authenticator.RequestorType;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.UserInfo;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.io.auth.CredentialsAgentException;
+import org.openstreetmap.josm.io.auth.CredentialsAgentResponse;
+import org.openstreetmap.josm.io.auth.CredentialsManager;
+import org.openstreetmap.josm.io.auth.JosmPreferencesCredentialAgent;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Notifies user periodically of new received (unread) messages
+ * @since 6349
+ */
+public final class MessageNotifier {
+
+    private MessageNotifier() {
+        // Hide default constructor for utils classes
+    }
+
+    /** Property defining if this task is enabled or not */
+    public static final BooleanProperty PROP_NOTIFIER_ENABLED = new BooleanProperty("message.notifier.enabled", true);
+    /** Property defining the update interval in minutes */
+    public static final IntegerProperty PROP_INTERVAL = new IntegerProperty("message.notifier.interval", 5);
+
+    private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor();
+
+    private static final Runnable WORKER = new Worker();
+
+    private static ScheduledFuture<?> task = null;
+
+    private static class Worker implements Runnable {
+
+        private int lastUnreadCount = 0;
+
+        @Override
+        public void run() {
+            try {
+                final UserInfo userInfo = new OsmServerUserInfoReader().fetchUserInfo(NullProgressMonitor.INSTANCE, tr("get number of unread messages"));
+                final int unread = userInfo.getUnreadMessages();
+                if (unread > 0 && unread != lastUnreadCount) {
+                    GuiHelper.runInEDT(new Runnable() {
+                        @Override
+                        public void run() {
+                            JPanel panel = new JPanel(new GridBagLayout());
+                            panel.add(new JLabel(trn("You have {0} unread message.", "You have {0} unread messages.", unread, unread)), GBC.eol());
+                            panel.add(new UrlLabel(Main.getBaseUserUrl() + "/"+userInfo.getDisplayName()+"/inbox", tr("Click here to see your inbox.")), GBC.eol());
+                            panel.setOpaque(false);
+                            new Notification().setContent(panel)
+                                .setIcon(JOptionPane.INFORMATION_MESSAGE)
+                                .setDuration(Notification.TIME_LONG)
+                                .show();
+                        }
+                    });
+                    lastUnreadCount = unread;
+                }
+            } catch (OsmTransferException e) {
+                Main.warn(e);
+            }
+        }
+    }
+
+    /**
+     * Starts the message notifier task if not already started and if user is fully identified
+     */
+    public static void start() {
+        int interval = PROP_INTERVAL.get();
+        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);
+            Main.info("Message notifier active (checks every "+interval+" minute"+(interval>1?"s":"")+")");
+        }
+    }
+
+    /**
+     * Stops the message notifier task if started
+     */
+    public static void stop() {
+        if (isRunning()) {
+            task.cancel(false);
+            Main.info("Message notifier inactive");
+            task = null;
+        }
+    }
+
+    /**
+     * Determines if the message notifier is currently running
+     * @return {@code true} if the notifier is running, {@code false} otherwise
+     */
+    public static boolean isRunning() {
+        return task != null;
+    }
+
+    /**
+     * Determines if user set enough information in JOSM preferences to make the request to OSM API without
+     * prompting him for a password.
+     * @return {@code true} if user chose an OAuth token or supplied both its username and password, {@code false otherwise}
+     */
+    public static boolean isUserEnoughIdentified() {
+        JosmUserIdentityManager identManager = JosmUserIdentityManager.getInstance();
+        if (identManager.isFullyIdentified()) {
+            return true;
+        } else {
+            CredentialsManager credManager = CredentialsManager.getInstance();
+            try {
+                if (JosmPreferencesCredentialAgent.class.equals(credManager.getCredentialsAgentClass())) {
+                    if (OsmApi.isUsingOAuth()) {
+                        return credManager.lookupOAuthAccessToken() != null;
+                    } else {
+                        String username = Main.pref.get("osm-server.username", null);
+                        String password = Main.pref.get("osm-server.password", null);
+                        return username != null && !username.isEmpty() && password != null && !password.isEmpty();
+                    }
+                } else {
+                    CredentialsAgentResponse credentials = credManager.getCredentials(
+                            RequestorType.SERVER, OsmApi.getOsmApi().getHost(), false);
+                    if (credentials != null) {
+                        String username = credentials.getUsername();
+                        char[] password = credentials.getPassword();
+                        return username != null && !username.isEmpty() && password != null && password.length > 0;
+                    }
+                }
+            } catch (CredentialsAgentException e) {
+                Main.warn("Unable to get credentials: "+e.getMessage());
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/OfflineAccessException.java b/src/org/openstreetmap/josm/io/OfflineAccessException.java
index f078b9e..7bc9fa9 100644
--- a/src/org/openstreetmap/josm/io/OfflineAccessException.java
+++ b/src/org/openstreetmap/josm/io/OfflineAccessException.java
@@ -1,17 +1,17 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-/**
- * Exception thrown when an online resource is accessed while in offline mode.
- * @since 7434
- */
-public class OfflineAccessException extends IllegalStateException {
-
-    /**
-     * Constructs a new {@code OfflineAccessException}.
-     * @param s the String that contains a detailed message
-     */
-    public OfflineAccessException(String s) {
-        super(s);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+/**
+ * Exception thrown when an online resource is accessed while in offline mode.
+ * @since 7434
+ */
+public class OfflineAccessException extends IllegalStateException {
+
+    /**
+     * Constructs a new {@code OfflineAccessException}.
+     * @param s the String that contains a detailed message
+     */
+    public OfflineAccessException(String s) {
+        super(s);
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/OnlineResource.java b/src/org/openstreetmap/josm/io/OnlineResource.java
index ff1847e..ee5218c 100644
--- a/src/org/openstreetmap/josm/io/OnlineResource.java
+++ b/src/org/openstreetmap/josm/io/OnlineResource.java
@@ -1,50 +1,50 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * Online resources directly used by JOSM.
- * This does not include websites where user can sometimes be redirected through its web browser,
- * but only those to we establish a connection.
- *
- * @since 7434
- */
-public enum OnlineResource {
-
-    /** The OSM API, used for download, upload, history, etc. */
-    OSM_API(tr("OSM API")),
-    /** The JOSM website, used for startup page, imagery/presets/styles/rules entries, help, etc. */
-    JOSM_WEBSITE(tr("JOSM website")),
-    /** Value used to represent all online resources */
-    ALL(tr("All"));
-
-    private final String locName;
-
-    private OnlineResource(String locName) {
-        this.locName = locName;
-    }
-
-    /**
-     * Replies the localized name.
-     * @return the localized name
-     */
-    public final String getLocName() {
-        return locName;
-    }
-
-    /**
-     * Ensures resource is not accessed in offline mode.
-     * @param downloadString The attempted download string
-     * @param resourceString The resource download string that should not be accessed
-     * @throws OfflineAccessException if resource is accessed in offline mode, in any protocol
-     */
-    public final void checkOfflineAccess(String downloadString, String resourceString) {
-        if (Main.isOffline(this) && downloadString.substring(downloadString.indexOf("://"))
-                .startsWith(resourceString.substring(resourceString.indexOf("://")))) {
-            throw new OfflineAccessException(tr("Unable to access ''{0}'': {1} not available (offline mode)", downloadString, getLocName()));
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * Online resources directly used by JOSM.
+ * This does not include websites where user can sometimes be redirected through its web browser,
+ * but only those to we establish a connection.
+ *
+ * @since 7434
+ */
+public enum OnlineResource {
+
+    /** The OSM API, used for download, upload, history, etc. */
+    OSM_API(tr("OSM API")),
+    /** The JOSM website, used for startup page, imagery/presets/styles/rules entries, help, etc. */
+    JOSM_WEBSITE(tr("JOSM website")),
+    /** Value used to represent all online resources */
+    ALL(tr("All"));
+
+    private final String locName;
+
+    private OnlineResource(String locName) {
+        this.locName = locName;
+    }
+
+    /**
+     * Replies the localized name.
+     * @return the localized name
+     */
+    public final String getLocName() {
+        return locName;
+    }
+
+    /**
+     * Ensures resource is not accessed in offline mode.
+     * @param downloadString The attempted download string
+     * @param resourceString The resource download string that should not be accessed
+     * @throws OfflineAccessException if resource is accessed in offline mode, in any protocol
+     */
+    public final void checkOfflineAccess(String downloadString, String resourceString) {
+        if (Main.isOffline(this) && downloadString.substring(downloadString.indexOf("://"))
+                .startsWith(resourceString.substring(resourceString.indexOf("://")))) {
+            throw new OfflineAccessException(tr("Unable to access ''{0}'': {1} not available (offline mode)", downloadString, getLocName()));
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/OsmChangeReader.java b/src/org/openstreetmap/josm/io/OsmChangeReader.java
index 04c89cb..f8392a3 100644
--- a/src/org/openstreetmap/josm/io/OsmChangeReader.java
+++ b/src/org/openstreetmap/josm/io/OsmChangeReader.java
@@ -1,111 +1,111 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.InputStream;
-import java.util.Arrays;
-
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-
-/**
- * Reader for <a href="http://wiki.openstreetmap.org/wiki/OsmChange">OsmChange</a> file format.
- */
-public class OsmChangeReader extends OsmReader {
-
-    /**
-     * List of possible actions.
-     */
-    private static final String[] ACTIONS = {"create", "modify", "delete"};
-
-    /**
-     * constructor (for private and subclasses use only)
-     *
-     * @see #parseDataSet(InputStream, ProgressMonitor)
-     */
-    protected OsmChangeReader() {
-    }
-
-    @Override
-    protected void parseRoot() throws XMLStreamException {
-        if ("osmChange".equals(parser.getLocalName())) {
-            parseOsmChange();
-        } else {
-            parseUnknown();
-        }
-    }
-
-    private void parseOsmChange() throws XMLStreamException {
-        String v = parser.getAttributeValue(null, "version");
-        if (v == null) {
-            throwException(tr("Missing mandatory attribute ''{0}''.", "version"));
-        }
-        if (!"0.6".equals(v)) {
-            throwException(tr("Unsupported version: {0}", v));
-        }
-        ds.setVersion(v);
-        while (parser.hasNext()) {
-            int event = parser.next();
-            if (event == XMLStreamConstants.START_ELEMENT) {
-                if (Arrays.asList(ACTIONS).contains(parser.getLocalName())) {
-                    parseCommon(parser.getLocalName());
-                } else {
-                    parseUnknown();
-                }
-            } else if (event == XMLStreamConstants.END_ELEMENT) {
-                return;
-            }
-        }
-    }
-
-    private void parseCommon(String action) throws XMLStreamException {
-        while (parser.hasNext()) {
-            int event = parser.next();
-            if (event == XMLStreamConstants.START_ELEMENT) {
-                OsmPrimitive p = null;
-                switch (parser.getLocalName()) {
-                case "node":
-                    p = parseNode();
-                    break;
-                case "way":
-                    p = parseWay();
-                    break;
-                case "relation":
-                    p = parseRelation();
-                    break;
-                default:
-                    parseUnknown();
-                }
-                if (p != null && action != null) {
-                    if ("modify".equals(action)) {
-                        p.setModified(true);
-                    } else if ("delete".equals(action)) {
-                        p.setDeleted(true);
-                    }
-                }
-            } else if (event == XMLStreamConstants.END_ELEMENT) {
-                return;
-            }
-        }
-    }
-
-    /**
-     * Parse the given input source and return the dataset.
-     *
-     * @param source the source input stream. Must not be <code>null</code>.
-     * @param progressMonitor  the progress monitor. If <code>null</code>,
-     * {@link org.openstreetmap.josm.gui.progress.NullProgressMonitor#INSTANCE} is assumed
-     *
-     * @return the dataset with the parsed data
-     * @throws IllegalDataException thrown if the an error was found while parsing the data from the source
-     * @throws IllegalArgumentException thrown if source is <code>null</code>
-     */
-    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
-        return new OsmChangeReader().doParseDataSet(source, progressMonitor);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.InputStream;
+import java.util.Arrays;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+/**
+ * Reader for <a href="http://wiki.openstreetmap.org/wiki/OsmChange">OsmChange</a> file format.
+ */
+public class OsmChangeReader extends OsmReader {
+
+    /**
+     * List of possible actions.
+     */
+    private static final String[] ACTIONS = {"create", "modify", "delete"};
+
+    /**
+     * constructor (for private and subclasses use only)
+     *
+     * @see #parseDataSet(InputStream, ProgressMonitor)
+     */
+    protected OsmChangeReader() {
+    }
+
+    @Override
+    protected void parseRoot() throws XMLStreamException {
+        if ("osmChange".equals(parser.getLocalName())) {
+            parseOsmChange();
+        } else {
+            parseUnknown();
+        }
+    }
+
+    private void parseOsmChange() throws XMLStreamException {
+        String v = parser.getAttributeValue(null, "version");
+        if (v == null) {
+            throwException(tr("Missing mandatory attribute ''{0}''.", "version"));
+        }
+        if (!"0.6".equals(v)) {
+            throwException(tr("Unsupported version: {0}", v));
+        }
+        ds.setVersion(v);
+        while (parser.hasNext()) {
+            int event = parser.next();
+            if (event == XMLStreamConstants.START_ELEMENT) {
+                if (Arrays.asList(ACTIONS).contains(parser.getLocalName())) {
+                    parseCommon(parser.getLocalName());
+                } else {
+                    parseUnknown();
+                }
+            } else if (event == XMLStreamConstants.END_ELEMENT) {
+                return;
+            }
+        }
+    }
+
+    private void parseCommon(String action) throws XMLStreamException {
+        while (parser.hasNext()) {
+            int event = parser.next();
+            if (event == XMLStreamConstants.START_ELEMENT) {
+                OsmPrimitive p = null;
+                switch (parser.getLocalName()) {
+                case "node":
+                    p = parseNode();
+                    break;
+                case "way":
+                    p = parseWay();
+                    break;
+                case "relation":
+                    p = parseRelation();
+                    break;
+                default:
+                    parseUnknown();
+                }
+                if (p != null && action != null) {
+                    if ("modify".equals(action)) {
+                        p.setModified(true);
+                    } else if ("delete".equals(action)) {
+                        p.setDeleted(true);
+                    }
+                }
+            } else if (event == XMLStreamConstants.END_ELEMENT) {
+                return;
+            }
+        }
+    }
+
+    /**
+     * Parse the given input source and return the dataset.
+     *
+     * @param source the source input stream. Must not be <code>null</code>.
+     * @param progressMonitor  the progress monitor. If <code>null</code>,
+     * {@link org.openstreetmap.josm.gui.progress.NullProgressMonitor#INSTANCE} is assumed
+     *
+     * @return the dataset with the parsed data
+     * @throws IllegalDataException thrown if the an error was found while parsing the data from the source
+     * @throws IllegalArgumentException thrown if source is <code>null</code>
+     */
+    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
+        return new OsmChangeReader().doParseDataSet(source, progressMonitor);
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/OsmZipImporter.java b/src/org/openstreetmap/josm/io/OsmZipImporter.java
index 8b94ade..d9b4e6d 100644
--- a/src/org/openstreetmap/josm/io/OsmZipImporter.java
+++ b/src/org/openstreetmap/josm/io/OsmZipImporter.java
@@ -1,28 +1,28 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
-
-/**
- * OSM data importer that uncompresses it from Zip format.
- * @since 6882
- */
-public class OsmZipImporter extends OsmImporter {
-
-    /**
-     * File filter used to load/save Zip compressed OSM files.
-     */
-    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
-            "osm.zip", "osm.zip", tr("OSM Server Files zip compressed") + " (*.osm.zip)");
-
-    /**
-     * Constructs a new {@code OsmZipImporter}.
-     */
-    public OsmZipImporter() {
-        super(FILE_FILTER);
-    }
-
-    // compression handling is performed in super-class
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+
+/**
+ * OSM data importer that uncompresses it from Zip format.
+ * @since 6882
+ */
+public class OsmZipImporter extends OsmImporter {
+
+    /**
+     * File filter used to load/save Zip compressed OSM files.
+     */
+    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
+            "osm.zip", "osm.zip", tr("OSM Server Files zip compressed") + " (*.osm.zip)");
+
+    /**
+     * Constructs a new {@code OsmZipImporter}.
+     */
+    public OsmZipImporter() {
+        super(FILE_FILTER);
+    }
+
+    // compression handling is performed in super-class
+}
diff --git a/src/org/openstreetmap/josm/io/imagery/WMSException.java b/src/org/openstreetmap/josm/io/imagery/WMSException.java
index d5dc434..ef44d0f 100644
--- a/src/org/openstreetmap/josm/io/imagery/WMSException.java
+++ b/src/org/openstreetmap/josm/io/imagery/WMSException.java
@@ -1,59 +1,59 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.imagery;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * WMS Service Exception, as defined by {@code application/vnd.ogc.se_xml} format:<ul>
- * <li><a href="http://schemas.opengis.net/wms/1.1.0/exception_1_1_0.dtd">WMS 1.1.0 DTD</a></li>
- * <li><a href="http://schemas.opengis.net/wms/1.3.0/exception_1_3_0.dtd">WMS 1.3.0 XSD</a></li>
- * </ul>
- * @since 7425
- */
-public class WMSException extends Exception {
-
-    private final WMSRequest request;
-    private final URL url;
-    private final String[] exceptions;
-
-    /**
-     * Constructs a new {@code WMSException}.
-     * @param request the WMS request that lead to this exception
-     * @param url the URL that lead to this exception
-     * @param exceptions the exceptions replied by WMS server
-     */
-    public WMSException(WMSRequest request, URL url, Collection<String> exceptions) {
-        super(Utils.join("\n", exceptions));
-        this.request = request;
-        this.url = url;
-        this.exceptions = exceptions.toArray(new String[0]);
-    }
-
-    /**
-     * Replies the WMS request that lead to this exception.
-     * @return the WMS request
-     */
-    public final WMSRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * Replies the URL that lead to this exception.
-     * @return the URL
-     */
-    public final URL getUrl() {
-        return url;
-    }
-
-    /**
-     * Replies the WMS Service exceptions.
-     * @return the exceptions
-     */
-    public final Collection<String> getExceptions() {
-        return Arrays.asList(exceptions);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.imagery;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * WMS Service Exception, as defined by {@code application/vnd.ogc.se_xml} format:<ul>
+ * <li><a href="http://schemas.opengis.net/wms/1.1.0/exception_1_1_0.dtd">WMS 1.1.0 DTD</a></li>
+ * <li><a href="http://schemas.opengis.net/wms/1.3.0/exception_1_3_0.dtd">WMS 1.3.0 XSD</a></li>
+ * </ul>
+ * @since 7425
+ */
+public class WMSException extends Exception {
+
+    private final WMSRequest request;
+    private final URL url;
+    private final String[] exceptions;
+
+    /**
+     * Constructs a new {@code WMSException}.
+     * @param request the WMS request that lead to this exception
+     * @param url the URL that lead to this exception
+     * @param exceptions the exceptions replied by WMS server
+     */
+    public WMSException(WMSRequest request, URL url, Collection<String> exceptions) {
+        super(Utils.join("\n", exceptions));
+        this.request = request;
+        this.url = url;
+        this.exceptions = exceptions.toArray(new String[0]);
+    }
+
+    /**
+     * Replies the WMS request that lead to this exception.
+     * @return the WMS request
+     */
+    public final WMSRequest getRequest() {
+        return request;
+    }
+
+    /**
+     * Replies the URL that lead to this exception.
+     * @return the URL
+     */
+    public final URL getUrl() {
+        return url;
+    }
+
+    /**
+     * Replies the WMS Service exceptions.
+     * @return the exceptions
+     */
+    public final Collection<String> getExceptions() {
+        return Arrays.asList(exceptions);
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/DNSName.java b/src/org/openstreetmap/josm/io/remotecontrol/DNSName.java
index 833f92e..f709953 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/DNSName.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/DNSName.java
@@ -1,248 +1,248 @@
-/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package org.openstreetmap.josm.io.remotecontrol;
-
-import java.io.IOException;
-import java.util.Locale;
-
-import sun.security.util.DerOutputStream;
-import sun.security.x509.GeneralNameInterface;
-
-/**
- * This class implements the DNSName as required by the GeneralNames
- * ASN.1 object.
- * <p>
- * [RFC2459] When the subjectAltName extension contains a domain name service
- * label, the domain name MUST be stored in the dNSName (an IA5String).
- * The name MUST be in the "preferred name syntax," as specified by RFC
- * 1034 [RFC 1034]. Note that while upper and lower case letters are
- * allowed in domain names, no signifigance is attached to the case.  In
- * addition, while the string " " is a legal domain name, subjectAltName
- * extensions with a dNSName " " are not permitted.  Finally, the use of
- * the DNS representation for Internet mail addresses (wpolk.nist.gov
- * instead of wpolk at nist.gov) is not permitted; such identities are to
- * be encoded as rfc822Name.
- *
- * This class has been copied from OpenJDK7u repository and modified
- * in order to fix Java bug 8016345:
- * https://bugs.openjdk.java.net/browse/JDK-8016345
- *
- * It can be deleted after a migration to a Java release fixing this bug.
- * <p>
- * @author Amit Kapoor
- * @author Hemma Prafullchandra
- * @author JOSM developers
- * @since 7347
- */
-public class DNSName implements GeneralNameInterface {
-    private final String name;
-
-    private static final String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-    private static final String digitsAndHyphen = "0123456789-";
-    private static final String alphaDigitsAndHyphen = alpha + digitsAndHyphen;
-
-    /**
-     * Create the DNSName object with the specified name.
-     *
-     * @param name the DNSName.
-     * @throws IOException if the name is not a valid DNSName subjectAltName
-     */
-    public DNSName(String name) throws IOException {
-        if (name == null || name.length() == 0)
-            throw new IOException("DNS name must not be null");
-        if (name.indexOf(' ') != -1)
-            throw new IOException("DNS names or NameConstraints with blank components are not permitted");
-        if (name.charAt(0) == '.' || name.charAt(name.length() -1) == '.')
-            throw new IOException("DNS names or NameConstraints may not begin or end with a .");
-        //Name will consist of label components separated by "."
-        //startIndex is the index of the first character of a component
-        //endIndex is the index of the last character of a component plus 1
-        for (int endIndex,startIndex=0; startIndex < name.length(); startIndex = endIndex+1) {
-            endIndex = name.indexOf('.', startIndex);
-            if (endIndex < 0) {
-                endIndex = name.length();
-            }
-            if ((endIndex-startIndex) < 1)
-                throw new IOException("DNSName SubjectAltNames with empty components are not permitted");
-
-            //nonStartIndex: index for characters in the component beyond the first one
-            for (int nonStartIndex=startIndex+1; nonStartIndex < endIndex; nonStartIndex++) {
-                char x = name.charAt(nonStartIndex);
-                if ((alphaDigitsAndHyphen).indexOf(x) < 0)
-                    throw new IOException("DNSName components must consist of letters, digits, and hyphens");
-            }
-        }
-        this.name = name;
-    }
-
-    /**
-     * Return the type of the GeneralName.
-     */
-    @Override
-    public int getType() {
-        return GeneralNameInterface.NAME_DNS;
-    }
-
-    /**
-     * Return the actual name value of the GeneralName.
-     * @return the actual name value of the GeneralName
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Encode the DNS name into the DerOutputStream.
-     *
-     * @param out the DER stream to encode the DNSName to.
-     * @exception IOException on encoding errors.
-     */
-    @Override
-    public void encode(DerOutputStream out) throws IOException {
-        out.putIA5String(name);
-    }
-
-    /**
-     * Convert the name into user readable string.
-     */
-    @Override
-    public String toString() {
-        return "DNSName: " + name;
-    }
-
-    /**
-     * Compares this name with another, for equality.
-     *
-     * @return true iff the names are equivalent
-     * according to RFC2459.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-
-        if (!(obj instanceof DNSName))
-            return false;
-
-        DNSName other = (DNSName)obj;
-
-        // RFC2459 mandates that these names are
-        // not case-sensitive
-        return name.equalsIgnoreCase(other.name);
-    }
-
-    /**
-     * Returns the hash code value for this object.
-     *
-     * @return a hash code value for this object.
-     */
-    @Override
-    public int hashCode() {
-        return name.toUpperCase().hashCode();
-    }
-
-    /**
-     * Return type of constraint inputName places on this name:<ul>
-     *   <li>NAME_DIFF_TYPE = -1: input name is different type from name (i.e. does not constrain).
-     *   <li>NAME_MATCH = 0: input name matches name.
-     *   <li>NAME_NARROWS = 1: input name narrows name (is lower in the naming subtree)
-     *   <li>NAME_WIDENS = 2: input name widens name (is higher in the naming subtree)
-     *   <li>NAME_SAME_TYPE = 3: input name does not match or narrow name, but is same type.
-     * </ul>.  These results are used in checking NameConstraints during
-     * certification path verification.
-     * <p>
-     * RFC2459: DNS name restrictions are expressed as foo.bar.com. Any subdomain
-     * satisfies the name constraint. For example, www.foo.bar.com would
-     * satisfy the constraint but bigfoo.bar.com would not.
-     * <p>
-     * draft-ietf-pkix-new-part1-00.txt:  DNS name restrictions are expressed as foo.bar.com.
-     * Any DNS name that
-     * can be constructed by simply adding to the left hand side of the name
-     * satisfies the name constraint. For example, www.foo.bar.com would
-     * satisfy the constraint but foo1.bar.com would not.
-     * <p>
-     * RFC1034: By convention, domain names can be stored with arbitrary case, but
-     * domain name comparisons for all present domain functions are done in a
-     * case-insensitive manner, assuming an ASCII character set, and a high
-     * order zero bit.
-     * <p>
-     * @param inputName to be checked for being constrained
-     * @return constraint type above
-     * @throws UnsupportedOperationException if name is not exact match, but narrowing and widening are
-     *          not supported for this name type.
-     */
-    @Override
-    public int constrains(GeneralNameInterface inputName) {
-        int constraintType;
-        if (inputName == null)
-            constraintType = NAME_DIFF_TYPE;
-        else if (inputName.getType() != NAME_DNS)
-            constraintType = NAME_DIFF_TYPE;
-        else {
-            String inName =
-                (((DNSName)inputName).getName()).toLowerCase(Locale.ENGLISH);
-            String thisName = name.toLowerCase(Locale.ENGLISH);
-            if (inName.equals(thisName))
-                constraintType = NAME_MATCH;
-            else if (thisName.endsWith(inName)) {
-                int inNdx = thisName.lastIndexOf(inName);
-                if (thisName.charAt(inNdx-1) == '.' )
-                    constraintType = NAME_WIDENS;
-                else
-                    constraintType = NAME_SAME_TYPE;
-            } else if (inName.endsWith(thisName)) {
-                int ndx = inName.lastIndexOf(thisName);
-                if (inName.charAt(ndx-1) == '.' )
-                    constraintType = NAME_NARROWS;
-                else
-                    constraintType = NAME_SAME_TYPE;
-            } else {
-                constraintType = NAME_SAME_TYPE;
-            }
-        }
-        return constraintType;
-    }
-
-    /**
-     * Return subtree depth of this name for purposes of determining
-     * NameConstraints minimum and maximum bounds and for calculating
-     * path lengths in name subtrees.
-     *
-     * @return distance of name from root
-     * @throws UnsupportedOperationException if not supported for this name type
-     */
-    @Override
-    public int subtreeDepth() {
-        String subtree=name;
-        int i=1;
-
-        /* count dots */
-        for (; subtree.lastIndexOf('.') >= 0; i++) {
-            subtree=subtree.substring(0,subtree.lastIndexOf('.'));
-        }
-
-        return i;
-    }
-}
+/*
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openstreetmap.josm.io.remotecontrol;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import sun.security.util.DerOutputStream;
+import sun.security.x509.GeneralNameInterface;
+
+/**
+ * This class implements the DNSName as required by the GeneralNames
+ * ASN.1 object.
+ * <p>
+ * [RFC2459] When the subjectAltName extension contains a domain name service
+ * label, the domain name MUST be stored in the dNSName (an IA5String).
+ * The name MUST be in the "preferred name syntax," as specified by RFC
+ * 1034 [RFC 1034]. Note that while upper and lower case letters are
+ * allowed in domain names, no signifigance is attached to the case.  In
+ * addition, while the string " " is a legal domain name, subjectAltName
+ * extensions with a dNSName " " are not permitted.  Finally, the use of
+ * the DNS representation for Internet mail addresses (wpolk.nist.gov
+ * instead of wpolk at nist.gov) is not permitted; such identities are to
+ * be encoded as rfc822Name.
+ *
+ * This class has been copied from OpenJDK7u repository and modified
+ * in order to fix Java bug 8016345:
+ * https://bugs.openjdk.java.net/browse/JDK-8016345
+ *
+ * It can be deleted after a migration to a Java release fixing this bug.
+ * <p>
+ * @author Amit Kapoor
+ * @author Hemma Prafullchandra
+ * @author JOSM developers
+ * @since 7347
+ */
+public class DNSName implements GeneralNameInterface {
+    private final String name;
+
+    private static final String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    private static final String digitsAndHyphen = "0123456789-";
+    private static final String alphaDigitsAndHyphen = alpha + digitsAndHyphen;
+
+    /**
+     * Create the DNSName object with the specified name.
+     *
+     * @param name the DNSName.
+     * @throws IOException if the name is not a valid DNSName subjectAltName
+     */
+    public DNSName(String name) throws IOException {
+        if (name == null || name.length() == 0)
+            throw new IOException("DNS name must not be null");
+        if (name.indexOf(' ') != -1)
+            throw new IOException("DNS names or NameConstraints with blank components are not permitted");
+        if (name.charAt(0) == '.' || name.charAt(name.length() -1) == '.')
+            throw new IOException("DNS names or NameConstraints may not begin or end with a .");
+        //Name will consist of label components separated by "."
+        //startIndex is the index of the first character of a component
+        //endIndex is the index of the last character of a component plus 1
+        for (int endIndex,startIndex=0; startIndex < name.length(); startIndex = endIndex+1) {
+            endIndex = name.indexOf('.', startIndex);
+            if (endIndex < 0) {
+                endIndex = name.length();
+            }
+            if ((endIndex-startIndex) < 1)
+                throw new IOException("DNSName SubjectAltNames with empty components are not permitted");
+
+            //nonStartIndex: index for characters in the component beyond the first one
+            for (int nonStartIndex=startIndex+1; nonStartIndex < endIndex; nonStartIndex++) {
+                char x = name.charAt(nonStartIndex);
+                if ((alphaDigitsAndHyphen).indexOf(x) < 0)
+                    throw new IOException("DNSName components must consist of letters, digits, and hyphens");
+            }
+        }
+        this.name = name;
+    }
+
+    /**
+     * Return the type of the GeneralName.
+     */
+    @Override
+    public int getType() {
+        return GeneralNameInterface.NAME_DNS;
+    }
+
+    /**
+     * Return the actual name value of the GeneralName.
+     * @return the actual name value of the GeneralName
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Encode the DNS name into the DerOutputStream.
+     *
+     * @param out the DER stream to encode the DNSName to.
+     * @exception IOException on encoding errors.
+     */
+    @Override
+    public void encode(DerOutputStream out) throws IOException {
+        out.putIA5String(name);
+    }
+
+    /**
+     * Convert the name into user readable string.
+     */
+    @Override
+    public String toString() {
+        return "DNSName: " + name;
+    }
+
+    /**
+     * Compares this name with another, for equality.
+     *
+     * @return true iff the names are equivalent
+     * according to RFC2459.
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+
+        if (!(obj instanceof DNSName))
+            return false;
+
+        DNSName other = (DNSName)obj;
+
+        // RFC2459 mandates that these names are
+        // not case-sensitive
+        return name.equalsIgnoreCase(other.name);
+    }
+
+    /**
+     * Returns the hash code value for this object.
+     *
+     * @return a hash code value for this object.
+     */
+    @Override
+    public int hashCode() {
+        return name.toUpperCase().hashCode();
+    }
+
+    /**
+     * Return type of constraint inputName places on this name:<ul>
+     *   <li>NAME_DIFF_TYPE = -1: input name is different type from name (i.e. does not constrain).
+     *   <li>NAME_MATCH = 0: input name matches name.
+     *   <li>NAME_NARROWS = 1: input name narrows name (is lower in the naming subtree)
+     *   <li>NAME_WIDENS = 2: input name widens name (is higher in the naming subtree)
+     *   <li>NAME_SAME_TYPE = 3: input name does not match or narrow name, but is same type.
+     * </ul>.  These results are used in checking NameConstraints during
+     * certification path verification.
+     * <p>
+     * RFC2459: DNS name restrictions are expressed as foo.bar.com. Any subdomain
+     * satisfies the name constraint. For example, www.foo.bar.com would
+     * satisfy the constraint but bigfoo.bar.com would not.
+     * <p>
+     * draft-ietf-pkix-new-part1-00.txt:  DNS name restrictions are expressed as foo.bar.com.
+     * Any DNS name that
+     * can be constructed by simply adding to the left hand side of the name
+     * satisfies the name constraint. For example, www.foo.bar.com would
+     * satisfy the constraint but foo1.bar.com would not.
+     * <p>
+     * RFC1034: By convention, domain names can be stored with arbitrary case, but
+     * domain name comparisons for all present domain functions are done in a
+     * case-insensitive manner, assuming an ASCII character set, and a high
+     * order zero bit.
+     * <p>
+     * @param inputName to be checked for being constrained
+     * @return constraint type above
+     * @throws UnsupportedOperationException if name is not exact match, but narrowing and widening are
+     *          not supported for this name type.
+     */
+    @Override
+    public int constrains(GeneralNameInterface inputName) {
+        int constraintType;
+        if (inputName == null)
+            constraintType = NAME_DIFF_TYPE;
+        else if (inputName.getType() != NAME_DNS)
+            constraintType = NAME_DIFF_TYPE;
+        else {
+            String inName =
+                (((DNSName)inputName).getName()).toLowerCase(Locale.ENGLISH);
+            String thisName = name.toLowerCase(Locale.ENGLISH);
+            if (inName.equals(thisName))
+                constraintType = NAME_MATCH;
+            else if (thisName.endsWith(inName)) {
+                int inNdx = thisName.lastIndexOf(inName);
+                if (thisName.charAt(inNdx-1) == '.' )
+                    constraintType = NAME_WIDENS;
+                else
+                    constraintType = NAME_SAME_TYPE;
+            } else if (inName.endsWith(thisName)) {
+                int ndx = inName.lastIndexOf(thisName);
+                if (inName.charAt(ndx-1) == '.' )
+                    constraintType = NAME_NARROWS;
+                else
+                    constraintType = NAME_SAME_TYPE;
+            } else {
+                constraintType = NAME_SAME_TYPE;
+            }
+        }
+        return constraintType;
+    }
+
+    /**
+     * Return subtree depth of this name for purposes of determining
+     * NameConstraints minimum and maximum bounds and for calculating
+     * path lengths in name subtrees.
+     *
+     * @return distance of name from root
+     * @throws UnsupportedOperationException if not supported for this name type
+     */
+    @Override
+    public int subtreeDepth() {
+        String subtree=name;
+        int i=1;
+
+        /* count dots */
+        for (; subtree.lastIndexOf('.') >= 0; i++) {
+            subtree=subtree.substring(0,subtree.lastIndexOf('.'));
+        }
+
+        return i;
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
index 94a7887..0c642e6 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
@@ -1,438 +1,438 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol;
-
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.net.BindException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.security.GeneralSecurityException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.SecureRandom;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocket;
-import javax.net.ssl.SSLServerSocketFactory;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.TrustManagerFactory;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.preferences.StringProperty;
-
-import sun.security.util.ObjectIdentifier;
-import sun.security.x509.AlgorithmId;
-import sun.security.x509.BasicConstraintsExtension;
-import sun.security.x509.CertificateAlgorithmId;
-import sun.security.x509.CertificateExtensions;
-import sun.security.x509.CertificateIssuerName;
-import sun.security.x509.CertificateSerialNumber;
-import sun.security.x509.CertificateSubjectName;
-import sun.security.x509.CertificateValidity;
-import sun.security.x509.CertificateVersion;
-import sun.security.x509.CertificateX509Key;
-import sun.security.x509.ExtendedKeyUsageExtension;
-import sun.security.x509.GeneralName;
-import sun.security.x509.GeneralNameInterface;
-import sun.security.x509.GeneralNames;
-import sun.security.x509.IPAddressName;
-import sun.security.x509.OIDName;
-import sun.security.x509.SubjectAlternativeNameExtension;
-import sun.security.x509.URIName;
-import sun.security.x509.X500Name;
-import sun.security.x509.X509CertImpl;
-import sun.security.x509.X509CertInfo;
-
-/**
- * Simple HTTPS server that spawns a {@link RequestProcessor} for every secure connection.
- *
- * @since 6941
- */
-public class RemoteControlHttpsServer extends Thread {
-
-    /** The server socket */
-    private ServerSocket server;
-
-    private static RemoteControlHttpsServer instance;
-    private boolean initOK = false;
-    private SSLContext sslContext;
-
-    private static final int HTTPS_PORT = 8112;
-
-    /**
-     * JOSM keystore file name.
-     * @since 7337
-     */
-    public static final String KEYSTORE_FILENAME = "josm.keystore";
-
-    /**
-     * Preference for keystore password (automatically generated by JOSM).
-     * @since 7335
-     */
-    public static final StringProperty KEYSTORE_PASSWORD = new StringProperty("remotecontrol.https.keystore.password", "");
-
-    /**
-     * Preference for certificate password (automatically generated by JOSM).
-     * @since 7335
-     */
-    public static final StringProperty KEYENTRY_PASSWORD = new StringProperty("remotecontrol.https.keyentry.password", "");
-
-    /**
-     * Unique alias used to store JOSM localhost entry, both in JOSM keystore and system/browser keystores.
-     * @since 7343
-     */
-    public static final String ENTRY_ALIAS = "josm_localhost";
-
-    /**
-     * Creates a GeneralName object from known types.
-     * @param t one of 4 known types
-     * @param v value
-     * @return which one
-     * @throws IOException
-     */
-    private static GeneralName createGeneralName(String t, String v) throws IOException {
-        GeneralNameInterface gn;
-        switch (t.toLowerCase()) {
-            case "uri": gn = new URIName(v); break;
-            case "dns": gn = new DNSName(v); break;
-            case "ip": gn = new IPAddressName(v); break;
-            default: gn = new OIDName(v);
-        }
-        return new GeneralName(gn);
-    }
-
-    /**
-     * Create a self-signed X.509 Certificate.
-     * @param dn the X.509 Distinguished Name, eg "CN=localhost, OU=JOSM, O=OpenStreetMap"
-     * @param pair the KeyPair
-     * @param days how many days from now the Certificate is valid for
-     * @param algorithm the signing algorithm, eg "SHA256withRSA"
-     * @param san SubjectAlternativeName extension (optional)
-     */
-    private static X509Certificate generateCertificate(String dn, KeyPair pair, int days, String algorithm, String san) throws GeneralSecurityException, IOException {
-        PrivateKey privkey = pair.getPrivate();
-        X509CertInfo info = new X509CertInfo();
-        Date from = new Date();
-        Date to = new Date(from.getTime() + days * 86400000L);
-        CertificateValidity interval = new CertificateValidity(from, to);
-        BigInteger sn = new BigInteger(64, new SecureRandom());
-        X500Name owner = new X500Name(dn);
-
-        info.set(X509CertInfo.VALIDITY, interval);
-        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
-
-        // Change of behaviour in JDK8:
-        // https://bugs.openjdk.java.net/browse/JDK-8040820
-        // https://bugs.openjdk.java.net/browse/JDK-7198416
-        if (!Main.isJava8orLater()) {
-            // Java 7 code. To remove with Java 8 migration
-            info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
-            info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
-        } else {
-            // Java 8 and later code
-            info.set(X509CertInfo.SUBJECT, owner);
-            info.set(X509CertInfo.ISSUER, owner);
-        }
-
-        info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
-        info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
-        AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
-        info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));
-
-        CertificateExtensions ext = new CertificateExtensions();
-        // Critical: Not CA, max path len 0
-        ext.set(BasicConstraintsExtension.NAME, new BasicConstraintsExtension(true, false, 0));
-        // Critical: only allow TLS ("serverAuth" = 1.3.6.1.5.5.7.3.1)
-        ext.set(ExtendedKeyUsageExtension.NAME, new ExtendedKeyUsageExtension(true,
-                new Vector<ObjectIdentifier>(Arrays.asList(new ObjectIdentifier("1.3.6.1.5.5.7.3.1")))));
-
-        if (san != null) {
-            int colonpos;
-            String[] ps = san.split(",");
-            GeneralNames gnames = new GeneralNames();
-            for(String item: ps) {
-                colonpos = item.indexOf(':');
-                if (colonpos < 0) {
-                    throw new IllegalArgumentException("Illegal item " + item + " in " + san);
-                }
-                String t = item.substring(0, colonpos);
-                String v = item.substring(colonpos+1);
-                gnames.add(createGeneralName(t, v));
-            }
-            // Non critical
-            ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(false, gnames));
-        }
-
-        info.set(X509CertInfo.EXTENSIONS, ext);
-
-        // Sign the cert to identify the algorithm that's used.
-        X509CertImpl cert = new X509CertImpl(info);
-        cert.sign(privkey, algorithm);
-
-        // Update the algorithm, and resign.
-        algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
-        info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
-        cert = new X509CertImpl(info);
-        cert.sign(privkey, algorithm);
-        return cert;
-    }
-
-    /**
-     * Setup the JOSM internal keystore, used to store HTTPS certificate and private key.
-     * @return Path to the (initialized) JOSM keystore
-     * @throws IOException if an I/O error occurs
-     * @throws GeneralSecurityException if a security error occurs
-     * @since 7343
-     */
-    public static Path setupJosmKeystore() throws IOException, GeneralSecurityException {
-
-        char[] storePassword = KEYSTORE_PASSWORD.get().toCharArray();
-        char[] entryPassword = KEYENTRY_PASSWORD.get().toCharArray();
-
-        Path dir = Paths.get(RemoteControl.getRemoteControlDir());
-        Path path = dir.resolve(KEYSTORE_FILENAME);
-        Files.createDirectories(dir);
-
-        if (!Files.exists(path)) {
-            Main.debug("No keystore found, creating a new one");
-
-            // Create new keystore like previous one generated with JDK keytool as follows:
-            // keytool -genkeypair -storepass josm_ssl -keypass josm_ssl -alias josm_localhost -dname "CN=localhost, OU=JOSM, O=OpenStreetMap"
-            // -ext san=ip:127.0.0.1 -keyalg RSA -validity 1825
-
-            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
-            generator.initialize(2048);
-            KeyPair pair = generator.generateKeyPair();
-
-            X509Certificate cert = generateCertificate("CN=localhost, OU=JOSM, O=OpenStreetMap", pair, 1825, "SHA256withRSA",
-                    // see #10033#comment:20: All browsers respect "ip" in SAN, except IE which only understands DNS entries:
-                    // https://connect.microsoft.com/IE/feedback/details/814744/the-ie-doesnt-trust-a-san-certificate-when-connecting-to-ip-address
-                    "dns:localhost,ip:127.0.0.1,dns:127.0.0.1,ip:::1,uri:https://127.0.0.1:"+HTTPS_PORT+",uri:https://::1:"+HTTPS_PORT);
-
-            KeyStore ks = KeyStore.getInstance("JKS");
-            ks.load(null, null);
-
-            // Generate new passwords. See https://stackoverflow.com/a/41156/2257172
-            SecureRandom random = new SecureRandom();
-            KEYSTORE_PASSWORD.put(new BigInteger(130, random).toString(32));
-            KEYENTRY_PASSWORD.put(new BigInteger(130, random).toString(32));
-
-            storePassword = KEYSTORE_PASSWORD.get().toCharArray();
-            entryPassword = KEYENTRY_PASSWORD.get().toCharArray();
-
-            ks.setKeyEntry(ENTRY_ALIAS, pair.getPrivate(), entryPassword, new Certificate[]{cert});
-            ks.store(Files.newOutputStream(path, StandardOpenOption.CREATE), storePassword);
-        }
-        return path;
-    }
-
-    /**
-     * Loads the JOSM keystore.
-     * @return the (initialized) JOSM keystore
-     * @throws IOException if an I/O error occurs
-     * @throws GeneralSecurityException if a security error occurs
-     * @since 7343
-     */
-    public static KeyStore loadJosmKeystore() throws IOException, GeneralSecurityException {
-        try (InputStream in = Files.newInputStream(setupJosmKeystore())) {
-            KeyStore ks = KeyStore.getInstance("JKS");
-            ks.load(in, KEYSTORE_PASSWORD.get().toCharArray());
-
-            if (Main.isDebugEnabled()) {
-                for (Enumeration<String> aliases = ks.aliases(); aliases.hasMoreElements();) {
-                    Main.debug("Alias in JOSM keystore: "+aliases.nextElement());
-                }
-            }
-            return ks;
-        }
-    }
-
-    private void initialize() {
-        if (!initOK) {
-            try {
-                KeyStore ks = loadJosmKeystore();
-
-                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
-                kmf.init(ks, KEYENTRY_PASSWORD.get().toCharArray());
-
-                TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
-                tmf.init(ks);
-
-                sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
-
-                if (Main.isTraceEnabled()) {
-                    Main.trace("SSL Context protocol: " + sslContext.getProtocol());
-                    Main.trace("SSL Context provider: " + sslContext.getProvider());
-                }
-
-                setupPlatform(ks);
-
-                initOK = true;
-            } catch (IOException | GeneralSecurityException e) {
-                Main.error(e);
-            }
-        }
-    }
-
-    /**
-     * Setup the platform-dependant certificate stuff.
-     * @param josmKs The JOSM keystore, containing localhost certificate and private key.
-     * @return {@code true} if something has changed as a result of the call (certificate installation, etc.)
-     * @throws KeyStoreException if the keystore has not been initialized (loaded)
-     * @throws NoSuchAlgorithmException in case of error
-     * @throws CertificateException in case of error
-     * @throws IOException in case of error
-     * @since 7343
-     */
-    public static boolean setupPlatform(KeyStore josmKs) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
-        Enumeration<String> aliases = josmKs.aliases();
-        if (aliases.hasMoreElements()) {
-            return Main.platform.setupHttpsCertificate(ENTRY_ALIAS,
-                    new KeyStore.TrustedCertificateEntry(josmKs.getCertificate(aliases.nextElement())));
-        }
-        return false;
-    }
-
-    /**
-     * Starts or restarts the HTTPS server
-     */
-    public static void restartRemoteControlHttpsServer() {
-        int port = Main.pref.getInteger("remote.control.https.port", HTTPS_PORT);
-        try {
-            stopRemoteControlHttpsServer();
-
-            if (RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.get()) {
-                instance = new RemoteControlHttpsServer(port);
-                if (instance.initOK) {
-                    instance.start();
-                }
-            }
-        } catch (BindException ex) {
-            Main.warn(marktr("Cannot start remotecontrol https server on port {0}: {1}"),
-                    Integer.toString(port), ex.getLocalizedMessage());
-        } catch (IOException ioe) {
-            Main.error(ioe);
-        } catch (NoSuchAlgorithmException e) {
-            Main.error(e);
-        }
-    }
-
-    /**
-     * Stops the HTTPS server
-     */
-    public static void stopRemoteControlHttpsServer() {
-        if (instance != null) {
-            try {
-                instance.stopServer();
-                instance = null;
-            } catch (IOException ioe) {
-                Main.error(ioe);
-            }
-        }
-    }
-
-    /**
-     * Constructs a new {@code RemoteControlHttpsServer}.
-     * @param port The port this server will listen on
-     * @throws IOException when connection errors
-     * @throws NoSuchAlgorithmException if the JVM does not support TLS (can not happen)
-     */
-    public RemoteControlHttpsServer(int port) throws IOException, NoSuchAlgorithmException {
-        super("RemoteControl HTTPS Server");
-        this.setDaemon(true);
-
-        initialize();
-
-        if (!initOK) {
-            Main.error(tr("Unable to initialize Remote Control HTTPS Server"));
-            return;
-        }
-
-        // Create SSL Server factory
-        SSLServerSocketFactory factory = sslContext.getServerSocketFactory();
-        if (Main.isTraceEnabled()) {
-            Main.trace("SSL factory - Supported Cipher suites: "+Arrays.toString(factory.getSupportedCipherSuites()));
-        }
-
-        // Start the server socket with only 1 connection.
-        // Also make sure we only listen on the local interface so nobody from the outside can connect!
-        // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
-        this.server = factory.createServerSocket(port, 1, RemoteControl.getInetAddress());
-
-        if (Main.isTraceEnabled() && server instanceof SSLServerSocket) {
-            SSLServerSocket sslServer = (SSLServerSocket) server;
-            Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
-            Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
-            Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
-            Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
-            Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
-            Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
-        }
-    }
-
-    /**
-     * The main loop, spawns a {@link RequestProcessor} for each connection.
-     */
-    @Override
-    public void run() {
-        Main.info(marktr("RemoteControl::Accepting secure connections on {0}:{1}"),
-                server.getInetAddress(), Integer.toString(server.getLocalPort()));
-        while (true) {
-            try {
-                @SuppressWarnings("resource")
-                Socket request = server.accept();
-                if (Main.isTraceEnabled() && request instanceof SSLSocket) {
-                    SSLSocket sslSocket = (SSLSocket) request;
-                    Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
-                    Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
-                    Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
-                    Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
-                    Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
-                    Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
-                    Main.trace("SSL socket - Session: "+sslSocket.getSession());
-                }
-                RequestProcessor.processRequest(request);
-            } catch (SocketException se) {
-                if (!server.isClosed()) {
-                    Main.error(se);
-                }
-            } catch (IOException ioe) {
-                Main.error(ioe);
-            }
-        }
-    }
-
-    /**
-     * Stops the HTTPS server.
-     *
-     * @throws IOException if any I/O error occurs
-     */
-    public void stopServer() throws IOException {
-        if (server != null) {
-            server.close();
-            Main.info(marktr("RemoteControl::Server (https) stopped."));
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.net.BindException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.security.GeneralSecurityException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.SecureRandom;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.preferences.StringProperty;
+
+import sun.security.util.ObjectIdentifier;
+import sun.security.x509.AlgorithmId;
+import sun.security.x509.BasicConstraintsExtension;
+import sun.security.x509.CertificateAlgorithmId;
+import sun.security.x509.CertificateExtensions;
+import sun.security.x509.CertificateIssuerName;
+import sun.security.x509.CertificateSerialNumber;
+import sun.security.x509.CertificateSubjectName;
+import sun.security.x509.CertificateValidity;
+import sun.security.x509.CertificateVersion;
+import sun.security.x509.CertificateX509Key;
+import sun.security.x509.ExtendedKeyUsageExtension;
+import sun.security.x509.GeneralName;
+import sun.security.x509.GeneralNameInterface;
+import sun.security.x509.GeneralNames;
+import sun.security.x509.IPAddressName;
+import sun.security.x509.OIDName;
+import sun.security.x509.SubjectAlternativeNameExtension;
+import sun.security.x509.URIName;
+import sun.security.x509.X500Name;
+import sun.security.x509.X509CertImpl;
+import sun.security.x509.X509CertInfo;
+
+/**
+ * Simple HTTPS server that spawns a {@link RequestProcessor} for every secure connection.
+ *
+ * @since 6941
+ */
+public class RemoteControlHttpsServer extends Thread {
+
+    /** The server socket */
+    private ServerSocket server;
+
+    private static RemoteControlHttpsServer instance;
+    private boolean initOK = false;
+    private SSLContext sslContext;
+
+    private static final int HTTPS_PORT = 8112;
+
+    /**
+     * JOSM keystore file name.
+     * @since 7337
+     */
+    public static final String KEYSTORE_FILENAME = "josm.keystore";
+
+    /**
+     * Preference for keystore password (automatically generated by JOSM).
+     * @since 7335
+     */
+    public static final StringProperty KEYSTORE_PASSWORD = new StringProperty("remotecontrol.https.keystore.password", "");
+
+    /**
+     * Preference for certificate password (automatically generated by JOSM).
+     * @since 7335
+     */
+    public static final StringProperty KEYENTRY_PASSWORD = new StringProperty("remotecontrol.https.keyentry.password", "");
+
+    /**
+     * Unique alias used to store JOSM localhost entry, both in JOSM keystore and system/browser keystores.
+     * @since 7343
+     */
+    public static final String ENTRY_ALIAS = "josm_localhost";
+
+    /**
+     * Creates a GeneralName object from known types.
+     * @param t one of 4 known types
+     * @param v value
+     * @return which one
+     * @throws IOException
+     */
+    private static GeneralName createGeneralName(String t, String v) throws IOException {
+        GeneralNameInterface gn;
+        switch (t.toLowerCase()) {
+            case "uri": gn = new URIName(v); break;
+            case "dns": gn = new DNSName(v); break;
+            case "ip": gn = new IPAddressName(v); break;
+            default: gn = new OIDName(v);
+        }
+        return new GeneralName(gn);
+    }
+
+    /**
+     * Create a self-signed X.509 Certificate.
+     * @param dn the X.509 Distinguished Name, eg "CN=localhost, OU=JOSM, O=OpenStreetMap"
+     * @param pair the KeyPair
+     * @param days how many days from now the Certificate is valid for
+     * @param algorithm the signing algorithm, eg "SHA256withRSA"
+     * @param san SubjectAlternativeName extension (optional)
+     */
+    private static X509Certificate generateCertificate(String dn, KeyPair pair, int days, String algorithm, String san) throws GeneralSecurityException, IOException {
+        PrivateKey privkey = pair.getPrivate();
+        X509CertInfo info = new X509CertInfo();
+        Date from = new Date();
+        Date to = new Date(from.getTime() + days * 86400000L);
+        CertificateValidity interval = new CertificateValidity(from, to);
+        BigInteger sn = new BigInteger(64, new SecureRandom());
+        X500Name owner = new X500Name(dn);
+
+        info.set(X509CertInfo.VALIDITY, interval);
+        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
+
+        // Change of behaviour in JDK8:
+        // https://bugs.openjdk.java.net/browse/JDK-8040820
+        // https://bugs.openjdk.java.net/browse/JDK-7198416
+        if (!Main.isJava8orLater()) {
+            // Java 7 code. To remove with Java 8 migration
+            info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
+            info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
+        } else {
+            // Java 8 and later code
+            info.set(X509CertInfo.SUBJECT, owner);
+            info.set(X509CertInfo.ISSUER, owner);
+        }
+
+        info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
+        info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
+        AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
+        info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));
+
+        CertificateExtensions ext = new CertificateExtensions();
+        // Critical: Not CA, max path len 0
+        ext.set(BasicConstraintsExtension.NAME, new BasicConstraintsExtension(true, false, 0));
+        // Critical: only allow TLS ("serverAuth" = 1.3.6.1.5.5.7.3.1)
+        ext.set(ExtendedKeyUsageExtension.NAME, new ExtendedKeyUsageExtension(true,
+                new Vector<ObjectIdentifier>(Arrays.asList(new ObjectIdentifier("1.3.6.1.5.5.7.3.1")))));
+
+        if (san != null) {
+            int colonpos;
+            String[] ps = san.split(",");
+            GeneralNames gnames = new GeneralNames();
+            for(String item: ps) {
+                colonpos = item.indexOf(':');
+                if (colonpos < 0) {
+                    throw new IllegalArgumentException("Illegal item " + item + " in " + san);
+                }
+                String t = item.substring(0, colonpos);
+                String v = item.substring(colonpos+1);
+                gnames.add(createGeneralName(t, v));
+            }
+            // Non critical
+            ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(false, gnames));
+        }
+
+        info.set(X509CertInfo.EXTENSIONS, ext);
+
+        // Sign the cert to identify the algorithm that's used.
+        X509CertImpl cert = new X509CertImpl(info);
+        cert.sign(privkey, algorithm);
+
+        // Update the algorithm, and resign.
+        algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
+        info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
+        cert = new X509CertImpl(info);
+        cert.sign(privkey, algorithm);
+        return cert;
+    }
+
+    /**
+     * Setup the JOSM internal keystore, used to store HTTPS certificate and private key.
+     * @return Path to the (initialized) JOSM keystore
+     * @throws IOException if an I/O error occurs
+     * @throws GeneralSecurityException if a security error occurs
+     * @since 7343
+     */
+    public static Path setupJosmKeystore() throws IOException, GeneralSecurityException {
+
+        char[] storePassword = KEYSTORE_PASSWORD.get().toCharArray();
+        char[] entryPassword = KEYENTRY_PASSWORD.get().toCharArray();
+
+        Path dir = Paths.get(RemoteControl.getRemoteControlDir());
+        Path path = dir.resolve(KEYSTORE_FILENAME);
+        Files.createDirectories(dir);
+
+        if (!Files.exists(path)) {
+            Main.debug("No keystore found, creating a new one");
+
+            // Create new keystore like previous one generated with JDK keytool as follows:
+            // keytool -genkeypair -storepass josm_ssl -keypass josm_ssl -alias josm_localhost -dname "CN=localhost, OU=JOSM, O=OpenStreetMap"
+            // -ext san=ip:127.0.0.1 -keyalg RSA -validity 1825
+
+            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+            generator.initialize(2048);
+            KeyPair pair = generator.generateKeyPair();
+
+            X509Certificate cert = generateCertificate("CN=localhost, OU=JOSM, O=OpenStreetMap", pair, 1825, "SHA256withRSA",
+                    // see #10033#comment:20: All browsers respect "ip" in SAN, except IE which only understands DNS entries:
+                    // https://connect.microsoft.com/IE/feedback/details/814744/the-ie-doesnt-trust-a-san-certificate-when-connecting-to-ip-address
+                    "dns:localhost,ip:127.0.0.1,dns:127.0.0.1,ip:::1,uri:https://127.0.0.1:"+HTTPS_PORT+",uri:https://::1:"+HTTPS_PORT);
+
+            KeyStore ks = KeyStore.getInstance("JKS");
+            ks.load(null, null);
+
+            // Generate new passwords. See https://stackoverflow.com/a/41156/2257172
+            SecureRandom random = new SecureRandom();
+            KEYSTORE_PASSWORD.put(new BigInteger(130, random).toString(32));
+            KEYENTRY_PASSWORD.put(new BigInteger(130, random).toString(32));
+
+            storePassword = KEYSTORE_PASSWORD.get().toCharArray();
+            entryPassword = KEYENTRY_PASSWORD.get().toCharArray();
+
+            ks.setKeyEntry(ENTRY_ALIAS, pair.getPrivate(), entryPassword, new Certificate[]{cert});
+            ks.store(Files.newOutputStream(path, StandardOpenOption.CREATE), storePassword);
+        }
+        return path;
+    }
+
+    /**
+     * Loads the JOSM keystore.
+     * @return the (initialized) JOSM keystore
+     * @throws IOException if an I/O error occurs
+     * @throws GeneralSecurityException if a security error occurs
+     * @since 7343
+     */
+    public static KeyStore loadJosmKeystore() throws IOException, GeneralSecurityException {
+        try (InputStream in = Files.newInputStream(setupJosmKeystore())) {
+            KeyStore ks = KeyStore.getInstance("JKS");
+            ks.load(in, KEYSTORE_PASSWORD.get().toCharArray());
+
+            if (Main.isDebugEnabled()) {
+                for (Enumeration<String> aliases = ks.aliases(); aliases.hasMoreElements();) {
+                    Main.debug("Alias in JOSM keystore: "+aliases.nextElement());
+                }
+            }
+            return ks;
+        }
+    }
+
+    private void initialize() {
+        if (!initOK) {
+            try {
+                KeyStore ks = loadJosmKeystore();
+
+                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+                kmf.init(ks, KEYENTRY_PASSWORD.get().toCharArray());
+
+                TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+                tmf.init(ks);
+
+                sslContext = SSLContext.getInstance("TLS");
+                sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+
+                if (Main.isTraceEnabled()) {
+                    Main.trace("SSL Context protocol: " + sslContext.getProtocol());
+                    Main.trace("SSL Context provider: " + sslContext.getProvider());
+                }
+
+                setupPlatform(ks);
+
+                initOK = true;
+            } catch (IOException | GeneralSecurityException e) {
+                Main.error(e);
+            }
+        }
+    }
+
+    /**
+     * Setup the platform-dependant certificate stuff.
+     * @param josmKs The JOSM keystore, containing localhost certificate and private key.
+     * @return {@code true} if something has changed as a result of the call (certificate installation, etc.)
+     * @throws KeyStoreException if the keystore has not been initialized (loaded)
+     * @throws NoSuchAlgorithmException in case of error
+     * @throws CertificateException in case of error
+     * @throws IOException in case of error
+     * @since 7343
+     */
+    public static boolean setupPlatform(KeyStore josmKs) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
+        Enumeration<String> aliases = josmKs.aliases();
+        if (aliases.hasMoreElements()) {
+            return Main.platform.setupHttpsCertificate(ENTRY_ALIAS,
+                    new KeyStore.TrustedCertificateEntry(josmKs.getCertificate(aliases.nextElement())));
+        }
+        return false;
+    }
+
+    /**
+     * Starts or restarts the HTTPS server
+     */
+    public static void restartRemoteControlHttpsServer() {
+        int port = Main.pref.getInteger("remote.control.https.port", HTTPS_PORT);
+        try {
+            stopRemoteControlHttpsServer();
+
+            if (RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.get()) {
+                instance = new RemoteControlHttpsServer(port);
+                if (instance.initOK) {
+                    instance.start();
+                }
+            }
+        } catch (BindException ex) {
+            Main.warn(marktr("Cannot start remotecontrol https server on port {0}: {1}"),
+                    Integer.toString(port), ex.getLocalizedMessage());
+        } catch (IOException ioe) {
+            Main.error(ioe);
+        } catch (NoSuchAlgorithmException e) {
+            Main.error(e);
+        }
+    }
+
+    /**
+     * Stops the HTTPS server
+     */
+    public static void stopRemoteControlHttpsServer() {
+        if (instance != null) {
+            try {
+                instance.stopServer();
+                instance = null;
+            } catch (IOException ioe) {
+                Main.error(ioe);
+            }
+        }
+    }
+
+    /**
+     * Constructs a new {@code RemoteControlHttpsServer}.
+     * @param port The port this server will listen on
+     * @throws IOException when connection errors
+     * @throws NoSuchAlgorithmException if the JVM does not support TLS (can not happen)
+     */
+    public RemoteControlHttpsServer(int port) throws IOException, NoSuchAlgorithmException {
+        super("RemoteControl HTTPS Server");
+        this.setDaemon(true);
+
+        initialize();
+
+        if (!initOK) {
+            Main.error(tr("Unable to initialize Remote Control HTTPS Server"));
+            return;
+        }
+
+        // Create SSL Server factory
+        SSLServerSocketFactory factory = sslContext.getServerSocketFactory();
+        if (Main.isTraceEnabled()) {
+            Main.trace("SSL factory - Supported Cipher suites: "+Arrays.toString(factory.getSupportedCipherSuites()));
+        }
+
+        // Start the server socket with only 1 connection.
+        // Also make sure we only listen on the local interface so nobody from the outside can connect!
+        // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
+        this.server = factory.createServerSocket(port, 1, RemoteControl.getInetAddress());
+
+        if (Main.isTraceEnabled() && server instanceof SSLServerSocket) {
+            SSLServerSocket sslServer = (SSLServerSocket) server;
+            Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
+            Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
+            Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
+            Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
+            Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
+            Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
+        }
+    }
+
+    /**
+     * The main loop, spawns a {@link RequestProcessor} for each connection.
+     */
+    @Override
+    public void run() {
+        Main.info(marktr("RemoteControl::Accepting secure connections on {0}:{1}"),
+                server.getInetAddress(), Integer.toString(server.getLocalPort()));
+        while (true) {
+            try {
+                @SuppressWarnings("resource")
+                Socket request = server.accept();
+                if (Main.isTraceEnabled() && request instanceof SSLSocket) {
+                    SSLSocket sslSocket = (SSLSocket) request;
+                    Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
+                    Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
+                    Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
+                    Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
+                    Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
+                    Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
+                    Main.trace("SSL socket - Session: "+sslSocket.getSession());
+                }
+                RequestProcessor.processRequest(request);
+            } catch (SocketException se) {
+                if (!server.isClosed()) {
+                    Main.error(se);
+                }
+            } catch (IOException ioe) {
+                Main.error(ioe);
+            }
+        }
+    }
+
+    /**
+     * Stops the HTTPS server.
+     *
+     * @throws IOException if any I/O error occurs
+     */
+    public void stopServer() throws IOException {
+        if (server != null) {
+            server.close();
+            Main.info(marktr("RemoteControl::Server (https) stopped."));
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java b/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
index a669032..b68a8ef 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
@@ -1,488 +1,488 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.net.Socket;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.StringTokenizer;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.AddWayHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.FeaturesHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.ImageryHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.ImportHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.LoadAndZoomHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.LoadDataHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.LoadObjectHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.OpenFileHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
-import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
-import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerErrorException;
-import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerForbiddenException;
-import org.openstreetmap.josm.io.remotecontrol.handler.VersionHandler;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Processes HTTP "remote control" requests.
- */
-public class RequestProcessor extends Thread {
-    /**
-     * RemoteControl protocol version. Change minor number for compatible
-     * interface extensions. Change major number in case of incompatible
-     * changes.
-     */
-    public static final String PROTOCOLVERSION = "{\"protocolversion\": {\"major\": " +
-        RemoteControl.protocolMajorVersion + ", \"minor\": " +
-        RemoteControl.protocolMinorVersion +
-        "}, \"application\": \"JOSM RemoteControl\"}";
-
-    /** The socket this processor listens on */
-    private Socket request;
-
-    /**
-     * Collection of request handlers.
-     * Will be initialized with default handlers here. Other plug-ins
-     * can extend this list by using @see addRequestHandler
-     */
-    private static Map<String, Class<? extends RequestHandler>> handlers = new TreeMap<>();
-
-    /**
-     * Constructor
-     *
-     * @param request A socket to read the request.
-     */
-    public RequestProcessor(Socket request) {
-        super("RemoteControl request processor");
-        this.setDaemon(true);
-        this.request = request;
-    }
-
-    /**
-     * Spawns a new thread for the request
-     * @param request The request to process
-     */
-    public static void processRequest(Socket request) {
-        RequestProcessor processor = new RequestProcessor(request);
-        processor.start();
-    }
-
-    /**
-     * Add external request handler. Can be used by other plug-ins that
-     * want to use remote control.
-     *
-     * @param command The command to handle.
-     * @param handler The additional request handler.
-     */
-    static void addRequestHandlerClass(String command,
-            Class<? extends RequestHandler> handler) {
-        addRequestHandlerClass(command, handler, false);
-    }
-
-    /**
-     * Add external request handler. Message can be suppressed.
-     * (for internal use)
-     *
-     * @param command The command to handle.
-     * @param handler The additional request handler.
-     * @param silent Don't show message if true.
-     */
-    private static void addRequestHandlerClass(String command,
-                Class<? extends RequestHandler> handler, boolean silent) {
-        if(command.charAt(0) == '/') {
-            command = command.substring(1);
-        }
-        String commandWithSlash = "/" + command;
-        if (handlers.get(commandWithSlash) != null) {
-            Main.info("RemoteControl: ignoring duplicate command " + command
-                    + " with handler " + handler.getName());
-        } else {
-            if (!silent) {
-                Main.info("RemoteControl: adding command \"" +
-                    command + "\" (handled by " + handler.getSimpleName() + ")");
-            }
-            handlers.put(commandWithSlash, handler);
-        }
-    }
-
-    /** Add default request handlers */
-    static {
-        addRequestHandlerClass(LoadAndZoomHandler.command, LoadAndZoomHandler.class, true);
-        addRequestHandlerClass(LoadAndZoomHandler.command2, LoadAndZoomHandler.class, true);
-        addRequestHandlerClass(LoadDataHandler.command, LoadDataHandler.class, true);
-        addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
-        addRequestHandlerClass(AddNodeHandler.command, AddNodeHandler.class, true);
-        addRequestHandlerClass(AddWayHandler.command, AddWayHandler.class, true);
-        addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
-        addRequestHandlerClass(VersionHandler.command, VersionHandler.class, true);
-        addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
-        addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
-        addRequestHandlerClass(FeaturesHandler.command, FeaturesHandler.class, true);
-    }
-
-    /**
-     * The work is done here.
-     */
-    @Override
-    public void run() {
-        Writer out = null;
-        try {
-            OutputStream raw = new BufferedOutputStream(request.getOutputStream());
-            out = new OutputStreamWriter(raw, StandardCharsets.UTF_8);
-            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), "ASCII"));
-
-            String get = in.readLine();
-            if (get == null) {
-                sendError(out);
-                return;
-            }
-            Main.info("RemoteControl received: " + get);
-
-            StringTokenizer st = new StringTokenizer(get);
-            if (!st.hasMoreTokens()) {
-                sendError(out);
-                return;
-            }
-            String method = st.nextToken();
-            if (!st.hasMoreTokens()) {
-                sendError(out);
-                return;
-            }
-            String url = st.nextToken();
-
-            if (!"GET".equals(method)) {
-                sendNotImplemented(out);
-                return;
-            }
-
-            int questionPos = url.indexOf('?');
-
-            String command = questionPos < 0 ? url : url.substring(0, questionPos);
-
-            Map <String,String> headers = new HashMap<>();
-            int k=0, MAX_HEADERS=20;
-            while (k<MAX_HEADERS) {
-                get=in.readLine();
-                if (get==null) break;
-                k++;
-                String[] h = get.split(": ", 2);
-                if (h.length==2) {
-                    headers.put(h[0], h[1]);
-                } else break;
-            }
-
-            // Who sent the request: trying our best to detect
-            // not from localhost => sender = IP
-            // from localhost: sender = referer header, if exists
-            String sender = null;
-
-            if (!request.getInetAddress().isLoopbackAddress()) {
-                sender = request.getInetAddress().getHostAddress();
-            } else {
-                String ref = headers.get("Referer");
-                Pattern r = Pattern.compile("(https?://)?([^/]*)");
-                if (ref!=null) {
-                    Matcher m = r.matcher(ref);
-                    if (m.find()) {
-                        sender = m.group(2);
-                    }
-                }
-                if (sender == null) {
-                    sender = "localhost";
-                }
-            }
-
-            // find a handler for this command
-            Class<? extends RequestHandler> handlerClass = handlers.get(command);
-            if (handlerClass == null) {
-                String usage = getUsageAsHtml();
-                String websiteDoc = HelpUtil.getWikiBaseHelpUrl() +"/Help/Preferences/RemoteControl";
-                String help = "No command specified! The following commands are available:<ul>" + usage
-                        + "</ul>" + "See <a href=\""+websiteDoc+"\">"+websiteDoc+"</a> for complete documentation.";
-                sendBadRequest(out, help);
-            } else {
-                // create handler object
-                RequestHandler handler = handlerClass.newInstance();
-                try {
-                    handler.setCommand(command);
-                    handler.setUrl(url);
-                    handler.setSender(sender);
-                    handler.handle();
-                    sendHeader(out, "200 OK", handler.getContentType(), false);
-                    out.write("Content-length: " + handler.getContent().length()
-                            + "\r\n");
-                    out.write("\r\n");
-                    out.write(handler.getContent());
-                    out.flush();
-                } catch (RequestHandlerErrorException ex) {
-                    sendError(out);
-                } catch (RequestHandlerBadRequestException ex) {
-                    sendBadRequest(out, ex.getMessage());
-                } catch (RequestHandlerForbiddenException ex) {
-                    sendForbidden(out, ex.getMessage());
-                }
-            }
-
-        } catch (IOException ioe) {
-            Main.debug(Main.getErrorMessage(ioe));
-        } catch (Exception e) {
-            Main.error(e);
-            try {
-                sendError(out);
-            } catch (IOException e1) {
-                Main.warn(e1);
-            }
-        } finally {
-            try {
-                request.close();
-            } catch (IOException e) {
-                Main.debug(Main.getErrorMessage(e));
-            }
-        }
-    }
-
-    /**
-     * Sends a 500 error: server error
-     *
-     * @param out
-     *            The writer where the error is written
-     * @throws IOException
-     *             If the error can not be written
-     */
-    private void sendError(Writer out) throws IOException {
-        sendHeader(out, "500 Internal Server Error", "text/html", true);
-        out.write("<HTML>\r\n");
-        out.write("<HEAD><TITLE>Internal Error</TITLE>\r\n");
-        out.write("</HEAD>\r\n");
-        out.write("<BODY>");
-        out.write("<H1>HTTP Error 500: Internal Server Error</H1>\r\n");
-        out.write("</BODY></HTML>\r\n");
-        out.flush();
-    }
-
-    /**
-     * Sends a 501 error: not implemented
-     *
-     * @param out
-     *            The writer where the error is written
-     * @throws IOException
-     *             If the error can not be written
-     */
-    private void sendNotImplemented(Writer out) throws IOException {
-        sendHeader(out, "501 Not Implemented", "text/html", true);
-        out.write("<HTML>\r\n");
-        out.write("<HEAD><TITLE>Not Implemented</TITLE>\r\n");
-        out.write("</HEAD>\r\n");
-        out.write("<BODY>");
-        out.write("<H1>HTTP Error 501: Not Implemented</h2>\r\n");
-        out.write("</BODY></HTML>\r\n");
-        out.flush();
-    }
-
-    /**
-     * Sends a 403 error: forbidden
-     *
-     * @param out
-     *            The writer where the error is written
-     * @throws IOException
-     *             If the error can not be written
-     */
-    private void sendForbidden(Writer out, String help) throws IOException {
-        sendHeader(out, "403 Forbidden", "text/html", true);
-        out.write("<HTML>\r\n");
-        out.write("<HEAD><TITLE>Forbidden</TITLE>\r\n");
-        out.write("</HEAD>\r\n");
-        out.write("<BODY>");
-        out.write("<H1>HTTP Error 403: Forbidden</h2>\r\n");
-        if (help != null) {
-            out.write(help);
-        }
-        out.write("</BODY></HTML>\r\n");
-        out.flush();
-    }
-
-    /**
-     * Sends a 403 error: forbidden
-     *
-     * @param out
-     *            The writer where the error is written
-     * @throws IOException
-     *             If the error can not be written
-     */
-    private void sendBadRequest(Writer out, String help) throws IOException {
-        sendHeader(out, "400 Bad Request", "text/html", true);
-        out.write("<HTML>\r\n");
-        out.write("<HEAD><TITLE>Bad Request</TITLE>\r\n");
-        out.write("</HEAD>\r\n");
-        out.write("<BODY>");
-        out.write("<H1>HTTP Error 400: Bad Request</h2>\r\n");
-        if (help != null) {
-            out.write(help);
-        }
-        out.write("</BODY></HTML>\r\n");
-        out.flush();
-    }
-
-    /**
-     * Send common HTTP headers to the client.
-     *
-     * @param out
-     *            The Writer
-     * @param status
-     *            The status string ("200 OK", "500", etc)
-     * @param contentType
-     *            The content type of the data sent
-     * @param endHeaders
-     *            If true, adds a new line, ending the headers.
-     * @throws IOException
-     *             When error
-     */
-    private void sendHeader(Writer out, String status, String contentType,
-            boolean endHeaders) throws IOException {
-        out.write("HTTP/1.1 " + status + "\r\n");
-        Date now = new Date();
-        out.write("Date: " + now + "\r\n");
-        out.write("Server: JOSM RemoteControl\r\n");
-        out.write("Content-type: " + contentType + "\r\n");
-        out.write("Access-Control-Allow-Origin: *\r\n");
-        if (endHeaders)
-            out.write("\r\n");
-    }
-
-    public static String getHandlersInfoAsJSON() {
-        StringBuilder r = new StringBuilder();
-        boolean first = true;
-        r.append("[");
-
-        for (Entry<String, Class<? extends RequestHandler>> p : handlers.entrySet()) {
-            if (first) {
-                first = false;
-            } else {
-                r.append(", ");
-            }
-            r.append(getHandlerInfoAsJSON(p.getKey()));
-        }
-        r.append("]");
-
-        return r.toString();
-    }
-
-    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) {
-                Main.error(ex);
-                return null;
-            }
-
-            printJsonInfo(cmd, r, handler);
-            return w.toString();
-        } catch (IOException e) {
-            Main.error(e);
-            return null;
-        }
-    }
-
-    private static void printJsonInfo(String cmd, PrintWriter r, RequestHandler handler) {
-        r.printf("{ \"request\" : \"%s\"", cmd);
-        if (handler.getUsage() != null) {
-            r.printf(", \"usage\" : \"%s\"", handler.getUsage());
-        }
-        r.append(", \"parameters\" : [");
-
-        String[] params = handler.getMandatoryParams();
-        if (params != null) {
-            for (int i = 0; i < params.length; i++) {
-                if (i == 0) {
-                    r.append('\"');
-                } else {
-                    r.append(", \"");
-                }
-                r.append(params[i]).append('\"');
-            }
-        }
-        r.append("], \"optional\" : [");
-        String[] optional = handler.getOptionalParams();
-        if (optional != null) {
-            for (int i = 0; i < optional.length; i++) {
-                if (i == 0) {
-                    r.append('\"');
-                } else {
-                    r.append(", \"");
-                }
-                r.append(optional[i]).append('\"');
-            }
-        }
-
-        r.append("], \"examples\" : [");
-        String[] examples = handler.getUsageExamples(cmd.substring(1));
-        if (examples != null) {
-            for (int i = 0; i < examples.length; i++) {
-                if (i == 0) {
-                    r.append('\"');
-                } else {
-                    r.append(", \"");
-                }
-                r.append(examples[i]).append('\"');
-            }
-        }
-        r.append("]}");
-    }
-
-    /**
-     * Reports HTML message with the description of all available commands
-     * @return HTML message with the description of all available commands
-     * @throws IllegalAccessException
-     * @throws InstantiationException
-     */
-    public static String getUsageAsHtml() throws IllegalAccessException, InstantiationException {
-        StringBuilder usage = new StringBuilder(1024);
-        for (Entry<String, Class<? extends RequestHandler>> handler : handlers.entrySet()) {
-            RequestHandler sample = handler.getValue().newInstance();
-            String[] mandatory = sample.getMandatoryParams();
-            String[] optional = sample.getOptionalParams();
-            String[] examples = sample.getUsageExamples(handler.getKey().substring(1));
-            usage.append("<li>");
-            usage.append(handler.getKey());
-            if (sample.getUsage() != null && !sample.getUsage().isEmpty()) {
-                usage.append(" — <i>").append(sample.getUsage()).append("</i>");
-            }
-            if (mandatory != null) {
-                usage.append("<br/>mandatory parameters: ").append(Utils.join(", ", Arrays.asList(mandatory)));
-            }
-            if (optional != null) {
-                usage.append("<br/>optional parameters: ").append(Utils.join(", ", Arrays.asList(optional)));
-            }
-            if (examples != null) {
-                usage.append("<br/>examples: ");
-                for (String ex: examples) {
-                    usage.append("<br/> <a href=\"http://localhost:8111"+ex+"\">"+ex+"</a>");
-                }
-            }
-            usage.append("</li>");
-        }
-        return usage.toString();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.AddWayHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.FeaturesHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.ImageryHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.ImportHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.LoadAndZoomHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.LoadDataHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.LoadObjectHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.OpenFileHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
+import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerErrorException;
+import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerForbiddenException;
+import org.openstreetmap.josm.io.remotecontrol.handler.VersionHandler;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Processes HTTP "remote control" requests.
+ */
+public class RequestProcessor extends Thread {
+    /**
+     * RemoteControl protocol version. Change minor number for compatible
+     * interface extensions. Change major number in case of incompatible
+     * changes.
+     */
+    public static final String PROTOCOLVERSION = "{\"protocolversion\": {\"major\": " +
+        RemoteControl.protocolMajorVersion + ", \"minor\": " +
+        RemoteControl.protocolMinorVersion +
+        "}, \"application\": \"JOSM RemoteControl\"}";
+
+    /** The socket this processor listens on */
+    private Socket request;
+
+    /**
+     * Collection of request handlers.
+     * Will be initialized with default handlers here. Other plug-ins
+     * can extend this list by using @see addRequestHandler
+     */
+    private static Map<String, Class<? extends RequestHandler>> handlers = new TreeMap<>();
+
+    /**
+     * Constructor
+     *
+     * @param request A socket to read the request.
+     */
+    public RequestProcessor(Socket request) {
+        super("RemoteControl request processor");
+        this.setDaemon(true);
+        this.request = request;
+    }
+
+    /**
+     * Spawns a new thread for the request
+     * @param request The request to process
+     */
+    public static void processRequest(Socket request) {
+        RequestProcessor processor = new RequestProcessor(request);
+        processor.start();
+    }
+
+    /**
+     * Add external request handler. Can be used by other plug-ins that
+     * want to use remote control.
+     *
+     * @param command The command to handle.
+     * @param handler The additional request handler.
+     */
+    static void addRequestHandlerClass(String command,
+            Class<? extends RequestHandler> handler) {
+        addRequestHandlerClass(command, handler, false);
+    }
+
+    /**
+     * Add external request handler. Message can be suppressed.
+     * (for internal use)
+     *
+     * @param command The command to handle.
+     * @param handler The additional request handler.
+     * @param silent Don't show message if true.
+     */
+    private static void addRequestHandlerClass(String command,
+                Class<? extends RequestHandler> handler, boolean silent) {
+        if(command.charAt(0) == '/') {
+            command = command.substring(1);
+        }
+        String commandWithSlash = "/" + command;
+        if (handlers.get(commandWithSlash) != null) {
+            Main.info("RemoteControl: ignoring duplicate command " + command
+                    + " with handler " + handler.getName());
+        } else {
+            if (!silent) {
+                Main.info("RemoteControl: adding command \"" +
+                    command + "\" (handled by " + handler.getSimpleName() + ")");
+            }
+            handlers.put(commandWithSlash, handler);
+        }
+    }
+
+    /** Add default request handlers */
+    static {
+        addRequestHandlerClass(LoadAndZoomHandler.command, LoadAndZoomHandler.class, true);
+        addRequestHandlerClass(LoadAndZoomHandler.command2, LoadAndZoomHandler.class, true);
+        addRequestHandlerClass(LoadDataHandler.command, LoadDataHandler.class, true);
+        addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
+        addRequestHandlerClass(AddNodeHandler.command, AddNodeHandler.class, true);
+        addRequestHandlerClass(AddWayHandler.command, AddWayHandler.class, true);
+        addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
+        addRequestHandlerClass(VersionHandler.command, VersionHandler.class, true);
+        addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
+        addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
+        addRequestHandlerClass(FeaturesHandler.command, FeaturesHandler.class, true);
+    }
+
+    /**
+     * The work is done here.
+     */
+    @Override
+    public void run() {
+        Writer out = null;
+        try {
+            OutputStream raw = new BufferedOutputStream(request.getOutputStream());
+            out = new OutputStreamWriter(raw, StandardCharsets.UTF_8);
+            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), "ASCII"));
+
+            String get = in.readLine();
+            if (get == null) {
+                sendError(out);
+                return;
+            }
+            Main.info("RemoteControl received: " + get);
+
+            StringTokenizer st = new StringTokenizer(get);
+            if (!st.hasMoreTokens()) {
+                sendError(out);
+                return;
+            }
+            String method = st.nextToken();
+            if (!st.hasMoreTokens()) {
+                sendError(out);
+                return;
+            }
+            String url = st.nextToken();
+
+            if (!"GET".equals(method)) {
+                sendNotImplemented(out);
+                return;
+            }
+
+            int questionPos = url.indexOf('?');
+
+            String command = questionPos < 0 ? url : url.substring(0, questionPos);
+
+            Map <String,String> headers = new HashMap<>();
+            int k=0, MAX_HEADERS=20;
+            while (k<MAX_HEADERS) {
+                get=in.readLine();
+                if (get==null) break;
+                k++;
+                String[] h = get.split(": ", 2);
+                if (h.length==2) {
+                    headers.put(h[0], h[1]);
+                } else break;
+            }
+
+            // Who sent the request: trying our best to detect
+            // not from localhost => sender = IP
+            // from localhost: sender = referer header, if exists
+            String sender = null;
+
+            if (!request.getInetAddress().isLoopbackAddress()) {
+                sender = request.getInetAddress().getHostAddress();
+            } else {
+                String ref = headers.get("Referer");
+                Pattern r = Pattern.compile("(https?://)?([^/]*)");
+                if (ref!=null) {
+                    Matcher m = r.matcher(ref);
+                    if (m.find()) {
+                        sender = m.group(2);
+                    }
+                }
+                if (sender == null) {
+                    sender = "localhost";
+                }
+            }
+
+            // find a handler for this command
+            Class<? extends RequestHandler> handlerClass = handlers.get(command);
+            if (handlerClass == null) {
+                String usage = getUsageAsHtml();
+                String websiteDoc = HelpUtil.getWikiBaseHelpUrl() +"/Help/Preferences/RemoteControl";
+                String help = "No command specified! The following commands are available:<ul>" + usage
+                        + "</ul>" + "See <a href=\""+websiteDoc+"\">"+websiteDoc+"</a> for complete documentation.";
+                sendBadRequest(out, help);
+            } else {
+                // create handler object
+                RequestHandler handler = handlerClass.newInstance();
+                try {
+                    handler.setCommand(command);
+                    handler.setUrl(url);
+                    handler.setSender(sender);
+                    handler.handle();
+                    sendHeader(out, "200 OK", handler.getContentType(), false);
+                    out.write("Content-length: " + handler.getContent().length()
+                            + "\r\n");
+                    out.write("\r\n");
+                    out.write(handler.getContent());
+                    out.flush();
+                } catch (RequestHandlerErrorException ex) {
+                    sendError(out);
+                } catch (RequestHandlerBadRequestException ex) {
+                    sendBadRequest(out, ex.getMessage());
+                } catch (RequestHandlerForbiddenException ex) {
+                    sendForbidden(out, ex.getMessage());
+                }
+            }
+
+        } catch (IOException ioe) {
+            Main.debug(Main.getErrorMessage(ioe));
+        } catch (Exception e) {
+            Main.error(e);
+            try {
+                sendError(out);
+            } catch (IOException e1) {
+                Main.warn(e1);
+            }
+        } finally {
+            try {
+                request.close();
+            } catch (IOException e) {
+                Main.debug(Main.getErrorMessage(e));
+            }
+        }
+    }
+
+    /**
+     * Sends a 500 error: server error
+     *
+     * @param out
+     *            The writer where the error is written
+     * @throws IOException
+     *             If the error can not be written
+     */
+    private void sendError(Writer out) throws IOException {
+        sendHeader(out, "500 Internal Server Error", "text/html", true);
+        out.write("<HTML>\r\n");
+        out.write("<HEAD><TITLE>Internal Error</TITLE>\r\n");
+        out.write("</HEAD>\r\n");
+        out.write("<BODY>");
+        out.write("<H1>HTTP Error 500: Internal Server Error</H1>\r\n");
+        out.write("</BODY></HTML>\r\n");
+        out.flush();
+    }
+
+    /**
+     * Sends a 501 error: not implemented
+     *
+     * @param out
+     *            The writer where the error is written
+     * @throws IOException
+     *             If the error can not be written
+     */
+    private void sendNotImplemented(Writer out) throws IOException {
+        sendHeader(out, "501 Not Implemented", "text/html", true);
+        out.write("<HTML>\r\n");
+        out.write("<HEAD><TITLE>Not Implemented</TITLE>\r\n");
+        out.write("</HEAD>\r\n");
+        out.write("<BODY>");
+        out.write("<H1>HTTP Error 501: Not Implemented</h2>\r\n");
+        out.write("</BODY></HTML>\r\n");
+        out.flush();
+    }
+
+    /**
+     * Sends a 403 error: forbidden
+     *
+     * @param out
+     *            The writer where the error is written
+     * @throws IOException
+     *             If the error can not be written
+     */
+    private void sendForbidden(Writer out, String help) throws IOException {
+        sendHeader(out, "403 Forbidden", "text/html", true);
+        out.write("<HTML>\r\n");
+        out.write("<HEAD><TITLE>Forbidden</TITLE>\r\n");
+        out.write("</HEAD>\r\n");
+        out.write("<BODY>");
+        out.write("<H1>HTTP Error 403: Forbidden</h2>\r\n");
+        if (help != null) {
+            out.write(help);
+        }
+        out.write("</BODY></HTML>\r\n");
+        out.flush();
+    }
+
+    /**
+     * Sends a 403 error: forbidden
+     *
+     * @param out
+     *            The writer where the error is written
+     * @throws IOException
+     *             If the error can not be written
+     */
+    private void sendBadRequest(Writer out, String help) throws IOException {
+        sendHeader(out, "400 Bad Request", "text/html", true);
+        out.write("<HTML>\r\n");
+        out.write("<HEAD><TITLE>Bad Request</TITLE>\r\n");
+        out.write("</HEAD>\r\n");
+        out.write("<BODY>");
+        out.write("<H1>HTTP Error 400: Bad Request</h2>\r\n");
+        if (help != null) {
+            out.write(help);
+        }
+        out.write("</BODY></HTML>\r\n");
+        out.flush();
+    }
+
+    /**
+     * Send common HTTP headers to the client.
+     *
+     * @param out
+     *            The Writer
+     * @param status
+     *            The status string ("200 OK", "500", etc)
+     * @param contentType
+     *            The content type of the data sent
+     * @param endHeaders
+     *            If true, adds a new line, ending the headers.
+     * @throws IOException
+     *             When error
+     */
+    private void sendHeader(Writer out, String status, String contentType,
+            boolean endHeaders) throws IOException {
+        out.write("HTTP/1.1 " + status + "\r\n");
+        Date now = new Date();
+        out.write("Date: " + now + "\r\n");
+        out.write("Server: JOSM RemoteControl\r\n");
+        out.write("Content-type: " + contentType + "\r\n");
+        out.write("Access-Control-Allow-Origin: *\r\n");
+        if (endHeaders)
+            out.write("\r\n");
+    }
+
+    public static String getHandlersInfoAsJSON() {
+        StringBuilder r = new StringBuilder();
+        boolean first = true;
+        r.append("[");
+
+        for (Entry<String, Class<? extends RequestHandler>> p : handlers.entrySet()) {
+            if (first) {
+                first = false;
+            } else {
+                r.append(", ");
+            }
+            r.append(getHandlerInfoAsJSON(p.getKey()));
+        }
+        r.append("]");
+
+        return r.toString();
+    }
+
+    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) {
+                Main.error(ex);
+                return null;
+            }
+
+            printJsonInfo(cmd, r, handler);
+            return w.toString();
+        } catch (IOException e) {
+            Main.error(e);
+            return null;
+        }
+    }
+
+    private static void printJsonInfo(String cmd, PrintWriter r, RequestHandler handler) {
+        r.printf("{ \"request\" : \"%s\"", cmd);
+        if (handler.getUsage() != null) {
+            r.printf(", \"usage\" : \"%s\"", handler.getUsage());
+        }
+        r.append(", \"parameters\" : [");
+
+        String[] params = handler.getMandatoryParams();
+        if (params != null) {
+            for (int i = 0; i < params.length; i++) {
+                if (i == 0) {
+                    r.append('\"');
+                } else {
+                    r.append(", \"");
+                }
+                r.append(params[i]).append('\"');
+            }
+        }
+        r.append("], \"optional\" : [");
+        String[] optional = handler.getOptionalParams();
+        if (optional != null) {
+            for (int i = 0; i < optional.length; i++) {
+                if (i == 0) {
+                    r.append('\"');
+                } else {
+                    r.append(", \"");
+                }
+                r.append(optional[i]).append('\"');
+            }
+        }
+
+        r.append("], \"examples\" : [");
+        String[] examples = handler.getUsageExamples(cmd.substring(1));
+        if (examples != null) {
+            for (int i = 0; i < examples.length; i++) {
+                if (i == 0) {
+                    r.append('\"');
+                } else {
+                    r.append(", \"");
+                }
+                r.append(examples[i]).append('\"');
+            }
+        }
+        r.append("]}");
+    }
+
+    /**
+     * Reports HTML message with the description of all available commands
+     * @return HTML message with the description of all available commands
+     * @throws IllegalAccessException
+     * @throws InstantiationException
+     */
+    public static String getUsageAsHtml() throws IllegalAccessException, InstantiationException {
+        StringBuilder usage = new StringBuilder(1024);
+        for (Entry<String, Class<? extends RequestHandler>> handler : handlers.entrySet()) {
+            RequestHandler sample = handler.getValue().newInstance();
+            String[] mandatory = sample.getMandatoryParams();
+            String[] optional = sample.getOptionalParams();
+            String[] examples = sample.getUsageExamples(handler.getKey().substring(1));
+            usage.append("<li>");
+            usage.append(handler.getKey());
+            if (sample.getUsage() != null && !sample.getUsage().isEmpty()) {
+                usage.append(" — <i>").append(sample.getUsage()).append("</i>");
+            }
+            if (mandatory != null) {
+                usage.append("<br/>mandatory parameters: ").append(Utils.join(", ", Arrays.asList(mandatory)));
+            }
+            if (optional != null) {
+                usage.append("<br/>optional parameters: ").append(Utils.join(", ", Arrays.asList(optional)));
+            }
+            if (examples != null) {
+                usage.append("<br/>examples: ");
+                for (String ex: examples) {
+                    usage.append("<br/> <a href=\"http://localhost:8111"+ex+"\">"+ex+"</a>");
+                }
+            }
+            usage.append("</li>");
+        }
+        return usage.toString();
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
index b421574..4d3782d 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
@@ -1,130 +1,130 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Point;
-import java.util.Collections;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AutoScaleAction;
-import org.openstreetmap.josm.command.AddCommand;
-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.util.GuiHelper;
-import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-
-/**
- * Handler for add_node request.
- */
-public class AddNodeHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to add a node.
-     */
-    public static final String command = "add_node";
-
-    private double lat;
-    private double lon;
-    
-    private Node node;
-
-    @Override
-    protected void handleRequest() {
-        GuiHelper.runInEDTAndWait(new Runnable() {
-            @Override public void run() {
-                 addNode(args);
-            }
-        });
-    }
-
-    @Override
-    public String[] getMandatoryParams()
-    {
-        return new String[] { "lat", "lon" };
-    }
-    
-    @Override
-    public String[] getOptionalParams()
-    {
-        return new String[] { "addtags" };
-    }
-
-    @Override
-    public String getUsage() {
-        return "adds a node (given by its latitude and longitude) to the current dataset";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        return new String[] {
-            "/add_node?lat=11&lon=22",
-            "/add_node?lon=13.3&lat=53.2&addtags=natural=tree|name=%20%20%20==Great%20Oak==" 
-        };
-    }
-    
-    @Override
-    public String getPermissionMessage() {
-        return tr("Remote Control has been asked to create a new node.") +
-                "<br>" + tr("Coordinates: ") + args.get("lat") + ", " + args.get("lon");
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return PermissionPrefWithDefault.CREATE_OBJECTS;
-    }
-
-    /**
-     * Adds a node, implements the GET /add_node?lon=...&lat=... request.
-     * @param args
-     */
-    private void addNode(Map<String, String> args){
-
-        // Parse the arguments
-        Main.info("Adding node at (" + lat + ", " + lon + ")");
-
-        // Create a new node
-        LatLon ll = new LatLon(lat, lon);
-
-        node = null;
-
-        if (Main.isDisplayingMapView()) {
-            Point p = Main.map.mapView.getPoint(ll);
-            node = Main.map.mapView.getNearestNode(p, OsmPrimitive.isUsablePredicate);
-            if (node!=null && node.getCoor().greatCircleDistance(ll) > Main.pref.getDouble("remotecontrol.tolerance", 0.1)) {
-                node = null; // node is too far
-            }
-        }
-
-        if (node==null) {
-            node = new Node(ll);
-            // Now execute the commands to add this node.
-            Main.main.undoRedo.add(new AddCommand(node));
-        }
-
-        Main.main.getCurrentDataSet().setSelected(node);
-        if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
-            AutoScaleAction.autoScale("selection");
-        } else {
-            Main.map.mapView.repaint();
-        }
-        // parse parameter addtags=tag1=value1|tag2=vlaue2
-        AddTagsDialog.addTags(args, sender, Collections.singleton(node));
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        try {
-            lat = Double.parseDouble(args.get("lat"));
-            lon = Double.parseDouble(args.get("lon"));
-        } catch (NumberFormatException e) {
-            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
-        }
-        if (!Main.main.hasEditLayer()) {
-             throw new RequestHandlerBadRequestException(tr("There is no layer opened to add node"));
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Point;
+import java.util.Collections;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.command.AddCommand;
+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.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+
+/**
+ * Handler for add_node request.
+ */
+public class AddNodeHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to add a node.
+     */
+    public static final String command = "add_node";
+
+    private double lat;
+    private double lon;
+    
+    private Node node;
+
+    @Override
+    protected void handleRequest() {
+        GuiHelper.runInEDTAndWait(new Runnable() {
+            @Override public void run() {
+                 addNode(args);
+            }
+        });
+    }
+
+    @Override
+    public String[] getMandatoryParams()
+    {
+        return new String[] { "lat", "lon" };
+    }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] { "addtags" };
+    }
+
+    @Override
+    public String getUsage() {
+        return "adds a node (given by its latitude and longitude) to the current dataset";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return new String[] {
+            "/add_node?lat=11&lon=22",
+            "/add_node?lon=13.3&lat=53.2&addtags=natural=tree|name=%20%20%20==Great%20Oak==" 
+        };
+    }
+    
+    @Override
+    public String getPermissionMessage() {
+        return tr("Remote Control has been asked to create a new node.") +
+                "<br>" + tr("Coordinates: ") + args.get("lat") + ", " + args.get("lon");
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.CREATE_OBJECTS;
+    }
+
+    /**
+     * Adds a node, implements the GET /add_node?lon=...&lat=... request.
+     * @param args
+     */
+    private void addNode(Map<String, String> args){
+
+        // Parse the arguments
+        Main.info("Adding node at (" + lat + ", " + lon + ")");
+
+        // Create a new node
+        LatLon ll = new LatLon(lat, lon);
+
+        node = null;
+
+        if (Main.isDisplayingMapView()) {
+            Point p = Main.map.mapView.getPoint(ll);
+            node = Main.map.mapView.getNearestNode(p, OsmPrimitive.isUsablePredicate);
+            if (node!=null && node.getCoor().greatCircleDistance(ll) > Main.pref.getDouble("remotecontrol.tolerance", 0.1)) {
+                node = null; // node is too far
+            }
+        }
+
+        if (node==null) {
+            node = new Node(ll);
+            // Now execute the commands to add this node.
+            Main.main.undoRedo.add(new AddCommand(node));
+        }
+
+        Main.main.getCurrentDataSet().setSelected(node);
+        if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
+            AutoScaleAction.autoScale("selection");
+        } else {
+            Main.map.mapView.repaint();
+        }
+        // parse parameter addtags=tag1=value1|tag2=vlaue2
+        AddTagsDialog.addTags(args, sender, Collections.singleton(node));
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        try {
+            lat = Double.parseDouble(args.get("lat"));
+            lon = Double.parseDouble(args.get("lon"));
+        } catch (NumberFormatException e) {
+            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
+        }
+        if (!Main.main.hasEditLayer()) {
+             throw new RequestHandlerBadRequestException(tr("There is no layer opened to add node"));
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java
index 0c996fe..f04aa8f 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java
@@ -1,88 +1,88 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import org.openstreetmap.josm.Main;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
-
-/**
- * Reports available commands, their parameters and examples
- * @since 6091
- */
-public class FeaturesHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to reply version.
-     */
-    public static final String command = "features";
-
-    @Override
-    protected void handleRequest() throws RequestHandlerErrorException,
-            RequestHandlerBadRequestException {
-        StringBuilder buf = new StringBuilder();
-        String q=args.get("q");
-        if (q!=null) {
-            buf.append("[");
-            boolean first = true;
-            for (String s: q.split("[,\\s]+")) {
-               if (first) {
-                   first = false;
-               } else {
-                   buf.append(", ");
-               }
-               String info = RequestProcessor.getHandlerInfoAsJSON("/"+s);
-               if (info!=null) {
-                   buf.append(info);
-               } else {
-                   Main.warn("Unknown handler {0} passed to /features request", s);
-               }
-            }
-            buf.append("]");
-        } else {
-            buf.append(RequestProcessor.getHandlersInfoAsJSON());
-        }
-            
-        content = buf.toString();
-        contentType = "application/json";
-        if (args.containsKey("jsonp")) {
-            content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ")";
-        }
-    }
-
-    @Override
-    public String getPermissionMessage() {
-        return tr("Remote Control has been asked to report its supported features. This enables web sites to guess a running JOSM version");
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return PermissionPrefWithDefault.READ_PROTOCOL_VERSION;
-    }
-
-    @Override
-    public String[] getMandatoryParams() {
-        return null;
-    }
-    
-    @Override
-    public String[] getOptionalParams() {
-        return new String[]{"jsonp", "q"};
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        // Nothing to do
-    }
-
-    @Override
-    public String getUsage() {
-        return "reports available commands, their parameters and examples";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        return new String[] {"/features", "/features?q=import,add_node"}; 
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import org.openstreetmap.josm.Main;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
+
+/**
+ * Reports available commands, their parameters and examples
+ * @since 6091
+ */
+public class FeaturesHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to reply version.
+     */
+    public static final String command = "features";
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException,
+            RequestHandlerBadRequestException {
+        StringBuilder buf = new StringBuilder();
+        String q=args.get("q");
+        if (q!=null) {
+            buf.append("[");
+            boolean first = true;
+            for (String s: q.split("[,\\s]+")) {
+               if (first) {
+                   first = false;
+               } else {
+                   buf.append(", ");
+               }
+               String info = RequestProcessor.getHandlerInfoAsJSON("/"+s);
+               if (info!=null) {
+                   buf.append(info);
+               } else {
+                   Main.warn("Unknown handler {0} passed to /features request", s);
+               }
+            }
+            buf.append("]");
+        } else {
+            buf.append(RequestProcessor.getHandlersInfoAsJSON());
+        }
+            
+        content = buf.toString();
+        contentType = "application/json";
+        if (args.containsKey("jsonp")) {
+            content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ")";
+        }
+    }
+
+    @Override
+    public String getPermissionMessage() {
+        return tr("Remote Control has been asked to report its supported features. This enables web sites to guess a running JOSM version");
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.READ_PROTOCOL_VERSION;
+    }
+
+    @Override
+    public String[] getMandatoryParams() {
+        return null;
+    }
+    
+    @Override
+    public String[] getOptionalParams() {
+        return new String[]{"jsonp", "q"};
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        // Nothing to do
+    }
+
+    @Override
+    public String getUsage() {
+        return "reports available commands, their parameters and examples";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return new String[] {"/features", "/features?q=import,add_node"}; 
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
index a9faa3e..70e70c1 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
@@ -1,172 +1,172 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.Arrays;
-import java.util.HashMap;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.imagery.ImageryInfo;
-import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
-import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Adds an imagery (WMS/TMS) layer. For instance, {@code /imagery?title=...&type=...&url=...}.
- * @since 3715
- */
-public class ImageryHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to add an imagery layer.
-     */
-    public static final String command = "imagery";
-
-    @Override
-    public String getPermissionMessage() {
-        return tr("Remote Control has been asked to load an imagery layer from the following URL:")
-                + "<br>" + args.get("url");
-    }
-
-    @Override
-    public String[] getMandatoryParams() {
-        return new String[]{"url"};
-    }
-
-    @Override
-    public String[] getOptionalParams() {
-        return new String[] { "title", "type", "cookies", "min_zoom", "max_zoom"};
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return PermissionPrefWithDefault.LOAD_IMAGERY;
-    }
-
-    protected static ImageryInfo findBingEntry() {
-        for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
-            if (ImageryType.BING.equals(i.getImageryType())) {
-                return i;
-            }
-        }
-        return null;
-    }
-
-    protected ImageryInfo buildImageryInfo() {
-        String url = args.get("url");
-        String title = args.get("title");
-        String type = args.get("type");
-        final ImageryInfo bing = ImageryType.BING.getTypeString().equals(type) ? findBingEntry() : null;
-        if ((title == null || title.isEmpty()) && bing != null) {
-            title = bing.getName();
-        }
-        if (title == null || title.isEmpty()) {
-            title = tr("Remote imagery");
-        }
-        String cookies = args.get("cookies");
-        final ImageryInfo imgInfo = new ImageryInfo(title, url, type, null, cookies);
-        if (bing != null) {
-            imgInfo.setIcon(bing.getIcon());
-        }
-        String minZoom = args.get("min_zoom");
-        if (minZoom != null && !minZoom.isEmpty()) {
-            try {
-                imgInfo.setDefaultMinZoom(Integer.parseInt(minZoom));
-            } catch (NumberFormatException e) {
-                Main.error(e);
-            }
-        }
-        String maxZoom = args.get("max_zoom");
-        if (maxZoom != null && !maxZoom.isEmpty()) {
-            try {
-                imgInfo.setDefaultMaxZoom(Integer.parseInt(maxZoom));
-            } catch (NumberFormatException e) {
-                Main.error(e);
-            }
-        }
-        return imgInfo;
-    }
-
-    @Override
-    protected void handleRequest() throws RequestHandlerErrorException {
-        final ImageryInfo imgInfo = buildImageryInfo();
-        if (Main.isDisplayingMapView()) {
-            for (ImageryLayer layer : Main.map.mapView.getLayersOfType(ImageryLayer.class)) {
-                if (layer.getInfo().equals(imgInfo)) {
-                    Main.info("Imagery layer already exists: "+imgInfo);
-                    return;
-                }
-            }
-        }
-        GuiHelper.runInEDT(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    Main.main.addLayer(ImageryLayer.create(imgInfo));
-                } catch (IllegalArgumentException e) {
-                    Main.error(e, false);
-                }
-            }
-        });
-    }
-
-    @Override
-    protected void parseArgs() {
-        HashMap<String, String> args = new HashMap<>();
-        if (request.indexOf('?') != -1) {
-            String query = request.substring(request.indexOf('?') + 1);
-            if (query.indexOf("url=") == 0) {
-                args.put("url", decodeParam(query.substring(4)));
-            } else {
-                int urlIdx = query.indexOf("&url=");
-                if (urlIdx != -1) {
-                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
-                    query = query.substring(0, urlIdx);
-                } else if (query.indexOf('#') != -1) {
-                    query = query.substring(0, query.indexOf('#'));
-                }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), decodeParam(param.substring(eq + 1)));
-                    }
-                }
-            }
-        }
-        this.args = args;
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        String url = args.get("url");
-        String type = args.get("type");
-        try {
-            ImageryLayer.create(new ImageryInfo(null, url, type, null, null));
-        } catch (IllegalArgumentException e) {
-            throw new RequestHandlerBadRequestException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public String getUsage() {
-        return "adds an imagery layer (e.g. WMS, TMS)";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        final String types = Utils.join("|", Utils.transform(Arrays.asList(ImageryInfo.ImageryType.values()), new Utils.Function<ImageryInfo.ImageryType, String>() {
-            @Override
-            public String apply(ImageryInfo.ImageryType x) {
-                return x.getTypeString();
-            }
-        }));
-        return new String[] { "/imagery?title=osm&type=tms&url=https://a.tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png",
-            "/imagery?title=landsat&type=wms&url=http://irs.gis-lab.info/?layers=landsat&SRS=%7Bproj%7D&WIDTH=%7Bwidth%7D&HEIGHT=%7Bheight%7D&BBOX=%7Bbbox%7D",
-            "/imagery?title=...&type={"+types+"}&url=....[&cookies=...][&min_zoom=...][&max_zoom=...]"};
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
+import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Adds an imagery (WMS/TMS) layer. For instance, {@code /imagery?title=...&type=...&url=...}.
+ * @since 3715
+ */
+public class ImageryHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to add an imagery layer.
+     */
+    public static final String command = "imagery";
+
+    @Override
+    public String getPermissionMessage() {
+        return tr("Remote Control has been asked to load an imagery layer from the following URL:")
+                + "<br>" + args.get("url");
+    }
+
+    @Override
+    public String[] getMandatoryParams() {
+        return new String[]{"url"};
+    }
+
+    @Override
+    public String[] getOptionalParams() {
+        return new String[] { "title", "type", "cookies", "min_zoom", "max_zoom"};
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.LOAD_IMAGERY;
+    }
+
+    protected static ImageryInfo findBingEntry() {
+        for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
+            if (ImageryType.BING.equals(i.getImageryType())) {
+                return i;
+            }
+        }
+        return null;
+    }
+
+    protected ImageryInfo buildImageryInfo() {
+        String url = args.get("url");
+        String title = args.get("title");
+        String type = args.get("type");
+        final ImageryInfo bing = ImageryType.BING.getTypeString().equals(type) ? findBingEntry() : null;
+        if ((title == null || title.isEmpty()) && bing != null) {
+            title = bing.getName();
+        }
+        if (title == null || title.isEmpty()) {
+            title = tr("Remote imagery");
+        }
+        String cookies = args.get("cookies");
+        final ImageryInfo imgInfo = new ImageryInfo(title, url, type, null, cookies);
+        if (bing != null) {
+            imgInfo.setIcon(bing.getIcon());
+        }
+        String minZoom = args.get("min_zoom");
+        if (minZoom != null && !minZoom.isEmpty()) {
+            try {
+                imgInfo.setDefaultMinZoom(Integer.parseInt(minZoom));
+            } catch (NumberFormatException e) {
+                Main.error(e);
+            }
+        }
+        String maxZoom = args.get("max_zoom");
+        if (maxZoom != null && !maxZoom.isEmpty()) {
+            try {
+                imgInfo.setDefaultMaxZoom(Integer.parseInt(maxZoom));
+            } catch (NumberFormatException e) {
+                Main.error(e);
+            }
+        }
+        return imgInfo;
+    }
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException {
+        final ImageryInfo imgInfo = buildImageryInfo();
+        if (Main.isDisplayingMapView()) {
+            for (ImageryLayer layer : Main.map.mapView.getLayersOfType(ImageryLayer.class)) {
+                if (layer.getInfo().equals(imgInfo)) {
+                    Main.info("Imagery layer already exists: "+imgInfo);
+                    return;
+                }
+            }
+        }
+        GuiHelper.runInEDT(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Main.main.addLayer(ImageryLayer.create(imgInfo));
+                } catch (IllegalArgumentException e) {
+                    Main.error(e, false);
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void parseArgs() {
+        HashMap<String, String> args = new HashMap<>();
+        if (request.indexOf('?') != -1) {
+            String query = request.substring(request.indexOf('?') + 1);
+            if (query.indexOf("url=") == 0) {
+                args.put("url", decodeParam(query.substring(4)));
+            } else {
+                int urlIdx = query.indexOf("&url=");
+                if (urlIdx != -1) {
+                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
+                    query = query.substring(0, urlIdx);
+                } else if (query.indexOf('#') != -1) {
+                    query = query.substring(0, query.indexOf('#'));
+                }
+                String[] params = query.split("&", -1);
+                for (String param : params) {
+                    int eq = param.indexOf('=');
+                    if (eq != -1) {
+                        args.put(param.substring(0, eq), decodeParam(param.substring(eq + 1)));
+                    }
+                }
+            }
+        }
+        this.args = args;
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        String url = args.get("url");
+        String type = args.get("type");
+        try {
+            ImageryLayer.create(new ImageryInfo(null, url, type, null, null));
+        } catch (IllegalArgumentException e) {
+            throw new RequestHandlerBadRequestException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public String getUsage() {
+        return "adds an imagery layer (e.g. WMS, TMS)";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        final String types = Utils.join("|", Utils.transform(Arrays.asList(ImageryInfo.ImageryType.values()), new Utils.Function<ImageryInfo.ImageryType, String>() {
+            @Override
+            public String apply(ImageryInfo.ImageryType x) {
+                return x.getTypeString();
+            }
+        }));
+        return new String[] { "/imagery?title=osm&type=tms&url=https://a.tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png",
+            "/imagery?title=landsat&type=wms&url=http://irs.gis-lab.info/?layers=landsat&SRS=%7Bproj%7D&WIDTH=%7Bwidth%7D&HEIGHT=%7Bheight%7D&BBOX=%7Bbbox%7D",
+            "/imagery?title=...&type={"+types+"}&url=....[&cookies=...][&min_zoom=...][&max_zoom=...]"};
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
index 9f03e67..c1bf2b8 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
@@ -1,134 +1,134 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.HashMap;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Handler for import request
- */
-public class ImportHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to import data.
-     */
-    public static final String command = "import";
-
-    private URL url;
-    private Collection<DownloadTask> suitableDownloadTasks;
-
-    @Override
-    protected void handleRequest() throws RequestHandlerErrorException {
-        try {
-            if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
-                // TODO: handle multiple suitable download tasks ?
-                suitableDownloadTasks.iterator().next().loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
-            }
-        } catch (Exception ex) {
-            Main.warn("RemoteControl: Error parsing import remote control request:");
-            Main.error(ex);
-            throw new RequestHandlerErrorException(ex);
-        }
-    }
-
-    @Override
-    public String[] getMandatoryParams() {
-        return new String[]{"url"};
-    }
-    
-    @Override
-    public String[] getOptionalParams() {
-        return new String[] {"new_layer"};
-    }
-
-    @Override
-    public String getUsage() {
-        return "downloads the specified OSM file and adds it to the current data set";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        return new String[] { "/import?url="+Main.getJOSMWebsite()+"/browser/josm/trunk/data_nodist/direction-arrows.osm" };
-    }
-    
-    @Override
-    public String getPermissionMessage() {
-        // URL can be any suitable URL giving back OSM data, including OSM API calls, even if calls to the main API
-        // should rather be passed to LoadAndZoomHandler or LoadObjectHandler.
-        // Other API instances will however use the import handler to force JOSM to make requests to this API instance.
-        // (Example with OSM-FR website that makes calls to the OSM-FR API)
-        // For user-friendliness, let's try to decode these OSM API calls to give a better confirmation message.
-        String taskMessage = null;
-        if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
-            // TODO: handle multiple suitable download tasks ?
-            taskMessage = suitableDownloadTasks.iterator().next().getConfirmationMessage(url);
-        }
-        return tr("Remote Control has been asked to import data from the following URL:")
-                + "<br>" + (taskMessage == null ? url.toString() : taskMessage);
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return PermissionPrefWithDefault.IMPORT_DATA;
-    }
-
-    @Override
-    protected void parseArgs() {
-        HashMap<String, String> args = new HashMap<>();
-        if (request.indexOf('?') != -1) {
-            String query = request.substring(request.indexOf('?') + 1);
-            if (query.indexOf("url=") == 0) {
-                args.put("url", decodeParam(query.substring(4)));
-            } else {
-                int urlIdx = query.indexOf("&url=");
-                if (urlIdx != -1) {
-                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
-                    query = query.substring(0, urlIdx);
-                } else {
-                    if (query.indexOf('#') != -1) {
-                        query = query.substring(0, query.indexOf('#'));
-                    }
-                }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), param.substring(eq + 1));
-                    }
-                }
-            }
-        }
-        this.args = args;
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        String urlString = args.get("url");
-        if (Main.pref.getBoolean("remotecontrol.importhandler.fix_url_query", true)) {
-            urlString = Utils.fixURLQuery(urlString);
-        }
-        try {
-            // Ensure the URL is valid
-            url = new URL(urlString);
-        } catch (MalformedURLException e) {
-            throw new RequestHandlerBadRequestException("MalformedURLException: "+e.getMessage(), e);
-        }
-        // Find download tasks for the given URL
-        suitableDownloadTasks = Main.main.menu.openLocation.findDownloadTasks(urlString, true);
-        if (suitableDownloadTasks.isEmpty()) {
-            // It should maybe be better to reject the request in that case ?
-            // For compatibility reasons with older instances of JOSM, arbitrary choice of DownloadOsmTask
-            suitableDownloadTasks.add(new DownloadOsmTask());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Handler for import request
+ */
+public class ImportHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to import data.
+     */
+    public static final String command = "import";
+
+    private URL url;
+    private Collection<DownloadTask> suitableDownloadTasks;
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException {
+        try {
+            if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
+                // TODO: handle multiple suitable download tasks ?
+                suitableDownloadTasks.iterator().next().loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
+            }
+        } catch (Exception ex) {
+            Main.warn("RemoteControl: Error parsing import remote control request:");
+            Main.error(ex);
+            throw new RequestHandlerErrorException(ex);
+        }
+    }
+
+    @Override
+    public String[] getMandatoryParams() {
+        return new String[]{"url"};
+    }
+    
+    @Override
+    public String[] getOptionalParams() {
+        return new String[] {"new_layer"};
+    }
+
+    @Override
+    public String getUsage() {
+        return "downloads the specified OSM file and adds it to the current data set";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return new String[] { "/import?url="+Main.getJOSMWebsite()+"/browser/josm/trunk/data_nodist/direction-arrows.osm" };
+    }
+    
+    @Override
+    public String getPermissionMessage() {
+        // URL can be any suitable URL giving back OSM data, including OSM API calls, even if calls to the main API
+        // should rather be passed to LoadAndZoomHandler or LoadObjectHandler.
+        // Other API instances will however use the import handler to force JOSM to make requests to this API instance.
+        // (Example with OSM-FR website that makes calls to the OSM-FR API)
+        // For user-friendliness, let's try to decode these OSM API calls to give a better confirmation message.
+        String taskMessage = null;
+        if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
+            // TODO: handle multiple suitable download tasks ?
+            taskMessage = suitableDownloadTasks.iterator().next().getConfirmationMessage(url);
+        }
+        return tr("Remote Control has been asked to import data from the following URL:")
+                + "<br>" + (taskMessage == null ? url.toString() : taskMessage);
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.IMPORT_DATA;
+    }
+
+    @Override
+    protected void parseArgs() {
+        HashMap<String, String> args = new HashMap<>();
+        if (request.indexOf('?') != -1) {
+            String query = request.substring(request.indexOf('?') + 1);
+            if (query.indexOf("url=") == 0) {
+                args.put("url", decodeParam(query.substring(4)));
+            } else {
+                int urlIdx = query.indexOf("&url=");
+                if (urlIdx != -1) {
+                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
+                    query = query.substring(0, urlIdx);
+                } else {
+                    if (query.indexOf('#') != -1) {
+                        query = query.substring(0, query.indexOf('#'));
+                    }
+                }
+                String[] params = query.split("&", -1);
+                for (String param : params) {
+                    int eq = param.indexOf('=');
+                    if (eq != -1) {
+                        args.put(param.substring(0, eq), param.substring(eq + 1));
+                    }
+                }
+            }
+        }
+        this.args = args;
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        String urlString = args.get("url");
+        if (Main.pref.getBoolean("remotecontrol.importhandler.fix_url_query", true)) {
+            urlString = Utils.fixURLQuery(urlString);
+        }
+        try {
+            // Ensure the URL is valid
+            url = new URL(urlString);
+        } catch (MalformedURLException e) {
+            throw new RequestHandlerBadRequestException("MalformedURLException: "+e.getMessage(), e);
+        }
+        // Find download tasks for the given URL
+        suitableDownloadTasks = Main.main.menu.openLocation.findDownloadTasks(urlString, true);
+        if (suitableDownloadTasks.isEmpty()) {
+            // It should maybe be better to reject the request in that case ?
+            // For compatibility reasons with older instances of JOSM, arbitrary choice of DownloadOsmTask
+            suitableDownloadTasks.add(new DownloadOsmTask());
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
index d06807c..c289277 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
@@ -1,298 +1,298 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.Future;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AutoScaleAction;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
-import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
-import org.openstreetmap.josm.actions.search.SearchCompiler;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.BBox;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Handler for {@code load_and_zoom} and {@code zoom} requests.
- * @since 3707
- */
-public class LoadAndZoomHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to load data and zoom.
-     */
-    public static final String command = "load_and_zoom";
-
-    /**
-     * The remote control command name used to zoom.
-     */
-    public static final String command2 = "zoom";
-
-    // Mandatory arguments
-    private double minlat;
-    private double maxlat;
-    private double minlon;
-    private double maxlon;
-
-    // Optional argument 'select'
-    private final Set<SimplePrimitiveId> toSelect = new HashSet<>();
-
-    @Override
-    public String getPermissionMessage() {
-        String msg = tr("Remote Control has been asked to load data from the API.") +
-                "<br>" + tr("Bounding box: ") + new BBox(minlon, minlat, maxlon, maxlat).toStringCSV(", ");
-        if (args.containsKey("select") && toSelect.size() > 0) {
-            msg += "<br>" + tr("Selection: {0}", toSelect.size());
-        }
-        return msg;
-    }
-
-    @Override
-    public String[] getMandatoryParams() {
-        return new String[] { "bottom", "top", "left", "right" };
-    }
-
-    @Override
-    public String[] getOptionalParams() {
-        return new String[] {"new_layer", "addtags", "select", "zoom_mode", "changeset_comment", "changeset_source", "search"};
-    }
-
-    @Override
-    public String getUsage() {
-        return "download a bounding box from the API, zoom to the downloaded area and optionally select one or more objects";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        return getUsageExamples(myCommand);
-    }
-
-    @Override
-    public String[] getUsageExamples(String cmd) {
-        if (command.equals(cmd)) {
-            return new String[] {
-                    "/load_and_zoom?addtags=wikipedia:de=Wei%C3%9Fe_Gasse|maxspeed=5&select=way23071688,way23076176,way23076177,&left=13.740&right=13.741&top=51.05&bottom=51.049",
-                    "/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999&new_layer=true"};
-        } else {
-            return new String[] {
-            "/zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999",
-            "/zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&search=highway+OR+railway",
-            };
-        }
-    }
-
-    @Override
-    protected void handleRequest() throws RequestHandlerErrorException {
-        DownloadTask osmTask = new DownloadOsmTask();
-        try {
-            boolean newLayer = isLoadInNewLayer();
-
-            if (command.equals(myCommand)) {
-                if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) {
-                    Main.info("RemoteControl: download forbidden by preferences");
-                } else {
-                    Area toDownload = null;
-                    if (!newLayer) {
-                        // find out whether some data has already been downloaded
-                        Area present = null;
-                        DataSet ds = Main.main.getCurrentDataSet();
-                        if (ds != null) {
-                            present = ds.getDataSourceArea();
-                        }
-                        if (present != null && !present.isEmpty()) {
-                            toDownload = new Area(new Rectangle2D.Double(minlon,minlat,maxlon-minlon,maxlat-minlat));
-                            toDownload.subtract(present);
-                            if (!toDownload.isEmpty()) {
-                                // the result might not be a rectangle (L shaped etc)
-                                Rectangle2D downloadBounds = toDownload.getBounds2D();
-                                minlat = downloadBounds.getMinY();
-                                minlon = downloadBounds.getMinX();
-                                maxlat = downloadBounds.getMaxY();
-                                maxlon = downloadBounds.getMaxX();
-                            }
-                        }
-                    }
-                    if (toDownload != null && toDownload.isEmpty()) {
-                        Main.info("RemoteControl: no download necessary");
-                    } else {
-                        Future<?> future = osmTask.download(newLayer, new Bounds(minlat,minlon,maxlat,maxlon), null /* let the task manage the progress monitor */);
-                        Main.worker.submit(new PostDownloadHandler(osmTask, future));
-                    }
-                }
-            }
-        } catch (Exception ex) {
-            Main.warn("RemoteControl: Error parsing load_and_zoom remote control request:");
-            Main.error(ex);
-            throw new RequestHandlerErrorException(ex);
-        }
-
-        /**
-         * deselect objects if parameter addtags given
-         */
-        if (args.containsKey("addtags")) {
-            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
-                @Override
-                public void run() {
-                    DataSet ds = Main.main.getCurrentDataSet();
-                    if(ds == null) // e.g. download failed
-                        return;
-                    ds.clearSelection();
-                }
-            });
-        }
-
-        final Collection<OsmPrimitive> forTagAdd = new HashSet<>();
-        final Bounds bbox = new Bounds(minlat, minlon, maxlat, maxlon);
-        if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
-            // select objects after downloading, zoom to selection.
-            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
-                @Override
-                public void run() {
-                    Set<OsmPrimitive> newSel = new HashSet<>();
-                    DataSet ds = Main.main.getCurrentDataSet();
-                    if (ds == null) // e.g. download failed
-                        return;
-                    for (SimplePrimitiveId id : toSelect) {
-                        final OsmPrimitive p = ds.getPrimitiveById(id);
-                        if (p != null) {
-                            newSel.add(p);
-                            forTagAdd.add(p);
-                        }
-                    }
-                    toSelect.clear();
-                    ds.setSelected(newSel);
-                    zoom(newSel, bbox);
-                    if (Main.isDisplayingMapView() && Main.map.relationListDialog != null) {
-                        Main.map.relationListDialog.selectRelations(null); // unselect all relations to fix #7342
-                        Main.map.relationListDialog.dataChanged(null);
-                        Main.map.relationListDialog.selectRelations(Utils.filteredCollection(newSel, Relation.class));
-                    }
-                }
-            });
-        } else if (args.containsKey("search") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
-            try {
-                final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"), false, false);
-                Main.worker.submit(new Runnable() {
-                    @Override
-                    public void run() {
-                        final DataSet ds = Main.main.getCurrentDataSet();
-                        final Collection<OsmPrimitive> filteredPrimitives = Utils.filter(ds.allPrimitives(), search);
-                        ds.setSelected(filteredPrimitives);
-                        forTagAdd.addAll(filteredPrimitives);
-                        zoom(filteredPrimitives, bbox);
-                    }
-                });
-            } catch (SearchCompiler.ParseError ex) {
-                Main.error(ex);
-                throw new RequestHandlerErrorException(ex);
-            }
-        } else {
-            // after downloading, zoom to downloaded area.
-            zoom(Collections.<OsmPrimitive>emptySet(), bbox);
-        }
-
-        // add changeset tags after download if necessary
-        if (args.containsKey("changeset_comment") || args.containsKey("changeset_source")) {
-            Main.worker.submit(new Runnable() {
-                @Override
-                public void run() {
-                    if (Main.main.getCurrentDataSet() != null) {
-                        if (args.containsKey("changeset_comment")) {
-                            Main.main.getCurrentDataSet().addChangeSetTag("comment", args.get("changeset_comment"));
-                        }
-                        if (args.containsKey("changeset_source")) {
-                            Main.main.getCurrentDataSet().addChangeSetTag("source", args.get("changeset_source"));
-                        }
-                    }
-                }
-            });
-        }
-
-        AddTagsDialog.addTags(args, sender, forTagAdd);
-    }
-
-    protected void zoom(Collection<OsmPrimitive> primitives, final Bounds bbox) {
-        if (!PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
-            return;
-        }
-        // zoom_mode=(download|selection), defaults to selection
-        if (!"download".equals(args.get("zoom_mode")) && !primitives.isEmpty()) {
-            AutoScaleAction.autoScale("selection");
-        } else if (Main.isDisplayingMapView()) {
-            // make sure this isn't called unless there *is* a MapView
-            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
-                @Override
-                public void run() {
-                    BoundingXYVisitor bbox1 = new BoundingXYVisitor();
-                    bbox1.visit(bbox);
-                    Main.map.mapView.zoomTo(bbox1);
-                }
-            });
-        }
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return null;
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        // Process mandatory arguments
-        minlat = 0;
-        maxlat = 0;
-        minlon = 0;
-        maxlon = 0;
-        try {
-            minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
-            maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
-            minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
-            maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
-        } catch (NumberFormatException e) {
-            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
-        }
-
-        // Current API 0.6 check: "The latitudes must be between -90 and 90"
-        if (!LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat)) {
-            throw new RequestHandlerBadRequestException(tr("The latitudes must be between {0} and {1}", -90d, 90d));
-        }
-        // Current API 0.6 check: "longitudes between -180 and 180"
-        if (!LatLon.isValidLon(minlon) || !LatLon.isValidLon(maxlon)) {
-            throw new RequestHandlerBadRequestException(tr("The longitudes must be between {0} and {1}", -180d, 180d));
-        }
-        // Current API 0.6 check: "the minima must be less than the maxima"
-        if (minlat > maxlat || minlon > maxlon) {
-            throw new RequestHandlerBadRequestException(tr("The minima must be less than the maxima"));
-        }
-
-        // Process optional argument 'select'
-        if (args.containsKey("select")) {
-            toSelect.clear();
-            for (String item : args.get("select").split(",")) {
-                try {
-                    toSelect.add(SimplePrimitiveId.fromString(item));
-                } catch (IllegalArgumentException ex) {
-                    Main.warn("RemoteControl: invalid selection '" + item + "' ignored");
-                }
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Future;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
+import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.BBox;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Handler for {@code load_and_zoom} and {@code zoom} requests.
+ * @since 3707
+ */
+public class LoadAndZoomHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to load data and zoom.
+     */
+    public static final String command = "load_and_zoom";
+
+    /**
+     * The remote control command name used to zoom.
+     */
+    public static final String command2 = "zoom";
+
+    // Mandatory arguments
+    private double minlat;
+    private double maxlat;
+    private double minlon;
+    private double maxlon;
+
+    // Optional argument 'select'
+    private final Set<SimplePrimitiveId> toSelect = new HashSet<>();
+
+    @Override
+    public String getPermissionMessage() {
+        String msg = tr("Remote Control has been asked to load data from the API.") +
+                "<br>" + tr("Bounding box: ") + new BBox(minlon, minlat, maxlon, maxlat).toStringCSV(", ");
+        if (args.containsKey("select") && toSelect.size() > 0) {
+            msg += "<br>" + tr("Selection: {0}", toSelect.size());
+        }
+        return msg;
+    }
+
+    @Override
+    public String[] getMandatoryParams() {
+        return new String[] { "bottom", "top", "left", "right" };
+    }
+
+    @Override
+    public String[] getOptionalParams() {
+        return new String[] {"new_layer", "addtags", "select", "zoom_mode", "changeset_comment", "changeset_source", "search"};
+    }
+
+    @Override
+    public String getUsage() {
+        return "download a bounding box from the API, zoom to the downloaded area and optionally select one or more objects";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return getUsageExamples(myCommand);
+    }
+
+    @Override
+    public String[] getUsageExamples(String cmd) {
+        if (command.equals(cmd)) {
+            return new String[] {
+                    "/load_and_zoom?addtags=wikipedia:de=Wei%C3%9Fe_Gasse|maxspeed=5&select=way23071688,way23076176,way23076177,&left=13.740&right=13.741&top=51.05&bottom=51.049",
+                    "/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999&new_layer=true"};
+        } else {
+            return new String[] {
+            "/zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999",
+            "/zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&search=highway+OR+railway",
+            };
+        }
+    }
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException {
+        DownloadTask osmTask = new DownloadOsmTask();
+        try {
+            boolean newLayer = isLoadInNewLayer();
+
+            if (command.equals(myCommand)) {
+                if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) {
+                    Main.info("RemoteControl: download forbidden by preferences");
+                } else {
+                    Area toDownload = null;
+                    if (!newLayer) {
+                        // find out whether some data has already been downloaded
+                        Area present = null;
+                        DataSet ds = Main.main.getCurrentDataSet();
+                        if (ds != null) {
+                            present = ds.getDataSourceArea();
+                        }
+                        if (present != null && !present.isEmpty()) {
+                            toDownload = new Area(new Rectangle2D.Double(minlon,minlat,maxlon-minlon,maxlat-minlat));
+                            toDownload.subtract(present);
+                            if (!toDownload.isEmpty()) {
+                                // the result might not be a rectangle (L shaped etc)
+                                Rectangle2D downloadBounds = toDownload.getBounds2D();
+                                minlat = downloadBounds.getMinY();
+                                minlon = downloadBounds.getMinX();
+                                maxlat = downloadBounds.getMaxY();
+                                maxlon = downloadBounds.getMaxX();
+                            }
+                        }
+                    }
+                    if (toDownload != null && toDownload.isEmpty()) {
+                        Main.info("RemoteControl: no download necessary");
+                    } else {
+                        Future<?> future = osmTask.download(newLayer, new Bounds(minlat,minlon,maxlat,maxlon), null /* let the task manage the progress monitor */);
+                        Main.worker.submit(new PostDownloadHandler(osmTask, future));
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            Main.warn("RemoteControl: Error parsing load_and_zoom remote control request:");
+            Main.error(ex);
+            throw new RequestHandlerErrorException(ex);
+        }
+
+        /**
+         * deselect objects if parameter addtags given
+         */
+        if (args.containsKey("addtags")) {
+            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
+                @Override
+                public void run() {
+                    DataSet ds = Main.main.getCurrentDataSet();
+                    if(ds == null) // e.g. download failed
+                        return;
+                    ds.clearSelection();
+                }
+            });
+        }
+
+        final Collection<OsmPrimitive> forTagAdd = new HashSet<>();
+        final Bounds bbox = new Bounds(minlat, minlon, maxlat, maxlon);
+        if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
+            // select objects after downloading, zoom to selection.
+            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
+                @Override
+                public void run() {
+                    Set<OsmPrimitive> newSel = new HashSet<>();
+                    DataSet ds = Main.main.getCurrentDataSet();
+                    if (ds == null) // e.g. download failed
+                        return;
+                    for (SimplePrimitiveId id : toSelect) {
+                        final OsmPrimitive p = ds.getPrimitiveById(id);
+                        if (p != null) {
+                            newSel.add(p);
+                            forTagAdd.add(p);
+                        }
+                    }
+                    toSelect.clear();
+                    ds.setSelected(newSel);
+                    zoom(newSel, bbox);
+                    if (Main.isDisplayingMapView() && Main.map.relationListDialog != null) {
+                        Main.map.relationListDialog.selectRelations(null); // unselect all relations to fix #7342
+                        Main.map.relationListDialog.dataChanged(null);
+                        Main.map.relationListDialog.selectRelations(Utils.filteredCollection(newSel, Relation.class));
+                    }
+                }
+            });
+        } else if (args.containsKey("search") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
+            try {
+                final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"), false, false);
+                Main.worker.submit(new Runnable() {
+                    @Override
+                    public void run() {
+                        final DataSet ds = Main.main.getCurrentDataSet();
+                        final Collection<OsmPrimitive> filteredPrimitives = Utils.filter(ds.allPrimitives(), search);
+                        ds.setSelected(filteredPrimitives);
+                        forTagAdd.addAll(filteredPrimitives);
+                        zoom(filteredPrimitives, bbox);
+                    }
+                });
+            } catch (SearchCompiler.ParseError ex) {
+                Main.error(ex);
+                throw new RequestHandlerErrorException(ex);
+            }
+        } else {
+            // after downloading, zoom to downloaded area.
+            zoom(Collections.<OsmPrimitive>emptySet(), bbox);
+        }
+
+        // add changeset tags after download if necessary
+        if (args.containsKey("changeset_comment") || args.containsKey("changeset_source")) {
+            Main.worker.submit(new Runnable() {
+                @Override
+                public void run() {
+                    if (Main.main.getCurrentDataSet() != null) {
+                        if (args.containsKey("changeset_comment")) {
+                            Main.main.getCurrentDataSet().addChangeSetTag("comment", args.get("changeset_comment"));
+                        }
+                        if (args.containsKey("changeset_source")) {
+                            Main.main.getCurrentDataSet().addChangeSetTag("source", args.get("changeset_source"));
+                        }
+                    }
+                }
+            });
+        }
+
+        AddTagsDialog.addTags(args, sender, forTagAdd);
+    }
+
+    protected void zoom(Collection<OsmPrimitive> primitives, final Bounds bbox) {
+        if (!PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
+            return;
+        }
+        // zoom_mode=(download|selection), defaults to selection
+        if (!"download".equals(args.get("zoom_mode")) && !primitives.isEmpty()) {
+            AutoScaleAction.autoScale("selection");
+        } else if (Main.isDisplayingMapView()) {
+            // make sure this isn't called unless there *is* a MapView
+            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
+                @Override
+                public void run() {
+                    BoundingXYVisitor bbox1 = new BoundingXYVisitor();
+                    bbox1.visit(bbox);
+                    Main.map.mapView.zoomTo(bbox1);
+                }
+            });
+        }
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return null;
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        // Process mandatory arguments
+        minlat = 0;
+        maxlat = 0;
+        minlon = 0;
+        maxlon = 0;
+        try {
+            minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
+            maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
+            minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
+            maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
+        } catch (NumberFormatException e) {
+            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
+        }
+
+        // Current API 0.6 check: "The latitudes must be between -90 and 90"
+        if (!LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat)) {
+            throw new RequestHandlerBadRequestException(tr("The latitudes must be between {0} and {1}", -90d, 90d));
+        }
+        // Current API 0.6 check: "longitudes between -180 and 180"
+        if (!LatLon.isValidLon(minlon) || !LatLon.isValidLon(maxlon)) {
+            throw new RequestHandlerBadRequestException(tr("The longitudes must be between {0} and {1}", -180d, 180d));
+        }
+        // Current API 0.6 check: "the minima must be less than the maxima"
+        if (minlat > maxlat || minlon > maxlon) {
+            throw new RequestHandlerBadRequestException(tr("The minima must be less than the maxima"));
+        }
+
+        // Process optional argument 'select'
+        if (args.containsKey("select")) {
+            toSelect.clear();
+            for (String item : args.get("select").split(",")) {
+                try {
+                    toSelect.add(SimplePrimitiveId.fromString(item));
+                } catch (IllegalArgumentException ex) {
+                    Main.warn("RemoteControl: invalid selection '" + item + "' ignored");
+                }
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
index 20be51b..265eb29 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
@@ -1,321 +1,321 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.text.MessageFormat;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * This is the parent of all classes that handle a specific remote control command
- *
- * @author Bodo Meissner
- */
-public abstract class RequestHandler {
-
-    public static final String globalConfirmationKey = "remotecontrol.always-confirm";
-    public static final boolean globalConfirmationDefault = false;
-    public static final String loadInNewLayerKey = "remotecontrol.new-layer";
-    public static final boolean loadInNewLayerDefault = false;
-
-    /** The GET request arguments */
-    protected Map<String,String> args;
-
-    /** The request URL without "GET". */
-    protected String request;
-
-    /** default response */
-    protected String content = "OK\r\n";
-    /** default content type */
-    protected String contentType = "text/plain";
-
-    /** will be filled with the command assigned to the subclass */
-    protected String myCommand;
-
-    /**
-     * who sent the request?
-     * the host from referer header or IP of request sender
-     */
-    protected String sender;
-
-    /**
-     * Check permission and parameters and handle request.
-     *
-     * @throws RequestHandlerForbiddenException
-     * @throws RequestHandlerBadRequestException
-     * @throws RequestHandlerErrorException
-     */
-    public final void handle() throws RequestHandlerForbiddenException, RequestHandlerBadRequestException, RequestHandlerErrorException {
-        checkMandatoryParams();
-        validateRequest();
-        checkPermission();
-        handleRequest();
-    }
-
-    /**
-     * Validates the request before attempting to perform it.
-     * @throws RequestHandlerBadRequestException
-     * @since 5678
-     */
-    protected abstract void validateRequest() throws RequestHandlerBadRequestException;
-
-    /**
-     * Handle a specific command sent as remote control.
-     *
-     * This method of the subclass will do the real work.
-     *
-     * @throws RequestHandlerErrorException
-     * @throws RequestHandlerBadRequestException
-     */
-    protected abstract void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException;
-
-    /**
-     * Get a specific message to ask the user for permission for the operation
-     * requested via remote control.
-     *
-     * This message will be displayed to the user if the preference
-     * remotecontrol.always-confirm is true.
-     *
-     * @return the message
-     */
-    public abstract String getPermissionMessage();
-
-    /**
-     * Get a PermissionPref object containing the name of a special permission
-     * preference to individually allow the requested operation and an error
-     * message to be displayed when a disabled operation is requested.
-     *
-     * Default is not to check any special preference. Override this in a
-     * subclass to define permission preference and error message.
-     *
-     * @return the preference name and error message or null
-     */
-    public abstract PermissionPrefWithDefault getPermissionPref();
-
-    public abstract String[] getMandatoryParams();
-
-    public String[] getOptionalParams() {
-        return null;
-    }
-
-    public String getUsage() {
-        return null;
-    }
-
-    public String[] getUsageExamples() {
-        return null;
-    }
-
-    /**
-     * Returns usage examples for the given command. To be overriden only my handlers that define several commands.
-     * @param cmd The command asked
-     * @return Usage examples for the given command
-     * @since 6332
-     */
-    public String[] getUsageExamples(String cmd) {
-        return getUsageExamples();
-    }
-
-    /**
-     * Check permissions in preferences and display error message
-     * or ask for permission.
-     *
-     * @throws RequestHandlerForbiddenException
-     */
-    public final void checkPermission() throws RequestHandlerForbiddenException {
-        /*
-         * If the subclass defines a specific preference and if this is set
-         * to false, abort with an error message.
-         *
-         * Note: we use the deprecated class here for compatibility with
-         * older versions of WMSPlugin.
-         */
-        PermissionPrefWithDefault permissionPref = getPermissionPref();
-        if (permissionPref != null && permissionPref.pref != null) {
-            if (!Main.pref.getBoolean(permissionPref.pref, permissionPref.defaultVal)) {
-                String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by preferences", myCommand);
-                Main.info(err);
-                throw new RequestHandlerForbiddenException(err);
-            }
-        }
-
-        /* Does the user want to confirm everything?
-         * If yes, display specific confirmation message.
-         */
-        if (Main.pref.getBoolean(globalConfirmationKey, globalConfirmationDefault)) {
-            // Ensure dialog box does not exceed main window size
-            Integer maxWidth = (int) Math.max(200, Main.parent.getWidth()*0.6);
-            String message = "<html><div>" + getPermissionMessage() +
-                    "<br/>" + tr("Do you want to allow this?") + "</div></html>";
-            JLabel label = new JLabel(message);
-            if (label.getPreferredSize().width > maxWidth) {
-                label.setText(message.replaceFirst("<div>", "<div style=\"width:" + maxWidth + "px;\">"));
-            }
-            if (JOptionPane.showConfirmDialog(Main.parent, label,
-                tr("Confirm Remote Control action"),
-                JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
-                    String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by user''s choice", myCommand);
-                    throw new RequestHandlerForbiddenException(err);
-            }
-        }
-    }
-
-    /**
-     * Set request URL and parse args.
-     *
-     * @param url The request URL.
-     */
-    public void setUrl(String url) {
-        this.request = url;
-        parseArgs();
-    }
-
-    /**
-     * Parse the request parameters as key=value pairs.
-     * The result will be stored in {@code this.args}.
-     *
-     * Can be overridden by subclass.
-     */
-    protected void parseArgs() {
-        try {
-            String req = URLDecoder.decode(this.request, "UTF-8");
-            HashMap<String, String> args = new HashMap<>();
-            if (req.indexOf('?') != -1) {
-                String query = req.substring(req.indexOf('?') + 1);
-                if (query.indexOf('#') != -1) {
-                            query = query.substring(0, query.indexOf('#'));
-                        }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), param.substring(eq + 1));
-                    }
-                }
-            }
-            this.args = args;
-        } catch (UnsupportedEncodingException ex) {
-            throw new IllegalStateException(ex);
-        }
-    }
-
-    void checkMandatoryParams() throws RequestHandlerBadRequestException {
-        String[] mandatory = getMandatoryParams();
-        String[] optional = getOptionalParams();
-        List<String> missingKeys = new LinkedList<>();
-        boolean error = false;
-        if(mandatory != null) for (String key : mandatory) {
-            String value = args.get(key);
-            if ((value == null) || (value.length() == 0)) {
-                error = true;
-                Main.warn("'" + myCommand + "' remote control request must have '" + key + "' parameter");
-                missingKeys.add(key);
-            }
-        }
-        HashSet<String> knownParams = new HashSet<>();
-        if (mandatory != null) Collections.addAll(knownParams, mandatory);
-        if (optional != null) Collections.addAll(knownParams, optional);
-        for (String par: args.keySet()) {
-            if (!knownParams.contains(par)) {
-                Main.warn("Unknown remote control parameter {0}, skipping it", par);
-            }
-        }
-        if (error) {
-            throw new RequestHandlerBadRequestException(
-                    "The following keys are mandatory, but have not been provided: "
-                    + Utils.join(", ", missingKeys));
-        }
-    }
-
-    /**
-     * Save command associated with this handler.
-     *
-     * @param command The command.
-     */
-    public void setCommand(String command)
-    {
-        if (command.charAt(0) == '/') {
-            command = command.substring(1);
-        }
-        myCommand = command;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public String getContentType() {
-        return contentType;
-    }
-
-    protected boolean isLoadInNewLayer() {
-        return args.get("new_layer") != null && !args.get("new_layer").isEmpty()
-                ? Boolean.parseBoolean(args.get("new_layer"))
-                : Main.pref.getBoolean(loadInNewLayerKey, loadInNewLayerDefault);
-    }
-
-    protected final String decodeParam(String param) {
-        try {
-            return URLDecoder.decode(param, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void setSender(String sender) {
-        this.sender = sender;
-    }
-
-    public static class RequestHandlerException extends Exception {
-
-        public RequestHandlerException(String message) {
-            super(message);
-        }
-        public RequestHandlerException(String message, Throwable cause) {
-            super(message, cause);
-        }
-        public RequestHandlerException(Throwable cause) {
-            super(cause);
-        }
-        public RequestHandlerException() {
-        }
-    }
-
-    public static class RequestHandlerErrorException extends RequestHandlerException {
-        public RequestHandlerErrorException(Throwable cause) {
-            super(cause);
-        }
-    }
-
-    public static class RequestHandlerBadRequestException extends RequestHandlerException {
-
-        public RequestHandlerBadRequestException(String message) {
-            super(message);
-        }
-        public RequestHandlerBadRequestException(String message, Throwable cause) {
-            super(message, cause);
-        }
-    }
-
-    public static class RequestHandlerForbiddenException extends RequestHandlerException {
-        private static final long serialVersionUID = 2263904699747115423L;
-
-        public RequestHandlerForbiddenException(String message) {
-            super(message);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.text.MessageFormat;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * This is the parent of all classes that handle a specific remote control command
+ *
+ * @author Bodo Meissner
+ */
+public abstract class RequestHandler {
+
+    public static final String globalConfirmationKey = "remotecontrol.always-confirm";
+    public static final boolean globalConfirmationDefault = false;
+    public static final String loadInNewLayerKey = "remotecontrol.new-layer";
+    public static final boolean loadInNewLayerDefault = false;
+
+    /** The GET request arguments */
+    protected Map<String,String> args;
+
+    /** The request URL without "GET". */
+    protected String request;
+
+    /** default response */
+    protected String content = "OK\r\n";
+    /** default content type */
+    protected String contentType = "text/plain";
+
+    /** will be filled with the command assigned to the subclass */
+    protected String myCommand;
+
+    /**
+     * who sent the request?
+     * the host from referer header or IP of request sender
+     */
+    protected String sender;
+
+    /**
+     * Check permission and parameters and handle request.
+     *
+     * @throws RequestHandlerForbiddenException
+     * @throws RequestHandlerBadRequestException
+     * @throws RequestHandlerErrorException
+     */
+    public final void handle() throws RequestHandlerForbiddenException, RequestHandlerBadRequestException, RequestHandlerErrorException {
+        checkMandatoryParams();
+        validateRequest();
+        checkPermission();
+        handleRequest();
+    }
+
+    /**
+     * Validates the request before attempting to perform it.
+     * @throws RequestHandlerBadRequestException
+     * @since 5678
+     */
+    protected abstract void validateRequest() throws RequestHandlerBadRequestException;
+
+    /**
+     * Handle a specific command sent as remote control.
+     *
+     * This method of the subclass will do the real work.
+     *
+     * @throws RequestHandlerErrorException
+     * @throws RequestHandlerBadRequestException
+     */
+    protected abstract void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException;
+
+    /**
+     * Get a specific message to ask the user for permission for the operation
+     * requested via remote control.
+     *
+     * This message will be displayed to the user if the preference
+     * remotecontrol.always-confirm is true.
+     *
+     * @return the message
+     */
+    public abstract String getPermissionMessage();
+
+    /**
+     * Get a PermissionPref object containing the name of a special permission
+     * preference to individually allow the requested operation and an error
+     * message to be displayed when a disabled operation is requested.
+     *
+     * Default is not to check any special preference. Override this in a
+     * subclass to define permission preference and error message.
+     *
+     * @return the preference name and error message or null
+     */
+    public abstract PermissionPrefWithDefault getPermissionPref();
+
+    public abstract String[] getMandatoryParams();
+
+    public String[] getOptionalParams() {
+        return null;
+    }
+
+    public String getUsage() {
+        return null;
+    }
+
+    public String[] getUsageExamples() {
+        return null;
+    }
+
+    /**
+     * Returns usage examples for the given command. To be overriden only my handlers that define several commands.
+     * @param cmd The command asked
+     * @return Usage examples for the given command
+     * @since 6332
+     */
+    public String[] getUsageExamples(String cmd) {
+        return getUsageExamples();
+    }
+
+    /**
+     * Check permissions in preferences and display error message
+     * or ask for permission.
+     *
+     * @throws RequestHandlerForbiddenException
+     */
+    public final void checkPermission() throws RequestHandlerForbiddenException {
+        /*
+         * If the subclass defines a specific preference and if this is set
+         * to false, abort with an error message.
+         *
+         * Note: we use the deprecated class here for compatibility with
+         * older versions of WMSPlugin.
+         */
+        PermissionPrefWithDefault permissionPref = getPermissionPref();
+        if (permissionPref != null && permissionPref.pref != null) {
+            if (!Main.pref.getBoolean(permissionPref.pref, permissionPref.defaultVal)) {
+                String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by preferences", myCommand);
+                Main.info(err);
+                throw new RequestHandlerForbiddenException(err);
+            }
+        }
+
+        /* Does the user want to confirm everything?
+         * If yes, display specific confirmation message.
+         */
+        if (Main.pref.getBoolean(globalConfirmationKey, globalConfirmationDefault)) {
+            // Ensure dialog box does not exceed main window size
+            Integer maxWidth = (int) Math.max(200, Main.parent.getWidth()*0.6);
+            String message = "<html><div>" + getPermissionMessage() +
+                    "<br/>" + tr("Do you want to allow this?") + "</div></html>";
+            JLabel label = new JLabel(message);
+            if (label.getPreferredSize().width > maxWidth) {
+                label.setText(message.replaceFirst("<div>", "<div style=\"width:" + maxWidth + "px;\">"));
+            }
+            if (JOptionPane.showConfirmDialog(Main.parent, label,
+                tr("Confirm Remote Control action"),
+                JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
+                    String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by user''s choice", myCommand);
+                    throw new RequestHandlerForbiddenException(err);
+            }
+        }
+    }
+
+    /**
+     * Set request URL and parse args.
+     *
+     * @param url The request URL.
+     */
+    public void setUrl(String url) {
+        this.request = url;
+        parseArgs();
+    }
+
+    /**
+     * Parse the request parameters as key=value pairs.
+     * The result will be stored in {@code this.args}.
+     *
+     * Can be overridden by subclass.
+     */
+    protected void parseArgs() {
+        try {
+            String req = URLDecoder.decode(this.request, "UTF-8");
+            HashMap<String, String> args = new HashMap<>();
+            if (req.indexOf('?') != -1) {
+                String query = req.substring(req.indexOf('?') + 1);
+                if (query.indexOf('#') != -1) {
+                            query = query.substring(0, query.indexOf('#'));
+                        }
+                String[] params = query.split("&", -1);
+                for (String param : params) {
+                    int eq = param.indexOf('=');
+                    if (eq != -1) {
+                        args.put(param.substring(0, eq), param.substring(eq + 1));
+                    }
+                }
+            }
+            this.args = args;
+        } catch (UnsupportedEncodingException ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+
+    void checkMandatoryParams() throws RequestHandlerBadRequestException {
+        String[] mandatory = getMandatoryParams();
+        String[] optional = getOptionalParams();
+        List<String> missingKeys = new LinkedList<>();
+        boolean error = false;
+        if(mandatory != null) for (String key : mandatory) {
+            String value = args.get(key);
+            if ((value == null) || (value.length() == 0)) {
+                error = true;
+                Main.warn("'" + myCommand + "' remote control request must have '" + key + "' parameter");
+                missingKeys.add(key);
+            }
+        }
+        HashSet<String> knownParams = new HashSet<>();
+        if (mandatory != null) Collections.addAll(knownParams, mandatory);
+        if (optional != null) Collections.addAll(knownParams, optional);
+        for (String par: args.keySet()) {
+            if (!knownParams.contains(par)) {
+                Main.warn("Unknown remote control parameter {0}, skipping it", par);
+            }
+        }
+        if (error) {
+            throw new RequestHandlerBadRequestException(
+                    "The following keys are mandatory, but have not been provided: "
+                    + Utils.join(", ", missingKeys));
+        }
+    }
+
+    /**
+     * Save command associated with this handler.
+     *
+     * @param command The command.
+     */
+    public void setCommand(String command)
+    {
+        if (command.charAt(0) == '/') {
+            command = command.substring(1);
+        }
+        myCommand = command;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+    protected boolean isLoadInNewLayer() {
+        return args.get("new_layer") != null && !args.get("new_layer").isEmpty()
+                ? Boolean.parseBoolean(args.get("new_layer"))
+                : Main.pref.getBoolean(loadInNewLayerKey, loadInNewLayerDefault);
+    }
+
+    protected final String decodeParam(String param) {
+        try {
+            return URLDecoder.decode(param, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void setSender(String sender) {
+        this.sender = sender;
+    }
+
+    public static class RequestHandlerException extends Exception {
+
+        public RequestHandlerException(String message) {
+            super(message);
+        }
+        public RequestHandlerException(String message, Throwable cause) {
+            super(message, cause);
+        }
+        public RequestHandlerException(Throwable cause) {
+            super(cause);
+        }
+        public RequestHandlerException() {
+        }
+    }
+
+    public static class RequestHandlerErrorException extends RequestHandlerException {
+        public RequestHandlerErrorException(Throwable cause) {
+            super(cause);
+        }
+    }
+
+    public static class RequestHandlerBadRequestException extends RequestHandlerException {
+
+        public RequestHandlerBadRequestException(String message) {
+            super(message);
+        }
+        public RequestHandlerBadRequestException(String message, Throwable cause) {
+            super(message, cause);
+        }
+    }
+
+    public static class RequestHandlerForbiddenException extends RequestHandlerException {
+        private static final long serialVersionUID = 2263904699747115423L;
+
+        public RequestHandlerForbiddenException(String message) {
+            super(message);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
index c60f6ae..431dec2 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
@@ -1,63 +1,63 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol.handler;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
-
-/**
- * Handler for version request.
- */
-public class VersionHandler extends RequestHandler {
-
-    /**
-     * The remote control command name used to reply version.
-     */
-    public static final String command = "version";
-
-    @Override
-    protected void handleRequest() throws RequestHandlerErrorException,
-            RequestHandlerBadRequestException {
-        content = RequestProcessor.PROTOCOLVERSION;
-        contentType = "application/json";
-        if (args.containsKey("jsonp")) {
-            content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ")";
-        }
-    }
-
-    @Override
-    public String getPermissionMessage() {
-        return tr("Remote Control has been asked to report its protocol version. This enables web sites to detect a running JOSM.");
-    }
-
-    @Override
-    public PermissionPrefWithDefault getPermissionPref() {
-        return PermissionPrefWithDefault.READ_PROTOCOL_VERSION;
-    }
-
-    @Override
-    public String[] getMandatoryParams() {
-        return null;
-    }
-
-    @Override
-    public String[] getOptionalParams() {
-        return new String[]{"jsonp"};
-    }
-
-    @Override
-    protected void validateRequest() throws RequestHandlerBadRequestException {
-        // Nothing to do
-    }
-
-    @Override
-    public String getUsage() {
-        return "returns the current protocol version of the installed JOSM RemoteControl";
-    }
-
-    @Override
-    public String[] getUsageExamples() {
-        return new String[] { "/version", "/version?jsonp=test"};
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
+
+/**
+ * Handler for version request.
+ */
+public class VersionHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to reply version.
+     */
+    public static final String command = "version";
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException,
+            RequestHandlerBadRequestException {
+        content = RequestProcessor.PROTOCOLVERSION;
+        contentType = "application/json";
+        if (args.containsKey("jsonp")) {
+            content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ")";
+        }
+    }
+
+    @Override
+    public String getPermissionMessage() {
+        return tr("Remote Control has been asked to report its protocol version. This enables web sites to detect a running JOSM.");
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.READ_PROTOCOL_VERSION;
+    }
+
+    @Override
+    public String[] getMandatoryParams() {
+        return null;
+    }
+
+    @Override
+    public String[] getOptionalParams() {
+        return new String[]{"jsonp"};
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {
+        // Nothing to do
+    }
+
+    @Override
+    public String getUsage() {
+        return "returns the current protocol version of the installed JOSM RemoteControl";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return new String[] { "/version", "/version?jsonp=test"};
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/session/SessionImporter.java b/src/org/openstreetmap/josm/io/session/SessionImporter.java
index ee34dbf..8dc2c87 100644
--- a/src/org/openstreetmap/josm/io/session/SessionImporter.java
+++ b/src/org/openstreetmap/josm/io/session/SessionImporter.java
@@ -1,40 +1,40 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.session;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
-import org.openstreetmap.josm.actions.SessionLoadAction.Loader;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.io.FileImporter;
-import org.openstreetmap.josm.io.IllegalDataException;
-
-/**
- * File importer allowing to import session files (*.jos/joz files).
- * @since 6245
- */
-public class SessionImporter extends FileImporter {
-
-    /**
-     * The file filter used to load JOSM session files
-     */
-    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
-            "jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
-
-    /**
-     * Constructs a new {@code SessionImporter}.
-     */
-    public SessionImporter() {
-        super(FILE_FILTER);
-    }
-
-    @Override
-    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
-        boolean zip = file.getName().toLowerCase().endsWith(".joz");
-        Main.worker.submit(new Loader(file, zip));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.session;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.actions.SessionLoadAction.Loader;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.FileImporter;
+import org.openstreetmap.josm.io.IllegalDataException;
+
+/**
+ * File importer allowing to import session files (*.jos/joz files).
+ * @since 6245
+ */
+public class SessionImporter extends FileImporter {
+
+    /**
+     * The file filter used to load JOSM session files
+     */
+    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
+            "jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
+
+    /**
+     * Constructs a new {@code SessionImporter}.
+     */
+    public SessionImporter() {
+        super(FILE_FILTER);
+    }
+
+    @Override
+    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
+        boolean zip = file.getName().toLowerCase().endsWith(".joz");
+        Main.worker.submit(new Loader(file, zip));
+    }
+}
diff --git a/src/org/openstreetmap/josm/plugins/PluginHandler.java b/src/org/openstreetmap/josm/plugins/PluginHandler.java
index 6bb4c62..1a7d603 100644
--- a/src/org/openstreetmap/josm/plugins/PluginHandler.java
+++ b/src/org/openstreetmap/josm/plugins/PluginHandler.java
@@ -1083,7 +1083,6 @@ public final class PluginHandler {
                 Main.warn(tr("Failed to install already downloaded plugin ''{0}''. Skipping installation. JOSM is still going to load the old plugin version.", pluginName));
             }
         }
-        return;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/tools/ColorScale.java b/src/org/openstreetmap/josm/tools/ColorScale.java
index bc4a349..5bff226 100644
--- a/src/org/openstreetmap/josm/tools/ColorScale.java
+++ b/src/org/openstreetmap/josm/tools/ColorScale.java
@@ -1,176 +1,176 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import java.awt.Color;
-import java.awt.FontMetrics;
-import java.awt.Graphics2D;
-
-/**
- * Utility class that helps to work with color scale for coloring GPX tracks etc.
- * @since 7319
- */
-public class ColorScale {
-    private double min, max;
-    private Color noDataColor;
-    private Color belowMinColor;
-    private Color aboveMaxColor;
-
-    private Color[] colors;
-    private String title = "";
-    private int intervalCount = 5;
-
-    private ColorScale() {
-
-    }
-
-    public static ColorScale createHSBScale(int count) {
-        ColorScale sc = new ColorScale();
-        sc.colors = new Color[count];
-        for (int i = 0; i < count; i++) {
-            sc.colors[i] = Color.getHSBColor(i / 300.0f, 1, 1);
-        }
-        sc.setRange(0, 255);
-        sc.addBounds();
-        return sc;
-    }
-
-    public static ColorScale createCyclicScale(int count) {
-        ColorScale sc = new ColorScale();
-        //                    red   yellow  green   blue    red
-        int[] h = new int[] { 0,    59,     127,    244,    360};
-        int[] s = new int[] { 100,  84,     99,     100 };
-        int[] b = new int[] { 90,   93,     74,     83 };
-
-        sc.colors = new Color[count];
-        for (int i = 0; i < sc.colors.length; i++) {
-
-            float angle = 4 - i / 256f * 4;
-            int quadrant = (int) angle;
-            angle -= quadrant;
-            quadrant = Utils.mod(quadrant+1, 4);
-
-            float vh = h[quadrant] * w(angle) + h[quadrant+1] * (1 - w(angle));
-            float vs = s[quadrant] * w(angle) + s[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
-            float vb = b[quadrant] * w(angle) + b[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
-
-            sc.colors[i] = Color.getHSBColor(vh/360f, vs/100f, vb/100f);
-        }
-        sc.setRange(0, 2*Math.PI);
-        sc.addBounds();
-        return sc;
-    }
-
-    /**
-     * transition function:
-     *  w(0)=1, w(1)=0, 0<=w(x)<=1
-     * @param x number: 0<=x<=1
-     * @return the weighted value
-     */
-    private static float w(float x) {
-        if (x < 0.5)
-            return 1 - 2*x*x;
-        else
-            return 2*(1-x)*(1-x);
-    }
-
-    public void setRange(double min, double max) {
-        this.min = min;
-        this.max = max;
-    }
-
-    /**
-     * Add standard colors for values below min or above max value
-     */
-    public void addBounds() {
-        aboveMaxColor = colors[colors.length-1];
-        belowMinColor = colors[0];
-    }
-
-    public final Color getColor(double value) {
-        if (value<min) return belowMinColor;
-        if (value>max) return aboveMaxColor;
-        if (Double.isNaN(value)) return noDataColor;
-        final int n = colors.length;
-        int idx = (int) ((value-min)*colors.length / (max-min));
-        if (idx<colors.length) {
-            return colors[idx];
-        } else {
-            return colors[n-1]; // this happens when value==max
-        }
-    }
-
-    public final Color getColor(Number value) {
-        return (value==null)? noDataColor : getColor(value.doubleValue());
-    }
-
-    public Color getNoDataColor() {
-        return noDataColor;
-    }
-
-    public void setNoDataColor(Color noDataColor) {
-        this.noDataColor = noDataColor;
-    }
-
-    public ColorScale makeTransparent(int alpha) {
-        for (int i = 0; i < colors.length; i++) {
-            colors[i] = new Color((colors[i].getRGB() & 0xFFFFFF) | ((alpha & 0xFF) << 24), true);
-        }
-        return this;
-    }
-
-    public ColorScale addTitle(String title) {
-        this.title = title;
-        return this;
-    }
-
-    public ColorScale setIntervalCount(int intervalCount) {
-        this.intervalCount = intervalCount;
-        return this;
-    }
-
-    public ColorScale makeReversed() {
-        int n = colors.length;
-        Color tmp;
-        for (int i=0; i<n/2; i++) {
-            tmp = colors[i];
-            colors[i] = colors[n-1-i];
-            colors[n-1-i] = tmp;
-        }
-        tmp = belowMinColor;
-        belowMinColor = aboveMaxColor;
-        aboveMaxColor = tmp;
-        return this;
-    }
-
-    public void drawColorBar(Graphics2D g, int x, int y, int w, int h, double valueScale) {
-        int n=colors.length;
-
-        for (int i=0; i<n; i++) {
-            g.setColor(colors[i]);
-            if (w<h) {
-                g.fillRect(x, y+i*h/n, w, h/n+1);
-            } else {
-                g.fillRect(x+i*w/n, y, w/n+1, h);
-            }
-        }
-
-        int fw, fh;
-        FontMetrics fm = g.getFontMetrics();
-        fh = fm.getHeight()/2;
-        fw = fm.stringWidth(String.valueOf(Math.max((int)Math.abs(max*valueScale), (int)Math.abs(min*valueScale)))) + fm.stringWidth("0.123");
-        g.setColor(noDataColor);
-        if (title != null) {
-            g.drawString(title, x-fw-3, y-fh*3/2);
-        }
-        for (int i=0; i<=intervalCount; i++) {
-            g.setColor(colors[(int)(1.0*i*n/intervalCount-1e-10)]);
-            final double val =  min+i*(max-min)/intervalCount;
-            final String txt = String.format("%.3f", val*valueScale);
-            if (w<h) {
-                g.drawString(txt, x-fw-3, y+i*h/intervalCount+fh/2);
-            } else {
-                g.drawString(txt, x+i*w/intervalCount-fw/2, y+fh-3);
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+
+/**
+ * Utility class that helps to work with color scale for coloring GPX tracks etc.
+ * @since 7319
+ */
+public class ColorScale {
+    private double min, max;
+    private Color noDataColor;
+    private Color belowMinColor;
+    private Color aboveMaxColor;
+
+    private Color[] colors;
+    private String title = "";
+    private int intervalCount = 5;
+
+    private ColorScale() {
+
+    }
+
+    public static ColorScale createHSBScale(int count) {
+        ColorScale sc = new ColorScale();
+        sc.colors = new Color[count];
+        for (int i = 0; i < count; i++) {
+            sc.colors[i] = Color.getHSBColor(i / 300.0f, 1, 1);
+        }
+        sc.setRange(0, 255);
+        sc.addBounds();
+        return sc;
+    }
+
+    public static ColorScale createCyclicScale(int count) {
+        ColorScale sc = new ColorScale();
+        //                    red   yellow  green   blue    red
+        int[] h = new int[] { 0,    59,     127,    244,    360};
+        int[] s = new int[] { 100,  84,     99,     100 };
+        int[] b = new int[] { 90,   93,     74,     83 };
+
+        sc.colors = new Color[count];
+        for (int i = 0; i < sc.colors.length; i++) {
+
+            float angle = 4 - i / 256f * 4;
+            int quadrant = (int) angle;
+            angle -= quadrant;
+            quadrant = Utils.mod(quadrant+1, 4);
+
+            float vh = h[quadrant] * w(angle) + h[quadrant+1] * (1 - w(angle));
+            float vs = s[quadrant] * w(angle) + s[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
+            float vb = b[quadrant] * w(angle) + b[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
+
+            sc.colors[i] = Color.getHSBColor(vh/360f, vs/100f, vb/100f);
+        }
+        sc.setRange(0, 2*Math.PI);
+        sc.addBounds();
+        return sc;
+    }
+
+    /**
+     * transition function:
+     *  w(0)=1, w(1)=0, 0<=w(x)<=1
+     * @param x number: 0<=x<=1
+     * @return the weighted value
+     */
+    private static float w(float x) {
+        if (x < 0.5)
+            return 1 - 2*x*x;
+        else
+            return 2*(1-x)*(1-x);
+    }
+
+    public void setRange(double min, double max) {
+        this.min = min;
+        this.max = max;
+    }
+
+    /**
+     * Add standard colors for values below min or above max value
+     */
+    public void addBounds() {
+        aboveMaxColor = colors[colors.length-1];
+        belowMinColor = colors[0];
+    }
+
+    public final Color getColor(double value) {
+        if (value<min) return belowMinColor;
+        if (value>max) return aboveMaxColor;
+        if (Double.isNaN(value)) return noDataColor;
+        final int n = colors.length;
+        int idx = (int) ((value-min)*colors.length / (max-min));
+        if (idx<colors.length) {
+            return colors[idx];
+        } else {
+            return colors[n-1]; // this happens when value==max
+        }
+    }
+
+    public final Color getColor(Number value) {
+        return (value==null)? noDataColor : getColor(value.doubleValue());
+    }
+
+    public Color getNoDataColor() {
+        return noDataColor;
+    }
+
+    public void setNoDataColor(Color noDataColor) {
+        this.noDataColor = noDataColor;
+    }
+
+    public ColorScale makeTransparent(int alpha) {
+        for (int i = 0; i < colors.length; i++) {
+            colors[i] = new Color((colors[i].getRGB() & 0xFFFFFF) | ((alpha & 0xFF) << 24), true);
+        }
+        return this;
+    }
+
+    public ColorScale addTitle(String title) {
+        this.title = title;
+        return this;
+    }
+
+    public ColorScale setIntervalCount(int intervalCount) {
+        this.intervalCount = intervalCount;
+        return this;
+    }
+
+    public ColorScale makeReversed() {
+        int n = colors.length;
+        Color tmp;
+        for (int i=0; i<n/2; i++) {
+            tmp = colors[i];
+            colors[i] = colors[n-1-i];
+            colors[n-1-i] = tmp;
+        }
+        tmp = belowMinColor;
+        belowMinColor = aboveMaxColor;
+        aboveMaxColor = tmp;
+        return this;
+    }
+
+    public void drawColorBar(Graphics2D g, int x, int y, int w, int h, double valueScale) {
+        int n=colors.length;
+
+        for (int i=0; i<n; i++) {
+            g.setColor(colors[i]);
+            if (w<h) {
+                g.fillRect(x, y+i*h/n, w, h/n+1);
+            } else {
+                g.fillRect(x+i*w/n, y, w/n+1, h);
+            }
+        }
+
+        int fw, fh;
+        FontMetrics fm = g.getFontMetrics();
+        fh = fm.getHeight()/2;
+        fw = fm.stringWidth(String.valueOf(Math.max((int)Math.abs(max*valueScale), (int)Math.abs(min*valueScale)))) + fm.stringWidth("0.123");
+        g.setColor(noDataColor);
+        if (title != null) {
+            g.drawString(title, x-fw-3, y-fh*3/2);
+        }
+        for (int i=0; i<=intervalCount; i++) {
+            g.setColor(colors[(int)(1.0*i*n/intervalCount-1e-10)]);
+            final double val =  min+i*(max-min)/intervalCount;
+            final String txt = String.format("%.3f", val*valueScale);
+            if (w<h) {
+                g.drawString(txt, x-fw-3, y+i*h/intervalCount+fh/2);
+            } else {
+                g.drawString(txt, x+i*w/intervalCount-fw/2, y+fh-3);
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/tools/CompositeList.java b/src/org/openstreetmap/josm/tools/CompositeList.java
index baf64fe..b9e24ed 100644
--- a/src/org/openstreetmap/josm/tools/CompositeList.java
+++ b/src/org/openstreetmap/josm/tools/CompositeList.java
@@ -1,36 +1,36 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import java.util.AbstractList;
-import java.util.List;
-
-/**
- * Joined List build from two Lists (read-only).
- *
- * Extremely simple single-purpose implementation.
- * @param <T>
- * @since 7109
- */
-public class CompositeList<T> extends AbstractList<T> {
-    private List<? extends T> a,b;
-
-    /**
-     * Constructs a new {@code CompositeList} from two lists.
-     * @param a First list
-     * @param b Second list
-     */
-    public CompositeList(List<? extends T> a, List<? extends T> b) {
-        this.a = a;
-        this.b = b;
-    }
-
-    @Override
-    public T get(int index) {
-        return index < a.size() ? a.get(index) : b.get(index - a.size());
-    }
-
-    @Override
-    public int size() {
-        return a.size() + b.size();
-    }
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.util.AbstractList;
+import java.util.List;
+
+/**
+ * Joined List build from two Lists (read-only).
+ *
+ * Extremely simple single-purpose implementation.
+ * @param <T>
+ * @since 7109
+ */
+public class CompositeList<T> extends AbstractList<T> {
+    private List<? extends T> a,b;
+
+    /**
+     * Constructs a new {@code CompositeList} from two lists.
+     * @param a First list
+     * @param b Second list
+     */
+    public CompositeList(List<? extends T> a, List<? extends T> b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    @Override
+    public T get(int index) {
+        return index < a.size() ? a.get(index) : b.get(index - a.size());
+    }
+
+    @Override
+    public int size() {
+        return a.size() + b.size();
+    }
 }
\ No newline at end of file
diff --git a/src/org/openstreetmap/josm/tools/ExifReader.java b/src/org/openstreetmap/josm/tools/ExifReader.java
index 0e62677..8ddc6d3 100644
--- a/src/org/openstreetmap/josm/tools/ExifReader.java
+++ b/src/org/openstreetmap/josm/tools/ExifReader.java
@@ -20,6 +20,7 @@ import com.drew.metadata.Tag;
 import com.drew.metadata.exif.ExifIFD0Directory;
 import com.drew.metadata.exif.ExifSubIFDDirectory;
 import com.drew.metadata.exif.GpsDirectory;
+import java.awt.geom.AffineTransform;
 
 /**
  * Read out EXIF information from a JPEG file
@@ -187,4 +188,66 @@ public final class ExifReader {
         }
         return value;
     }
+
+    /**
+     * Returns a Transform that fixes the image orientation.
+     *
+     * Only orientation 1, 3, 6 and 8 are supported. Everything else is treated
+     * as 1.
+     * @param orientation the exif-orientation of the image
+     * @param width the original width of the image
+     * @param height the original height of the image
+     * @return a transform that rotates the image, so it is upright
+     */
+    public static AffineTransform getRestoreOrientationTransform(final int orientation, final int width, final int height) {
+        final int q;
+        final double ax, ay;
+        switch (orientation) {
+        case 8:
+            q = -1;
+            ax = width / 2;
+            ay = width / 2;
+            break;
+        case 3:
+            q = 2;
+            ax = width / 2;
+            ay = height / 2;
+            break;
+        case 6:
+            q = 1;
+            ax = height / 2;
+            ay = height / 2;
+            break;
+        default:
+            q = 0;
+            ax = 0;
+            ay = 0;
+        }
+        return AffineTransform.getQuadrantRotateInstance(q, ax, ay);
+    }
+
+    /**
+     * Check, if the given orientation switches width and height of the image.
+     * E.g. 90 degree rotation
+     *
+     * Only orientation 1, 3, 6 and 8 are supported. Everything else is treated
+     * as 1.
+     * @param orientation the exif-orientation of the image
+     * @return true, if it switches width and height
+     */
+    public static boolean orientationSwitchesDimensions(int orientation) {
+        return orientation == 6 || orientation == 8;
+    }
+
+    /**
+     * Check, if the given orientation requires any correction to the image.
+     *
+     * Only orientation 1, 3, 6 and 8 are supported. Everything else is treated
+     * as 1.
+     * @param orientation the exif-orientation of the image
+     * @return true, unless the orientation value is 1 or unsupported.
+     */
+    public static boolean orientationNeedsCorrection(int orientation) {
+        return orientation == 3 || orientation == 6 || orientation == 8;
+    }
 }
diff --git a/src/org/openstreetmap/josm/tools/TextTagParser.java b/src/org/openstreetmap/josm/tools/TextTagParser.java
index cf92277..48febca 100644
--- a/src/org/openstreetmap/josm/tools/TextTagParser.java
+++ b/src/org/openstreetmap/josm/tools/TextTagParser.java
@@ -1,320 +1,320 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.GridBagLayout;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.gui.widgets.UrlLabel;
-import org.openstreetmap.josm.io.XmlWriter;
-import org.openstreetmap.josm.tools.LanguageInfo.LocaleType;
-
-/**
- * Class that helps to parse tags from arbitrary text
- */
-public final class TextTagParser {
-
-    // properties need JOSM restart to apply, modified rarely enough
-    protected static final int MAX_KEY_LENGTH = Main.pref.getInteger("tags.paste.max-key-length", 50);
-    protected static final int MAX_KEY_COUNT = Main.pref.getInteger("tags.paste.max-key-count", 30);
-    protected static final String KEY_PATTERN = Main.pref.get("tags.paste.tag-pattern", "[0-9a-zA-Z:_]*");
-    protected static final int MAX_VALUE_LENGTH = 255;
-
-    private TextTagParser() {
-        // Hide default constructor for utils classes
-    }
-
-    public static class TextAnalyzer {
-        boolean quotesStarted = false;
-        boolean esc = false;
-        StringBuilder s = new StringBuilder(200);
-        int pos;
-        String data;
-        int n;
-
-        public TextAnalyzer(String text) {
-            pos = 0;
-            data = text;
-            n = data.length();
-        }
-
-        /**
-         * Read tags from "Free format"
-         */
-        Map<String, String>  getFreeParsedTags() {
-            String k, v;
-            Map<String, String> tags = new HashMap<>();
-
-            while (true) {
-                skipEmpty();
-                if (pos == n) { break; }
-                k = parseString("\n\r\t= ");
-                if (pos == n) { tags.clear();  break; }
-                skipSign();
-                if (pos == n) { tags.clear();  break; }
-                v = parseString("\n\r\t ");
-                tags.put(k, v);
-            }
-            return tags;
-        }
-
-        private String parseString(String stopChars) {
-            char[] stop = stopChars.toCharArray();
-            Arrays.sort(stop);
-            char c;
-            while (pos < n) {
-                c = data.charAt(pos);
-                if (esc) {
-                    esc = false;
-                    s.append(c); //  \" \\
-                } else if (c == '\\') {
-                    esc = true;
-                } else if (c == '\"' && !quotesStarted) { // opening "
-                    if (s.toString().trim().length()>0) { // we had   ||some text"||
-                        s.append(c); // just add ", not open
-                    } else {
-                        s.delete(0, s.length()); // forget that empty characthers and start reading "....
-                        quotesStarted = true;
-                    }
-                } else if (c == '\"' && quotesStarted) {  // closing "
-                    quotesStarted = false;
-                    pos++;
-                    break;
-                } else if (!quotesStarted && (Arrays.binarySearch(stop, c)>=0)) {
-                    // stop-symbol found
-                    pos++;
-                    break;
-                } else {
-                    // skip non-printable characters
-                    if(c>=32) s.append(c);
-                }
-                pos++;
-            }
-
-            String res = s.toString();
-            s.delete(0, s.length());
-            return res.trim();
-        }
-
-        private void skipSign() {
-            char c;
-            boolean signFound = false;
-            while (pos < n) {
-                c = data.charAt(pos);
-                if (c == '\t' || c == '\n'  || c == ' ') {
-                    pos++;
-                } else if (c== '=') {
-                    if (signFound) break; // a  =  =qwerty means "a"="=qwerty"
-                    signFound = true;
-                    pos++;
-                } else {
-                    break;
-                }
-            }
-        }
-
-        private void skipEmpty() {
-            char c;
-            while (pos < n) {
-                c = data.charAt(pos);
-                if (c == '\t' || c == '\n' || c == '\r' || c == ' ' ) {
-                    pos++;
-                } else {
-                    break;
-                }
-            }
-        }
-    }
-
-    protected static String unescape(String k) {
-        if(! (k.startsWith("\"") && k.endsWith("\"")) ) {
-            if (k.contains("=")) {
-                // '=' not in quotes will be treated as an error!
-                return null;
-            } else {
-                return k;
-            }
-        }
-        String text = k.substring(1,k.length()-1);
-        return (new TextAnalyzer(text)).parseString("\r\t\n");
-    }
-
-    /**
-     * Try to find tag-value pairs in given text
-     * @param text - text in which tags are looked for
-     * @param splitRegex - text is splitted into parts with this delimiter
-     * @param tagRegex - each part is matched against this regex
-     * @param unescapeTextInQuotes - if true, matched tag and value will be analyzed more thoroughly
-     */
-    public static Map<String, String> readTagsByRegexp(String text, String splitRegex, String tagRegex, boolean unescapeTextInQuotes) {
-         String[] lines = text.split(splitRegex);
-         Pattern p = Pattern.compile(tagRegex);
-         Map<String, String> tags = new HashMap<>();
-         String k=null, v=null;
-         for (String  line: lines) {
-            if (line.trim().isEmpty()) continue; // skip empty lines
-            Matcher m = p.matcher(line);
-            if (m.matches()) {
-                 k=m.group(1).trim(); v=m.group(2).trim();
-                 if (unescapeTextInQuotes) {
-                     k = unescape(k);
-                     v = unescape(v);
-                     if (k==null || v==null) return null;
-                 }
-                 tags.put(k,v);
-            } else {
-                return null;
-            }
-         }
-         if (!tags.isEmpty()) {
-            return tags;
-         }  else {
-            return null;
-         }
-    }
-
-    public static Map<String,String> getValidatedTagsFromText(String buf) {
-        Map<String,String> tags = readTagsFromText(buf);
-        return validateTags(tags) ? tags : null;
-    }
-
-    /**
-     * Apply different methods to extract tag-value pairs from arbitrary text
-     * @param buf
-     * @return null if no format is suitable
-     */
-
-    public static Map<String,String> readTagsFromText(String buf) {
-        Map<String,String> tags;
-
-        // Format
-        // tag1\tval1\ntag2\tval2\n
-        tags = readTagsByRegexp(buf, "[\\r\\n]+", ".*([a-zA-Z0-9:_]+).*\\t(.*?)", false);
-                // try "tag\tvalue\n" format
-        if (tags!=null) return tags;
-
-        // Format
-        // a=b \n c=d \n "a b"=hello
-        // SORRY: "a=b" = c is not supported fror now, only first = will be considered
-        // a = "b=c" is OK
-        // a = b=c  - this method of parsing fails intentionally
-        tags = readTagsByRegexp(buf, "[\\n\\t\\r]+", "(.*?)=(.*?)", true);
-                // try format  t1=v1\n t2=v2\n ...
-        if (tags!=null) return tags;
-
-        // JSON-format
-        String bufJson = buf.trim();
-        // trim { }, if there are any
-        if (bufJson.startsWith("{") && bufJson.endsWith("}") ) bufJson = bufJson.substring(1,bufJson.length()-1);
-        tags = readTagsByRegexp(bufJson, "[\\s]*,[\\s]*",
-                "[\\s]*(\\\".*?[^\\\\]\\\")"+"[\\s]*:[\\s]*"+"(\\\".*?[^\\\\]\\\")[\\s]*", true);
-        if (tags!=null) return tags;
-
-        // Free format
-        // a 1 "b" 2 c=3 d 4 e "5"
-        TextAnalyzer parser = new TextAnalyzer(buf);
-        tags = parser.getFreeParsedTags();
-        return tags;
-    }
-
-    /**
-     * Check tags for correctness and display warnings if needed
-     * @param tags - map key->value to check
-     * @return true if the tags should be pasted
-     */
-    public static boolean validateTags(Map<String, String> tags) {
-        int r;
-        int s = tags.size();
-        if (s > MAX_KEY_COUNT) {
-            // Use trn() even if for english it makes no sense, as s > 30
-            r=warning(trn("There was {0} tag found in the buffer, it is suspicious!",
-            "There were {0} tags found in the buffer, it is suspicious!", s,
-            s), "", "tags.paste.toomanytags");
-            if (r==2 || r==3) return false; if (r==4) return true;
-        }
-        for (Entry<String, String> entry : tags.entrySet()) {
-            String key = entry.getKey();
-            String value = entry.getValue();
-            if (key.length() > MAX_KEY_LENGTH) {
-                r = warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+"="+value, "tags.paste.keytoolong");
-                if (r==2 || r==3) return false; if (r==4) return true;
-            }
-            if (!key.matches(KEY_PATTERN)) {
-                r = warning(tr("Suspicious characters in key:"), key, "tags.paste.keydoesnotmatch");
-                if (r==2 || r==3) return false; if (r==4) return true;
-            }
-            if (value.length() > MAX_VALUE_LENGTH) {
-                r = warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "tags.paste.valuetoolong");
-                if (r==2 || r==3) return false; if (r==4) return true;
-            }
-        }
-        return true;
-    }
-
-    private static int warning(String text, String data, String code) {
-        ExtendedDialog ed = new ExtendedDialog(
-                    Main.parent,
-                    tr("Do you want to paste these tags?"),
-                    new String[]{tr("Ok"), tr("Cancel"), tr("Clear buffer"), tr("Ignore warnings")});
-        ed.setButtonIcons(new String[]{"ok.png", "cancel.png", "dialogs/delete.png", "pastetags.png"});
-        ed.setContent("<html><b>"+text + "</b><br/><br/><div width=\"300px\">"+XmlWriter.encode(data,true)+"</html>");
-        ed.setDefaultButton(2);
-        ed.setCancelButton(2);
-        ed.setIcon(JOptionPane.WARNING_MESSAGE);
-        ed.toggleEnable(code);
-        ed.showDialog();
-        int r = ed.getValue();
-        if (r==0) r = 2;
-        // clean clipboard if user asked
-        if (r==3) Utils.copyToClipboard("");
-        return r;
-    }
-
-    /**
-     * Shows message that the buffer can not be pasted, allowing user to clean the buffer
-     * @param helpTopic the help topic of the parent action
-     * TODO: Replace by proper HelpAwareOptionPane instead of self-made help link
-     */
-    public static void showBadBufferMessage(String helpTopic) {
-        String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object"
-            + " or suitable text. </p></html>");
-        JPanel p = new JPanel(new GridBagLayout());
-        p.add(new JLabel(msg),GBC.eop());
-        String helpUrl = HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic(helpTopic, LocaleType.DEFAULT));
-        if (helpUrl != null) {
-            p.add(new UrlLabel(helpUrl), GBC.eop());
-        }
-
-        ExtendedDialog ed = new ExtendedDialog(
-                    Main.parent,
-                    tr("Warning"),
-                    new String[]{tr("Ok"), tr("Clear buffer")});
-
-        ed.setButtonIcons(new String[]{"ok.png", "dialogs/delete.png"});
-
-        ed.setContent(p);
-        ed.setDefaultButton(1);
-        ed.setCancelButton(1);
-        ed.setIcon(JOptionPane.WARNING_MESSAGE);
-        ed.toggleEnable("tags.paste.cleanbadbuffer");
-        ed.showDialog();
-
-        int r = ed.getValue();
-        // clean clipboard if user asked
-        if (r==2) Utils.copyToClipboard("");
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.GridBagLayout;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.io.XmlWriter;
+import org.openstreetmap.josm.tools.LanguageInfo.LocaleType;
+
+/**
+ * Class that helps to parse tags from arbitrary text
+ */
+public final class TextTagParser {
+
+    // properties need JOSM restart to apply, modified rarely enough
+    protected static final int MAX_KEY_LENGTH = Main.pref.getInteger("tags.paste.max-key-length", 50);
+    protected static final int MAX_KEY_COUNT = Main.pref.getInteger("tags.paste.max-key-count", 30);
+    protected static final String KEY_PATTERN = Main.pref.get("tags.paste.tag-pattern", "[0-9a-zA-Z:_]*");
+    protected static final int MAX_VALUE_LENGTH = 255;
+
+    private TextTagParser() {
+        // Hide default constructor for utils classes
+    }
+
+    public static class TextAnalyzer {
+        boolean quotesStarted = false;
+        boolean esc = false;
+        StringBuilder s = new StringBuilder(200);
+        int pos;
+        String data;
+        int n;
+
+        public TextAnalyzer(String text) {
+            pos = 0;
+            data = text;
+            n = data.length();
+        }
+
+        /**
+         * Read tags from "Free format"
+         */
+        Map<String, String>  getFreeParsedTags() {
+            String k, v;
+            Map<String, String> tags = new HashMap<>();
+
+            while (true) {
+                skipEmpty();
+                if (pos == n) { break; }
+                k = parseString("\n\r\t= ");
+                if (pos == n) { tags.clear();  break; }
+                skipSign();
+                if (pos == n) { tags.clear();  break; }
+                v = parseString("\n\r\t ");
+                tags.put(k, v);
+            }
+            return tags;
+        }
+
+        private String parseString(String stopChars) {
+            char[] stop = stopChars.toCharArray();
+            Arrays.sort(stop);
+            char c;
+            while (pos < n) {
+                c = data.charAt(pos);
+                if (esc) {
+                    esc = false;
+                    s.append(c); //  \" \\
+                } else if (c == '\\') {
+                    esc = true;
+                } else if (c == '\"' && !quotesStarted) { // opening "
+                    if (s.toString().trim().length()>0) { // we had   ||some text"||
+                        s.append(c); // just add ", not open
+                    } else {
+                        s.delete(0, s.length()); // forget that empty characthers and start reading "....
+                        quotesStarted = true;
+                    }
+                } else if (c == '\"' && quotesStarted) {  // closing "
+                    quotesStarted = false;
+                    pos++;
+                    break;
+                } else if (!quotesStarted && (Arrays.binarySearch(stop, c)>=0)) {
+                    // stop-symbol found
+                    pos++;
+                    break;
+                } else {
+                    // skip non-printable characters
+                    if(c>=32) s.append(c);
+                }
+                pos++;
+            }
+
+            String res = s.toString();
+            s.delete(0, s.length());
+            return res.trim();
+        }
+
+        private void skipSign() {
+            char c;
+            boolean signFound = false;
+            while (pos < n) {
+                c = data.charAt(pos);
+                if (c == '\t' || c == '\n'  || c == ' ') {
+                    pos++;
+                } else if (c== '=') {
+                    if (signFound) break; // a  =  =qwerty means "a"="=qwerty"
+                    signFound = true;
+                    pos++;
+                } else {
+                    break;
+                }
+            }
+        }
+
+        private void skipEmpty() {
+            char c;
+            while (pos < n) {
+                c = data.charAt(pos);
+                if (c == '\t' || c == '\n' || c == '\r' || c == ' ' ) {
+                    pos++;
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    protected static String unescape(String k) {
+        if(! (k.startsWith("\"") && k.endsWith("\"")) ) {
+            if (k.contains("=")) {
+                // '=' not in quotes will be treated as an error!
+                return null;
+            } else {
+                return k;
+            }
+        }
+        String text = k.substring(1,k.length()-1);
+        return (new TextAnalyzer(text)).parseString("\r\t\n");
+    }
+
+    /**
+     * Try to find tag-value pairs in given text
+     * @param text - text in which tags are looked for
+     * @param splitRegex - text is splitted into parts with this delimiter
+     * @param tagRegex - each part is matched against this regex
+     * @param unescapeTextInQuotes - if true, matched tag and value will be analyzed more thoroughly
+     */
+    public static Map<String, String> readTagsByRegexp(String text, String splitRegex, String tagRegex, boolean unescapeTextInQuotes) {
+         String[] lines = text.split(splitRegex);
+         Pattern p = Pattern.compile(tagRegex);
+         Map<String, String> tags = new HashMap<>();
+         String k=null, v=null;
+         for (String  line: lines) {
+            if (line.trim().isEmpty()) continue; // skip empty lines
+            Matcher m = p.matcher(line);
+            if (m.matches()) {
+                 k=m.group(1).trim(); v=m.group(2).trim();
+                 if (unescapeTextInQuotes) {
+                     k = unescape(k);
+                     v = unescape(v);
+                     if (k==null || v==null) return null;
+                 }
+                 tags.put(k,v);
+            } else {
+                return null;
+            }
+         }
+         if (!tags.isEmpty()) {
+            return tags;
+         }  else {
+            return null;
+         }
+    }
+
+    public static Map<String,String> getValidatedTagsFromText(String buf) {
+        Map<String,String> tags = readTagsFromText(buf);
+        return validateTags(tags) ? tags : null;
+    }
+
+    /**
+     * Apply different methods to extract tag-value pairs from arbitrary text
+     * @param buf
+     * @return null if no format is suitable
+     */
+
+    public static Map<String,String> readTagsFromText(String buf) {
+        Map<String,String> tags;
+
+        // Format
+        // tag1\tval1\ntag2\tval2\n
+        tags = readTagsByRegexp(buf, "[\\r\\n]+", ".*([a-zA-Z0-9:_]+).*\\t(.*?)", false);
+                // try "tag\tvalue\n" format
+        if (tags!=null) return tags;
+
+        // Format
+        // a=b \n c=d \n "a b"=hello
+        // SORRY: "a=b" = c is not supported fror now, only first = will be considered
+        // a = "b=c" is OK
+        // a = b=c  - this method of parsing fails intentionally
+        tags = readTagsByRegexp(buf, "[\\n\\t\\r]+", "(.*?)=(.*?)", true);
+                // try format  t1=v1\n t2=v2\n ...
+        if (tags!=null) return tags;
+
+        // JSON-format
+        String bufJson = buf.trim();
+        // trim { }, if there are any
+        if (bufJson.startsWith("{") && bufJson.endsWith("}") ) bufJson = bufJson.substring(1,bufJson.length()-1);
+        tags = readTagsByRegexp(bufJson, "[\\s]*,[\\s]*",
+                "[\\s]*(\\\".*?[^\\\\]\\\")"+"[\\s]*:[\\s]*"+"(\\\".*?[^\\\\]\\\")[\\s]*", true);
+        if (tags!=null) return tags;
+
+        // Free format
+        // a 1 "b" 2 c=3 d 4 e "5"
+        TextAnalyzer parser = new TextAnalyzer(buf);
+        tags = parser.getFreeParsedTags();
+        return tags;
+    }
+
+    /**
+     * Check tags for correctness and display warnings if needed
+     * @param tags - map key->value to check
+     * @return true if the tags should be pasted
+     */
+    public static boolean validateTags(Map<String, String> tags) {
+        int r;
+        int s = tags.size();
+        if (s > MAX_KEY_COUNT) {
+            // Use trn() even if for english it makes no sense, as s > 30
+            r=warning(trn("There was {0} tag found in the buffer, it is suspicious!",
+            "There were {0} tags found in the buffer, it is suspicious!", s,
+            s), "", "tags.paste.toomanytags");
+            if (r==2 || r==3) return false; if (r==4) return true;
+        }
+        for (Entry<String, String> entry : tags.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            if (key.length() > MAX_KEY_LENGTH) {
+                r = warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+"="+value, "tags.paste.keytoolong");
+                if (r==2 || r==3) return false; if (r==4) return true;
+            }
+            if (!key.matches(KEY_PATTERN)) {
+                r = warning(tr("Suspicious characters in key:"), key, "tags.paste.keydoesnotmatch");
+                if (r==2 || r==3) return false; if (r==4) return true;
+            }
+            if (value.length() > MAX_VALUE_LENGTH) {
+                r = warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "tags.paste.valuetoolong");
+                if (r==2 || r==3) return false; if (r==4) return true;
+            }
+        }
+        return true;
+    }
+
+    private static int warning(String text, String data, String code) {
+        ExtendedDialog ed = new ExtendedDialog(
+                    Main.parent,
+                    tr("Do you want to paste these tags?"),
+                    new String[]{tr("Ok"), tr("Cancel"), tr("Clear buffer"), tr("Ignore warnings")});
+        ed.setButtonIcons(new String[]{"ok.png", "cancel.png", "dialogs/delete.png", "pastetags.png"});
+        ed.setContent("<html><b>"+text + "</b><br/><br/><div width=\"300px\">"+XmlWriter.encode(data,true)+"</html>");
+        ed.setDefaultButton(2);
+        ed.setCancelButton(2);
+        ed.setIcon(JOptionPane.WARNING_MESSAGE);
+        ed.toggleEnable(code);
+        ed.showDialog();
+        int r = ed.getValue();
+        if (r==0) r = 2;
+        // clean clipboard if user asked
+        if (r==3) Utils.copyToClipboard("");
+        return r;
+    }
+
+    /**
+     * Shows message that the buffer can not be pasted, allowing user to clean the buffer
+     * @param helpTopic the help topic of the parent action
+     * TODO: Replace by proper HelpAwareOptionPane instead of self-made help link
+     */
+    public static void showBadBufferMessage(String helpTopic) {
+        String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object"
+            + " or suitable text. </p></html>");
+        JPanel p = new JPanel(new GridBagLayout());
+        p.add(new JLabel(msg),GBC.eop());
+        String helpUrl = HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic(helpTopic, LocaleType.DEFAULT));
+        if (helpUrl != null) {
+            p.add(new UrlLabel(helpUrl), GBC.eop());
+        }
+
+        ExtendedDialog ed = new ExtendedDialog(
+                    Main.parent,
+                    tr("Warning"),
+                    new String[]{tr("Ok"), tr("Clear buffer")});
+
+        ed.setButtonIcons(new String[]{"ok.png", "dialogs/delete.png"});
+
+        ed.setContent(p);
+        ed.setDefaultButton(1);
+        ed.setCancelButton(1);
+        ed.setIcon(JOptionPane.WARNING_MESSAGE);
+        ed.toggleEnable("tags.paste.cleanbadbuffer");
+        ed.showDialog();
+
+        int r = ed.getValue();
+        // clean clipboard if user asked
+        if (r==2) Utils.copyToClipboard("");
+    }
+}
diff --git a/src/org/openstreetmap/josm/tools/XmlParsingException.java b/src/org/openstreetmap/josm/tools/XmlParsingException.java
index c90beaa..b2d8ae1 100644
--- a/src/org/openstreetmap/josm/tools/XmlParsingException.java
+++ b/src/org/openstreetmap/josm/tools/XmlParsingException.java
@@ -1,82 +1,82 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-/**
- * An exception thrown during XML parsing, with known line and column.
- * @since 6906
- */
-public class XmlParsingException extends SAXException {
-    private int columnNumber;
-    private int lineNumber;
-
-    /**
-     * Constructs a new {@code XmlParsingException}.
-     * @param e The cause
-     */
-    public XmlParsingException(Exception e) {
-        super(e);
-    }
-
-    /**
-     * Constructs a new {@code XmlParsingException}.
-     * @param message The error message
-     * @param e The cause
-     */
-    public XmlParsingException(String message, Exception e) {
-        super(message, e);
-    }
-
-    /**
-     * Constructs a new {@code XmlParsingException}.
-     * @param message The error message
-     */
-    public XmlParsingException(String message) {
-        super(message);
-    }
-
-    /**
-     * Sets the location (line/column) where the exception occured.
-     * @param locator object giving the location (line/column) where the exception occured
-     * @return {@code this}
-     */
-    public XmlParsingException rememberLocation(Locator locator) {
-        if (locator != null) {
-            this.columnNumber = locator.getColumnNumber();
-            this.lineNumber = locator.getLineNumber();
-        }
-        return this;
-    }
-
-    @Override
-    public String getMessage() {
-        String msg = super.getMessage();
-        if (lineNumber == 0 && columnNumber == 0)
-            return msg;
-        if (msg == null) {
-            msg = getClass().getName();
-        }
-        msg = msg + " " + tr("(at line {0}, column {1})", lineNumber, columnNumber);
-        return msg;
-    }
-
-    /**
-     * Returns the column number where the exception occured.
-     * @return the column number where the exception occured
-     */
-    public int getColumnNumber() {
-        return columnNumber;
-    }
-
-    /**
-     * Returns the line number where the exception occured.
-     * @return the line number where the exception occured
-     */
-    public int getLineNumber() {
-        return lineNumber;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ * An exception thrown during XML parsing, with known line and column.
+ * @since 6906
+ */
+public class XmlParsingException extends SAXException {
+    private int columnNumber;
+    private int lineNumber;
+
+    /**
+     * Constructs a new {@code XmlParsingException}.
+     * @param e The cause
+     */
+    public XmlParsingException(Exception e) {
+        super(e);
+    }
+
+    /**
+     * Constructs a new {@code XmlParsingException}.
+     * @param message The error message
+     * @param e The cause
+     */
+    public XmlParsingException(String message, Exception e) {
+        super(message, e);
+    }
+
+    /**
+     * Constructs a new {@code XmlParsingException}.
+     * @param message The error message
+     */
+    public XmlParsingException(String message) {
+        super(message);
+    }
+
+    /**
+     * Sets the location (line/column) where the exception occured.
+     * @param locator object giving the location (line/column) where the exception occured
+     * @return {@code this}
+     */
+    public XmlParsingException rememberLocation(Locator locator) {
+        if (locator != null) {
+            this.columnNumber = locator.getColumnNumber();
+            this.lineNumber = locator.getLineNumber();
+        }
+        return this;
+    }
+
+    @Override
+    public String getMessage() {
+        String msg = super.getMessage();
+        if (lineNumber == 0 && columnNumber == 0)
+            return msg;
+        if (msg == null) {
+            msg = getClass().getName();
+        }
+        msg = msg + " " + tr("(at line {0}, column {1})", lineNumber, columnNumber);
+        return msg;
+    }
+
+    /**
+     * Returns the column number where the exception occured.
+     * @return the column number where the exception occured
+     */
+    public int getColumnNumber() {
+        return columnNumber;
+    }
+
+    /**
+     * Returns the line number where the exception occured.
+     * @return the line number where the exception occured
+     */
+    public int getLineNumber() {
+        return lineNumber;
+    }
+}
diff --git a/src/org/openstreetmap/josm/tools/date/package-info.java b/src/org/openstreetmap/josm/tools/date/package-info.java
index 09677e8..01c9448 100644
--- a/src/org/openstreetmap/josm/tools/date/package-info.java
+++ b/src/org/openstreetmap/josm/tools/date/package-info.java
@@ -1,6 +1,6 @@
-// License: GPL. For details, see LICENSE file.
-
-/**
- * Provides classes for handling dates.
- */
-package org.openstreetmap.josm.tools.date;
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling dates.
+ */
+package org.openstreetmap.josm.tools.date;
diff --git a/styles/standard/elemstyles.mapcss b/styles/standard/elemstyles.mapcss
index 3f0f334..9064c51 100644
--- a/styles/standard/elemstyles.mapcss
+++ b/styles/standard/elemstyles.mapcss
@@ -503,6 +503,11 @@ way[highway=unclassified] {
     width: 2;
     color: street#c0c0c0;
 }
+way[highway=escape] {
+    width: 3;
+    color: street#c0c0c0;
+    dashes: 3,3;
+}
 way[highway=road] {
     width: 2;
     casing-width: 0.5;
@@ -660,7 +665,7 @@ node[highway=traffic_signals] {
     set icon_z17;
     text: auto;
 }
-node[highway=traffic_signals][crossing] {
+node[highway=traffic_signals][crossing][crossing!=no] {
     icon-image: "vehicle/traffic_signals_crossing.svg";
     set icon_z17;
     text: auto;
@@ -1071,9 +1076,6 @@ node[piste:difficulty=novice] {
 /* power tags */
 /**************/
 
-area[power=tower] {
-    fill-color: power#eeeeee;
-}
 node[power=tower] {
     icon-image: "misc/landmark/power/tower_small.png";
     set icon_z17;
@@ -1094,6 +1096,8 @@ way[power=cable] {
     color: power#eeeeee;
     dashes: 9,9;
 }
+node[power=plant],
+node[power=sub_station],
 node[power=line],
 node[power=cable],
 node[power=minor_line] {
@@ -1102,23 +1106,27 @@ node[power=minor_line] {
     text: auto;
 }
 area[power=plant],
-area[power=sub_station],
 area[power=substation],
 area[power=transformer],
+area[power=compensator],
+area[power=converter],
 area[power=generator] {
     fill-color: power#eeeeee;
 }
-node[power=plant],
-node[power=sub_station],
-node[power=substation],
 node[power=cable_distribution_cabinet],
 node[power=generator] {
     icon-image: "misc/landmark/power.png";
     set icon_z17;
     text: auto;
 }
+node[power=substation] {
+    icon-image: "icons/power_substation.n.16.png";
+    set icon_z17;
+    text: auto;
+}
 node[power=transformer] {
     icon-image: "misc/landmark/power/transformer.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -1210,15 +1218,14 @@ node[power_source] {
 
 area[man_made=beacon],
 area[man_made=bridge],
+area[bridge:support],
 area[man_made=chimney],
 area[man_made=crane],
-area[man_made=flagpole],
 area[man_made=gasometer],
 area[man_made=bunker_silo],
 area[man_made=lighthouse],
 area[man_made=monitoring_station],
-area[man_made=mineshaft],
-area[man_made=adit] {
+area[man_made=mineshaft] {
     fill-color: manmade#d8d8d8;
 }
 node[man_made=beacon] {
@@ -1226,6 +1233,16 @@ node[man_made=beacon] {
     set icon_z17;
     text: auto;
 }
+node[man_made=bridge] {
+    icon-image: "misc/deprecated.png";
+    set icon_z17;
+    text: auto;
+}
+node[bridge:support] {
+    icon-image: "transport/bridge/support.svg";
+    set icon_z17;
+    text: auto;
+}
 node[man_made=chimney] {
     icon-image: "misc/landmark/chimney.png";
     set icon_z17;
@@ -1242,7 +1259,8 @@ node[man_made=flagpole] {
     text: auto;
 }
 node[man_made=gasometer] {
-    icon-image: "misc/landmark/gasometer.png";
+    icon-image: "presets/gasometer.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -1265,11 +1283,6 @@ way[man_made=breakwater] {
     width: 2;
     color: manmade#d8d8d8;
 }
-node[man_made=groyne] {
-    icon-image: "nautical/groyne.png";
-    set icon_z17;
-    text: auto;
-}
 node[man_made=lighthouse] {
     icon-image: "misc/landmark/lighthouse.png";
     set icon_z17;
@@ -1321,6 +1334,9 @@ way[man_made=pipeline] {
     width: 2;
     color: pipeline#660000;
 }
+node[man_made=breakwater],
+node[man_made=groyne],
+node[man_made=embankment],
 node[man_made=pipeline] {
     icon-image: "misc/deprecated.png";
     set icon_z17;
@@ -1333,7 +1349,6 @@ node[man_made=petroleum_well] {
 }
 area[man_made=reservoir_covered],
 area[man_made=surveillance],
-area[man_made=survey_point],
 area[man_made=tower],
 area[man_made=wastewater_plant],
 area[man_made=watermill],
@@ -1350,7 +1365,8 @@ node[man_made=reservoir_covered] {
     text: auto;
 }
 node[man_made=surveillance] {
-    icon-image: "misc/surveillance.png";
+    icon-image: "presets/surveillance.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -1428,6 +1444,7 @@ area[leisure=golf_course],
 area[leisure=stadium],
 area[leisure=track][!area?!]:closed,
 area[leisure=pitch],
+area[leisure=horse_riding],
 area[leisure=water_park] {
     fill-color: leisure#c7f1a3;
 }
@@ -1460,6 +1477,12 @@ node[leisure=pitch] {
     set icon_z17;
     text: auto;
 }
+node[leisure=horse_riding] {
+    icon-image: "presets/equestrian.png";
+    icon-width: 16;
+    set icon_z17;
+    text: auto;
+}
 node[leisure=water_park] {
     icon-image: "leisure/water_park.png";
     set icon_z17;
@@ -1473,7 +1496,15 @@ node[leisure=marina] {
     set icon_z17;
     text: auto;
 }
-area[leisure=slipway],
+way[leisure=slipway] {
+    width: 2;
+    color: leisure#c7f1a3;
+}
+node[leisure=slipway] {
+    icon-image: "nautical/slipway.png";
+    set icon_z17;
+    text: auto;
+}
 area[leisure=fishing],
 area[leisure=nature_reserve],
 area[leisure=park],
@@ -1483,11 +1514,6 @@ area[leisure=common],
 area[leisure=firepit] {
     fill-color: leisure#c7f1a3;
 }
-node[leisure=slipway] {
-    icon-image: "nautical/slipway.png";
-    set icon_z17;
-    text: auto;
-}
 node[leisure=fishing] {
     icon-image: "sport/fishing.png";
     set icon_z17;
@@ -1548,7 +1574,8 @@ node[leisure=miniature_golf] {
     text: auto;
 }
 node[leisure=dog_park] {
-    icon-image: "leisure/dog.png";
+    icon-image: "presets/dogpark.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -1701,7 +1728,7 @@ node[shop=laundry] {
     text: auto;
 }
 node[shop=outdoor] {
-    icon-image: "shop/sports/outdoor.png";
+    icon-image: "shop/outdoor.png";
     set icon_z17;
     text: auto;
 }
@@ -1710,14 +1737,18 @@ node[shop=kiosk] {
     set icon_z17;
     text: auto;
 }
-node[shop=alcohol],
 node[shop=beverages] {
     icon-image: "shop/beverages.png";
     set icon_z17;
     text: auto;
 }
+node[shop=alcohol] {
+    icon-image: "shop/alcohol.png";
+    set icon_z17;
+    text: auto;
+}
 node[shop=books] {
-    icon-image: "shop/rental/library.png";
+    icon-image: "shop/book.svg";
     set icon_z17;
     text: auto;
 }
@@ -1928,7 +1959,8 @@ node[shop=tailor] {
     text: auto;
 }
 node[shop=travel_agency] {
-    icon-image: "place/island.png";
+    icon-image: "presets/travel.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -2082,12 +2114,12 @@ node[amenity=biergarten] {
     text: auto;
 }
 node[amenity=nightclub] {
-    icon-image: "leisure/nightclub.png";
+    icon-image: "leisure/discoball.svg";
     set icon_z17;
     text: auto;
 }
 node[amenity=stripclub] {
-    icon-image: "leisure/stripclub.png";
+    icon-image: "leisure/nightclub.png";
     set icon_z17;
     text: auto;
 }
@@ -2127,12 +2159,12 @@ area[amenity=parking],
 area[amenity=motorcycle_parking],
 area[amenity=bicycle_parking],
 area[amenity=bicycle_rental],
+area[amenity=bicycle_repair_station],
 area[amenity=car_rental],
 area[amenity=car_sharing],
 area[amenity=car_wash],
 area[amenity=taxi],
-area[amenity=fuel],
-area[amenity=charging_station] {
+area[amenity=fuel] {
     fill-color: amenity_traffic#f7efb7;
 }
 node[amenity=parking_space] {
@@ -2187,6 +2219,11 @@ node[amenity=bicycle_rental] {
     set icon_z17;
     text: auto;
 }
+node[amenity=bicycle_repair_station] {
+    icon-image: "vehicle/bicycle_repair_station.svg";
+    set icon_z17;
+    text: auto;
+}
 node[amenity=car_rental] {
     icon-image: "vehicle/rental/car.png";
     set icon_z17;
@@ -2222,9 +2259,6 @@ node[amenity=grit_bin] {
     set icon_z17;
     text: auto;
 }
-area[amenity=telephone] {
-    fill-color: amenity_light#f7efb7;
-}
 node[amenity=telephone] {
     icon-image: "service/telephone.png";
     set icon_z17;
@@ -2235,9 +2269,7 @@ node[amenity=clock] {
     set icon_z17;
     text: auto;
 }
-area[emergency=phone],
 area[emergency=aed],
-area[emergency=defibrillator],
 area[amenity=toilets],
 area[amenity=shower],
 area[amenity=recycling] {
@@ -2289,12 +2321,16 @@ area[amenity=embassy],
 area[amenity=community_centre] {
     fill-color: amenity_light#f7efb7;
 }
-node[amenity=public_building],
-node[amenity=townhall] {
+node[amenity=public_building] {
     icon-image: "service.png";
     set icon_z17;
     text: auto;
 }
+node[amenity=townhall] {
+    icon-image: "presets/townhall.png";
+    set icon_z17;
+    text: auto;
+}
 node[amenity=embassy] {
     icon-image: "service/administration/embassy.png";
     set icon_z17;
@@ -2305,7 +2341,6 @@ node[amenity=community_centre] {
     set icon_z17;
     text: auto;
 }
-area[amenity=drinking_water],
 area[amenity=water_point],
 area[amenity=fountain] {
     fill-color: light_water#00005f;
@@ -2329,7 +2364,6 @@ area[amenity=place_of_worship],
 area[amenity=grave_yard],
 area[amenity=crematorium],
 area[amenity=post_office],
-area[amenity=post_box],
 area[amenity=studio],
 area[amenity=school],
 area[amenity=university],
@@ -2461,6 +2495,8 @@ node[amenity=driving_school] {
 area[amenity=pharmacy],
 area[amenity=hospital],
 area[amenity=clinic],
+area[amenity=nursing_home],
+area[amenity=social_facility],
 area[amenity=nursery],
 area[amenity=baby_hatch],
 area[amenity=doctors],
@@ -2479,6 +2515,8 @@ node[amenity=clinic] {
     set icon_z17;
     text: auto;
 }
+node[amenity=nursing_home],
+node[amenity=social_facility],
 node[amenity=nursery] {
     icon-image: "misc/no_icon.png";
     set icon_z17;
@@ -2516,12 +2554,11 @@ area[amenity=courthouse],
 area[amenity=prison],
 area[amenity=bank],
 area[amenity=bureau_de_change],
-area[amenity=atm],
 area[amenity=bbq] {
     fill-color: amenity_light#f7efb7;
 }
 node[amenity=library] {
-    icon-image: "shop/rental/library.png";
+    icon-image: "shop/library.png";
     set icon_z17;
     text: auto;
 }
@@ -2547,7 +2584,8 @@ node[amenity=ferry_terminal] {
     text: auto;
 }
 node[amenity=theatre] {
-    icon-image: "leisure/theater.png";
+    icon-image: "presets/theater.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -2606,10 +2644,8 @@ node[emergency=fire_hydrant] {
     text: auto;
 }
 area[amenity=shelter],
-area[amenity=hunting_stand],
 area[amenity=marketplace],
-area[amenity=wlan],
-area[amenity=vending_machine] {
+area[amenity=wlan] {
     fill-color: amenity_light#f7efb7;
 }
 node[amenity=shelter] {
@@ -2632,6 +2668,11 @@ node[amenity=shelter][shelter_type=basic_hut] {
     set icon_z17;
     text: auto;
 }
+node[amenity=shelter][shelter_type=lean_to] {
+    icon-image: "accommodation/shelter_lean_to.svg";
+    set icon_z17;
+    text: auto;
+}
 node[amenity=hunting_stand] {
     icon-image: "hunting_stand.png";
     set icon_z17;
@@ -2854,14 +2895,14 @@ area[historic=memorial],
 area[historic=archaeological_site],
 area[historic=ruins],
 area[historic=battlefield],
-area[historic=palaeontological_site],
+area[geological=palaeontological_site],
 area[historic=wayside_cross],
 area[historic=wayside_shrine],
 area[historic=boundary_stone] {
     fill-color: historic#663300;
 }
 node[historic=castle] {
-    icon-image: "sightseeing/castle.png";
+    icon-image: "sightseeing/castle.svg";
     set icon_z17;
     text: auto;
 }
@@ -2890,7 +2931,7 @@ node[historic=battlefield] {
     set icon_z17;
     text: auto;
 }
-node[historic=palaeontological_site] {
+node[geological=palaeontological_site] {
     icon-image: "historic/palaeontological_site.png";
     set icon_z17;
     text: auto;
@@ -3118,9 +3159,9 @@ node[public_transport=platform][train=yes] {
 /* railway tags */
 /****************/
 
-area[railway=station], area[railway=tram_station],
-area[railway=subway_entrance],
-area[railway=crossing], area[railway=level_crossing] {
+area[railway=station],
+area[railway=tram_station],
+area[railway=subway_entrance] {
     fill-color: railwaypoint#f7efb7;
 }
 node[railway=station], node[railway=tram_station] {
@@ -3144,12 +3185,13 @@ node[railway=subway_entrance] {
     text: auto;
 }
 node[railway=crossing] {
-    icon-image: "vehicle/crossing_small.png";
+    icon-image: "vehicle/crossing.png";
     set icon_z17;
     text: auto;
 }
 node[railway=level_crossing] {
-    icon-image: "vehicle/crossing.png";
+    icon-image: "presets/level_crossing.png";
+    icon-width: 16;
     set icon_z17;
     text: auto;
 }
@@ -3215,8 +3257,7 @@ way[railway=monorail] {
     color: rail#404040;
     dashes: 9,9;
 }
-area[railway=turntable],
-area[railway=buffer_stop] {
+area[railway=turntable] {
     fill-color: rail#404040;
 }
 node[railway=turntable] {
@@ -3241,6 +3282,12 @@ way[railway=funicular] {
     color: rail#404040;
     dashes: 9,9;
 }
+node[railway=switch] {
+    icon-image: "presets/railway_switch.png";
+    icon-width: 16;
+    set icon_z17;
+    text: auto;
+}
 node[railway=rail], node[railway=tram], node[railway=light_rail],
 node[railway=subway], node[railway=preserved],
 node[railway=disused], node[railway=abandoned],
@@ -3281,12 +3328,9 @@ way[railway=construction][construction=tram][!highway] {
 /* aeroway tags */
 /****************/
 
-area[aeroway=aerodrome]:closed {
+area[aeroway=aerodrome] {
     fill-color: aeroway#660000;
-}
-way[aeroway=aerodrome] {
     width: 2;
-    color: aeroway#660000;
     dashes: 9,9;
 }
 node[aeroway=aerodrome] {
@@ -3317,11 +3361,6 @@ way[aeroway=runway] {
     width: 3;
     color: aeroway_dark#330000;
 }
-node[aeroway=runway] {
-    icon-image: "transport/airport/runway.png";
-    set icon_z17;
-    text: auto;
-}
 area[aeroway=taxiway]:closed {
     fill-color: aeroway#660000;
 }
@@ -3329,16 +3368,14 @@ way[aeroway=taxiway] {
     width: 2;
     color: aeroway#660000;
 }
-node[aeroway=taxiway] {
-    icon-image: "transport/airport/taxiway.png";
-    set icon_z17;
-    text: auto;
-}
-area[aeroway=apron], area[aeroway=hangar] {
+area[aeroway=apron],
+area[aeroway=hangar] {
     fill-color: aeroway_light#990000;
 }
-node[aeroway=apron] {
-    icon-image: "transport/airport/apron.png";
+node[aeroway=apron],
+node[aeroway=runway],
+node[aeroway=taxiway] {
+    icon-image: "misc/deprecated.png";
     set icon_z17;
     text: auto;
 }
@@ -3368,38 +3405,36 @@ way[aerialway=gondola] {
     color: aerialway#663300;
     dashes: 9,9;
 }
-node[aerialway=cable_car] {
-    icon-image: "transport/aerialway/cable_car.png";
-    set icon_z17;
-    text: auto;
-}
-node[aerialway=gondola] {
-    icon-image: "transport/aerialway/gondola.png";
-    set icon_z17;
-    text: auto;
-}
 way[aerialway=chair_lift] {
     width: 1;
     color: aerialway#663300;
     dashes: 6,6;
 }
-node[aerialway=chair_lift] {
-    icon-image: "transport/aerialway/chair_lift.png";
-    set icon_z17;
-    text: auto;
+way[aerialway=mixed_lift] {
+    width: 1;
+    color: aerialway#663300;
+    dashes: 6,6,9,6;
 }
+way[aerialway=j-bar],
+way[aerialway=t-bar],
+way[aerialway=platter],
+way[aerialway=rope_tow],
 way[aerialway=drag_lift] {
     width: 1;
     color: aerialway#663300;
     dashes: 3,3;
 }
-node[aerialway=drag_lift] {
-    icon-image: "transport/aerialway/drag_lift.png";
-    set icon_z17;
-    text: auto;
+way[aerialway=magic_carpet] {
+    width: 1;
+    color: aerialway#663300;
+    dashes: 3,3;
 }
-area[aerialway=station],
-area[aerialway=pylon] {
+way[aerialway=goods] {
+    width: 1;
+    color: aerialway#663300;
+    dashes: 2,2;
+}
+area[aerialway=station] {
     fill-color: aerialway#663300;
 }
 node[aerialway=station] {
@@ -3408,17 +3443,22 @@ node[aerialway=station] {
     text: auto;
 }
 node[aerialway=pylon] {
-    icon-image: "misc/landmark/power/tower_small.png";
+    icon-image: "transport/aerialway/pylon.svg";
     set icon_z17;
     text: auto;
 }
-way[aerialway=goods] {
-    width: 1;
-    color: aerialway#663300;
-    dashes: 2,2;
-}
+node[aerialway=cable_car],
+node[aerialway=gondola],
+node[aerialway=chair_lift],
+node[aerialway=mixed_lift],
+node[aerialway=drag_lift],
+node[aerialway=t-bar],
+node[aerialway=j-bar],
+node[aerialway=platter],
+node[aerialway=magic_carpet],
+node[aerialway=rope_tow],
 node[aerialway=goods] {
-    icon-image: "transport/aerialway/goods.png";
+    icon-image: "misc/deprecated.png";
     set icon_z17;
     text: auto;
 }
@@ -3775,9 +3815,6 @@ node[natural=saddle] {
     text: auto;
     set text_z0;
 }
-area[natural=peak] {
-    fill-color: peak#663300;
-}
 node[natural=peak] {
     icon-image: "presets/peak.svg";
     set icon_z0;
@@ -3799,9 +3836,6 @@ node[natural=glacier] {
     text: auto;
     set text_z0;
 }
-area[natural=volcano] {
-    fill-color: volcano#5f0000;
-}
 node[natural=volcano] {
     icon-image: "misc/landmark/volcano_small.png";
     set icon_z0;
@@ -4233,7 +4267,7 @@ node["openGeoDB:type"=Gemeinde],
 node["openGeoDB:type"=Ort],
 node["openGeoDB:type"=District],
 node["openGeoDB:location"=locality] {
-    icon-image: "place/settlement/town.png";
+    icon-image: "place/settlement/openGeoDB.png";
     set icon_z0;
     text: auto;
     set text_z0;
@@ -4275,6 +4309,7 @@ node[place=county] {
     text-color:black;
     text-halo-color: white;
     text-halo-radius: 1;
+    z-index: 2.9;
 }
 node[place=city] {
     icon-image: "place/settlement/city.png";
@@ -4286,14 +4321,9 @@ node[place=city] {
     text-color:black;
     text-halo-color: white;
     text-halo-radius: 1;
+    z-index: 2.8;
 }
-node[place=town],
-node[place=village],
-node[place=hamlet],
-node[place=farm],
-node[place=isolated_dwelling],
-node[place=neighbourhood],
-node[place=suburb] {
+node[place=town] {
     icon-image: "place/settlement/town.png";
     set icon_z0;
     text: auto;
@@ -4303,6 +4333,79 @@ node[place=suburb] {
     text-color:black;
     text-halo-color: white;
     text-halo-radius: 1;
+    z-index: 2.7;
+}
+node[place=suburb] {
+    icon-image: "place/settlement/suburb.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.6;
+}
+node[place=village] {
+    icon-image: "place/settlement/village.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.5;
+}
+node[place=neighbourhood] {
+    icon-image: "place/settlement/neighbourhood.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.4;
+}
+node[place=hamlet] {
+    icon-image: "place/settlement/hamlet.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.3;
+}
+node[place=isolated_dwelling] {
+    icon-image: "place/settlement/isolated_dwelling.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.2;
+}
+node[place=farm] {
+    icon-image: "place/settlement/farm.png";
+    set icon_z0;
+    text: auto;
+    set text_z0;
+    font-size: 10;
+    font-weight: bold;
+    text-color:black;
+    text-halo-color: white;
+    text-halo-radius: 1;
+    z-index: 2.1;
 }
 node[place=locality] {
     icon-image: "place/locality.png";
diff --git a/taginfoextract.groovy b/taginfoextract.groovy
index 4fd5415..02a5841 100644
--- a/taginfoextract.groovy
+++ b/taginfoextract.groovy
@@ -86,7 +86,7 @@ class taginfoextract {
             }
             f = new File("${base_dir}/images/${path}")
             if (f.exists()) {
-                return "https://josm.openstreetmap.de/export/${josm_svn_revision}/josm/trunk/images/${path}"
+                return "http://josm.openstreetmap.de/export/${josm_svn_revision}/josm/trunk/images/${path}"
             }
             assert false, "Cannot find image url for ${path}"
         }
@@ -198,9 +198,9 @@ class taginfoextract {
     static void parse_command_line_arguments(args) {
         def cli = new CliBuilder(usage:'taginfoextract.groovy [options] [inputfile]',
             header:"Options:",
-            footer:"[inputfile]  the file to process (optional, default is 'resource://styles/standard/elemstyles.mapcss')")
-        cli.o(args:1, argName: "file", "output file, - prints to stdout (default: -)")
-        cli._(longOpt:'svnrev', args:1, argName:"revision", "corresponding revision of the repository http://svn.openstreetmap.org/ (optional, current revision is fetched from the web if not given)")
+            footer:"[inputfile]           the file to process (optional, default is 'resource://styles/standard/elemstyles.mapcss')")
+        cli.o(args:1, argName: "file", "output file (json), - prints to stdout (default: -)")
+        cli._(longOpt:'svnrev', args:1, argName:"revision", "corresponding revision of the repository http://svn.openstreetmap.org/ (optional, current revision is read from the local checkout or from the web if not given, see --svnweb)")
         cli._(longOpt:'imgdir', args:1, argName:"directory", "directory to put the generated images in (default: ./taginfo-img)")
         cli._(longOpt:'svnweb', 'fetch revision of the repository http://svn.openstreetmap.org/ from web and not from the local repository')
         cli._(longOpt:'imgurlprefix', args:1, argName:'prefix', 'image URLs prefix for generated image files')
@@ -242,7 +242,7 @@ class taginfoextract {
                 |    "name": "JOSM main mappaint style",
                 |    "description": "Tags supported by the main mappaint style in the OSM editor JOSM",
                 |    "project_url": "http://josm.openstreetmap.de/",
-                |    "icon_url": "http://josm.openstreetmap.de/export/7543/josm/trunk/images/logo_16x16x8.png",
+                |    "icon_url": "http://josm.openstreetmap.de/export/7770/josm/trunk/images/logo_16x16x8.png",
                 |    "contact_name": "JOSM developer team",
                 |    "contact_email": "josm-dev at openstreetmap.org"
                 |  },
diff --git a/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java b/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
index 80282c5..93649a4 100644
--- a/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
@@ -1,77 +1,77 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.nodes;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
-
- at Ignore
-public class NodeListMergerTest extends JFrame {
-
-
-    private NodeListMerger nodeListMerger;
-
-    protected void populate() {
-        Way w1 = new Way();
-        Node n1;
-        w1.addNode(n1 = new Node(1));
-        for (int i=0; i < 20; i++) {
-            n1.put("key" + i, "value" + i);
-        }
-        StringBuilder note = new StringBuilder();
-        for (int i=0; i < 50; i++) {
-            note.append(" A very long text ");
-        }
-        n1.put("note", note.toString());
-        w1.addNode(new Node(2));
-        w1.addNode(new Node(3));
-
-        Way w2 = new Way();
-        w2.addNode(new Node(4));
-        w2.addNode(new Node(5));
-        w2.addNode(new Node(6));
-
-        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
-
-    }
-
-    protected void populateLong() {
-        Way w1 = new Way();
-        for (int i = 0; i < 100; i++) {
-            w1.addNode(new Node(i));
-        }
-
-        Way w2 = new Way();
-        for (int i = 1; i < 200; i+=2) {
-            w2.addNode(new Node(i));
-        }
-        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
-
-    }
-
-    protected void build() {
-        nodeListMerger = new NodeListMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(nodeListMerger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code NodeListMergerTest}.
-     */
-    public NodeListMergerTest() {
-        build();
-        populate();
-    }
-
-    static public void main(String args[]) {
-        NodeListMergerTest test = new NodeListMergerTest();
-        test.setSize(600,600);
-        test.setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.nodes;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.junit.Ignore;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+ at Ignore
+public class NodeListMergerTest extends JFrame {
+
+
+    private NodeListMerger nodeListMerger;
+
+    protected void populate() {
+        Way w1 = new Way();
+        Node n1;
+        w1.addNode(n1 = new Node(1));
+        for (int i=0; i < 20; i++) {
+            n1.put("key" + i, "value" + i);
+        }
+        StringBuilder note = new StringBuilder();
+        for (int i=0; i < 50; i++) {
+            note.append(" A very long text ");
+        }
+        n1.put("note", note.toString());
+        w1.addNode(new Node(2));
+        w1.addNode(new Node(3));
+
+        Way w2 = new Way();
+        w2.addNode(new Node(4));
+        w2.addNode(new Node(5));
+        w2.addNode(new Node(6));
+
+        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
+
+    }
+
+    protected void populateLong() {
+        Way w1 = new Way();
+        for (int i = 0; i < 100; i++) {
+            w1.addNode(new Node(i));
+        }
+
+        Way w2 = new Way();
+        for (int i = 1; i < 200; i+=2) {
+            w2.addNode(new Node(i));
+        }
+        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
+
+    }
+
+    protected void build() {
+        nodeListMerger = new NodeListMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(nodeListMerger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code NodeListMergerTest}.
+     */
+    public NodeListMergerTest() {
+        build();
+        populate();
+    }
+
+    static public void main(String args[]) {
+        NodeListMergerTest test = new NodeListMergerTest();
+        test.setSize(600,600);
+        test.setVisible(true);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java b/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
index 6bb4bf5..1c7f2ab 100644
--- a/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
@@ -1,52 +1,52 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.properties;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.conflict.Conflict;
-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.data.projection.Projections;
-
- at Ignore
-public class PropertiesMergerTest extends JFrame{
-
-    private PropertiesMerger merger;
-
-    protected void build() {
-        Main.setProjection(Projections.getProjectionByCode("EPSG:4326")); // WGS 84
-
-        setLayout(new BorderLayout());
-        add(merger = new PropertiesMerger(), BorderLayout.CENTER);
-    }
-
-    protected void populate() {
-        Node my = new Node(1);
-        my.setCoor(new LatLon(1,1));
-        my.setDeleted(true);
-
-        Node their = new Node(2);
-        their.setCoor(new LatLon(10,10));
-
-        merger.getModel().populate(new Conflict<OsmPrimitive>(my, their));
-    }
-
-    /**
-     * Constructs a new {@code PropertiesMergerTest}.
-     */
-    public PropertiesMergerTest() {
-        build();
-        populate();
-    }
-
-    static public void main(String args[]) {
-        PropertiesMergerTest app = new PropertiesMergerTest();
-        app.setSize(600, 400);
-        app.setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.properties;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.junit.Ignore;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.conflict.Conflict;
+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.data.projection.Projections;
+
+ at Ignore
+public class PropertiesMergerTest extends JFrame{
+
+    private PropertiesMerger merger;
+
+    protected void build() {
+        Main.setProjection(Projections.getProjectionByCode("EPSG:4326")); // WGS 84
+
+        setLayout(new BorderLayout());
+        add(merger = new PropertiesMerger(), BorderLayout.CENTER);
+    }
+
+    protected void populate() {
+        Node my = new Node(1);
+        my.setCoor(new LatLon(1,1));
+        my.setDeleted(true);
+
+        Node their = new Node(2);
+        their.setCoor(new LatLon(10,10));
+
+        merger.getModel().populate(new Conflict<OsmPrimitive>(my, their));
+    }
+
+    /**
+     * Constructs a new {@code PropertiesMergerTest}.
+     */
+    public PropertiesMergerTest() {
+        build();
+        populate();
+    }
+
+    static public void main(String args[]) {
+        PropertiesMergerTest app = new PropertiesMergerTest();
+        app.setSize(600, 400);
+        app.setVisible(true);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java b/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
index adf445c..6efb843 100644
--- a/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
@@ -1,56 +1,56 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.relation;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-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;
-
- at Ignore
-public class RelationMemberMergerTest extends JFrame {
-
-    private RelationMemberMerger merger;
-
-    protected void populate() {
-        Relation r1 = new Relation();
-        r1.addMember(new RelationMember("role1", new Node(1)));
-        r1.addMember(new RelationMember("role2", new Way(2)));
-        r1.addMember(new RelationMember("role3", new Relation(3)));
-
-
-        Relation r2 = new Relation();
-        r2.addMember(new RelationMember("role1", new Node(1)));
-        r2.addMember(new RelationMember("role2", new Way(2)));
-        r2.addMember(new RelationMember("role3", new Relation(3)));
-
-        merger.populate(new Conflict<OsmPrimitive>(r1, r2));
-
-    }
-
-    protected void build() {
-        merger = new RelationMemberMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(merger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code RelationMemberMergerTest}.
-     */
-    public RelationMemberMergerTest() {
-        build();
-        populate();
-    }
-
-    static public void main(String args[]) {
-        RelationMemberMergerTest test = new RelationMemberMergerTest();
-        test.setSize(600,600);
-        test.setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.relation;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.junit.Ignore;
+import org.openstreetmap.josm.data.conflict.Conflict;
+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;
+
+ at Ignore
+public class RelationMemberMergerTest extends JFrame {
+
+    private RelationMemberMerger merger;
+
+    protected void populate() {
+        Relation r1 = new Relation();
+        r1.addMember(new RelationMember("role1", new Node(1)));
+        r1.addMember(new RelationMember("role2", new Way(2)));
+        r1.addMember(new RelationMember("role3", new Relation(3)));
+
+
+        Relation r2 = new Relation();
+        r2.addMember(new RelationMember("role1", new Node(1)));
+        r2.addMember(new RelationMember("role2", new Way(2)));
+        r2.addMember(new RelationMember("role3", new Relation(3)));
+
+        merger.populate(new Conflict<OsmPrimitive>(r1, r2));
+
+    }
+
+    protected void build() {
+        merger = new RelationMemberMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(merger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code RelationMemberMergerTest}.
+     */
+    public RelationMemberMergerTest() {
+        build();
+        populate();
+    }
+
+    static public void main(String args[]) {
+        RelationMemberMergerTest test = new RelationMemberMergerTest();
+        test.setSize(600,600);
+        test.setVisible(true);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java b/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
index 8a3ea8c..d85804f 100644
--- a/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
@@ -1,40 +1,40 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.tags;
-
-import org.junit.Ignore;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
- at Ignore
-public class TagMergerTest extends JFrame {
-
-    private TagMerger tagMerger;
-
-    protected void build() {
-        tagMerger = new TagMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(tagMerger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code TagMergerTest}.
-     */
-    public TagMergerTest() {
-        build();
-        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
-        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", null));
-        tagMerger.getModel().addItem(new TagMergeItem("key", null, "theirvalue"));
-        tagMerger.getModel().addItem(new TagMergeItem("a very long key asdfasdf asdfasdf", "a very long value asdfasdf", "a very long value asdfasdf"));
-        for (int i=0; i< 50; i++) {
-          tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
-        }
-    }
-
-    public static void main(String args[]) {
-        TagMergerTest test  = new TagMergerTest();
-        test.setSize(600,600);
-        test.setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.tags;
+
+import org.junit.Ignore;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+ at Ignore
+public class TagMergerTest extends JFrame {
+
+    private TagMerger tagMerger;
+
+    protected void build() {
+        tagMerger = new TagMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(tagMerger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code TagMergerTest}.
+     */
+    public TagMergerTest() {
+        build();
+        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
+        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", null));
+        tagMerger.getModel().addItem(new TagMergeItem("key", null, "theirvalue"));
+        tagMerger.getModel().addItem(new TagMergeItem("a very long key asdfasdf asdfasdf", "a very long value asdfasdf", "a very long value asdfasdf"));
+        for (int i=0; i< 50; i++) {
+          tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
+        }
+    }
+
+    public static void main(String args[]) {
+        TagMergerTest test  = new TagMergerTest();
+        test.setSize(600,600);
+        test.setVisible(true);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java b/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java
index 3453368..35a9705 100644
--- a/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java
@@ -1,52 +1,52 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
-
- at Ignore
-public class ConflictResolutionDialogTest extends JFrame {
-
-    private ConflictResolutionDialog dialog;
-
-    protected void build() {
-        setSize(100,100);
-        dialog = new ConflictResolutionDialog(this);
-        dialog.setSize(600,600);
-    }
-
-    protected void populate() {
-        Way w1 = new Way(1);
-        w1.addNode(new Node(10));
-        w1.addNode(new Node(11));
-
-        Way w2 = new Way(1);
-        w2.addNode(new Node(10));
-        w2.addNode(new Node(11));
-
-        dialog.getConflictResolver().populate(new Conflict<OsmPrimitive>(w1, w2));
-    }
-
-    public void showDialog() {
-        dialog.setVisible(true);
-    }
-
-    /**
-     * Constructs a new {@code ConflictResolutionDialogTest}.
-     */
-    public ConflictResolutionDialogTest() {
-        build();
-    }
-
-    static public void main(String args[]) {
-        ConflictResolutionDialogTest test = new ConflictResolutionDialogTest();
-        test.setVisible(true);
-        test.populate();
-        test.showDialog();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import javax.swing.JFrame;
+
+import org.junit.Ignore;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+ at Ignore
+public class ConflictResolutionDialogTest extends JFrame {
+
+    private ConflictResolutionDialog dialog;
+
+    protected void build() {
+        setSize(100,100);
+        dialog = new ConflictResolutionDialog(this);
+        dialog.setSize(600,600);
+    }
+
+    protected void populate() {
+        Way w1 = new Way(1);
+        w1.addNode(new Node(10));
+        w1.addNode(new Node(11));
+
+        Way w2 = new Way(1);
+        w2.addNode(new Node(10));
+        w2.addNode(new Node(11));
+
+        dialog.getConflictResolver().populate(new Conflict<OsmPrimitive>(w1, w2));
+    }
+
+    public void showDialog() {
+        dialog.setVisible(true);
+    }
+
+    /**
+     * Constructs a new {@code ConflictResolutionDialogTest}.
+     */
+    public ConflictResolutionDialogTest() {
+        build();
+    }
+
+    static public void main(String args[]) {
+        ConflictResolutionDialogTest test = new ConflictResolutionDialogTest();
+        test.setVisible(true);
+        test.populate();
+        test.showDialog();
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java b/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
index 0536288..1ab40cc 100644
--- a/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
@@ -1,21 +1,21 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import org.junit.Ignore;
-
-import javax.swing.JFrame;
-
- at Ignore
-public class ChangesetCacheManagerTest extends JFrame {
-
-    private ChangesetCacheManager manager;
-
-    public void start() {
-        manager = new ChangesetCacheManager();
-        manager.setVisible(true);
-    }
-
-    static public void main(String args[]) {
-        new ChangesetCacheManagerTest().start();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import org.junit.Ignore;
+
+import javax.swing.JFrame;
+
+ at Ignore
+public class ChangesetCacheManagerTest extends JFrame {
+
+    private ChangesetCacheManager manager;
+
+    public void start() {
+        manager = new ChangesetCacheManager();
+        manager.setVisible(true);
+    }
+
+    static public void main(String args[]) {
+        new ChangesetCacheManagerTest().start();
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java b/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java
index cf48c10..f8d0dfd 100644
--- a/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java
@@ -1,22 +1,22 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset.query;
-
-import org.junit.Ignore;
-
-import javax.swing.JFrame;
-
- at Ignore
-public class ChangesetQueryDialogTest extends JFrame {
-
-    private ChangesetQueryDialog dialog;
-
-    public void start() {
-        dialog = new ChangesetQueryDialog(this);
-        dialog.initForUserInput();
-        dialog.setVisible(true);
-    }
-
-    static public void main(String args[]) {
-        new ChangesetQueryDialogTest().start();
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset.query;
+
+import org.junit.Ignore;
+
+import javax.swing.JFrame;
+
+ at Ignore
+public class ChangesetQueryDialogTest extends JFrame {
+
+    private ChangesetQueryDialog dialog;
+
+    public void start() {
+        dialog = new ChangesetQueryDialog(this);
+        dialog.initForUserInput();
+        dialog.setVisible(true);
+    }
+
+    static public void main(String args[]) {
+        new ChangesetQueryDialogTest().start();
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java b/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java
index 7e5976a..0709782 100644
--- a/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java
+++ b/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java
@@ -1,65 +1,65 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerHistoryReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-
- at Ignore
-public class HistoryBrowserTest extends JFrame {
-
-    @BeforeClass
-    static public void init() {
-        JOSMFixture.createFunctionalTestFixture().init();
-    }
-
-    private HistoryBrowser browser;
-
-    protected void build() {
-        setSize(500,500);
-        getContentPane().setLayout(new BorderLayout());
-        browser = new HistoryBrowser();
-        getContentPane().add(browser, BorderLayout.CENTER);
-    }
-
-    protected void populate(OsmPrimitiveType type, long id) {
-        OsmServerHistoryReader reader = new OsmServerHistoryReader(type, id);
-        HistoryDataSet ds = null;
-        try {
-            ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
-        } catch(OsmTransferException e) {
-            Main.error(e);
-            return;
-        }
-        History h = ds.getHistory(new SimplePrimitiveId(id, type));
-        browser.populate(h);
-    }
-
-    /**
-     * Constructs a new {@code HistoryBrowserTest}.
-     */
-    public HistoryBrowserTest(){
-        build();
-        //populate(OsmPrimitiveType.NODE,354117);
-        //populate(OsmPrimitiveType.WAY,37951);
-        populate(OsmPrimitiveType.RELATION,5055);
-
-    }
-
-    static public void main(String args[]) {
-        HistoryBrowserTest.init();
-        new HistoryBrowserTest().setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.OsmServerHistoryReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+ at Ignore
+public class HistoryBrowserTest extends JFrame {
+
+    @BeforeClass
+    static public void init() {
+        JOSMFixture.createFunctionalTestFixture().init();
+    }
+
+    private HistoryBrowser browser;
+
+    protected void build() {
+        setSize(500,500);
+        getContentPane().setLayout(new BorderLayout());
+        browser = new HistoryBrowser();
+        getContentPane().add(browser, BorderLayout.CENTER);
+    }
+
+    protected void populate(OsmPrimitiveType type, long id) {
+        OsmServerHistoryReader reader = new OsmServerHistoryReader(type, id);
+        HistoryDataSet ds = null;
+        try {
+            ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
+        } catch(OsmTransferException e) {
+            Main.error(e);
+            return;
+        }
+        History h = ds.getHistory(new SimplePrimitiveId(id, type));
+        browser.populate(h);
+    }
+
+    /**
+     * Constructs a new {@code HistoryBrowserTest}.
+     */
+    public HistoryBrowserTest(){
+        build();
+        //populate(OsmPrimitiveType.NODE,354117);
+        //populate(OsmPrimitiveType.WAY,37951);
+        populate(OsmPrimitiveType.RELATION,5055);
+
+    }
+
+    static public void main(String args[]) {
+        HistoryBrowserTest.init();
+        new HistoryBrowserTest().setVisible(true);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java b/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
index 2dd6560..eacf81e 100644
--- a/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
@@ -1,278 +1,278 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.logging.Logger;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.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;
-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.io.UploadStrategy;
-import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
-public class MultiFetchServerObjectReaderTest {
-    private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
-
-    /**
-     * builds a large data set to be used later for testing MULTI FETCH on the server
-     *
-     * @return a large data set
-     */
-    protected static DataSet buildTestDataSet() {
-        DataSet ds = new DataSet();
-        ds.setVersion("0.6");
-
-        int numNodes = 1000;
-        int numWays = 1000;
-        int numRelations = 1000;
-
-        ArrayList<Node> nodes = new ArrayList<>();
-        ArrayList<Way> ways = new ArrayList<>();
-
-        // create a set of nodes
-        //
-        for (int i=0; i< numNodes; i++) {
-            Node n = new Node();
-            n.setCoor(new LatLon(-36.6,47.6));
-            n.put("name", "node-"+i);
-            ds.addPrimitive(n);
-            nodes.add(n);
-        }
-
-        // create a set of ways, each with a random number of
-        // nodes
-        //
-        for (int i=0; i< numWays; i++) {
-            Way w = new Way();
-            int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
-            int start = (int)Math.round(Math.random() * numNodes);
-            for (int j = 0; j < numNodesInWay;j++) {
-                int idx = (start + j) % numNodes;
-                Node n = nodes.get(idx);
-                w.addNode(n);
-            }
-            w.put("name", "way-"+i);
-            ds.addPrimitive(w);
-            ways.add(w);
-        }
-
-        // create a set of relations each with a random number of nodes,
-        // and ways
-        //
-        for (int i=0; i< numRelations; i++) {
-            Relation r = new Relation();
-            r.put("name", "relation-" +i);
-            int numNodesInRelation = (int)Math.round(Math.random() * 10);
-            int start = (int)Math.round(Math.random() * numNodes);
-            for (int j = 0; j < numNodesInRelation;j++) {
-                int idx = (start + j) % 500;
-                Node n = nodes.get(idx);
-                r.addMember(new RelationMember("role-" + j, n));
-            }
-            int numWaysInRelation = (int)Math.round(Math.random() * 10);
-            start = (int)Math.round(Math.random() * numWays);
-            for (int j = 0; j < numWaysInRelation;j++) {
-                int idx = (start + j) % 500;
-                Way w = ways.get(idx);
-                r.addMember(new RelationMember("role-" + j, w));
-            }
-            ds.addPrimitive(r);
-        }
-
-        return ds;
-    }
-
-    private static DataSet testDataSet;
-
-    /**
-     * creates the dataset on the server.
-     *
-     * @param ds the data set
-     * @throws OsmTransferException
-     */
-    public static void createDataSetOnServer(DataSet ds) throws OsmTransferException {
-        logger.info("creating data set on the server ...");
-        ArrayList<OsmPrimitive> primitives = new ArrayList<>();
-        primitives.addAll(testDataSet.getNodes());
-        primitives.addAll(testDataSet.getWays());
-        primitives.addAll(testDataSet.getRelations());
-
-        OsmServerWriter writer = new OsmServerWriter();
-        Changeset cs = new Changeset();
-        writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY), primitives,cs,NullProgressMonitor.INSTANCE);
-        OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
-    }
-
-    @BeforeClass
-    public static void init() throws OsmTransferException {
-        logger.info("initializing ...");
-        JOSMFixture.createFunctionalTestFixture().init();
-
-        // don't use atomic upload, the test API server can't cope with large diff uploads
-        //
-        Main.pref.put("osm-server.atomic-upload", false);
-
-        File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
-
-        String p = System.getProperties().getProperty("useCachedDataset");
-        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
-            logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
-            return;
-        }
-
-        logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
-
-        // build and upload the test data set
-        //
-        logger.info("creating test data set ....");
-        testDataSet = buildTestDataSet();
-        logger.info("uploading test data set ...");
-        createDataSetOnServer(testDataSet);
-
-        try (
-            PrintWriter pw = new PrintWriter(
-                    new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
-        )) {
-            logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
-            try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
-                w.header();
-                w.writeDataSources(testDataSet);
-                w.writeContent(testDataSet);
-                w.footer();
-            }
-        } catch(IOException e) {
-            fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
-        }
-    }
-
-    private DataSet ds;
-
-    /**
-     * Setup test.
-     */
-    @Before
-    public void setUp() throws IOException, IllegalDataException {
-        File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
-        logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
-        ds = new DataSet();
-        try (FileInputStream fis = new FileInputStream(f)) {
-            ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
-        }
-    }
-
-    @Test
-    public void testMultiGet10Nodes() throws OsmTransferException {
-        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
-        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
-        for (int i =0; i< 10; i++) {
-            reader.append(nodes.get(i));
-        }
-        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(10, out.getNodes().size());
-        for (Node n1:out.getNodes()) {
-            Node n2 = (Node)ds.getPrimitiveById(n1);
-            assertNotNull(n2);
-            assertEquals(n2.get("name"),n2.get("name"));
-        }
-        assertTrue(reader.getMissingPrimitives().isEmpty());
-    }
-
-    @Test
-    public void testMultiGet10Ways() throws OsmTransferException {
-        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
-        ArrayList<Way> ways= new ArrayList<>(ds.getWays());
-        for (int i =0; i< 10; i++) {
-            reader.append(ways.get(i));
-        }
-        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(10, out.getWays().size());
-        for (Way w1: out.getWays()) {
-            Way w2 = (Way)ds.getPrimitiveById(w1);
-            assertNotNull(w2);
-            assertEquals(w2.getNodesCount(), w1.getNodesCount());
-            assertEquals(w2.get("name"),w1.get("name"));
-        }
-        assertTrue(reader.getMissingPrimitives().isEmpty());
-    }
-
-    @Test
-    public void testMultiGet10Relations() throws OsmTransferException {
-        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
-        ArrayList<Relation> relations= new ArrayList<>(ds.getRelations());
-        for (int i =0; i< 10; i++) {
-            reader.append(relations.get(i));
-        }
-        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(10, out.getRelations().size());
-        for (Relation r1: out.getRelations()) {
-            Relation r2 = (Relation)ds.getPrimitiveById(r1);
-            assertNotNull(r2);
-            assertEquals(r2.getMembersCount(), r1.getMembersCount());
-            assertEquals(r2.get("name"),r2.get("name"));
-        }
-        assertTrue(reader.getMissingPrimitives().isEmpty());
-    }
-
-    @Test
-    public void testMultiGet800Nodes() throws OsmTransferException {
-        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
-        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
-        for (int i =0; i< 812; i++) {
-            reader.append(nodes.get(i));
-        }
-        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(812, out.getNodes().size());
-        for (Node n1:out.getNodes()) {
-            Node n2 = (Node)ds.getPrimitiveById(n1);
-            assertNotNull(n2);
-            assertEquals(n2.get("name"),n2.get("name"));
-        }
-        assertTrue(reader.getMissingPrimitives().isEmpty());
-    }
-
-    @Test
-    public void multiGetWithNonExistingNode() throws OsmTransferException {
-        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
-        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
-        for (int i =0; i< 10; i++) {
-            reader.append(nodes.get(i));
-        }
-        Node n = new Node(9999999);
-        reader.append(n); // doesn't exist
-        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(10, out.getNodes().size());
-        for (Node n1:out.getNodes()) {
-            Node n2 = (Node)ds.getPrimitiveById(n1);
-            assertNotNull(n2);
-            assertEquals(n2.get("name"),n2.get("name"));
-        }
-        assertFalse(reader.getMissingPrimitives().isEmpty());
-        assertEquals(1, reader.getMissingPrimitives().size());
-        assertEquals(9999999, reader.getMissingPrimitives().iterator().next().getUniqueId());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.logging.Logger;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.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;
+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.io.UploadStrategy;
+import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+public class MultiFetchServerObjectReaderTest {
+    private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
+
+    /**
+     * builds a large data set to be used later for testing MULTI FETCH on the server
+     *
+     * @return a large data set
+     */
+    protected static DataSet buildTestDataSet() {
+        DataSet ds = new DataSet();
+        ds.setVersion("0.6");
+
+        int numNodes = 1000;
+        int numWays = 1000;
+        int numRelations = 1000;
+
+        ArrayList<Node> nodes = new ArrayList<>();
+        ArrayList<Way> ways = new ArrayList<>();
+
+        // create a set of nodes
+        //
+        for (int i=0; i< numNodes; i++) {
+            Node n = new Node();
+            n.setCoor(new LatLon(-36.6,47.6));
+            n.put("name", "node-"+i);
+            ds.addPrimitive(n);
+            nodes.add(n);
+        }
+
+        // create a set of ways, each with a random number of
+        // nodes
+        //
+        for (int i=0; i< numWays; i++) {
+            Way w = new Way();
+            int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
+            int start = (int)Math.round(Math.random() * numNodes);
+            for (int j = 0; j < numNodesInWay;j++) {
+                int idx = (start + j) % numNodes;
+                Node n = nodes.get(idx);
+                w.addNode(n);
+            }
+            w.put("name", "way-"+i);
+            ds.addPrimitive(w);
+            ways.add(w);
+        }
+
+        // create a set of relations each with a random number of nodes,
+        // and ways
+        //
+        for (int i=0; i< numRelations; i++) {
+            Relation r = new Relation();
+            r.put("name", "relation-" +i);
+            int numNodesInRelation = (int)Math.round(Math.random() * 10);
+            int start = (int)Math.round(Math.random() * numNodes);
+            for (int j = 0; j < numNodesInRelation;j++) {
+                int idx = (start + j) % 500;
+                Node n = nodes.get(idx);
+                r.addMember(new RelationMember("role-" + j, n));
+            }
+            int numWaysInRelation = (int)Math.round(Math.random() * 10);
+            start = (int)Math.round(Math.random() * numWays);
+            for (int j = 0; j < numWaysInRelation;j++) {
+                int idx = (start + j) % 500;
+                Way w = ways.get(idx);
+                r.addMember(new RelationMember("role-" + j, w));
+            }
+            ds.addPrimitive(r);
+        }
+
+        return ds;
+    }
+
+    private static DataSet testDataSet;
+
+    /**
+     * creates the dataset on the server.
+     *
+     * @param ds the data set
+     * @throws OsmTransferException
+     */
+    public static void createDataSetOnServer(DataSet ds) throws OsmTransferException {
+        logger.info("creating data set on the server ...");
+        ArrayList<OsmPrimitive> primitives = new ArrayList<>();
+        primitives.addAll(testDataSet.getNodes());
+        primitives.addAll(testDataSet.getWays());
+        primitives.addAll(testDataSet.getRelations());
+
+        OsmServerWriter writer = new OsmServerWriter();
+        Changeset cs = new Changeset();
+        writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY), primitives,cs,NullProgressMonitor.INSTANCE);
+        OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
+    }
+
+    @BeforeClass
+    public static void init() throws OsmTransferException {
+        logger.info("initializing ...");
+        JOSMFixture.createFunctionalTestFixture().init();
+
+        // don't use atomic upload, the test API server can't cope with large diff uploads
+        //
+        Main.pref.put("osm-server.atomic-upload", false);
+
+        File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
+
+        String p = System.getProperties().getProperty("useCachedDataset");
+        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
+            logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
+            return;
+        }
+
+        logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
+
+        // build and upload the test data set
+        //
+        logger.info("creating test data set ....");
+        testDataSet = buildTestDataSet();
+        logger.info("uploading test data set ...");
+        createDataSetOnServer(testDataSet);
+
+        try (
+            PrintWriter pw = new PrintWriter(
+                    new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
+        )) {
+            logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
+            try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
+                w.header();
+                w.writeDataSources(testDataSet);
+                w.writeContent(testDataSet);
+                w.footer();
+            }
+        } catch(IOException e) {
+            fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
+        }
+    }
+
+    private DataSet ds;
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() throws IOException, IllegalDataException {
+        File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
+        logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
+        ds = new DataSet();
+        try (FileInputStream fis = new FileInputStream(f)) {
+            ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
+        }
+    }
+
+    @Test
+    public void testMultiGet10Nodes() throws OsmTransferException {
+        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
+        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
+        for (int i =0; i< 10; i++) {
+            reader.append(nodes.get(i));
+        }
+        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(10, out.getNodes().size());
+        for (Node n1:out.getNodes()) {
+            Node n2 = (Node)ds.getPrimitiveById(n1);
+            assertNotNull(n2);
+            assertEquals(n2.get("name"),n2.get("name"));
+        }
+        assertTrue(reader.getMissingPrimitives().isEmpty());
+    }
+
+    @Test
+    public void testMultiGet10Ways() throws OsmTransferException {
+        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
+        ArrayList<Way> ways= new ArrayList<>(ds.getWays());
+        for (int i =0; i< 10; i++) {
+            reader.append(ways.get(i));
+        }
+        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(10, out.getWays().size());
+        for (Way w1: out.getWays()) {
+            Way w2 = (Way)ds.getPrimitiveById(w1);
+            assertNotNull(w2);
+            assertEquals(w2.getNodesCount(), w1.getNodesCount());
+            assertEquals(w2.get("name"),w1.get("name"));
+        }
+        assertTrue(reader.getMissingPrimitives().isEmpty());
+    }
+
+    @Test
+    public void testMultiGet10Relations() throws OsmTransferException {
+        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
+        ArrayList<Relation> relations= new ArrayList<>(ds.getRelations());
+        for (int i =0; i< 10; i++) {
+            reader.append(relations.get(i));
+        }
+        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(10, out.getRelations().size());
+        for (Relation r1: out.getRelations()) {
+            Relation r2 = (Relation)ds.getPrimitiveById(r1);
+            assertNotNull(r2);
+            assertEquals(r2.getMembersCount(), r1.getMembersCount());
+            assertEquals(r2.get("name"),r2.get("name"));
+        }
+        assertTrue(reader.getMissingPrimitives().isEmpty());
+    }
+
+    @Test
+    public void testMultiGet800Nodes() throws OsmTransferException {
+        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
+        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
+        for (int i =0; i< 812; i++) {
+            reader.append(nodes.get(i));
+        }
+        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(812, out.getNodes().size());
+        for (Node n1:out.getNodes()) {
+            Node n2 = (Node)ds.getPrimitiveById(n1);
+            assertNotNull(n2);
+            assertEquals(n2.get("name"),n2.get("name"));
+        }
+        assertTrue(reader.getMissingPrimitives().isEmpty());
+    }
+
+    @Test
+    public void multiGetWithNonExistingNode() throws OsmTransferException {
+        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
+        ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
+        for (int i =0; i< 10; i++) {
+            reader.append(nodes.get(i));
+        }
+        Node n = new Node(9999999);
+        reader.append(n); // doesn't exist
+        DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(10, out.getNodes().size());
+        for (Node n1:out.getNodes()) {
+            Node n2 = (Node)ds.getPrimitiveById(n1);
+            assertNotNull(n2);
+            assertEquals(n2.get("name"),n2.get("name"));
+        }
+        assertFalse(reader.getMissingPrimitives().isEmpty());
+        assertEquals(1, reader.getMissingPrimitives().size());
+        assertEquals(9999999, reader.getMissingPrimitives().iterator().next().getUniqueId());
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
index 3500c58..3773bad 100644
--- a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
@@ -1,569 +1,569 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.text.MessageFormat;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
-import org.openstreetmap.josm.data.APIDataSet;
-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;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-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.data.projection.Projections;
-import org.openstreetmap.josm.gui.io.UploadStrategy;
-import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
-/**
- * Reads primitives referring to a particular primitive (ways including a node, relations referring to a relation)
- * @since 1806
- */
-public class OsmServerBackreferenceReaderTest {
-    static private final Logger logger = Logger.getLogger(OsmServerBackreferenceReader.class.getName());
-
-    protected static Node lookupNode(DataSet ds, int i) {
-        for (Node n : ds.getNodes()) {
-            if (("node-" + i).equals(n.get("name"))) return n;
-        }
-        fail("Cannot find node "+i);
-        return null;
-    }
-
-    protected static Way lookupWay(DataSet ds, int i) {
-        for (Way w : ds.getWays()) {
-            if (("way-" + i).equals(w.get("name"))) return w;
-        }
-        fail("Cannot find way "+i);
-        return null;
-    }
-
-    protected static Relation lookupRelation(DataSet ds, int i) {
-        for (Relation r : ds.getRelations()) {
-            if (("relation-" + i).equals(r.get("name"))) return r;
-        }
-        fail("Cannot find relation "+i);
-        return null;
-    }
-
-    protected static void populateTestDataSetWithNodes(DataSet ds) {
-        for (int i=0;i<100;i++) {
-            Node n = new Node();
-            n.setCoor(new LatLon(-36.6,47.6));
-            n.put("name", "node-"+i);
-            ds.addPrimitive(n);
-        }
-    }
-
-    protected static void populateTestDataSetWithWays(DataSet ds) {
-        for (int i=0;i<20;i++) {
-            Way w = new Way();
-            for (int j = 0; j < 10;j++) {
-                w.addNode(lookupNode(ds, i+j));
-            }
-            w.put("name", "way-"+i);
-            ds.addPrimitive(w);
-        }
-    }
-
-    protected static void populateTestDataSetWithRelations(DataSet ds) {
-        for (int i=0;i<10;i++) {
-            Relation r = new Relation();
-            r.put("name", "relation-" +i);
-            for (int j =0; j < 10; j++) {
-                RelationMember member = new RelationMember("node-" + j, lookupNode(ds, i + j));
-                r.addMember(member);
-            }
-            for (int j =0; j < 5; j++) {
-                RelationMember member = new RelationMember("way-" + j, lookupWay(ds, i + j));
-                r.addMember(member);
-            }
-            if (i > 5) {
-                for (int j =0; j < 3; j++) {
-                    RelationMember member = new RelationMember("relation-" + j, lookupRelation(ds, j));
-                    logger.info(MessageFormat.format("adding relation {0} to relation {1}", j, i));
-                    r.addMember(member);
-                }
-            }
-            ds.addPrimitive(r);
-        }
-    }
-
-    protected static DataSet buildTestDataSet() {
-        DataSet ds = new DataSet();
-        ds.setVersion("0.6");
-
-        populateTestDataSetWithNodes(ds);
-        populateTestDataSetWithWays(ds);
-        populateTestDataSetWithRelations(ds);
-        return ds;
-    }
-
-    /**
-     * creates the dataset on the server.
-     *
-     * @param ds the data set
-     * @throws OsmTransferException
-     */
-    static public void createDataSetOnServer(APIDataSet ds) throws OsmTransferException, CyclicUploadDependencyException {
-        logger.info("creating data set on the server ...");
-        ds.adjustRelationUploadOrder();
-        OsmServerWriter writer = new OsmServerWriter();
-        Changeset cs  = new Changeset();
-        writer.uploadOsm(
-                new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY),
-                ds.getPrimitives(), cs, NullProgressMonitor.INSTANCE);
-        OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
-    }
-
-    static DataSet testDataSet;
-
-    @BeforeClass
-    public static void init() throws OsmTransferException, CyclicUploadDependencyException {
-        logger.info("initializing ...");
-
-        JOSMFixture.createFunctionalTestFixture().init();
-
-        // don't use atomic upload, the test API server can't cope with large diff uploads
-        //
-        Main.pref.put("osm-server.atomic-upload", false);
-        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
-        Main.logLevel = 4;
-
-        File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
-
-        String p = System.getProperty("useCachedDataset");
-        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
-            logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
-            return;
-        }
-
-        logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
-
-        // build and upload the test data set
-        //
-        logger.info("creating test data set ....");
-        testDataSet = buildTestDataSet();
-        logger.info("uploading test data set ...");
-        createDataSetOnServer(new APIDataSet(testDataSet));
-
-        try (
-            PrintWriter pw = new PrintWriter(
-                    new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
-        )) {
-            logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
-            try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
-                w.header();
-                w.writeDataSources(testDataSet);
-                w.writeContent(testDataSet);
-                w.footer();
-            }
-        } catch(IOException e) {
-            fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
-        }
-    }
-
-    private DataSet ds;
-
-    /**
-     * Setup test.
-     */
-    @Before
-    public void setUp() throws IOException, IllegalDataException {
-        File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
-        logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
-        ds = new DataSet();
-        try (FileInputStream fis = new FileInputStream(f)) {
-            ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
-        }
-    }
-
-    @Test
-    public void testBackreferenceForNode() throws OsmTransferException {
-        Node n = lookupNode(ds, 0);
-        assertNotNull(n);
-        Way w = lookupWay(ds, 0);
-        assertNotNull(w);
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
-        reader.setReadFull(false);
-        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        printNumberOfPrimitives(referers);
-
-        Set<Long> expectedNodeIds = new HashSet<>();
-        Set<Long> expectedWayIds = new HashSet<>();
-        Set<Long> expectedRelationIds = new HashSet<>();
-
-        for (OsmPrimitive ref : n.getReferrers()) {
-            if (ref instanceof Way) {
-                expectedWayIds.add(ref.getId());
-                expectedNodeIds.addAll(getNodeIdsInWay((Way) ref));
-            } else if (ref instanceof Relation) {
-                expectedRelationIds.add(ref.getId());
-                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, false));
-                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
-            }
-        }
-
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-        assertEquals(expectedWayIds.size(), referers.getWays().size());
-        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
-
-        for (Node node : referers.getNodes()) {
-            assertTrue(expectedNodeIds.contains(node.getId()));
-            assertFalse(node.isIncomplete());
-        }
-
-        for (Way way : referers.getWays()) {
-            assertTrue(expectedWayIds.contains(way.getId()));
-            assertEquals(n.getReferrers().contains(way), !way.isIncomplete());
-        }
-
-        for (Relation relation : referers.getRelations()) {
-            assertTrue(expectedRelationIds.contains(relation.getId()));
-            assertFalse(relation.isIncomplete());
-        }
-    }
-
-    private void printNumberOfPrimitives(DataSet referers) {
-        System.out.println("#nodes=" + referers.getNodes().size() +
-                " #ways=" + referers.getWays().size() +
-                " #relations=" + referers.getRelations().size());
-    }
-
-    @Test
-    public void testBackreferenceForNode_Full() throws OsmTransferException {
-        Node n = lookupNode(ds, 0);
-        assertNotNull(n);
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
-        reader.setReadFull(true);
-        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        printNumberOfPrimitives(referers);
-
-        Set<Long> expectedNodeIds = new HashSet<>();
-        Set<Long> expectedWayIds = new HashSet<>();
-        Set<Long> expectedRelationIds = new HashSet<>();
-        for (OsmPrimitive ref : n.getReferrers()) {
-            if (ref instanceof Way) {
-                expectedWayIds.add(ref.getId());
-                expectedNodeIds.addAll(getNodeIdsInWay((Way) ref));
-            } else if (ref instanceof Relation) {
-                expectedRelationIds.add(ref.getId());
-                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, true));
-                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, true));
-            }
-        }
-
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-        assertEquals(expectedWayIds.size(), referers.getWays().size());
-        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
-
-        for (Node node : referers.getNodes()) {
-            assertTrue(expectedNodeIds.contains(node.getId()));
-            assertFalse(node.isIncomplete());
-        }
-
-        for (Way way : referers.getWays()) {
-            assertTrue(expectedWayIds.contains(way.getId()));
-            assertFalse(way.isIncomplete());
-        }
-
-        for (Relation relation : referers.getRelations()) {
-            assertTrue(expectedRelationIds.contains(relation.getId()));
-            assertFalse(relation.isIncomplete());
-        }
-    }
-
-    @Test
-    public void testBackreferenceForWay() throws OsmTransferException {
-        Way w = lookupWay(ds, 1);
-        assertNotNull(w);
-        // way with name "way-1" is referred to by two relations
-        //
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
-        reader.setReadFull(false);
-        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        printNumberOfPrimitives(referers);
-
-        Set<Long> expectedNodeIds = new HashSet<>();
-        Set<Long> expectedWayIds = new HashSet<>();
-        Set<Long> expectedRelationIds = new HashSet<>();
-
-        for (OsmPrimitive ref : w.getReferrers()) {
-            if (ref instanceof Relation) {
-                expectedRelationIds.add(ref.getId());
-                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, false));
-                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
-            }
-        }
-
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-        assertEquals(expectedWayIds.size(), referers.getWays().size());
-        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
-
-        for (Way w1 : referers.getWays()) {
-            assertTrue(w1.isIncomplete());
-        }
-        assertEquals(2, referers.getRelations().size());  // two relations referring to w
-
-        Relation r = lookupRelation(referers, 0);
-        assertNotNull(r);
-        assertFalse(r.isIncomplete());
-        r = lookupRelation(referers, 1);
-        assertFalse(r.isIncomplete());
-    }
-
-    @Test
-    public void testBackreferenceForWay_Full() throws OsmTransferException {
-        Way w = lookupWay(ds, 1);
-        assertNotNull(w);
-        // way with name "way-1" is referred to by two relations
-        //
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
-        reader.setReadFull(true);
-        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        assertEquals(6, referers.getWays().size());  // 6 ways referred by two relations
-        for (Way w1 : referers.getWays()) {
-            assertFalse(w1.isIncomplete());
-        }
-        assertEquals(2, referers.getRelations().size());  // two relations referring to
-        Set<Long> expectedNodeIds = new HashSet<>();
-        for (Way way : referers.getWays()) {
-            Way orig = (Way) ds.getPrimitiveById(way);
-            for (Node n : orig.getNodes()) {
-                expectedNodeIds.add(n.getId());
-            }
-        }
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-        for (Node n : referers.getNodes()) {
-            assertTrue(expectedNodeIds.contains(n.getId()));
-        }
-
-        Relation r = lookupRelation(referers, 0);
-        assertNotNull(r);
-        assertFalse(r.isIncomplete());
-        r = lookupRelation(referers, 1);
-        assertFalse(r.isIncomplete());
-    }
-
-    @Test
-    public void testBackreferenceForRelation() throws OsmTransferException {
-        Relation r = lookupRelation(ds, 1);
-        assertNotNull(r);
-        // way with name "relation-1" is referred to by four relations:
-        //    relation-6, relation-7, relation-8, relation-9
-        //
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
-        reader.setReadFull(false);
-        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
-        printNumberOfPrimitives(referers);
-
-        Set<Long> referringRelationsIds = new HashSet<>();
-        Relation r6 = lookupRelation(referers, 6);
-        assertNotNull(r6);
-        assertFalse(r6.isIncomplete());
-        referringRelationsIds.add(r6.getId());
-        Relation r7 = lookupRelation(referers, 7);
-        assertNotNull(r7);
-        assertFalse(r7.isIncomplete());
-        referringRelationsIds.add(r7.getId());
-        Relation r8 = lookupRelation(referers, 8);
-        assertNotNull(r8);
-        assertFalse(r8.isIncomplete());
-        referringRelationsIds.add(r8.getId());
-        Relation r9 = lookupRelation(referers, 9);
-        assertNotNull(r9);
-        assertFalse(r9.isIncomplete());
-        referringRelationsIds.add(r9.getId());
-
-        for (Relation r1 : referers.getRelations()) {
-            if (!referringRelationsIds.contains(r1.getId())) {
-                assertTrue(r1.isIncomplete());
-            }
-        }
-
-        // make sure we read all ways referred to by parent relations. These
-        // ways are incomplete after reading.
-        //
-        Set<Long> expectedWayIds = new HashSet<>();
-        for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-
-        assertEquals(expectedWayIds.size(), referers.getWays().size());
-        for (Way w1 : referers.getWays()) {
-            assertTrue(expectedWayIds.contains(w1.getId()));
-            assertTrue(w1.isIncomplete());
-        }
-
-        // make sure we read all nodes referred to by parent relations.
-        Set<Long> expectedNodeIds = new HashSet<>();
-        for (OsmPrimitive ref : r.getReferrers()) {
-            if (ref instanceof Relation) {
-                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
-            }
-        }
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-    }
-
-    protected static Set<Long> getNodeIdsInWay(Way way) {
-        HashSet<Long> ret = new HashSet<>();
-        if (way == null)return ret;
-        for (Node n: way.getNodes()) {
-            ret.add(n.getId());
-        }
-        return ret;
-    }
-
-    protected static Set<Long> getNodeIdsInRelation(Relation r, boolean children) {
-        HashSet<Long> ret = new HashSet<>();
-        if (r == null) return ret;
-        for (RelationMember m: r.getMembers()) {
-            if (m.isNode()) {
-                ret.add(m.getMember().getId());
-            } else if (m.isWay() && children) {
-                ret.addAll(getNodeIdsInWay(m.getWay()));
-            } else if (m.isRelation() && children) {
-                ret.addAll(getNodeIdsInRelation(m.getRelation(), true));
-            }
-        }
-        return ret;
-    }
-
-    protected static Set<Long> getWayIdsInRelation(Relation r, boolean children) {
-        HashSet<Long> ret = new HashSet<>();
-        if (r == null) return ret;
-        for (RelationMember m: r.getMembers()) {
-            if (m.isWay()) {
-                ret.add(m.getMember().getId());
-            } else if (m.isRelation() && children) {
-                ret.addAll(getWayIdsInRelation(m.getRelation(), true));
-            }
-        }
-        return ret;
-    }
-
-    @Test
-    public void testBackreferenceForRelation_Full() throws OsmTransferException {
-        Relation r = lookupRelation(ds, 1);
-        assertNotNull(r);
-        // way with name "relation-1" is referred to by four relations:
-        //    relation-6, relation-7, relation-8, relation-9
-        //
-
-        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
-        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
-        //
-        for (Relation r1 : referers.getRelations()) {
-            assertFalse(r1.isIncomplete());
-        }
-
-        // make sure we read all ways referred to by parent relations. These
-        // ways are completely read after reading the relations
-        //
-        Set<Long> expectedWayIds = new HashSet<>();
-        for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
-            if (m.isWay()) {
-                expectedWayIds.add(m.getMember().getId());
-            }
-        }
-        for (long id : expectedWayIds) {
-            Way w = (Way) referers.getPrimitiveById(id, OsmPrimitiveType.WAY);
-            assertNotNull(w);
-            assertFalse(w.isIncomplete());
-        }
-
-        Set<Long> expectedNodeIds = new HashSet<>();
-        for (int i = 6; i < 10; i++) {
-            Relation r1 = lookupRelation(ds, i);
-            expectedNodeIds.addAll(getNodeIdsInRelation(r1, true));
-        }
-
-        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
-        for (Node n : referers.getNodes()) {
-            assertTrue(expectedNodeIds.contains(n.getId()));
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
+import org.openstreetmap.josm.data.APIDataSet;
+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;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+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.data.projection.Projections;
+import org.openstreetmap.josm.gui.io.UploadStrategy;
+import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * Reads primitives referring to a particular primitive (ways including a node, relations referring to a relation)
+ * @since 1806
+ */
+public class OsmServerBackreferenceReaderTest {
+    static private final Logger logger = Logger.getLogger(OsmServerBackreferenceReader.class.getName());
+
+    protected static Node lookupNode(DataSet ds, int i) {
+        for (Node n : ds.getNodes()) {
+            if (("node-" + i).equals(n.get("name"))) return n;
+        }
+        fail("Cannot find node "+i);
+        return null;
+    }
+
+    protected static Way lookupWay(DataSet ds, int i) {
+        for (Way w : ds.getWays()) {
+            if (("way-" + i).equals(w.get("name"))) return w;
+        }
+        fail("Cannot find way "+i);
+        return null;
+    }
+
+    protected static Relation lookupRelation(DataSet ds, int i) {
+        for (Relation r : ds.getRelations()) {
+            if (("relation-" + i).equals(r.get("name"))) return r;
+        }
+        fail("Cannot find relation "+i);
+        return null;
+    }
+
+    protected static void populateTestDataSetWithNodes(DataSet ds) {
+        for (int i=0;i<100;i++) {
+            Node n = new Node();
+            n.setCoor(new LatLon(-36.6,47.6));
+            n.put("name", "node-"+i);
+            ds.addPrimitive(n);
+        }
+    }
+
+    protected static void populateTestDataSetWithWays(DataSet ds) {
+        for (int i=0;i<20;i++) {
+            Way w = new Way();
+            for (int j = 0; j < 10;j++) {
+                w.addNode(lookupNode(ds, i+j));
+            }
+            w.put("name", "way-"+i);
+            ds.addPrimitive(w);
+        }
+    }
+
+    protected static void populateTestDataSetWithRelations(DataSet ds) {
+        for (int i=0;i<10;i++) {
+            Relation r = new Relation();
+            r.put("name", "relation-" +i);
+            for (int j =0; j < 10; j++) {
+                RelationMember member = new RelationMember("node-" + j, lookupNode(ds, i + j));
+                r.addMember(member);
+            }
+            for (int j =0; j < 5; j++) {
+                RelationMember member = new RelationMember("way-" + j, lookupWay(ds, i + j));
+                r.addMember(member);
+            }
+            if (i > 5) {
+                for (int j =0; j < 3; j++) {
+                    RelationMember member = new RelationMember("relation-" + j, lookupRelation(ds, j));
+                    logger.info(MessageFormat.format("adding relation {0} to relation {1}", j, i));
+                    r.addMember(member);
+                }
+            }
+            ds.addPrimitive(r);
+        }
+    }
+
+    protected static DataSet buildTestDataSet() {
+        DataSet ds = new DataSet();
+        ds.setVersion("0.6");
+
+        populateTestDataSetWithNodes(ds);
+        populateTestDataSetWithWays(ds);
+        populateTestDataSetWithRelations(ds);
+        return ds;
+    }
+
+    /**
+     * creates the dataset on the server.
+     *
+     * @param ds the data set
+     * @throws OsmTransferException
+     */
+    static public void createDataSetOnServer(APIDataSet ds) throws OsmTransferException, CyclicUploadDependencyException {
+        logger.info("creating data set on the server ...");
+        ds.adjustRelationUploadOrder();
+        OsmServerWriter writer = new OsmServerWriter();
+        Changeset cs  = new Changeset();
+        writer.uploadOsm(
+                new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY),
+                ds.getPrimitives(), cs, NullProgressMonitor.INSTANCE);
+        OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
+    }
+
+    static DataSet testDataSet;
+
+    @BeforeClass
+    public static void init() throws OsmTransferException, CyclicUploadDependencyException {
+        logger.info("initializing ...");
+
+        JOSMFixture.createFunctionalTestFixture().init();
+
+        // don't use atomic upload, the test API server can't cope with large diff uploads
+        //
+        Main.pref.put("osm-server.atomic-upload", false);
+        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+        Main.logLevel = 4;
+
+        File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
+
+        String p = System.getProperty("useCachedDataset");
+        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
+            logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
+            return;
+        }
+
+        logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
+
+        // build and upload the test data set
+        //
+        logger.info("creating test data set ....");
+        testDataSet = buildTestDataSet();
+        logger.info("uploading test data set ...");
+        createDataSetOnServer(new APIDataSet(testDataSet));
+
+        try (
+            PrintWriter pw = new PrintWriter(
+                    new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
+        )) {
+            logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
+            try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
+                w.header();
+                w.writeDataSources(testDataSet);
+                w.writeContent(testDataSet);
+                w.footer();
+            }
+        } catch(IOException e) {
+            fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
+        }
+    }
+
+    private DataSet ds;
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() throws IOException, IllegalDataException {
+        File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
+        logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
+        ds = new DataSet();
+        try (FileInputStream fis = new FileInputStream(f)) {
+            ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
+        }
+    }
+
+    @Test
+    public void testBackreferenceForNode() throws OsmTransferException {
+        Node n = lookupNode(ds, 0);
+        assertNotNull(n);
+        Way w = lookupWay(ds, 0);
+        assertNotNull(w);
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
+        reader.setReadFull(false);
+        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        printNumberOfPrimitives(referers);
+
+        Set<Long> expectedNodeIds = new HashSet<>();
+        Set<Long> expectedWayIds = new HashSet<>();
+        Set<Long> expectedRelationIds = new HashSet<>();
+
+        for (OsmPrimitive ref : n.getReferrers()) {
+            if (ref instanceof Way) {
+                expectedWayIds.add(ref.getId());
+                expectedNodeIds.addAll(getNodeIdsInWay((Way) ref));
+            } else if (ref instanceof Relation) {
+                expectedRelationIds.add(ref.getId());
+                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, false));
+                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
+            }
+        }
+
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+        assertEquals(expectedWayIds.size(), referers.getWays().size());
+        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
+
+        for (Node node : referers.getNodes()) {
+            assertTrue(expectedNodeIds.contains(node.getId()));
+            assertFalse(node.isIncomplete());
+        }
+
+        for (Way way : referers.getWays()) {
+            assertTrue(expectedWayIds.contains(way.getId()));
+            assertEquals(n.getReferrers().contains(way), !way.isIncomplete());
+        }
+
+        for (Relation relation : referers.getRelations()) {
+            assertTrue(expectedRelationIds.contains(relation.getId()));
+            assertFalse(relation.isIncomplete());
+        }
+    }
+
+    private void printNumberOfPrimitives(DataSet referers) {
+        System.out.println("#nodes=" + referers.getNodes().size() +
+                " #ways=" + referers.getWays().size() +
+                " #relations=" + referers.getRelations().size());
+    }
+
+    @Test
+    public void testBackreferenceForNode_Full() throws OsmTransferException {
+        Node n = lookupNode(ds, 0);
+        assertNotNull(n);
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
+        reader.setReadFull(true);
+        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        printNumberOfPrimitives(referers);
+
+        Set<Long> expectedNodeIds = new HashSet<>();
+        Set<Long> expectedWayIds = new HashSet<>();
+        Set<Long> expectedRelationIds = new HashSet<>();
+        for (OsmPrimitive ref : n.getReferrers()) {
+            if (ref instanceof Way) {
+                expectedWayIds.add(ref.getId());
+                expectedNodeIds.addAll(getNodeIdsInWay((Way) ref));
+            } else if (ref instanceof Relation) {
+                expectedRelationIds.add(ref.getId());
+                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, true));
+                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, true));
+            }
+        }
+
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+        assertEquals(expectedWayIds.size(), referers.getWays().size());
+        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
+
+        for (Node node : referers.getNodes()) {
+            assertTrue(expectedNodeIds.contains(node.getId()));
+            assertFalse(node.isIncomplete());
+        }
+
+        for (Way way : referers.getWays()) {
+            assertTrue(expectedWayIds.contains(way.getId()));
+            assertFalse(way.isIncomplete());
+        }
+
+        for (Relation relation : referers.getRelations()) {
+            assertTrue(expectedRelationIds.contains(relation.getId()));
+            assertFalse(relation.isIncomplete());
+        }
+    }
+
+    @Test
+    public void testBackreferenceForWay() throws OsmTransferException {
+        Way w = lookupWay(ds, 1);
+        assertNotNull(w);
+        // way with name "way-1" is referred to by two relations
+        //
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
+        reader.setReadFull(false);
+        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        printNumberOfPrimitives(referers);
+
+        Set<Long> expectedNodeIds = new HashSet<>();
+        Set<Long> expectedWayIds = new HashSet<>();
+        Set<Long> expectedRelationIds = new HashSet<>();
+
+        for (OsmPrimitive ref : w.getReferrers()) {
+            if (ref instanceof Relation) {
+                expectedRelationIds.add(ref.getId());
+                expectedWayIds.addAll(getWayIdsInRelation((Relation) ref, false));
+                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
+            }
+        }
+
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+        assertEquals(expectedWayIds.size(), referers.getWays().size());
+        assertEquals(expectedRelationIds.size(), referers.getRelations().size());
+
+        for (Way w1 : referers.getWays()) {
+            assertTrue(w1.isIncomplete());
+        }
+        assertEquals(2, referers.getRelations().size());  // two relations referring to w
+
+        Relation r = lookupRelation(referers, 0);
+        assertNotNull(r);
+        assertFalse(r.isIncomplete());
+        r = lookupRelation(referers, 1);
+        assertFalse(r.isIncomplete());
+    }
+
+    @Test
+    public void testBackreferenceForWay_Full() throws OsmTransferException {
+        Way w = lookupWay(ds, 1);
+        assertNotNull(w);
+        // way with name "way-1" is referred to by two relations
+        //
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
+        reader.setReadFull(true);
+        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        assertEquals(6, referers.getWays().size());  // 6 ways referred by two relations
+        for (Way w1 : referers.getWays()) {
+            assertFalse(w1.isIncomplete());
+        }
+        assertEquals(2, referers.getRelations().size());  // two relations referring to
+        Set<Long> expectedNodeIds = new HashSet<>();
+        for (Way way : referers.getWays()) {
+            Way orig = (Way) ds.getPrimitiveById(way);
+            for (Node n : orig.getNodes()) {
+                expectedNodeIds.add(n.getId());
+            }
+        }
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+        for (Node n : referers.getNodes()) {
+            assertTrue(expectedNodeIds.contains(n.getId()));
+        }
+
+        Relation r = lookupRelation(referers, 0);
+        assertNotNull(r);
+        assertFalse(r.isIncomplete());
+        r = lookupRelation(referers, 1);
+        assertFalse(r.isIncomplete());
+    }
+
+    @Test
+    public void testBackreferenceForRelation() throws OsmTransferException {
+        Relation r = lookupRelation(ds, 1);
+        assertNotNull(r);
+        // way with name "relation-1" is referred to by four relations:
+        //    relation-6, relation-7, relation-8, relation-9
+        //
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
+        reader.setReadFull(false);
+        DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
+        printNumberOfPrimitives(referers);
+
+        Set<Long> referringRelationsIds = new HashSet<>();
+        Relation r6 = lookupRelation(referers, 6);
+        assertNotNull(r6);
+        assertFalse(r6.isIncomplete());
+        referringRelationsIds.add(r6.getId());
+        Relation r7 = lookupRelation(referers, 7);
+        assertNotNull(r7);
+        assertFalse(r7.isIncomplete());
+        referringRelationsIds.add(r7.getId());
+        Relation r8 = lookupRelation(referers, 8);
+        assertNotNull(r8);
+        assertFalse(r8.isIncomplete());
+        referringRelationsIds.add(r8.getId());
+        Relation r9 = lookupRelation(referers, 9);
+        assertNotNull(r9);
+        assertFalse(r9.isIncomplete());
+        referringRelationsIds.add(r9.getId());
+
+        for (Relation r1 : referers.getRelations()) {
+            if (!referringRelationsIds.contains(r1.getId())) {
+                assertTrue(r1.isIncomplete());
+            }
+        }
+
+        // make sure we read all ways referred to by parent relations. These
+        // ways are incomplete after reading.
+        //
+        Set<Long> expectedWayIds = new HashSet<>();
+        for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+
+        assertEquals(expectedWayIds.size(), referers.getWays().size());
+        for (Way w1 : referers.getWays()) {
+            assertTrue(expectedWayIds.contains(w1.getId()));
+            assertTrue(w1.isIncomplete());
+        }
+
+        // make sure we read all nodes referred to by parent relations.
+        Set<Long> expectedNodeIds = new HashSet<>();
+        for (OsmPrimitive ref : r.getReferrers()) {
+            if (ref instanceof Relation) {
+                expectedNodeIds.addAll(getNodeIdsInRelation((Relation) ref, false));
+            }
+        }
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+    }
+
+    protected static Set<Long> getNodeIdsInWay(Way way) {
+        HashSet<Long> ret = new HashSet<>();
+        if (way == null)return ret;
+        for (Node n: way.getNodes()) {
+            ret.add(n.getId());
+        }
+        return ret;
+    }
+
+    protected static Set<Long> getNodeIdsInRelation(Relation r, boolean children) {
+        HashSet<Long> ret = new HashSet<>();
+        if (r == null) return ret;
+        for (RelationMember m: r.getMembers()) {
+            if (m.isNode()) {
+                ret.add(m.getMember().getId());
+            } else if (m.isWay() && children) {
+                ret.addAll(getNodeIdsInWay(m.getWay()));
+            } else if (m.isRelation() && children) {
+                ret.addAll(getNodeIdsInRelation(m.getRelation(), true));
+            }
+        }
+        return ret;
+    }
+
+    protected static Set<Long> getWayIdsInRelation(Relation r, boolean children) {
+        HashSet<Long> ret = new HashSet<>();
+        if (r == null) return ret;
+        for (RelationMember m: r.getMembers()) {
+            if (m.isWay()) {
+                ret.add(m.getMember().getId());
+            } else if (m.isRelation() && children) {
+                ret.addAll(getWayIdsInRelation(m.getRelation(), true));
+            }
+        }
+        return ret;
+    }
+
+    @Test
+    public void testBackreferenceForRelation_Full() throws OsmTransferException {
+        Relation r = lookupRelation(ds, 1);
+        assertNotNull(r);
+        // way with name "relation-1" is referred to by four relations:
+        //    relation-6, relation-7, relation-8, relation-9
+        //
+
+        OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
+        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
+        //
+        for (Relation r1 : referers.getRelations()) {
+            assertFalse(r1.isIncomplete());
+        }
+
+        // make sure we read all ways referred to by parent relations. These
+        // ways are completely read after reading the relations
+        //
+        Set<Long> expectedWayIds = new HashSet<>();
+        for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
+            if (m.isWay()) {
+                expectedWayIds.add(m.getMember().getId());
+            }
+        }
+        for (long id : expectedWayIds) {
+            Way w = (Way) referers.getPrimitiveById(id, OsmPrimitiveType.WAY);
+            assertNotNull(w);
+            assertFalse(w.isIncomplete());
+        }
+
+        Set<Long> expectedNodeIds = new HashSet<>();
+        for (int i = 6; i < 10; i++) {
+            Relation r1 = lookupRelation(ds, i);
+            expectedNodeIds.addAll(getNodeIdsInRelation(r1, true));
+        }
+
+        assertEquals(expectedNodeIds.size(), referers.getNodes().size());
+        for (Node n : referers.getNodes()) {
+            assertTrue(expectedNodeIds.contains(n.getId()));
+        }
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/io/OsmServerHistoryReaderTest.java b/test/functional/org/openstreetmap/josm/io/OsmServerHistoryReaderTest.java
index d8de08e..8f8de42 100644
--- a/test/functional/org/openstreetmap/josm/io/OsmServerHistoryReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/OsmServerHistoryReaderTest.java
@@ -1,63 +1,63 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
-/**
- * History fetching tests. This test operates with production API.
- */
-public class OsmServerHistoryReaderTest {
-
-    /**
-     * Setup tests.
-     */
-    @BeforeClass
-    public static void init() {
-        Main.initApplicationPreferences();
-        Main.pref.put("osm-server.url", OsmApi.DEFAULT_API_URL);
-    }
-
-    /**
-     * Tests node history fetching.
-     * @throws OsmTransferException if any error occurs
-     */
-    @Test
-    public void testNode() throws OsmTransferException {
-        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.NODE, 266187);
-        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
-        History h = ds.getHistory(266187, OsmPrimitiveType.NODE);
-        assertTrue("NumVersions", h.getNumVersions() >= 4);
-    }
-
-    /**
-     * Tests way history fetching.
-     * @throws OsmTransferException if any error occurs
-     */
-    @Test
-    public void testWay() throws OsmTransferException {
-        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.WAY, 3058844);
-        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
-        History h = ds.getHistory(3058844, OsmPrimitiveType.WAY);
-        assertTrue("NumVersions", h.getNumVersions() >= 13);
-    }
-
-    /**
-     * Tests relation history fetching.
-     * @throws OsmTransferException if any error occurs
-     */
-    @Test
-    public void testRelation() throws OsmTransferException {
-        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.RELATION, 49);
-        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
-        History h = ds.getHistory(49, OsmPrimitiveType.RELATION);
-        assertTrue("NumVersions", h.getNumVersions() >= 3);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * History fetching tests. This test operates with production API.
+ */
+public class OsmServerHistoryReaderTest {
+
+    /**
+     * Setup tests.
+     */
+    @BeforeClass
+    public static void init() {
+        Main.initApplicationPreferences();
+        Main.pref.put("osm-server.url", OsmApi.DEFAULT_API_URL);
+    }
+
+    /**
+     * Tests node history fetching.
+     * @throws OsmTransferException if any error occurs
+     */
+    @Test
+    public void testNode() throws OsmTransferException {
+        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.NODE, 266187);
+        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
+        History h = ds.getHistory(266187, OsmPrimitiveType.NODE);
+        assertTrue("NumVersions", h.getNumVersions() >= 4);
+    }
+
+    /**
+     * Tests way history fetching.
+     * @throws OsmTransferException if any error occurs
+     */
+    @Test
+    public void testWay() throws OsmTransferException {
+        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.WAY, 3058844);
+        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
+        History h = ds.getHistory(3058844, OsmPrimitiveType.WAY);
+        assertTrue("NumVersions", h.getNumVersions() >= 13);
+    }
+
+    /**
+     * Tests relation history fetching.
+     * @throws OsmTransferException if any error occurs
+     */
+    @Test
+    public void testRelation() throws OsmTransferException {
+        OsmServerHistoryReader reader = new OsmServerHistoryReader(OsmPrimitiveType.RELATION, 49);
+        HistoryDataSet ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
+        History h = ds.getHistory(49, OsmPrimitiveType.RELATION);
+        assertTrue("NumVersions", h.getNumVersions() >= 3);
+    }
+}
diff --git a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
index accfecc..1a53bde 100644
--- a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
+++ b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
@@ -1,67 +1,67 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.io.UploadStrategySelectionPanel;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
- at Ignore
-public class UploadStrategySelectionPanelTest extends JFrame {
-
-    private UploadStrategySelectionPanel uploadStrategySelectionPanel;
-
-    protected void build()  {
-        getContentPane().setLayout(new BorderLayout());
-        uploadStrategySelectionPanel = new UploadStrategySelectionPanel();
-        getContentPane().add(uploadStrategySelectionPanel, BorderLayout.CENTER);
-        getContentPane().add(buildControlPanel(), BorderLayout.SOUTH);
-        setSize(400,400);
-    }
-
-
-    protected JPanel buildControlPanel() {
-        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        pnl.add(new JLabel("Num objects:"));
-        final JTextField tf;
-        pnl.add(tf = new JTextField(8));
-        tf.addActionListener(
-                new ActionListener() {
-                    public void actionPerformed(ActionEvent arg0) {
-                        int n = 0;
-                        try {
-                            n = Integer.parseInt(tf.getText());
-                        } catch(NumberFormatException e) {
-                            Main.error(e);
-                            return;
-                        }
-                        uploadStrategySelectionPanel.setNumUploadedObjects(n);
-                    }
-                }
-        );
-        return pnl;
-    }
-
-    /**
-     * Constructs a new {@code UploadStrategySelectionPanelTest}.
-     */
-    public UploadStrategySelectionPanelTest() {
-        build();
-        uploadStrategySelectionPanel.setNumUploadedObjects(51000);
-    }
-
-    public static void main(String args[]) throws OsmApiInitializationException, OsmTransferCanceledException{
-        OsmApi.getOsmApi().initialize(NullProgressMonitor.INSTANCE);
-        new UploadStrategySelectionPanelTest().setVisible(true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import org.junit.Ignore;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.io.UploadStrategySelectionPanel;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+ at Ignore
+public class UploadStrategySelectionPanelTest extends JFrame {
+
+    private UploadStrategySelectionPanel uploadStrategySelectionPanel;
+
+    protected void build()  {
+        getContentPane().setLayout(new BorderLayout());
+        uploadStrategySelectionPanel = new UploadStrategySelectionPanel();
+        getContentPane().add(uploadStrategySelectionPanel, BorderLayout.CENTER);
+        getContentPane().add(buildControlPanel(), BorderLayout.SOUTH);
+        setSize(400,400);
+    }
+
+
+    protected JPanel buildControlPanel() {
+        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        pnl.add(new JLabel("Num objects:"));
+        final JTextField tf;
+        pnl.add(tf = new JTextField(8));
+        tf.addActionListener(
+                new ActionListener() {
+                    public void actionPerformed(ActionEvent arg0) {
+                        int n = 0;
+                        try {
+                            n = Integer.parseInt(tf.getText());
+                        } catch(NumberFormatException e) {
+                            Main.error(e);
+                            return;
+                        }
+                        uploadStrategySelectionPanel.setNumUploadedObjects(n);
+                    }
+                }
+        );
+        return pnl;
+    }
+
+    /**
+     * Constructs a new {@code UploadStrategySelectionPanelTest}.
+     */
+    public UploadStrategySelectionPanelTest() {
+        build();
+        uploadStrategySelectionPanel.setNumUploadedObjects(51000);
+    }
+
+    public static void main(String args[]) throws OsmApiInitializationException, OsmTransferCanceledException{
+        OsmApi.getOsmApi().initialize(NullProgressMonitor.INSTANCE);
+        new UploadStrategySelectionPanelTest().setVisible(true);
+    }
+}
diff --git a/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
index 280746c..36bd03c 100644
--- a/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
@@ -1,48 +1,48 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.coor.LatLonTest;
-
-/**
- * Checks that rounding of coordinates is not too slow.
- */
-public class RoundingPerformanceTest {
-
-    private static double oldRoundToOsmPrecision(double value) {
-        // Old method, causes rounding errors, but efficient
-        return Math.round(value / LatLon.MAX_SERVER_PRECISION) * LatLon.MAX_SERVER_PRECISION;
-    }
-
-    /**
-     * Checks that rounding of coordinates is not too slow.
-     */
-    @Test
-    public void test() {
-        final int n = 1000000;
-        long start = System.nanoTime();
-        for (int i = 0; i < n; i++) {
-            for (double value : LatLonTest.SAMPLE_VALUES) {
-                oldRoundToOsmPrecision(value);
-            }
-        }
-        long end = System.nanoTime();
-        long oldTime = end-start;
-        System.out.println("Old time: "+oldTime/1000000.0 + " ms");
-
-        start = System.nanoTime();
-        for (int i = 0; i < n; i++) {
-            for (double value : LatLonTest.SAMPLE_VALUES) {
-                LatLon.roundToOsmPrecision(value);
-            }
-        }
-        end = System.nanoTime();
-        long newTime = end-start;
-        System.out.println("New time: "+newTime/1000000.0 + " ms");
-
-        assertTrue(newTime <= oldTime*12);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.LatLonTest;
+
+/**
+ * Checks that rounding of coordinates is not too slow.
+ */
+public class RoundingPerformanceTest {
+
+    private static double oldRoundToOsmPrecision(double value) {
+        // Old method, causes rounding errors, but efficient
+        return Math.round(value / LatLon.MAX_SERVER_PRECISION) * LatLon.MAX_SERVER_PRECISION;
+    }
+
+    /**
+     * Checks that rounding of coordinates is not too slow.
+     */
+    @Test
+    public void test() {
+        final int n = 1000000;
+        long start = System.nanoTime();
+        for (int i = 0; i < n; i++) {
+            for (double value : LatLonTest.SAMPLE_VALUES) {
+                oldRoundToOsmPrecision(value);
+            }
+        }
+        long end = System.nanoTime();
+        long oldTime = end-start;
+        System.out.println("Old time: "+oldTime/1000000.0 + " ms");
+
+        start = System.nanoTime();
+        for (int i = 0; i < n; i++) {
+            for (double value : LatLonTest.SAMPLE_VALUES) {
+                LatLon.roundToOsmPrecision(value);
+            }
+        }
+        end = System.nanoTime();
+        long newTime = end-start;
+        System.out.println("New time: "+newTime/1000000.0 + " ms");
+
+        assertTrue(newTime <= oldTime*12);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java
index 14d75ae..f427b1b 100644
--- a/test/unit/org/openstreetmap/josm/JOSMFixture.java
+++ b/test/unit/org/openstreetmap/josm/JOSMFixture.java
@@ -1,114 +1,114 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm;
-
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.nio.file.Paths;
-import java.text.MessageFormat;
-
-import org.openstreetmap.josm.data.projection.Projections;
-import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
-import org.openstreetmap.josm.io.OsmApi;
-import org.openstreetmap.josm.tools.I18n;
-
-/**
- * Fixture to define a proper and safe environment before running tests.
- */
-public class JOSMFixture {
-
-    /**
-     * Returns a new test fixture initialized to "unit" home.
-     * @return A new test fixture for unit tests
-     */
-    static public JOSMFixture createUnitTestFixture() {
-        return new JOSMFixture("test/config/unit-josm.home");
-    }
-
-    /**
-     * Returns a new test fixture initialized to "functional" home.
-     * @return A new test fixture for functional tests
-     */
-    static public JOSMFixture createFunctionalTestFixture() {
-        return new JOSMFixture("test/config/functional-josm.home");
-    }
-
-    /**
-     * Returns a new test fixture initialized to "performance" home.
-     * @return A new test fixture for performance tests
-     */
-    static public JOSMFixture createPerformanceTestFixture() {
-        return new JOSMFixture("test/config/performance-josm.home");
-    }
-
-    private final String josmHome;
-
-    /**
-     * Constructs a new text fixture initialized to a given josm home.
-     * @param josmHome The user home where preferences are to be read/written
-     */
-    public JOSMFixture(String josmHome) {
-        this.josmHome = josmHome;
-    }
-
-    /**
-     * Initializes the test fixture, without GUI.
-     */
-    public void init() {
-        init(false);
-    }
-
-    /**
-     * Initializes the test fixture, with or without GUI.
-     * @param createGui if {@code true} creates main GUI components
-     */
-    public void init(boolean createGui) {
-
-        // check josm.home
-        //
-        if (josmHome == null) {
-            fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
-        } else {
-            File f = new File(josmHome);
-            if (! f.exists() || ! f.canRead()) {
-                fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing ({2}) or not readable ({3}). Current directory is ''{4}''.",
-                        "josm.home", josmHome, f.exists(), f.canRead(), Paths.get("").toAbsolutePath()));
-            }
-        }
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.nio.file.Paths;
+import java.text.MessageFormat;
+
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.tools.I18n;
+
+/**
+ * Fixture to define a proper and safe environment before running tests.
+ */
+public class JOSMFixture {
+
+    /**
+     * Returns a new test fixture initialized to "unit" home.
+     * @return A new test fixture for unit tests
+     */
+    static public JOSMFixture createUnitTestFixture() {
+        return new JOSMFixture("test/config/unit-josm.home");
+    }
+
+    /**
+     * Returns a new test fixture initialized to "functional" home.
+     * @return A new test fixture for functional tests
+     */
+    static public JOSMFixture createFunctionalTestFixture() {
+        return new JOSMFixture("test/config/functional-josm.home");
+    }
+
+    /**
+     * Returns a new test fixture initialized to "performance" home.
+     * @return A new test fixture for performance tests
+     */
+    static public JOSMFixture createPerformanceTestFixture() {
+        return new JOSMFixture("test/config/performance-josm.home");
+    }
+
+    private final String josmHome;
+
+    /**
+     * Constructs a new text fixture initialized to a given josm home.
+     * @param josmHome The user home where preferences are to be read/written
+     */
+    public JOSMFixture(String josmHome) {
+        this.josmHome = josmHome;
+    }
+
+    /**
+     * Initializes the test fixture, without GUI.
+     */
+    public void init() {
+        init(false);
+    }
+
+    /**
+     * Initializes the test fixture, with or without GUI.
+     * @param createGui if {@code true} creates main GUI components
+     */
+    public void init(boolean createGui) {
+
+        // check josm.home
+        //
+        if (josmHome == null) {
+            fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
+        } else {
+            File f = new File(josmHome);
+            if (! f.exists() || ! f.canRead()) {
+                fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing ({2}) or not readable ({3}). Current directory is ''{4}''.",
+                        "josm.home", josmHome, f.exists(), f.canRead(), Paths.get("").toAbsolutePath()));
+            }
+        }
         System.setProperty("josm.home", josmHome);
-        Main.initApplicationPreferences();
-        Main.pref.enableSaveOnPut(false);
-        I18n.init();
-        // initialize the plaform hook, and
-        Main.determinePlatformHook();
-        // call the really early hook before we anything else
-        Main.platform.preStartupHook();
-
-        Main.pref.init(false);
-        I18n.set(Main.pref.get("language", "en"));
-
-        // init projection
-        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
-
-        // make sure we don't upload to or test against production
-        //
-        String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().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));
-        }
-
-        if (createGui) {
-            if (Main.toolbar == null) {
-                Main.toolbar = new ToolbarPreferences();
-            }
-            if (Main.main == null) {
-                new MainApplication();
-            }
-            if (Main.map == null) {
-                Main.main.createMapFrame(null, null);
-            }
-        }
-    }
-}
+        Main.initApplicationPreferences();
+        Main.pref.enableSaveOnPut(false);
+        I18n.init();
+        // initialize the plaform hook, and
+        Main.determinePlatformHook();
+        // call the really early hook before we anything else
+        Main.platform.preStartupHook();
+
+        Main.pref.init(false);
+        I18n.set(Main.pref.get("language", "en"));
+
+        // init projection
+        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+
+        // make sure we don't upload to or test against production
+        //
+        String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().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));
+        }
+
+        if (createGui) {
+            if (Main.toolbar == null) {
+                Main.toolbar = new ToolbarPreferences();
+            }
+            if (Main.main == null) {
+                new MainApplication();
+            }
+            if (Main.map == null) {
+                Main.main.createMapFrame(null, null);
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java b/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
index c3a3247..f675fda 100644
--- a/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
@@ -1,191 +1,191 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.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 AlignInLineAction.
- */
-public final class AlignInLineActionTest {
-
-    /** Class under test. */
-    private static AlignInLineAction action;
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init(true);
-
-        // Enable "Align in line" feature.
-        action = Main.main.menu.alignInLine;
-        action.setEnabled(true);
-    }
-
-    /**
-     * Test case: only nodes selected, part of an open way: align these nodes on the line passing through the extremity
-     * nodes (the most distant in the way sequence, not the most euclidean-distant). See
-     * https://josm.openstreetmap.de/ticket/9605#comment:3. Note that in this test, after alignment, way is overlapping
-     * itself.
-     */
-    @Test
-    public void nodesOpenWay() {
-        DataSet dataSet = new DataSet();
-        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
-
-        // Create test points, lower left is (0,0).
-        //
-        // 1 - - -
-        // - 3 - 2
-        // - - - -
-        Node point1 = new Node(new EastNorth(0, 2));
-        Node point2 = new Node(new EastNorth(3, 1));
-        Node point3 = new Node(new EastNorth(1, 1));
-
-        try {
-            Main.main.addLayer(layer);
-
-            // Create an open way.
-            createWay(dataSet, point1, point2, point3);
-
-            // Select nodes to align.
-            dataSet.addSelected(point1, point2, point3);
-
-            action.actionPerformed(null);
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.map.mapView.removeLayer(layer);
-        }
-
-        // Points 1 and 3 are the extremities and must not have moved. Only point 2 must have moved.
-        assertCoordEq(point1, 0, 2);
-        assertCoordEq(point2, 2, 0);
-        assertCoordEq(point3, 1, 1);
-    }
-
-    /**
-     * Test case: only nodes selected, part of a closed way: align these nodes on the line passing through the most
-     * distant nodes.
-     */
-    @Test
-    public void nodesClosedWay() {
-        DataSet dataSet = new DataSet();
-        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
-
-        // Create test points, lower left is (0,0).
-        //
-        // 4 - 3
-        // - - -
-        // 1 - 2
-        Node point1 = new Node(new EastNorth(0, 0));
-        Node point2 = new Node(new EastNorth(2, 0));
-        Node point3 = new Node(new EastNorth(2, 2));
-        Node point4 = new Node(new EastNorth(0, 2));
-
-        try {
-            Main.main.addLayer(layer);
-
-            // Create a closed way.
-            createWay(dataSet, point1, point2, point3, point4, point1);
-            // Select nodes to align (point1 must be in the second position to exhibit the bug).
-            dataSet.addSelected(point4, point1, point2);
-
-            action.actionPerformed(null);
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.map.mapView.removeLayer(layer);
-        }
-
-        // Only point 1 must have moved.
-        assertCoordEq(point1, 1, 1);
-        assertCoordEq(point2, 2, 0);
-        assertCoordEq(point3, 2, 2);
-        assertCoordEq(point4, 0, 2);
-    }
-
-    /**
-     * Test case: only nodes selected, part of multiple ways: align these nodes on the line passing through the most
-     * distant nodes.
-     */
-    @Test
-    public void nodesOpenWays() {
-        DataSet dataSet = new DataSet();
-        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
-
-        // Create test points, lower left is (0,0).
-        //
-        // 1 - -
-        // 3 - 2
-        // - - 4
-        Node point1 = new Node(new EastNorth(0, 2));
-        Node point2 = new Node(new EastNorth(2, 1));
-        Node point3 = new Node(new EastNorth(0, 1));
-        Node point4 = new Node(new EastNorth(2, 0));
-
-        try {
-            Main.main.addLayer(layer);
-
-            // Create 2 ways.
-            createWay(dataSet, point1, point2);
-            createWay(dataSet, point3, point4);
-
-            // Select nodes to align.
-            dataSet.addSelected(point1, point2, point3, point4);
-
-            // Points must align between points 1 and 4.
-            action.actionPerformed(null);
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.map.mapView.removeLayer(layer);
-        }
-
-        assertCoordEq(point1, 0, 2);
-        assertCoordEq(point2, 1.5, 0.5);
-        assertCoordEq(point3, 0.5, 1.5);
-        assertCoordEq(point4, 2, 0);
-    }
-
-    /**
-     * Create a way made of the provided nodes and select nodes.
-     *
-     * @param dataSet Dataset in which adding nodes.
-     * @param nodes List of nodes to add to dataset.
-     */
-    private void createWay(DataSet dataSet, Node... nodes) {
-        Way way = new Way();
-        dataSet.addPrimitive(way);
-
-        for (Node node : nodes) {
-            // Add primitive to dataset only if not already included.
-            if (dataSet.getPrimitiveById(node) == null)
-                dataSet.addPrimitive(node);
-
-            way.addNode(node);
-        }
-    }
-
-    /**
-     * Assert that the provided node has the specified coordinates. If not fail the test.
-     *
-     * @param node Node to test.
-     * @param x X coordinate.
-     * @param y Y coordinate.
-     */
-    private void assertCoordEq(Node node, double x, double y) {
-        EastNorth coordinate = node.getEastNorth();
-        assertEquals("Wrong x coordinate.", x, coordinate.getX(), LatLon.MAX_SERVER_PRECISION);
-        assertEquals("Wrong y coordinate.", y, coordinate.getY(), LatLon.MAX_SERVER_PRECISION);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.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 AlignInLineAction.
+ */
+public final class AlignInLineActionTest {
+
+    /** Class under test. */
+    private static AlignInLineAction action;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+
+        // Enable "Align in line" feature.
+        action = Main.main.menu.alignInLine;
+        action.setEnabled(true);
+    }
+
+    /**
+     * Test case: only nodes selected, part of an open way: align these nodes on the line passing through the extremity
+     * nodes (the most distant in the way sequence, not the most euclidean-distant). See
+     * https://josm.openstreetmap.de/ticket/9605#comment:3. Note that in this test, after alignment, way is overlapping
+     * itself.
+     */
+    @Test
+    public void nodesOpenWay() {
+        DataSet dataSet = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
+
+        // Create test points, lower left is (0,0).
+        //
+        // 1 - - -
+        // - 3 - 2
+        // - - - -
+        Node point1 = new Node(new EastNorth(0, 2));
+        Node point2 = new Node(new EastNorth(3, 1));
+        Node point3 = new Node(new EastNorth(1, 1));
+
+        try {
+            Main.main.addLayer(layer);
+
+            // Create an open way.
+            createWay(dataSet, point1, point2, point3);
+
+            // Select nodes to align.
+            dataSet.addSelected(point1, point2, point3);
+
+            action.actionPerformed(null);
+        } finally {
+            // Ensure we clean the place before leaving, even if test fails.
+            Main.map.mapView.removeLayer(layer);
+        }
+
+        // Points 1 and 3 are the extremities and must not have moved. Only point 2 must have moved.
+        assertCoordEq(point1, 0, 2);
+        assertCoordEq(point2, 2, 0);
+        assertCoordEq(point3, 1, 1);
+    }
+
+    /**
+     * Test case: only nodes selected, part of a closed way: align these nodes on the line passing through the most
+     * distant nodes.
+     */
+    @Test
+    public void nodesClosedWay() {
+        DataSet dataSet = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
+
+        // Create test points, lower left is (0,0).
+        //
+        // 4 - 3
+        // - - -
+        // 1 - 2
+        Node point1 = new Node(new EastNorth(0, 0));
+        Node point2 = new Node(new EastNorth(2, 0));
+        Node point3 = new Node(new EastNorth(2, 2));
+        Node point4 = new Node(new EastNorth(0, 2));
+
+        try {
+            Main.main.addLayer(layer);
+
+            // Create a closed way.
+            createWay(dataSet, point1, point2, point3, point4, point1);
+            // Select nodes to align (point1 must be in the second position to exhibit the bug).
+            dataSet.addSelected(point4, point1, point2);
+
+            action.actionPerformed(null);
+        } finally {
+            // Ensure we clean the place before leaving, even if test fails.
+            Main.map.mapView.removeLayer(layer);
+        }
+
+        // Only point 1 must have moved.
+        assertCoordEq(point1, 1, 1);
+        assertCoordEq(point2, 2, 0);
+        assertCoordEq(point3, 2, 2);
+        assertCoordEq(point4, 0, 2);
+    }
+
+    /**
+     * Test case: only nodes selected, part of multiple ways: align these nodes on the line passing through the most
+     * distant nodes.
+     */
+    @Test
+    public void nodesOpenWays() {
+        DataSet dataSet = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
+
+        // Create test points, lower left is (0,0).
+        //
+        // 1 - -
+        // 3 - 2
+        // - - 4
+        Node point1 = new Node(new EastNorth(0, 2));
+        Node point2 = new Node(new EastNorth(2, 1));
+        Node point3 = new Node(new EastNorth(0, 1));
+        Node point4 = new Node(new EastNorth(2, 0));
+
+        try {
+            Main.main.addLayer(layer);
+
+            // Create 2 ways.
+            createWay(dataSet, point1, point2);
+            createWay(dataSet, point3, point4);
+
+            // Select nodes to align.
+            dataSet.addSelected(point1, point2, point3, point4);
+
+            // Points must align between points 1 and 4.
+            action.actionPerformed(null);
+        } finally {
+            // Ensure we clean the place before leaving, even if test fails.
+            Main.map.mapView.removeLayer(layer);
+        }
+
+        assertCoordEq(point1, 0, 2);
+        assertCoordEq(point2, 1.5, 0.5);
+        assertCoordEq(point3, 0.5, 1.5);
+        assertCoordEq(point4, 2, 0);
+    }
+
+    /**
+     * Create a way made of the provided nodes and select nodes.
+     *
+     * @param dataSet Dataset in which adding nodes.
+     * @param nodes List of nodes to add to dataset.
+     */
+    private void createWay(DataSet dataSet, Node... nodes) {
+        Way way = new Way();
+        dataSet.addPrimitive(way);
+
+        for (Node node : nodes) {
+            // Add primitive to dataset only if not already included.
+            if (dataSet.getPrimitiveById(node) == null)
+                dataSet.addPrimitive(node);
+
+            way.addNode(node);
+        }
+    }
+
+    /**
+     * Assert that the provided node has the specified coordinates. If not fail the test.
+     *
+     * @param node Node to test.
+     * @param x X coordinate.
+     * @param y Y coordinate.
+     */
+    private void assertCoordEq(Node node, double x, double y) {
+        EastNorth coordinate = node.getEastNorth();
+        assertEquals("Wrong x coordinate.", x, coordinate.getX(), LatLon.MAX_SERVER_PRECISION);
+        assertEquals("Wrong y coordinate.", y, coordinate.getY(), LatLon.MAX_SERVER_PRECISION);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
index 27085c3..37221a9 100644
--- a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
@@ -1,45 +1,45 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-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.data.osm.DataSet;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.io.IllegalDataException;
-import org.openstreetmap.josm.io.OsmReader;
-
-/**
- * Unit tests of {@link JoinAreasAction} class.
- */
-public class JoinAreasActionTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
-
-    /**
-     * Non-regression test for bug #10511.
-     * @throws IOException if any I/O error occurs
-     * @throws IllegalDataException if OSM parsing fails
-     */
-    @Test
-    public void testTicket10511() throws IOException, IllegalDataException {
-        try (InputStream is = new FileInputStream(TestUtils.getRegressionDataFile(10511, "10511_mini.osm"))) {
-            DataSet ds = OsmReader.parseDataSet(is, null);
-            Main.map.mapView.addLayer(new OsmDataLayer(ds, null, null));
-            // FIXME enable this test after we fix the bug. Test disabled for now
-            // new JoinAreasAction().join(ds.getWays());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+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.data.osm.DataSet;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+
+/**
+ * Unit tests of {@link JoinAreasAction} class.
+ */
+public class JoinAreasActionTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Non-regression test for bug #10511.
+     * @throws IOException if any I/O error occurs
+     * @throws IllegalDataException if OSM parsing fails
+     */
+    @Test
+    public void testTicket10511() throws IOException, IllegalDataException {
+        try (InputStream is = new FileInputStream(TestUtils.getRegressionDataFile(10511, "10511_mini.osm"))) {
+            DataSet ds = OsmReader.parseDataSet(is, null);
+            Main.map.mapView.addLayer(new OsmDataLayer(ds, null, null));
+            // FIXME enable this test after we fix the bug. Test disabled for now
+            // new JoinAreasAction().join(ds.getWays());
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/corrector/ReverseWayTagCorrectorTest.java b/test/unit/org/openstreetmap/josm/corrector/ReverseWayTagCorrectorTest.java
index a8adb0f..682b94a 100644
--- a/test/unit/org/openstreetmap/josm/corrector/ReverseWayTagCorrectorTest.java
+++ b/test/unit/org/openstreetmap/josm/corrector/ReverseWayTagCorrectorTest.java
@@ -1,98 +1,98 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.corrector;
-
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.Tag;
-
-/**
- * Unit tests of {@link ReverseWayTagCorrector} class.
- */
-public class ReverseWayTagCorrectorTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Test of {@link ReverseWayTagCorrector.TagSwitcher#apply} method.
-     */
-    @Test
-    public void testTagSwitch() {
-        // oneway
-        assertSwitch(new Tag("oneway", "yes"), new Tag("oneway", "-1"));
-        assertSwitch(new Tag("oneway", "true"), new Tag("oneway", "-1"));
-        assertSwitch(new Tag("oneway", "-1"), new Tag("oneway", "yes"));
-        assertSwitch(new Tag("oneway", "no"), new Tag("oneway", "no"));
-        assertSwitch(new Tag("oneway", "something"), new Tag("oneway", "something"));
-        // incline/direction
-        for (String k : new String[]{"incline", "direction"}) {
-            assertSwitch(new Tag(k, "up"), new Tag(k, "down"));
-            assertSwitch(new Tag(k, "down"), new Tag(k, "up"));
-            assertSwitch(new Tag(k, "something"), new Tag(k, "something"));
-        }
-        // :forward/:backward (see #8518)
-        assertSwitch(new Tag("turn:forward", "right"), new Tag("turn:backward", "right"));
-        assertSwitch(new Tag("change:forward", "not_right"), new Tag("change:backward", "not_right"));
-        assertSwitch(new Tag("placement:forward", "right_of:1"), new Tag("placement:backward", "right_of:1"));
-        assertSwitch(new Tag("turn:lanes:forward", "left|right"), new Tag("turn:lanes:backward", "left|right"));
-        assertSwitch(new Tag("change:lanes:forward", "not_right|only_left"), new Tag("change:lanes:backward", "not_right|only_left"));
-        // keys
-        assertSwitch(new Tag("forward", "something"), new Tag("backward", "something"));
-        assertSwitch(new Tag("backward", "something"), new Tag("forward", "something"));
-        assertSwitch(new Tag("up", "something"), new Tag("down", "something"));
-        assertSwitch(new Tag("down", "something"), new Tag("up", "something"));
-        assertSwitch(new Tag("east", "something"), new Tag("west", "something"));
-        assertSwitch(new Tag("west", "something"), new Tag("east", "something"));
-        assertSwitch(new Tag("south", "something"), new Tag("north", "something"));
-        assertSwitch(new Tag("north", "something"), new Tag("south", "something"));
-        // values
-        assertSwitch(new Tag("something", "forward"), new Tag("something", "backward"));
-        assertSwitch(new Tag("something", "backward"), new Tag("something", "forward"));
-        assertSwitch(new Tag("something", "up"), new Tag("something", "down"));
-        assertSwitch(new Tag("something", "down"), new Tag("something", "up"));
-        assertSwitch(new Tag("something", "east"), new Tag("something", "west"));
-        assertSwitch(new Tag("something", "west"), new Tag("something", "east"));
-        assertSwitch(new Tag("something", "south"), new Tag("something", "north"));
-        assertSwitch(new Tag("something", "north"), new Tag("something", "south"));
-        // value[:_]suffix
-        assertSwitch(new Tag("something", "forward:suffix"), new Tag("something", "backward:suffix"));
-        assertSwitch(new Tag("something", "backward_suffix"), new Tag("something", "forward_suffix"));
-        assertSwitch(new Tag("something", "up:suffix"), new Tag("something", "down:suffix"));
-        assertSwitch(new Tag("something", "down_suffix"), new Tag("something", "up_suffix"));
-        assertSwitch(new Tag("something", "east:suffix"), new Tag("something", "west:suffix"));
-        assertSwitch(new Tag("something", "west_suffix"), new Tag("something", "east_suffix"));
-        assertSwitch(new Tag("something", "south:suffix"), new Tag("something", "north:suffix"));
-        assertSwitch(new Tag("something", "north_suffix"), new Tag("something", "south_suffix"));
-        // prefix[:_]value
-        assertSwitch(new Tag("something", "prefix:forward"), new Tag("something", "prefix:backward"));
-        assertSwitch(new Tag("something", "prefix_backward"), new Tag("something", "prefix_forward"));
-        assertSwitch(new Tag("something", "prefix:up"), new Tag("something", "prefix:down"));
-        assertSwitch(new Tag("something", "prefix_down"), new Tag("something", "prefix_up"));
-        assertSwitch(new Tag("something", "prefix:east"), new Tag("something", "prefix:west"));
-        assertSwitch(new Tag("something", "prefix_west"), new Tag("something", "prefix_east"));
-        assertSwitch(new Tag("something", "prefix:south"), new Tag("something", "prefix:north"));
-        assertSwitch(new Tag("something", "prefix_north"), new Tag("something", "prefix_south"));
-        // prefix[:_]value[:_]suffix
-        assertSwitch(new Tag("something", "prefix:forward:suffix"), new Tag("something", "prefix:backward:suffix"));
-        assertSwitch(new Tag("something", "prefix_backward:suffix"), new Tag("something", "prefix_forward:suffix"));
-        assertSwitch(new Tag("something", "prefix:up_suffix"), new Tag("something", "prefix:down_suffix"));
-        assertSwitch(new Tag("something", "prefix_down_suffix"), new Tag("something", "prefix_up_suffix"));
-        assertSwitch(new Tag("something", "prefix:east:suffix"), new Tag("something", "prefix:west:suffix"));
-        assertSwitch(new Tag("something", "prefix_west:suffix"), new Tag("something", "prefix_east:suffix"));
-        assertSwitch(new Tag("something", "prefix:south_suffix"), new Tag("something", "prefix:north_suffix"));
-        assertSwitch(new Tag("something", "prefix_north_suffix"), new Tag("something", "prefix_south_suffix"));
-        // #8499
-        assertSwitch(new Tag("type", "drawdown"), new Tag("type", "drawdown"));
-    }
-
-    private void assertSwitch(Tag oldTag, Tag newTag) {
-        Assert.assertEquals(ReverseWayTagCorrector.TagSwitcher.apply(oldTag), newTag);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.corrector;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Tag;
+
+/**
+ * Unit tests of {@link ReverseWayTagCorrector} class.
+ */
+public class ReverseWayTagCorrectorTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of {@link ReverseWayTagCorrector.TagSwitcher#apply} method.
+     */
+    @Test
+    public void testTagSwitch() {
+        // oneway
+        assertSwitch(new Tag("oneway", "yes"), new Tag("oneway", "-1"));
+        assertSwitch(new Tag("oneway", "true"), new Tag("oneway", "-1"));
+        assertSwitch(new Tag("oneway", "-1"), new Tag("oneway", "yes"));
+        assertSwitch(new Tag("oneway", "no"), new Tag("oneway", "no"));
+        assertSwitch(new Tag("oneway", "something"), new Tag("oneway", "something"));
+        // incline/direction
+        for (String k : new String[]{"incline", "direction"}) {
+            assertSwitch(new Tag(k, "up"), new Tag(k, "down"));
+            assertSwitch(new Tag(k, "down"), new Tag(k, "up"));
+            assertSwitch(new Tag(k, "something"), new Tag(k, "something"));
+        }
+        // :forward/:backward (see #8518)
+        assertSwitch(new Tag("turn:forward", "right"), new Tag("turn:backward", "right"));
+        assertSwitch(new Tag("change:forward", "not_right"), new Tag("change:backward", "not_right"));
+        assertSwitch(new Tag("placement:forward", "right_of:1"), new Tag("placement:backward", "right_of:1"));
+        assertSwitch(new Tag("turn:lanes:forward", "left|right"), new Tag("turn:lanes:backward", "left|right"));
+        assertSwitch(new Tag("change:lanes:forward", "not_right|only_left"), new Tag("change:lanes:backward", "not_right|only_left"));
+        // keys
+        assertSwitch(new Tag("forward", "something"), new Tag("backward", "something"));
+        assertSwitch(new Tag("backward", "something"), new Tag("forward", "something"));
+        assertSwitch(new Tag("up", "something"), new Tag("down", "something"));
+        assertSwitch(new Tag("down", "something"), new Tag("up", "something"));
+        assertSwitch(new Tag("east", "something"), new Tag("west", "something"));
+        assertSwitch(new Tag("west", "something"), new Tag("east", "something"));
+        assertSwitch(new Tag("south", "something"), new Tag("north", "something"));
+        assertSwitch(new Tag("north", "something"), new Tag("south", "something"));
+        // values
+        assertSwitch(new Tag("something", "forward"), new Tag("something", "backward"));
+        assertSwitch(new Tag("something", "backward"), new Tag("something", "forward"));
+        assertSwitch(new Tag("something", "up"), new Tag("something", "down"));
+        assertSwitch(new Tag("something", "down"), new Tag("something", "up"));
+        assertSwitch(new Tag("something", "east"), new Tag("something", "west"));
+        assertSwitch(new Tag("something", "west"), new Tag("something", "east"));
+        assertSwitch(new Tag("something", "south"), new Tag("something", "north"));
+        assertSwitch(new Tag("something", "north"), new Tag("something", "south"));
+        // value[:_]suffix
+        assertSwitch(new Tag("something", "forward:suffix"), new Tag("something", "backward:suffix"));
+        assertSwitch(new Tag("something", "backward_suffix"), new Tag("something", "forward_suffix"));
+        assertSwitch(new Tag("something", "up:suffix"), new Tag("something", "down:suffix"));
+        assertSwitch(new Tag("something", "down_suffix"), new Tag("something", "up_suffix"));
+        assertSwitch(new Tag("something", "east:suffix"), new Tag("something", "west:suffix"));
+        assertSwitch(new Tag("something", "west_suffix"), new Tag("something", "east_suffix"));
+        assertSwitch(new Tag("something", "south:suffix"), new Tag("something", "north:suffix"));
+        assertSwitch(new Tag("something", "north_suffix"), new Tag("something", "south_suffix"));
+        // prefix[:_]value
+        assertSwitch(new Tag("something", "prefix:forward"), new Tag("something", "prefix:backward"));
+        assertSwitch(new Tag("something", "prefix_backward"), new Tag("something", "prefix_forward"));
+        assertSwitch(new Tag("something", "prefix:up"), new Tag("something", "prefix:down"));
+        assertSwitch(new Tag("something", "prefix_down"), new Tag("something", "prefix_up"));
+        assertSwitch(new Tag("something", "prefix:east"), new Tag("something", "prefix:west"));
+        assertSwitch(new Tag("something", "prefix_west"), new Tag("something", "prefix_east"));
+        assertSwitch(new Tag("something", "prefix:south"), new Tag("something", "prefix:north"));
+        assertSwitch(new Tag("something", "prefix_north"), new Tag("something", "prefix_south"));
+        // prefix[:_]value[:_]suffix
+        assertSwitch(new Tag("something", "prefix:forward:suffix"), new Tag("something", "prefix:backward:suffix"));
+        assertSwitch(new Tag("something", "prefix_backward:suffix"), new Tag("something", "prefix_forward:suffix"));
+        assertSwitch(new Tag("something", "prefix:up_suffix"), new Tag("something", "prefix:down_suffix"));
+        assertSwitch(new Tag("something", "prefix_down_suffix"), new Tag("something", "prefix_up_suffix"));
+        assertSwitch(new Tag("something", "prefix:east:suffix"), new Tag("something", "prefix:west:suffix"));
+        assertSwitch(new Tag("something", "prefix_west:suffix"), new Tag("something", "prefix_east:suffix"));
+        assertSwitch(new Tag("something", "prefix:south_suffix"), new Tag("something", "prefix:north_suffix"));
+        assertSwitch(new Tag("something", "prefix_north_suffix"), new Tag("something", "prefix_south_suffix"));
+        // #8499
+        assertSwitch(new Tag("type", "drawdown"), new Tag("type", "drawdown"));
+    }
+
+    private void assertSwitch(Tag oldTag, Tag newTag) {
+        Assert.assertEquals(ReverseWayTagCorrector.TagSwitcher.apply(oldTag), newTag);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/BoundsTest.java b/test/unit/org/openstreetmap/josm/data/BoundsTest.java
index 8742d8e..f29b540 100644
--- a/test/unit/org/openstreetmap/josm/data/BoundsTest.java
+++ b/test/unit/org/openstreetmap/josm/data/BoundsTest.java
@@ -1,43 +1,43 @@
-package org.openstreetmap.josm.data;
-
-import org.junit.Test;
-import org.openstreetmap.josm.data.coor.LatLon;
-
-import static org.junit.Assert.assertTrue;
-
-public class BoundsTest {
-
-    @Test
-    public void crossingTests() {
-        Bounds b1 = new Bounds(0, 170, 50, -170);
-        assertTrue(b1.crosses180thMeridian());
-        assertTrue(!b1.contains(new LatLon(-10, -180)));
-        assertTrue(b1.contains(new LatLon(0, -180)));
-        assertTrue(b1.contains(new LatLon(50, -180)));
-        assertTrue(!b1.contains(new LatLon(60, -180)));
-        assertTrue(!b1.contains(new LatLon(-10, 180)));
-        assertTrue(b1.contains(new LatLon(0, 180)));
-        assertTrue(b1.contains(new LatLon(50, 180)));
-        assertTrue(!b1.contains(new LatLon(60, 180)));
-
-        Bounds b2 = new Bounds(60, 170, 90, -170);
-        assertTrue(!b1.intersects(b2));
-        assertTrue(!b2.intersects(b1));
-
-        Bounds b3 = new Bounds(25, 170, 90, -170);
-        assertTrue(b1.intersects(b3));
-        assertTrue(b3.intersects(b1));
-        assertTrue(b2.intersects(b3));
-        assertTrue(b3.intersects(b2));
-        
-        b3.extend(b1);
-        assertTrue(b3.equals(new Bounds(0, 170, 90, -170)));
-        assertTrue(b1.intersects(b3));
-        assertTrue(b3.intersects(b1));
-        assertTrue(b2.intersects(b3));
-        assertTrue(b3.intersects(b2));
-        
-        b3.extend(new LatLon(0, 0));
-        assertTrue(b3.equals(new Bounds(0, 0, 90, -170)));
-    }
-}
+package org.openstreetmap.josm.data;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+import static org.junit.Assert.assertTrue;
+
+public class BoundsTest {
+
+    @Test
+    public void crossingTests() {
+        Bounds b1 = new Bounds(0, 170, 50, -170);
+        assertTrue(b1.crosses180thMeridian());
+        assertTrue(!b1.contains(new LatLon(-10, -180)));
+        assertTrue(b1.contains(new LatLon(0, -180)));
+        assertTrue(b1.contains(new LatLon(50, -180)));
+        assertTrue(!b1.contains(new LatLon(60, -180)));
+        assertTrue(!b1.contains(new LatLon(-10, 180)));
+        assertTrue(b1.contains(new LatLon(0, 180)));
+        assertTrue(b1.contains(new LatLon(50, 180)));
+        assertTrue(!b1.contains(new LatLon(60, 180)));
+
+        Bounds b2 = new Bounds(60, 170, 90, -170);
+        assertTrue(!b1.intersects(b2));
+        assertTrue(!b2.intersects(b1));
+
+        Bounds b3 = new Bounds(25, 170, 90, -170);
+        assertTrue(b1.intersects(b3));
+        assertTrue(b3.intersects(b1));
+        assertTrue(b2.intersects(b3));
+        assertTrue(b3.intersects(b2));
+        
+        b3.extend(b1);
+        assertTrue(b3.equals(new Bounds(0, 170, 90, -170)));
+        assertTrue(b1.intersects(b3));
+        assertTrue(b3.intersects(b1));
+        assertTrue(b2.intersects(b3));
+        assertTrue(b3.intersects(b2));
+        
+        b3.extend(new LatLon(0, 0));
+        assertTrue(b3.equals(new Bounds(0, 0, 90, -170)));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
index 10b39ca..02082b2 100644
--- a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
+++ b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
@@ -1,123 +1,123 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.coor;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class LatLonTest {
-
-    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,
-            0.12, 0.123, 0.1234, 0.12345, 0.123456, 0.1234567,
-            1.12, 1.123, 1.1234, 1.12345, 1.123456, 1.1234567,
-            10.12, 10.123, 10.1234, 10.12345, 10.123456, 10.1234567,
-            100.12, 100.123, 100.1234, 100.12345, 100.123456, 100.1234567
-           };
-
-    /**
-     * Test of {@link LatLon#roundToOsmPrecisionStrict}
-     */
-    @Test
-    public void testRoundToOsmPrecisionStrict() {
-
-        for (double value : SAMPLE_VALUES) {
-            assertEquals(LatLon.roundToOsmPrecisionStrict(value), value, 0);
-        }
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(0.0), 0.0, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(-0.0), 0.0, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(0.12345678),  0.1234568, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(0.123456789), 0.1234568, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(1.12345678),  1.1234568, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(1.123456789), 1.1234568, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(10.12345678),  10.1234568, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(10.123456789), 10.1234568, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.12345678),  100.1234568, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.123456789), 100.1234568, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000000000001),  100.0000000, 0);
-
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999),  99.9999999, 0);
-    }
-
-    /**
-     * Test of {@link LatLon#toIntervalLon}
-     */
-    @Test
-    public void testToIntervalLon() {
-        assertEquals(-180.0, LatLon.toIntervalLon(-180.0), 0);
-        assertEquals(0.0, LatLon.toIntervalLon(0.0), 0);
-        assertEquals(180.0, LatLon.toIntervalLon(180.0), 0);
-
-        assertEquals(179.0, LatLon.toIntervalLon(-181.0), 0);
-        assertEquals(-179.0, LatLon.toIntervalLon(181.0), 0);
-
-        assertEquals(-1.0, LatLon.toIntervalLon(359.0), 0);
-        assertEquals(1.0, LatLon.toIntervalLon(-359.0), 0);
-
-        assertEquals(1.0, LatLon.toIntervalLon(361.0), 0);
-        assertEquals(-1.0, LatLon.toIntervalLon(-361.0), 0);
-
-        assertEquals(179.0, LatLon.toIntervalLon(539.0), 0);
-        assertEquals(-179.0, LatLon.toIntervalLon(-539.0), 0);
-
-        assertEquals(-179.0, LatLon.toIntervalLon(541.0), 0);
-        assertEquals(179.0, LatLon.toIntervalLon(-541.0), 0);
-    }
-
-    /**
-     * Test of {@link LatLon#equals}
-     */
-    @Test
-    public void testEquals() {
-        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
-            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            assertEquals(a, b);
-        }
-    }
-
-    /**
-     * Test of {@link LatLon#hashCode}
-     */
-    @Test
-    public void testHashCode() {
-        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
-            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            assertEquals(a.hashCode(), b.hashCode());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.coor;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class LatLonTest {
+
+    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,
+            0.12, 0.123, 0.1234, 0.12345, 0.123456, 0.1234567,
+            1.12, 1.123, 1.1234, 1.12345, 1.123456, 1.1234567,
+            10.12, 10.123, 10.1234, 10.12345, 10.123456, 10.1234567,
+            100.12, 100.123, 100.1234, 100.12345, 100.123456, 100.1234567
+           };
+
+    /**
+     * Test of {@link LatLon#roundToOsmPrecisionStrict}
+     */
+    @Test
+    public void testRoundToOsmPrecisionStrict() {
+
+        for (double value : SAMPLE_VALUES) {
+            assertEquals(LatLon.roundToOsmPrecisionStrict(value), value, 0);
+        }
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(0.0), 0.0, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(-0.0), 0.0, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(0.12345678),  0.1234568, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(0.123456789), 0.1234568, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(1.12345678),  1.1234568, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(1.123456789), 1.1234568, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(10.12345678),  10.1234568, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(10.123456789), 10.1234568, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.12345678),  100.1234568, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.123456789), 100.1234568, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.000000000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.0000000000000000001),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(100.00000000000000000001),  100.0000000, 0);
+
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.999999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.99999999),  100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecisionStrict(99.9999999),  99.9999999, 0);
+    }
+
+    /**
+     * Test of {@link LatLon#toIntervalLon}
+     */
+    @Test
+    public void testToIntervalLon() {
+        assertEquals(-180.0, LatLon.toIntervalLon(-180.0), 0);
+        assertEquals(0.0, LatLon.toIntervalLon(0.0), 0);
+        assertEquals(180.0, LatLon.toIntervalLon(180.0), 0);
+
+        assertEquals(179.0, LatLon.toIntervalLon(-181.0), 0);
+        assertEquals(-179.0, LatLon.toIntervalLon(181.0), 0);
+
+        assertEquals(-1.0, LatLon.toIntervalLon(359.0), 0);
+        assertEquals(1.0, LatLon.toIntervalLon(-359.0), 0);
+
+        assertEquals(1.0, LatLon.toIntervalLon(361.0), 0);
+        assertEquals(-1.0, LatLon.toIntervalLon(-361.0), 0);
+
+        assertEquals(179.0, LatLon.toIntervalLon(539.0), 0);
+        assertEquals(-179.0, LatLon.toIntervalLon(-539.0), 0);
+
+        assertEquals(-179.0, LatLon.toIntervalLon(541.0), 0);
+        assertEquals(179.0, LatLon.toIntervalLon(-541.0), 0);
+    }
+
+    /**
+     * Test of {@link LatLon#equals}
+     */
+    @Test
+    public void testEquals() {
+        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
+            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
+            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
+            assertEquals(a, b);
+        }
+    }
+
+    /**
+     * Test of {@link LatLon#hashCode}
+     */
+    @Test
+    public void testHashCode() {
+        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
+            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
+            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
+            assertEquals(a.hashCode(), b.hashCode());
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java b/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java
index 33d4055..b37a354 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java
@@ -1,261 +1,261 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.util.List;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
-import org.openstreetmap.josm.data.APIDataSet;
-
-public class APIDataSetTest {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void oneNewRelationOnly() {
-        Relation r = new Relation();
-        r.put("name", "r1");
-        DataSet ds = new DataSet();
-        ds.addPrimitive(r);
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch(CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
-
-        assertEquals(1, toAdd.size());
-        assertEquals(r, toAdd.get(0));
-    }
-
-    @Test
-    public void newParentChildPair() {
-        DataSet ds = new DataSet();
-        Relation r1 = new Relation();
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-
-        Relation r2 = new Relation();
-        ds.addPrimitive(r2);
-        r2.put("name", "r2");
-
-        r1.addMember(new RelationMember("", r2));
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch(CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
-
-        assertEquals(2, toAdd.size());
-        assertEquals(r2, toAdd.get(0)); // child first
-        assertEquals(r1, toAdd.get(1)); // ... then the parent
-    }
-
-    @Test
-    public void oneExistingAndThreNewInAChain() {
-        DataSet ds = new DataSet();
-
-        Relation r1 = new Relation();
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-
-        Relation r2 = new Relation();
-        ds.addPrimitive(r2);
-        r2.put("name", "r2");
-
-        Relation r3 = new Relation();
-        ds.addPrimitive(r3);
-        r3.put("name", "r3");
-
-        Relation r4 = new Relation(1, 1);
-        ds.addPrimitive(r4);
-        r4.put("name", "r4");
-        r4.setModified(true);
-
-        r1.addMember(new RelationMember("", r2));
-        r2.addMember(new RelationMember("", r3));
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch(CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
-
-        assertEquals(3, toAdd.size());
-        assertEquals(r3, toAdd.get(0));
-        assertEquals(r2, toAdd.get(1));
-        assertEquals(r1, toAdd.get(2));
-
-        List<OsmPrimitive> toUpdate = apiDataSet.getPrimitivesToUpdate();
-        assertEquals(1, toUpdate.size());
-        assertEquals(r4, toUpdate.get(0));
-    }
-
-    @Test
-    public void oneParentTwoNewChildren() {
-        DataSet ds = new DataSet();
-        Relation r1 = new Relation();
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-
-        Relation r2 = new Relation();
-        ds.addPrimitive(r2);
-        r2.put("name", "r2");
-
-        Relation r3 = new Relation();
-        ds.addPrimitive(r3);
-        r3.put("name", "r3");
-
-        r1.addMember(new RelationMember("", r2));
-        r1.addMember(new RelationMember("", r3));
-
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch(CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
-
-        assertEquals(3, toAdd.size());
-        assertEquals(true, toAdd.indexOf(r2) < toAdd.indexOf(r1));
-        assertEquals(true, toAdd.indexOf(r3) < toAdd.indexOf(r1));
-    }
-
-    @Test // for ticket #9624
-    public void deleteOneParentTwoNewChildren() {
-        DataSet ds = new DataSet();
-        Relation r1 = new Relation(1);
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-
-        Relation r2 = new Relation(2);
-        ds.addPrimitive(r2);
-        r2.put("name", "r2");
-
-        Relation r3 = new Relation(3);
-        ds.addPrimitive(r3);
-        r3.put("name", "r3");
-
-        Relation r4 = new Relation(4);
-        ds.addPrimitive(r4);
-        r4.put("name", "unrelated");
-
-
-        r1.addMember(new RelationMember("", r2));
-        r1.addMember(new RelationMember("", r3));
-
-        r1.setDeleted(true);
-        r2.setDeleted(true);
-        r3.setDeleted(true);
-        r4.setDeleted(true);
-
-
-        APIDataSet apiDataSet = new APIDataSet();
-        // add r1 first to test functionality of APIDataSet#adjustRelationUploadOrder()
-        apiDataSet.getPrimitivesToDelete().add(r1);
-        apiDataSet.getPrimitivesToDelete().add(r2);
-        apiDataSet.getPrimitivesToDelete().add(r3);
-        apiDataSet.getPrimitivesToDelete().add(r4);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch(CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
-
-        assertEquals(4, toDelete.size());
-        assertEquals(true, toDelete.indexOf(r2) < toDelete.indexOf(r1));
-        assertEquals(true, toDelete.indexOf(r3) < toDelete.indexOf(r1));
-    }
-
-    @Test // for ticket #9656
-    public void deleteWay() {
-        DataSet ds = new DataSet();
-        final Way way = new Way(1, 2);
-        way.put("highway", "unclassified");
-        ds.addPrimitive(way);
-
-        final Node n1 = new Node(2);
-        ds.addPrimitive(n1);
-        way.addNode(n1);
-
-        final Node n2 = new Node(3);
-        ds.addPrimitive(n2);
-        way.addNode(n2);
-
-        Relation r1 = new Relation(4, 2);
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-        r1.addMember(new RelationMember("foo", way));
-
-
-        r1.setDeleted(true);
-        way.setDeleted(true);
-        n1.setDeleted(true);
-        n2.setDeleted(true);
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-        } catch (CyclicUploadDependencyException e) {
-            fail("unexpected exception:" + e);
-        }
-        List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
-
-        assertEquals(4, toDelete.size());
-        assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n1));
-        assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n2));
-        assertEquals(true, toDelete.indexOf(r1) < toDelete.indexOf(way));
-    }
-
-    @Test
-    public void oneCycle() {
-        DataSet ds = new DataSet();
-        Relation r1 = new Relation();
-        ds.addPrimitive(r1);
-        r1.put("name", "r1");
-
-        Relation r2 = new Relation();
-        ds.addPrimitive(r2);
-        r2.put("name", "r2");
-
-        Relation r3 = new Relation();
-        ds.addPrimitive(r3);
-        r3.put("name", "r3");
-
-        r1.addMember(new RelationMember("", r2));
-        r2.addMember(new RelationMember("", r3));
-        r3.addMember(new RelationMember("", r1));
-
-        APIDataSet apiDataSet = new APIDataSet();
-        apiDataSet.init(ds);
-        try {
-            apiDataSet.adjustRelationUploadOrder();
-            fail("expected cyclic upload dependency exception not thrown");
-        } catch(CyclicUploadDependencyException e) {
-            System.out.println(e);
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
+import org.openstreetmap.josm.data.APIDataSet;
+
+public class APIDataSetTest {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void oneNewRelationOnly() {
+        Relation r = new Relation();
+        r.put("name", "r1");
+        DataSet ds = new DataSet();
+        ds.addPrimitive(r);
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch(CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
+
+        assertEquals(1, toAdd.size());
+        assertEquals(r, toAdd.get(0));
+    }
+
+    @Test
+    public void newParentChildPair() {
+        DataSet ds = new DataSet();
+        Relation r1 = new Relation();
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+
+        Relation r2 = new Relation();
+        ds.addPrimitive(r2);
+        r2.put("name", "r2");
+
+        r1.addMember(new RelationMember("", r2));
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch(CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
+
+        assertEquals(2, toAdd.size());
+        assertEquals(r2, toAdd.get(0)); // child first
+        assertEquals(r1, toAdd.get(1)); // ... then the parent
+    }
+
+    @Test
+    public void oneExistingAndThreNewInAChain() {
+        DataSet ds = new DataSet();
+
+        Relation r1 = new Relation();
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+
+        Relation r2 = new Relation();
+        ds.addPrimitive(r2);
+        r2.put("name", "r2");
+
+        Relation r3 = new Relation();
+        ds.addPrimitive(r3);
+        r3.put("name", "r3");
+
+        Relation r4 = new Relation(1, 1);
+        ds.addPrimitive(r4);
+        r4.put("name", "r4");
+        r4.setModified(true);
+
+        r1.addMember(new RelationMember("", r2));
+        r2.addMember(new RelationMember("", r3));
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch(CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
+
+        assertEquals(3, toAdd.size());
+        assertEquals(r3, toAdd.get(0));
+        assertEquals(r2, toAdd.get(1));
+        assertEquals(r1, toAdd.get(2));
+
+        List<OsmPrimitive> toUpdate = apiDataSet.getPrimitivesToUpdate();
+        assertEquals(1, toUpdate.size());
+        assertEquals(r4, toUpdate.get(0));
+    }
+
+    @Test
+    public void oneParentTwoNewChildren() {
+        DataSet ds = new DataSet();
+        Relation r1 = new Relation();
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+
+        Relation r2 = new Relation();
+        ds.addPrimitive(r2);
+        r2.put("name", "r2");
+
+        Relation r3 = new Relation();
+        ds.addPrimitive(r3);
+        r3.put("name", "r3");
+
+        r1.addMember(new RelationMember("", r2));
+        r1.addMember(new RelationMember("", r3));
+
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch(CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
+
+        assertEquals(3, toAdd.size());
+        assertEquals(true, toAdd.indexOf(r2) < toAdd.indexOf(r1));
+        assertEquals(true, toAdd.indexOf(r3) < toAdd.indexOf(r1));
+    }
+
+    @Test // for ticket #9624
+    public void deleteOneParentTwoNewChildren() {
+        DataSet ds = new DataSet();
+        Relation r1 = new Relation(1);
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+
+        Relation r2 = new Relation(2);
+        ds.addPrimitive(r2);
+        r2.put("name", "r2");
+
+        Relation r3 = new Relation(3);
+        ds.addPrimitive(r3);
+        r3.put("name", "r3");
+
+        Relation r4 = new Relation(4);
+        ds.addPrimitive(r4);
+        r4.put("name", "unrelated");
+
+
+        r1.addMember(new RelationMember("", r2));
+        r1.addMember(new RelationMember("", r3));
+
+        r1.setDeleted(true);
+        r2.setDeleted(true);
+        r3.setDeleted(true);
+        r4.setDeleted(true);
+
+
+        APIDataSet apiDataSet = new APIDataSet();
+        // add r1 first to test functionality of APIDataSet#adjustRelationUploadOrder()
+        apiDataSet.getPrimitivesToDelete().add(r1);
+        apiDataSet.getPrimitivesToDelete().add(r2);
+        apiDataSet.getPrimitivesToDelete().add(r3);
+        apiDataSet.getPrimitivesToDelete().add(r4);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch(CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
+
+        assertEquals(4, toDelete.size());
+        assertEquals(true, toDelete.indexOf(r2) < toDelete.indexOf(r1));
+        assertEquals(true, toDelete.indexOf(r3) < toDelete.indexOf(r1));
+    }
+
+    @Test // for ticket #9656
+    public void deleteWay() {
+        DataSet ds = new DataSet();
+        final Way way = new Way(1, 2);
+        way.put("highway", "unclassified");
+        ds.addPrimitive(way);
+
+        final Node n1 = new Node(2);
+        ds.addPrimitive(n1);
+        way.addNode(n1);
+
+        final Node n2 = new Node(3);
+        ds.addPrimitive(n2);
+        way.addNode(n2);
+
+        Relation r1 = new Relation(4, 2);
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+        r1.addMember(new RelationMember("foo", way));
+
+
+        r1.setDeleted(true);
+        way.setDeleted(true);
+        n1.setDeleted(true);
+        n2.setDeleted(true);
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+        } catch (CyclicUploadDependencyException e) {
+            fail("unexpected exception:" + e);
+        }
+        List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
+
+        assertEquals(4, toDelete.size());
+        assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n1));
+        assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n2));
+        assertEquals(true, toDelete.indexOf(r1) < toDelete.indexOf(way));
+    }
+
+    @Test
+    public void oneCycle() {
+        DataSet ds = new DataSet();
+        Relation r1 = new Relation();
+        ds.addPrimitive(r1);
+        r1.put("name", "r1");
+
+        Relation r2 = new Relation();
+        ds.addPrimitive(r2);
+        r2.put("name", "r2");
+
+        Relation r3 = new Relation();
+        ds.addPrimitive(r3);
+        r3.put("name", "r3");
+
+        r1.addMember(new RelationMember("", r2));
+        r2.addMember(new RelationMember("", r3));
+        r3.addMember(new RelationMember("", r1));
+
+        APIDataSet apiDataSet = new APIDataSet();
+        apiDataSet.init(ds);
+        try {
+            apiDataSet.adjustRelationUploadOrder();
+            fail("expected cyclic upload dependency exception not thrown");
+        } catch(CyclicUploadDependencyException e) {
+            System.out.println(e);
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy b/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
index 7be4a20..156bc88 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
+++ b/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
@@ -1,167 +1,167 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import java.net.InetAddress.Cache;
-import org.junit.Test 
-
-
-import static org.junit.Assert.*;
-
-class ChangesetCacheTest {
-	
-	@Test
-	public void test_Constructor() {
-	    ChangesetCache cache = ChangesetCache.getInstance()
-		assert cache != null
-	}
-	
-	@Test
-	public void test_addAndRemoveListeners() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-		
-		// should work
-		cache.addChangesetCacheListener null
-		
-		// should work 
-		def listener = new ChangesetCacheListener() {
-			public void changesetCacheUpdated(ChangesetCacheEvent event) {} 
-		}		
-		cache.addChangesetCacheListener listener
-		// adding a second time - should work too
-		cache.addChangesetCacheListener listener
-		assert cache. at listeners.size() == 1 // ... but only added once 
-		
-		cache.removeChangesetCacheListener null
-		
-		cache.removeChangesetCacheListener listener 
-		assert cache. at listeners.size() == 0
-	}
-	
-	@Test
-	public void update_get_remove_cycle() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-		
-		cache.update new Changeset(1)
-		assert cache.size() == 1
-		assert cache.get(1) != null
-		assert cache.get(1).id == 1
-		cache.remove(1)
-		assert cache.size() == 0
-	}
-	
-	@Test
-	public void updateTwice() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-
-		Changeset cs = new Changeset(1)
-		cs.incomplete = false
-		cs.put "key1", "value1"
-		cs.open = true
-		cache.update cs
-		
-		Changeset cs2 = new Changeset(cs)
-		assert cs2 != null
-		cs2.put "key2", "value2"
-		cs2.open = false
-		cache.update(cs2)
-		
-		assert cache.size() == 1
-		assert cache.get(1) != null
-		
-		cs = cache.get(1)
-		assert cs.get("key1") == "value1"
-		assert cs.get("key2") == "value2"
-		assert !cs.open		
-	}
-	
-	
-	@Test
-	public void contains() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache. at listeners.clear()
-		cache.clear()
-		
-		
-		Changeset cs = new Changeset(1)
-		cache.update cs
-		
-		assert cache.contains(1)
-		assert cache.contains(cs)
-		assert cache.contains(new Changeset(cs))
-		
-		assert ! cache.contains(2)
-		assert ! cache.contains(new Changeset(2))
-		assert ! cache.contains(null)
-	}
-	
-	@Test
-	public void fireingEvents_AddAChangeset() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-		cache. at listeners.clear()
-		
-		// should work 
-		def listener = new ChangesetCacheListener() {
-					public void changesetCacheUpdated(ChangesetCacheEvent event) {
-					    assert event != null
-						assert event.getAddedChangesets().size() == 1
-						assert event.getRemovedChangesets().empty
-						assert event.getUpdatedChangesets().empty
-						assert event.getSource() == cache 
-					} 
-		}   
-		cache.addChangesetCacheListener listener
-		cache.update(new Changeset(1))
-		cache.removeChangesetCacheListener listener
-	}
-	
-	@Test
-	public void fireingEvents_UpdateChangeset() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-		cache. at listeners.clear()
-		
-		// should work 
-		def listener = new ChangesetCacheListener() {
-					public void changesetCacheUpdated(ChangesetCacheEvent event) {
-						assert event != null
-						assert event.getAddedChangesets().empty
-						assert event.getRemovedChangesets().empty
-						assert event.getUpdatedChangesets().size() == 1
-						assert event.getSource() == cache 
-					} 
-				}   
-		cache.update(new Changeset(1))
-		
-		cache.addChangesetCacheListener listener
-		cache.update(new Changeset(1))
-		cache.removeChangesetCacheListener listener
-	}
-	
-	@Test
-	public void fireingEvents_RemoveChangeset() {
-		ChangesetCache cache = ChangesetCache.getInstance()
-		cache.clear()
-		cache. at listeners.clear()
-		
-		// should work 
-		def listener = new ChangesetCacheListener() {
-					public void changesetCacheUpdated(ChangesetCacheEvent event) {
-						assert event != null
-						assert event.getAddedChangesets().empty
-						assert event.getRemovedChangesets().size() == 1
-						assert event.getUpdatedChangesets().empty
-						assert event.getSource() == cache 
-					} 
-				}   
-		cache.update(new Changeset(1))
-		
-		cache.addChangesetCacheListener listener
-		cache.remove 1
-		cache.removeChangesetCacheListener listener
-	}
-	
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.net.InetAddress.Cache;
+import org.junit.Test 
+
+
+import static org.junit.Assert.*;
+
+class ChangesetCacheTest {
+	
+	@Test
+	public void test_Constructor() {
+	    ChangesetCache cache = ChangesetCache.getInstance()
+		assert cache != null
+	}
+	
+	@Test
+	public void test_addAndRemoveListeners() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+		
+		// should work
+		cache.addChangesetCacheListener null
+		
+		// should work 
+		def listener = new ChangesetCacheListener() {
+			public void changesetCacheUpdated(ChangesetCacheEvent event) {} 
+		}		
+		cache.addChangesetCacheListener listener
+		// adding a second time - should work too
+		cache.addChangesetCacheListener listener
+		assert cache. at listeners.size() == 1 // ... but only added once 
+		
+		cache.removeChangesetCacheListener null
+		
+		cache.removeChangesetCacheListener listener 
+		assert cache. at listeners.size() == 0
+	}
+	
+	@Test
+	public void update_get_remove_cycle() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+		
+		cache.update new Changeset(1)
+		assert cache.size() == 1
+		assert cache.get(1) != null
+		assert cache.get(1).id == 1
+		cache.remove(1)
+		assert cache.size() == 0
+	}
+	
+	@Test
+	public void updateTwice() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+
+		Changeset cs = new Changeset(1)
+		cs.incomplete = false
+		cs.put "key1", "value1"
+		cs.open = true
+		cache.update cs
+		
+		Changeset cs2 = new Changeset(cs)
+		assert cs2 != null
+		cs2.put "key2", "value2"
+		cs2.open = false
+		cache.update(cs2)
+		
+		assert cache.size() == 1
+		assert cache.get(1) != null
+		
+		cs = cache.get(1)
+		assert cs.get("key1") == "value1"
+		assert cs.get("key2") == "value2"
+		assert !cs.open		
+	}
+	
+	
+	@Test
+	public void contains() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache. at listeners.clear()
+		cache.clear()
+		
+		
+		Changeset cs = new Changeset(1)
+		cache.update cs
+		
+		assert cache.contains(1)
+		assert cache.contains(cs)
+		assert cache.contains(new Changeset(cs))
+		
+		assert ! cache.contains(2)
+		assert ! cache.contains(new Changeset(2))
+		assert ! cache.contains(null)
+	}
+	
+	@Test
+	public void fireingEvents_AddAChangeset() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+		cache. at listeners.clear()
+		
+		// should work 
+		def listener = new ChangesetCacheListener() {
+					public void changesetCacheUpdated(ChangesetCacheEvent event) {
+					    assert event != null
+						assert event.getAddedChangesets().size() == 1
+						assert event.getRemovedChangesets().empty
+						assert event.getUpdatedChangesets().empty
+						assert event.getSource() == cache 
+					} 
+		}   
+		cache.addChangesetCacheListener listener
+		cache.update(new Changeset(1))
+		cache.removeChangesetCacheListener listener
+	}
+	
+	@Test
+	public void fireingEvents_UpdateChangeset() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+		cache. at listeners.clear()
+		
+		// should work 
+		def listener = new ChangesetCacheListener() {
+					public void changesetCacheUpdated(ChangesetCacheEvent event) {
+						assert event != null
+						assert event.getAddedChangesets().empty
+						assert event.getRemovedChangesets().empty
+						assert event.getUpdatedChangesets().size() == 1
+						assert event.getSource() == cache 
+					} 
+				}   
+		cache.update(new Changeset(1))
+		
+		cache.addChangesetCacheListener listener
+		cache.update(new Changeset(1))
+		cache.removeChangesetCacheListener listener
+	}
+	
+	@Test
+	public void fireingEvents_RemoveChangeset() {
+		ChangesetCache cache = ChangesetCache.getInstance()
+		cache.clear()
+		cache. at listeners.clear()
+		
+		// should work 
+		def listener = new ChangesetCacheListener() {
+					public void changesetCacheUpdated(ChangesetCacheEvent event) {
+						assert event != null
+						assert event.getAddedChangesets().empty
+						assert event.getRemovedChangesets().size() == 1
+						assert event.getUpdatedChangesets().empty
+						assert event.getSource() == cache 
+					} 
+				}   
+		cache.update(new Changeset(1))
+		
+		cache.addChangesetCacheListener listener
+		cache.remove 1
+		cache.removeChangesetCacheListener listener
+	}
+	
 }
diff --git a/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java b/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
index 9ab42c9..6680e6b 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
@@ -1,999 +1,999 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-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.StringWriter;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.projection.Projections;
-
-public class DataSetMergerTest {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    private DataSet my;
-    private DataSet their;
-
-    /**
-     * Setup test.
-     */
-    @Before
-    public void setUp() {
-        User.clearUserMap();
-        my = new DataSet();
-        my.setVersion("0.6");
-        their = new DataSet();
-        their.setVersion("0.6");
-        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
-    }
-
-    private void runConsistencyTests(DataSet ds) throws Exception {
-        StringWriter writer = new StringWriter();
-        DatasetConsistencyTest test =  new DatasetConsistencyTest(ds, writer);
-        test.checkReferrers();
-        test.checkCompleteWaysWithIncompleteNodes();
-        test.searchNodes();
-        test.searchWays();
-        test.referredPrimitiveNotInDataset();
-        test.checkZeroNodesWays();
-        String result = writer.toString();
-        if (result.length() > 0)
-            throw new RuntimeException(result);
-    }
-
-    @After
-    public void checkDatasets() throws Exception {
-        runConsistencyTests(my);
-        runConsistencyTests(their);
-    }
-
-    /**
-     * two identical nodes, even in id and version. No confict expected.
-     *
-     * Can happen if data is loaded in two layers and then merged from one layer
-     * on the other.
-     */
-    @Test
-    public void nodeSimple_IdenticalNoConflict() {
-        Node n = new Node(new LatLon(0,0));
-        n.setOsmId(1,1);
-        n.setModified(false);
-        n.put("key1", "value1");
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        n1.setModified(false);
-        n1.put("key1", "value1");
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertTrue(visitor.getConflicts().isEmpty());
-        assertTrue(n1 != n2); // make sure we have a clone
-        assertEquals(1, n2.getId());
-        assertEquals(1, n2.getVersion());
-        assertEquals(false, n2.isModified());
-        assertEquals("value1", n2.get("key1"));
-
-        // merge target not modified after merging
-        assertTrue(!n2.isModified());
-    }
-
-    /**
-     * two  nodes, my is unmodified, their is updated and has a higher version
-     * => their version is going to be the merged version
-     *
-     */
-    @Test
-    public void nodeSimple_locallyUnmodifiedNoConflict() {
-        Node n = new Node(new LatLon(0,0));
-        n.setOsmId(1,1);
-        n.setModified(false);
-        n.put("key1", "value1");
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,2);
-        n1.setModified(false);
-        n1.put("key1", "value1-new");
-        n1.put("key2", "value2");
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertTrue(visitor.getConflicts().isEmpty());
-        assertTrue(n == n2); // make sure the merged node is still the original node
-        assertTrue(n2.getDataSet() == my);
-        assertEquals(1, n2.getId());
-        assertEquals(2, n2.getVersion());
-        assertEquals(false, n2.isModified());
-        assertEquals("value1-new", n2.get("key1"));
-        assertEquals("value2", n2.get("key2"));
-
-        // the merge target should not be modified
-        assertTrue(!n2.isModified());
-    }
-
-    /**
-     * Node with same id, my is modified, their has a higher version
-     * => results in a conflict
-     *
-     * Use case: node which is modified locally and updated by another mapper on
-     * the server
-     */
-    @Test
-    public void nodeSimple_TagConflict() {
-        Node n = new Node(new LatLon(0,0));
-        n.setOsmId(1,1);
-        n.setModified(true);
-        n.put("key1", "value1");
-        n.put("key2", "value2");
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,2);
-        n1.setModified(false);
-        n1.put("key1", "value1-new");
-
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertEquals(1,visitor.getConflicts().size());
-        assertTrue(n == n2);
-        assertTrue(n1 != n2);
-        assertTrue(n1.getDataSet() == their);
-    }
-
-    /**
-     * node with same id, my is deleted, their has a higher version
-     * => results in a conflict
-     *
-     * Use case: node which is deleted locally and updated by another mapper on
-     * the server
-     */
-    @Test
-    public void nodeSimple_DeleteConflict() {
-        Node n = new Node(1, 1);
-        n.setCoor(new LatLon(0,0));
-        n.setDeleted(true);
-        n.put("key1", "value1");
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,2);
-        n1.setModified(false);
-        n1.put("key1", "value1-new");
-        n1.put("key2", "value2");
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertEquals(1,visitor.getConflicts().size());
-        assertTrue(n == n2);
-        assertTrue(n1 != n2);
-        assertTrue(n1.getDataSet() == their);
-    }
-
-    /**
-     * My node is deleted, their node has the same id and version and is not deleted.
-     * => mine has precedence
-     *
-     */
-    @Test
-    public void nodeSimple_DeleteConflict_2() {
-        Node n = new Node(new LatLon(0,0));
-        n.setOsmId(1,1);
-        n.setDeleted(true);
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals(true, n2.isVisible());
-        assertTrue(n == n2);
-        assertTrue(n.getDataSet() == my);
-        assertTrue(n1.getDataSet() == their);
-    }
-
-    /**
-     * My and their node are new but semantically equal. My node is deleted.
-     *
-     * => Ignore my node, no conflict
-     */
-    @Test
-    public void nodeSimple_DeleteConflict_3() {
-        Node n = new Node(new LatLon(1,1));
-        n.setDeleted(true);
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(1,1));
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        assertEquals(0, visitor.getConflicts().size());
-        assertTrue(n.getDataSet() == my);
-        assertTrue(n1.getDataSet() == their);
-    }
-
-    /**
-     * My and their node are new but semantically equal. Both are deleted.
-     *
-     * => take mine
-     *
-     */
-    @Test
-    public void nodeSimple_DeleteConflict_4() {
-        Node n = new Node(new LatLon(1,1));
-        n.setDeleted(true);
-        my.addPrimitive(n);
-
-        Node n1 = new Node(new LatLon(1,1));
-        n1.setDeleted(true);
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
-        Node n2 = (Node)my.getNodes().toArray()[0];
-        assertTrue(n2 == n);
-        assertTrue(n2.isDeleted());
-    }
-
-    /**
-     * their node has no assigned id (id == 0) and is semantically equal to one of my
-     * nodes with id == 0
-     *
-     * => merge it onto my node.
-     *
-     */
-    @Test
-    public void nodeSimple_NoIdSemanticallyEqual() {
-
-        Calendar cal = GregorianCalendar.getInstance();
-        User myUser = User.createOsmUser(1111, "my");
-
-        User theirUser = User.createOsmUser(222, "their");
-
-        Node n = new Node();
-        n.setCoor(new LatLon(0,0));
-        n.put("key1", "value1");
-        n.setUser(myUser);
-        n.setTimestamp(cal.getTime());
-
-        my.addPrimitive(n);
-
-        Node n1 = new Node();
-        n1.setCoor(new LatLon(0,0));
-        n1.put("key1", "value1");
-        cal.add(Calendar.HOUR, 1);
-        Date timestamp = cal.getTime();
-        n1.setTimestamp(timestamp);
-        n1.setUser(theirUser);
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = my.getNodes().iterator().next();
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("value1",n2.get("key1"));
-        assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
-        assertEquals(theirUser,n2.getUser());
-        assertTrue(n2 == n);
-        assertTrue(n2 != n1);
-        assertTrue(n2.getDataSet() == my);
-    }
-
-    /**
-     * my node is incomplete, their node is complete
-     *
-     * => merge it onto my node. My node becomes complete
-     *
-     */
-    @Test
-    public void nodeSimple_IncompleteNode() {
-
-        Node n = new Node(1);
-        my.addPrimitive(n);
-
-        Node n1 = new Node();
-        n1.setCoor(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        n1.put("key1", "value1");
-        Date timestamp = new Date();
-        n1.setTimestamp(timestamp);
-        their.addPrimitive(n1);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n2 = my.getNodes().iterator().next();
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("value1",n2.get("key1"));
-        assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
-        assertEquals(false, n2.isIncomplete());
-        assertTrue(n2 == n);
-    }
-
-    /**
-     * their way has a higher version and different tags. the nodes are the same. My
-     * way is not modified. Merge is possible. No conflict.
-     *
-     * => merge it onto my way.
-     *
-     */
-    @Test
-    public void waySimple_IdenicalNodesDifferentTags() {
-
-        // -- the target dataset
-
-        Node n1 = new Node();
-        n1.setCoor(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        my.addPrimitive(n1);
-
-        Node n2 = new Node();
-        n2.setCoor(new LatLon(0,0));
-        n2.setOsmId(2,1);
-
-        my.addPrimitive(n2);
-
-        Way myWay = new Way();
-        myWay.setOsmId(3,1);
-        myWay.put("key1", "value1");
-        myWay.addNode(n1);
-        myWay.addNode(n2);
-        my.addPrimitive(myWay);
-
-        // -- the source data set
-
-        Node n3 = new Node(new LatLon(0,0));
-        n3.setOsmId(1,1);
-        their.addPrimitive(n3);
-
-        Node n4 = new Node(new LatLon(1,1));
-        n4.setOsmId(2,1);
-        their.addPrimitive(n4);
-
-        Way theirWay = new Way();
-        theirWay.setOsmId(3,2);
-        theirWay.put("key1", "value1");
-        theirWay.put("key2", "value2");
-        theirWay.addNode(n3);
-        theirWay.addNode(n4);
-        their.addPrimitive(theirWay);
-
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        // -- tests
-        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("value1",merged.get("key1"));
-        assertEquals("value2",merged.get("key2"));
-        assertEquals(3,merged.getId());
-        assertEquals(2,merged.getVersion());
-        assertEquals(2,merged.getNodesCount());
-        assertEquals(1,merged.getNode(0).getId());
-        assertEquals(2,merged.getNode(1).getId());
-        assertTrue(merged == myWay);
-        assertTrue(merged.getDataSet() == my);
-
-        Node mergedNode = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertTrue(mergedNode == n1);
-        mergedNode = (Node)my.getPrimitiveById(2, OsmPrimitiveType.NODE);
-        assertTrue(mergedNode == n2);
-
-        assertTrue(!merged.isModified());
-    }
-
-    /**
-     * their way has a higher version and different tags. And it has more nodes. Two
-     * of the existing nodes are modified.
-     *
-     * => merge it onto my way, no conflict
-     *
-     */
-    @Test
-    public void waySimple_AdditionalNodesAndChangedNodes() {
-
-        // -- my data set
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        my.addPrimitive(n1);
-
-        Node n2 = new Node(new LatLon(1,1));
-        n2.setOsmId(2,1);
-        my.addPrimitive(n2);
-
-        Way myWay = new Way();
-        myWay.setOsmId(3,1);
-        myWay.addNode(n1);
-        myWay.addNode(n2);
-        my.addPrimitive(myWay);
-
-        // --- their data set
-
-        Node n3 = new Node(new LatLon(0,0));
-        n3.setOsmId(1,1);
-        their.addPrimitive(n3);
-
-        Node n5 = new Node(new LatLon(1,1));
-        n5.setOsmId(4,1);
-
-        their.addPrimitive(n5);
-
-        Node n4 = new Node(new LatLon(2,2));
-        n4.setOsmId(2,2);
-        n4.put("key1", "value1");
-        their.addPrimitive(n4);
-
-
-        Way theirWay = new Way();
-        theirWay.setOsmId(3,2);
-        theirWay.addNode(n3);
-        theirWay.addNode(n5); // insert a node
-        theirWay.addNode(n4); // this one is updated
-        their.addPrimitive(theirWay);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        // -- tests
-        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals(3,merged.getId());
-        assertEquals(2,merged.getVersion());
-        assertEquals(3,merged.getNodesCount());
-        assertEquals(1,merged.getNode(0).getId());
-        assertEquals(4,merged.getNode(1).getId());
-        assertEquals(2,merged.getNode(2).getId());
-        assertEquals("value1",merged.getNode(2).get("key1"));
-
-        assertTrue(merged.getNode(0) == n1);
-        assertTrue(merged.getNode(1) != n5); // must be clone of the original node in their
-        assertTrue(merged.getNode(2) == n2);
-
-        assertTrue(!merged.isModified());  // the target wasn't modified before merging, it
-        // mustn't be after merging
-    }
-
-    /**
-     * their way has a higher version and different nodes. My way is modified.
-     *
-     * => merge onto my way not possible, create a conflict
-     *
-     */
-    @Test
-    public void waySimple_DifferentNodesAndMyIsModified() {
-
-        // -- the target dataset
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        my.addPrimitive(n1);
-
-        Node n2 = new Node(new LatLon(1,1));
-        n2.setOsmId(2,1);
-        my.addPrimitive(n2);
-
-        Way myWay = new Way();
-        myWay.setOsmId(3,1);
-
-        myWay.addNode(n1);
-        myWay.addNode(n2);
-        myWay.setModified(true);
-        myWay.put("key1", "value1");
-        my.addPrimitive(myWay);
-
-        // -- the source dataset
-
-        Node n3 = new Node(new LatLon(0,0));
-        n3.setOsmId(1,1);
-        their.addPrimitive(n3);
-
-        Node n5 = new Node(new LatLon(1,1));
-        n5.setOsmId(4,1);
-        their.addPrimitive(n5);
-
-        Node n4 = new Node(new LatLon(2,2));
-        n4.setOsmId(2,1);
-        n4.put("key1", "value1");
-        their.addPrimitive(n4);
-
-
-        Way theirWay = new Way();
-        theirWay.setOsmId(3,2);
-
-        theirWay.addNode(n3);
-        theirWay.addNode(n5); // insert a node
-        theirWay.addNode(n4); // this one is updated
-        their.addPrimitive(theirWay);
-
-
-        DataSetMerger visitor = new DataSetMerger(my, their);
-        visitor.merge();
-
-        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertEquals(1,visitor.getConflicts().size());
-        assertEquals(3,merged.getId());
-        assertEquals(1,merged.getVersion());
-        assertEquals(2,merged.getNodesCount());
-        assertEquals(1,merged.getNode(0).getId());
-        assertEquals(2,merged.getNode(1).getId());
-        assertEquals("value1",merged.get("key1"));
-    }
-
-
-    /**
-     * their way is not visible anymore.
-     *
-     * => conflict
-     *
-     */
-    @Test
-    public void waySimple_TheirVersionNotVisibleMyIsModified() {
-
-
-        Node mn1 = new Node(new LatLon(0,0));
-        mn1.setOsmId(1,1);
-        my.addPrimitive(mn1);
-
-        Node mn2 = new Node(new LatLon(1,1));
-        mn2.setOsmId(2,1);
-        my.addPrimitive(mn2);
-
-        Way myWay = new Way();
-        myWay.setOsmId(3,1);
-        myWay.addNode(mn1);
-        myWay.addNode(mn2);
-        myWay.setModified(true);
-        my.addPrimitive(myWay);
-
-
-        Way theirWay = new Way();
-        theirWay.setOsmId(3,2);
-        theirWay.setVisible(false);
-        /* Invisible objects fetched from the server should be marked as "deleted".
-         * Otherwise it's an error.
-         */
-        theirWay.setDeleted(true);
-        their.addPrimitive(theirWay);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertEquals(1,visitor.getConflicts().size());
-        assertEquals(true, visitor.getConflicts().hasConflictForMy(myWay));
-        assertEquals(true, visitor.getConflicts().hasConflictForTheir(theirWay));
-        assertEquals(myWay,merged);
-    }
-
-    /**
-     * my and their way have no ids,  nodes they refer to have an id. but
-     * my and  their way are semantically equal. so technical attributes of
-     * their way can be merged on my way. No conflict.
-     *
-     */
-    @Test
-    public void waySimple_twoWaysWithNoId_NodesWithId() {
-
-        // -- my data set
-
-        Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
-        my.addPrimitive(n1);
-
-        Node n2 = new Node(new LatLon(1,1));
-        n2.setOsmId(2,1);
-        my.addPrimitive(n2);
-
-        Way myWay = new Way();
-        myWay.addNode(n1);
-        myWay.addNode(n2);
-        my.addPrimitive(myWay);
-
-        // -- their data set
-
-        Node n3 = new Node(new LatLon(0,0));
-        n3.setOsmId(1,1);
-        their.addPrimitive(n3);
-
-        Node n4 = new Node(new LatLon(1,1));
-        n4.setOsmId(2,1);
-        their.addPrimitive(n4);
-
-        Way theirWay = new Way();
-        theirWay.addNode(n3);
-        theirWay.addNode(n4);
-        User user = User.createOsmUser(1111, "their");
-        theirWay.setUser(user);
-        theirWay.setTimestamp(new Date());
-        their.addPrimitive(theirWay);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        // -- tests
-        Way merged = (Way)my.getWays().toArray()[0];
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("their", merged.getUser().getName());
-        assertEquals(1111, merged.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
-        assertTrue(merged == myWay);
-        assertTrue(merged.getNode(0) == n1);
-        assertTrue(merged.getNode(1) == n2);
-
-        assertTrue(!merged.isModified());
-    }
-
-    /**
-     * my and their way have no ids, neither do the nodes they refer to. but
-     * my and  their way are semantically equal. so technical attributes of
-     * their way can be merged on my way. No conflict.
-     *
-     */
-    @Test
-    public void waySimple_twoWaysWithNoId_NodesWithoutId() {
-
-        // -- my data set
-
-        Node n1 = new Node(new LatLon(0,0));
-        my.addPrimitive(n1);
-
-        Node n2 = new Node(new LatLon(1,1));
-        my.addPrimitive(n2);
-
-        Way myWay = new Way();
-        myWay.addNode(n1);
-        myWay.addNode(n2);
-        my.addPrimitive(myWay);
-
-        // -- their data set
-
-        Node n3 = new Node(new LatLon(0,0));
-        their.addPrimitive(n3);
-
-        Node n4 = new Node(new LatLon(1,1));
-        their.addPrimitive(n4);
-
-        Way theirWay = new Way();
-        theirWay.addNode(n3);
-        theirWay.addNode(n4);
-        User user = User.createOsmUser(1111, "their");
-        theirWay.setUser(user);
-        theirWay.setTimestamp(new Date());
-        their.addPrimitive(theirWay);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        // -- tests
-        Way merged = (Way)my.getWays().toArray()[0];
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("their", merged.getUser().getName());
-        assertEquals(1111, merged.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
-        assertTrue(merged == myWay);
-        assertTrue(merged.getNode(0) == n1);
-        assertTrue(merged.getNode(1) == n2);
-
-        assertTrue(!merged.isModified());
-    }
-
-
-    /**
-     * My dataset includes a deleted node.
-     * Their dataset includes a way with three nodes, the first one being my node.
-     *
-     * => the merged way should include all three nodes. Deleted node should have deleted=false and
-     * special conflict with isDeleted should exist
-     *
-     */
-    @Test
-    public void wayComplex_mergingADeletedNode() {
-
-        // -- my dataset
-
-        Node mn1 = new Node(new LatLon(0,0));
-        mn1.setOsmId(1,1);
-        mn1.setDeleted(true);
-        my.addPrimitive(mn1);
-
-
-        Node tn1 = new Node(new LatLon(0,0));
-        tn1.setOsmId(1,1);
-        their.addPrimitive(tn1);
-
-        Node tn2 = new Node(new LatLon(1,1));
-        tn2.setOsmId(2,1);
-        their.addPrimitive(tn2);
-
-        Node tn3 = new Node(new LatLon(2,2));
-        tn3.setOsmId(3,1);
-        their.addPrimitive(tn3);
-
-        // -- their data set
-        Way theirWay = new Way();
-        theirWay.setOsmId(4,1);
-        theirWay.addNode(tn1);
-        theirWay.addNode(tn2);
-        theirWay.addNode(tn3);
-        theirWay.setUser(User.createOsmUser(1111, "their"));
-        theirWay.setTimestamp(new Date());
-        their.addPrimitive(theirWay);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        assertEquals(1, visitor.getConflicts().size());
-        assertTrue(visitor.getConflicts().get(0).isMyDeleted());
-
-        Way myWay = (Way)my.getPrimitiveById(4, OsmPrimitiveType.WAY);
-        assertEquals(3, myWay.getNodesCount());
-
-        Node n = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
-        assertTrue(myWay.getNodes().contains(n));
-
-        assertFalse(myWay.isModified());
-    }
-
-    /**
-     * My dataset includes a deleted node.
-     * Their dataset includes a relation with three nodes, the first one being my node.
-     *
-     * => the merged relation should include all three nodes. There should be conflict for deleted
-     * node with isMyDeleted set
-     *
-     */
-    @Test
-    public void relationComplex_mergingADeletedNode() {
-
-
-        Node mn1 = new Node(new LatLon(0,0));
-        mn1.setOsmId(1,1);
-        mn1.setDeleted(true);
-        my.addPrimitive(mn1);
-
-
-        Node tn1 = new Node(new LatLon(0,0));
-        tn1.setOsmId(1,1);
-        their.addPrimitive(tn1);
-
-        Node tn2 = new Node(new LatLon(1,1));
-        tn2.setOsmId(2,1);
-        their.addPrimitive(tn2);
-
-        Node tn3 = new Node(new LatLon(2,2));
-        tn3.setOsmId(3,1);
-        their.addPrimitive(tn3);
-
-
-        Relation theirRelation = new Relation();
-        theirRelation.setOsmId(4,1);
-
-        theirRelation.addMember(new RelationMember("", tn1));
-        theirRelation.addMember(new RelationMember("", tn2));
-        theirRelation.addMember(new RelationMember("", tn3));
-        their.addPrimitive(theirRelation);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        Node n = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
-        assertTrue(n != null);
-
-        assertEquals(1, visitor.getConflicts().size());
-        assertTrue(visitor.getConflicts().hasConflictForMy(n));
-        assertTrue(visitor.getConflicts().get(0).isMyDeleted());
-
-        Relation r = (Relation)my.getPrimitiveById(4,OsmPrimitiveType.RELATION);
-        assertEquals(3, r.getMembersCount());
-
-        assertFalse(r.isModified());
-    }
-
-    /**
-     * Merge an incomplete way with two incomplete nodes into an empty dataset.
-     *
-     * Use case: a way loaded with a multiget, i.e. GET /api/0.6/ways?ids=123456
-     */
-    @Test
-    public void newIncompleteWay() {
-
-        Node n1 = new Node(1);
-        their.addPrimitive(n1);
-
-        Node n2 = new Node(2);
-        their.addPrimitive(n2);
-
-        Way w3 = new Way(3);
-        w3.setNodes(Arrays.asList(n1,n2));
-        their.addPrimitive(w3);
-        assertTrue(w3.isIncomplete());
-
-
-        DataSetMerger visitor = new DataSetMerger(my, their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
-
-        OsmPrimitive p= my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertTrue(p.isIncomplete());
-        p= my.getPrimitiveById(2, OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertTrue(p.isIncomplete());
-        p= my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertNotNull(p);
-        assertTrue(p.isIncomplete());
-
-        Way w = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertNotNull(w);
-        assertTrue(p.isIncomplete());
-        assertEquals(2, w.getNodesCount());
-        assertTrue(w.getNode(0).isIncomplete());
-        assertTrue(w.getNode(1).isIncomplete());
-    }
-
-    /**
-     * Merge an incomplete way with two incomplete nodes into a dataset where the way already exists as complete way.
-     *
-     * Use case: a way loaded with a multiget, i.e. GET /api/0.6/ways?ids=123456 after a "Update selection " of this way
-     */
-    @Test
-    public void incompleteWayOntoCompleteWay() {
-
-        // an incomplete node
-        Node n1 = new Node(1);
-        their.addPrimitive(n1);
-
-        // another incomplete node
-        Node n2 = new Node(2);
-        their.addPrimitive(n2);
-
-        // an incomplete way with two incomplete nodes
-        Way w3 = new Way(3);
-        w3.setNodes(Arrays.asList(n1,n2));
-        their.addPrimitive(w3);
-
-
-        Node n4 = new Node(new LatLon(0,0));
-        n4.setOsmId(1,1);
-        my.addPrimitive(n4);
-
-        Node n5 = new Node(new LatLon(1,1));
-        n5.setOsmId(2,1);
-        my.addPrimitive(n5);
-
-        Way w6 = new Way(3, 1);
-        w6.setNodes(Arrays.asList(n4,n5));
-        my.addPrimitive(w6);
-
-        DataSetMerger visitor = new DataSetMerger(my,their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
-
-        OsmPrimitive p= my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertTrue(!p.isIncomplete());
-        p= my.getPrimitiveById(2, OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertTrue(!p.isIncomplete());
-        p= my.getPrimitiveById(3,OsmPrimitiveType.WAY);
-        assertNotNull(p);
-        assertTrue(!p.isIncomplete());
-
-        Way w = (Way)my.getPrimitiveById(3,OsmPrimitiveType.WAY);
-        assertNotNull(w);
-        assertTrue(!p.isIncomplete());
-        assertEquals(2, w.getNodesCount());
-        assertTrue(!w.getNode(0).isIncomplete());
-        assertTrue(!w.getNode(1).isIncomplete());
-    }
-
-    /**
-     * merge to complete nodes onto an incomplete way with the same two nodes, but incomplete.
-     * => both the nodes and the way should be complete in the target dataset after merging
-     */
-    @Test
-    public void twoCompleteNodesOntoAnIncompleteWay() {
-
-        // -- source dataset
-
-        // an complete node
-        Node n1 = new Node(1, 1);
-        n1.setCoor(new LatLon(1,1));
-        their.addPrimitive(n1);
-
-        // another complete node
-        Node n2 = new Node(2, 1);
-        n2.setCoor(new LatLon(2,2));
-        their.addPrimitive(n2);
-
-        // --- target dataset
-
-        Node n4 = new Node(1);
-        my.addPrimitive(n4);
-
-        Node n5 = new Node(2);
-        my.addPrimitive(n5);
-
-        Way w6 = new Way(3, 1);
-        w6.addNode(n4);
-        w6.addNode(n5);
-        my.addPrimitive(w6);
-
-        //-- merge it
-        DataSetMerger visitor = new DataSetMerger(my, their);
-        visitor.merge();
-
-        // -- test it
-        assertEquals(0,visitor.getConflicts().size());
-
-        Node n = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
-        assertNotNull(n);
-        assertFalse(n.isIncomplete());
-
-        n = (Node)my.getPrimitiveById(2, OsmPrimitiveType.NODE);
-        assertNotNull(n);
-        assertFalse(n.isIncomplete());
-
-        Way w = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertNotNull(w);
-        assertFalse(w.hasIncompleteNodes());
-        assertTrue(w.isUsable());
-        assertEquals(2, w.getNodesCount());
-        assertEquals(1, w.getNode(0).getId());
-        assertEquals(2, w.getNode(1).getId());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+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.StringWriter;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.projection.Projections;
+
+public class DataSetMergerTest {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    private DataSet my;
+    private DataSet their;
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        User.clearUserMap();
+        my = new DataSet();
+        my.setVersion("0.6");
+        their = new DataSet();
+        their.setVersion("0.6");
+        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+    }
+
+    private void runConsistencyTests(DataSet ds) throws Exception {
+        StringWriter writer = new StringWriter();
+        DatasetConsistencyTest test =  new DatasetConsistencyTest(ds, writer);
+        test.checkReferrers();
+        test.checkCompleteWaysWithIncompleteNodes();
+        test.searchNodes();
+        test.searchWays();
+        test.referredPrimitiveNotInDataset();
+        test.checkZeroNodesWays();
+        String result = writer.toString();
+        if (result.length() > 0)
+            throw new RuntimeException(result);
+    }
+
+    @After
+    public void checkDatasets() throws Exception {
+        runConsistencyTests(my);
+        runConsistencyTests(their);
+    }
+
+    /**
+     * two identical nodes, even in id and version. No confict expected.
+     *
+     * Can happen if data is loaded in two layers and then merged from one layer
+     * on the other.
+     */
+    @Test
+    public void nodeSimple_IdenticalNoConflict() {
+        Node n = new Node(new LatLon(0,0));
+        n.setOsmId(1,1);
+        n.setModified(false);
+        n.put("key1", "value1");
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        n1.setModified(false);
+        n1.put("key1", "value1");
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertTrue(visitor.getConflicts().isEmpty());
+        assertTrue(n1 != n2); // make sure we have a clone
+        assertEquals(1, n2.getId());
+        assertEquals(1, n2.getVersion());
+        assertEquals(false, n2.isModified());
+        assertEquals("value1", n2.get("key1"));
+
+        // merge target not modified after merging
+        assertTrue(!n2.isModified());
+    }
+
+    /**
+     * two  nodes, my is unmodified, their is updated and has a higher version
+     * => their version is going to be the merged version
+     *
+     */
+    @Test
+    public void nodeSimple_locallyUnmodifiedNoConflict() {
+        Node n = new Node(new LatLon(0,0));
+        n.setOsmId(1,1);
+        n.setModified(false);
+        n.put("key1", "value1");
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,2);
+        n1.setModified(false);
+        n1.put("key1", "value1-new");
+        n1.put("key2", "value2");
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertTrue(visitor.getConflicts().isEmpty());
+        assertTrue(n == n2); // make sure the merged node is still the original node
+        assertTrue(n2.getDataSet() == my);
+        assertEquals(1, n2.getId());
+        assertEquals(2, n2.getVersion());
+        assertEquals(false, n2.isModified());
+        assertEquals("value1-new", n2.get("key1"));
+        assertEquals("value2", n2.get("key2"));
+
+        // the merge target should not be modified
+        assertTrue(!n2.isModified());
+    }
+
+    /**
+     * Node with same id, my is modified, their has a higher version
+     * => results in a conflict
+     *
+     * Use case: node which is modified locally and updated by another mapper on
+     * the server
+     */
+    @Test
+    public void nodeSimple_TagConflict() {
+        Node n = new Node(new LatLon(0,0));
+        n.setOsmId(1,1);
+        n.setModified(true);
+        n.put("key1", "value1");
+        n.put("key2", "value2");
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,2);
+        n1.setModified(false);
+        n1.put("key1", "value1-new");
+
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertEquals(1,visitor.getConflicts().size());
+        assertTrue(n == n2);
+        assertTrue(n1 != n2);
+        assertTrue(n1.getDataSet() == their);
+    }
+
+    /**
+     * node with same id, my is deleted, their has a higher version
+     * => results in a conflict
+     *
+     * Use case: node which is deleted locally and updated by another mapper on
+     * the server
+     */
+    @Test
+    public void nodeSimple_DeleteConflict() {
+        Node n = new Node(1, 1);
+        n.setCoor(new LatLon(0,0));
+        n.setDeleted(true);
+        n.put("key1", "value1");
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,2);
+        n1.setModified(false);
+        n1.put("key1", "value1-new");
+        n1.put("key2", "value2");
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertEquals(1,visitor.getConflicts().size());
+        assertTrue(n == n2);
+        assertTrue(n1 != n2);
+        assertTrue(n1.getDataSet() == their);
+    }
+
+    /**
+     * My node is deleted, their node has the same id and version and is not deleted.
+     * => mine has precedence
+     *
+     */
+    @Test
+    public void nodeSimple_DeleteConflict_2() {
+        Node n = new Node(new LatLon(0,0));
+        n.setOsmId(1,1);
+        n.setDeleted(true);
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals(true, n2.isVisible());
+        assertTrue(n == n2);
+        assertTrue(n.getDataSet() == my);
+        assertTrue(n1.getDataSet() == their);
+    }
+
+    /**
+     * My and their node are new but semantically equal. My node is deleted.
+     *
+     * => Ignore my node, no conflict
+     */
+    @Test
+    public void nodeSimple_DeleteConflict_3() {
+        Node n = new Node(new LatLon(1,1));
+        n.setDeleted(true);
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(1,1));
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        assertEquals(0, visitor.getConflicts().size());
+        assertTrue(n.getDataSet() == my);
+        assertTrue(n1.getDataSet() == their);
+    }
+
+    /**
+     * My and their node are new but semantically equal. Both are deleted.
+     *
+     * => take mine
+     *
+     */
+    @Test
+    public void nodeSimple_DeleteConflict_4() {
+        Node n = new Node(new LatLon(1,1));
+        n.setDeleted(true);
+        my.addPrimitive(n);
+
+        Node n1 = new Node(new LatLon(1,1));
+        n1.setDeleted(true);
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        assertEquals(0,visitor.getConflicts().size());
+        Node n2 = (Node)my.getNodes().toArray()[0];
+        assertTrue(n2 == n);
+        assertTrue(n2.isDeleted());
+    }
+
+    /**
+     * their node has no assigned id (id == 0) and is semantically equal to one of my
+     * nodes with id == 0
+     *
+     * => merge it onto my node.
+     *
+     */
+    @Test
+    public void nodeSimple_NoIdSemanticallyEqual() {
+
+        Calendar cal = GregorianCalendar.getInstance();
+        User myUser = User.createOsmUser(1111, "my");
+
+        User theirUser = User.createOsmUser(222, "their");
+
+        Node n = new Node();
+        n.setCoor(new LatLon(0,0));
+        n.put("key1", "value1");
+        n.setUser(myUser);
+        n.setTimestamp(cal.getTime());
+
+        my.addPrimitive(n);
+
+        Node n1 = new Node();
+        n1.setCoor(new LatLon(0,0));
+        n1.put("key1", "value1");
+        cal.add(Calendar.HOUR, 1);
+        Date timestamp = cal.getTime();
+        n1.setTimestamp(timestamp);
+        n1.setUser(theirUser);
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = my.getNodes().iterator().next();
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("value1",n2.get("key1"));
+        assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
+        assertEquals(theirUser,n2.getUser());
+        assertTrue(n2 == n);
+        assertTrue(n2 != n1);
+        assertTrue(n2.getDataSet() == my);
+    }
+
+    /**
+     * my node is incomplete, their node is complete
+     *
+     * => merge it onto my node. My node becomes complete
+     *
+     */
+    @Test
+    public void nodeSimple_IncompleteNode() {
+
+        Node n = new Node(1);
+        my.addPrimitive(n);
+
+        Node n1 = new Node();
+        n1.setCoor(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        n1.put("key1", "value1");
+        Date timestamp = new Date();
+        n1.setTimestamp(timestamp);
+        their.addPrimitive(n1);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n2 = my.getNodes().iterator().next();
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("value1",n2.get("key1"));
+        assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
+        assertEquals(false, n2.isIncomplete());
+        assertTrue(n2 == n);
+    }
+
+    /**
+     * their way has a higher version and different tags. the nodes are the same. My
+     * way is not modified. Merge is possible. No conflict.
+     *
+     * => merge it onto my way.
+     *
+     */
+    @Test
+    public void waySimple_IdenicalNodesDifferentTags() {
+
+        // -- the target dataset
+
+        Node n1 = new Node();
+        n1.setCoor(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        my.addPrimitive(n1);
+
+        Node n2 = new Node();
+        n2.setCoor(new LatLon(0,0));
+        n2.setOsmId(2,1);
+
+        my.addPrimitive(n2);
+
+        Way myWay = new Way();
+        myWay.setOsmId(3,1);
+        myWay.put("key1", "value1");
+        myWay.addNode(n1);
+        myWay.addNode(n2);
+        my.addPrimitive(myWay);
+
+        // -- the source data set
+
+        Node n3 = new Node(new LatLon(0,0));
+        n3.setOsmId(1,1);
+        their.addPrimitive(n3);
+
+        Node n4 = new Node(new LatLon(1,1));
+        n4.setOsmId(2,1);
+        their.addPrimitive(n4);
+
+        Way theirWay = new Way();
+        theirWay.setOsmId(3,2);
+        theirWay.put("key1", "value1");
+        theirWay.put("key2", "value2");
+        theirWay.addNode(n3);
+        theirWay.addNode(n4);
+        their.addPrimitive(theirWay);
+
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("value1",merged.get("key1"));
+        assertEquals("value2",merged.get("key2"));
+        assertEquals(3,merged.getId());
+        assertEquals(2,merged.getVersion());
+        assertEquals(2,merged.getNodesCount());
+        assertEquals(1,merged.getNode(0).getId());
+        assertEquals(2,merged.getNode(1).getId());
+        assertTrue(merged == myWay);
+        assertTrue(merged.getDataSet() == my);
+
+        Node mergedNode = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertTrue(mergedNode == n1);
+        mergedNode = (Node)my.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertTrue(mergedNode == n2);
+
+        assertTrue(!merged.isModified());
+    }
+
+    /**
+     * their way has a higher version and different tags. And it has more nodes. Two
+     * of the existing nodes are modified.
+     *
+     * => merge it onto my way, no conflict
+     *
+     */
+    @Test
+    public void waySimple_AdditionalNodesAndChangedNodes() {
+
+        // -- my data set
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        my.addPrimitive(n1);
+
+        Node n2 = new Node(new LatLon(1,1));
+        n2.setOsmId(2,1);
+        my.addPrimitive(n2);
+
+        Way myWay = new Way();
+        myWay.setOsmId(3,1);
+        myWay.addNode(n1);
+        myWay.addNode(n2);
+        my.addPrimitive(myWay);
+
+        // --- their data set
+
+        Node n3 = new Node(new LatLon(0,0));
+        n3.setOsmId(1,1);
+        their.addPrimitive(n3);
+
+        Node n5 = new Node(new LatLon(1,1));
+        n5.setOsmId(4,1);
+
+        their.addPrimitive(n5);
+
+        Node n4 = new Node(new LatLon(2,2));
+        n4.setOsmId(2,2);
+        n4.put("key1", "value1");
+        their.addPrimitive(n4);
+
+
+        Way theirWay = new Way();
+        theirWay.setOsmId(3,2);
+        theirWay.addNode(n3);
+        theirWay.addNode(n5); // insert a node
+        theirWay.addNode(n4); // this one is updated
+        their.addPrimitive(theirWay);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals(3,merged.getId());
+        assertEquals(2,merged.getVersion());
+        assertEquals(3,merged.getNodesCount());
+        assertEquals(1,merged.getNode(0).getId());
+        assertEquals(4,merged.getNode(1).getId());
+        assertEquals(2,merged.getNode(2).getId());
+        assertEquals("value1",merged.getNode(2).get("key1"));
+
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) != n5); // must be clone of the original node in their
+        assertTrue(merged.getNode(2) == n2);
+
+        assertTrue(!merged.isModified());  // the target wasn't modified before merging, it
+        // mustn't be after merging
+    }
+
+    /**
+     * their way has a higher version and different nodes. My way is modified.
+     *
+     * => merge onto my way not possible, create a conflict
+     *
+     */
+    @Test
+    public void waySimple_DifferentNodesAndMyIsModified() {
+
+        // -- the target dataset
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        my.addPrimitive(n1);
+
+        Node n2 = new Node(new LatLon(1,1));
+        n2.setOsmId(2,1);
+        my.addPrimitive(n2);
+
+        Way myWay = new Way();
+        myWay.setOsmId(3,1);
+
+        myWay.addNode(n1);
+        myWay.addNode(n2);
+        myWay.setModified(true);
+        myWay.put("key1", "value1");
+        my.addPrimitive(myWay);
+
+        // -- the source dataset
+
+        Node n3 = new Node(new LatLon(0,0));
+        n3.setOsmId(1,1);
+        their.addPrimitive(n3);
+
+        Node n5 = new Node(new LatLon(1,1));
+        n5.setOsmId(4,1);
+        their.addPrimitive(n5);
+
+        Node n4 = new Node(new LatLon(2,2));
+        n4.setOsmId(2,1);
+        n4.put("key1", "value1");
+        their.addPrimitive(n4);
+
+
+        Way theirWay = new Way();
+        theirWay.setOsmId(3,2);
+
+        theirWay.addNode(n3);
+        theirWay.addNode(n5); // insert a node
+        theirWay.addNode(n4); // this one is updated
+        their.addPrimitive(theirWay);
+
+
+        DataSetMerger visitor = new DataSetMerger(my, their);
+        visitor.merge();
+
+        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertEquals(1,visitor.getConflicts().size());
+        assertEquals(3,merged.getId());
+        assertEquals(1,merged.getVersion());
+        assertEquals(2,merged.getNodesCount());
+        assertEquals(1,merged.getNode(0).getId());
+        assertEquals(2,merged.getNode(1).getId());
+        assertEquals("value1",merged.get("key1"));
+    }
+
+
+    /**
+     * their way is not visible anymore.
+     *
+     * => conflict
+     *
+     */
+    @Test
+    public void waySimple_TheirVersionNotVisibleMyIsModified() {
+
+
+        Node mn1 = new Node(new LatLon(0,0));
+        mn1.setOsmId(1,1);
+        my.addPrimitive(mn1);
+
+        Node mn2 = new Node(new LatLon(1,1));
+        mn2.setOsmId(2,1);
+        my.addPrimitive(mn2);
+
+        Way myWay = new Way();
+        myWay.setOsmId(3,1);
+        myWay.addNode(mn1);
+        myWay.addNode(mn2);
+        myWay.setModified(true);
+        my.addPrimitive(myWay);
+
+
+        Way theirWay = new Way();
+        theirWay.setOsmId(3,2);
+        theirWay.setVisible(false);
+        /* Invisible objects fetched from the server should be marked as "deleted".
+         * Otherwise it's an error.
+         */
+        theirWay.setDeleted(true);
+        their.addPrimitive(theirWay);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Way merged = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertEquals(1,visitor.getConflicts().size());
+        assertEquals(true, visitor.getConflicts().hasConflictForMy(myWay));
+        assertEquals(true, visitor.getConflicts().hasConflictForTheir(theirWay));
+        assertEquals(myWay,merged);
+    }
+
+    /**
+     * my and their way have no ids,  nodes they refer to have an id. but
+     * my and  their way are semantically equal. so technical attributes of
+     * their way can be merged on my way. No conflict.
+     *
+     */
+    @Test
+    public void waySimple_twoWaysWithNoId_NodesWithId() {
+
+        // -- my data set
+
+        Node n1 = new Node(new LatLon(0,0));
+        n1.setOsmId(1,1);
+        my.addPrimitive(n1);
+
+        Node n2 = new Node(new LatLon(1,1));
+        n2.setOsmId(2,1);
+        my.addPrimitive(n2);
+
+        Way myWay = new Way();
+        myWay.addNode(n1);
+        myWay.addNode(n2);
+        my.addPrimitive(myWay);
+
+        // -- their data set
+
+        Node n3 = new Node(new LatLon(0,0));
+        n3.setOsmId(1,1);
+        their.addPrimitive(n3);
+
+        Node n4 = new Node(new LatLon(1,1));
+        n4.setOsmId(2,1);
+        their.addPrimitive(n4);
+
+        Way theirWay = new Way();
+        theirWay.addNode(n3);
+        theirWay.addNode(n4);
+        User user = User.createOsmUser(1111, "their");
+        theirWay.setUser(user);
+        theirWay.setTimestamp(new Date());
+        their.addPrimitive(theirWay);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getWays().toArray()[0];
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("their", merged.getUser().getName());
+        assertEquals(1111, merged.getUser().getId());
+        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertTrue(merged == myWay);
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) == n2);
+
+        assertTrue(!merged.isModified());
+    }
+
+    /**
+     * my and their way have no ids, neither do the nodes they refer to. but
+     * my and  their way are semantically equal. so technical attributes of
+     * their way can be merged on my way. No conflict.
+     *
+     */
+    @Test
+    public void waySimple_twoWaysWithNoId_NodesWithoutId() {
+
+        // -- my data set
+
+        Node n1 = new Node(new LatLon(0,0));
+        my.addPrimitive(n1);
+
+        Node n2 = new Node(new LatLon(1,1));
+        my.addPrimitive(n2);
+
+        Way myWay = new Way();
+        myWay.addNode(n1);
+        myWay.addNode(n2);
+        my.addPrimitive(myWay);
+
+        // -- their data set
+
+        Node n3 = new Node(new LatLon(0,0));
+        their.addPrimitive(n3);
+
+        Node n4 = new Node(new LatLon(1,1));
+        their.addPrimitive(n4);
+
+        Way theirWay = new Way();
+        theirWay.addNode(n3);
+        theirWay.addNode(n4);
+        User user = User.createOsmUser(1111, "their");
+        theirWay.setUser(user);
+        theirWay.setTimestamp(new Date());
+        their.addPrimitive(theirWay);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getWays().toArray()[0];
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("their", merged.getUser().getName());
+        assertEquals(1111, merged.getUser().getId());
+        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertTrue(merged == myWay);
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) == n2);
+
+        assertTrue(!merged.isModified());
+    }
+
+
+    /**
+     * My dataset includes a deleted node.
+     * Their dataset includes a way with three nodes, the first one being my node.
+     *
+     * => the merged way should include all three nodes. Deleted node should have deleted=false and
+     * special conflict with isDeleted should exist
+     *
+     */
+    @Test
+    public void wayComplex_mergingADeletedNode() {
+
+        // -- my dataset
+
+        Node mn1 = new Node(new LatLon(0,0));
+        mn1.setOsmId(1,1);
+        mn1.setDeleted(true);
+        my.addPrimitive(mn1);
+
+
+        Node tn1 = new Node(new LatLon(0,0));
+        tn1.setOsmId(1,1);
+        their.addPrimitive(tn1);
+
+        Node tn2 = new Node(new LatLon(1,1));
+        tn2.setOsmId(2,1);
+        their.addPrimitive(tn2);
+
+        Node tn3 = new Node(new LatLon(2,2));
+        tn3.setOsmId(3,1);
+        their.addPrimitive(tn3);
+
+        // -- their data set
+        Way theirWay = new Way();
+        theirWay.setOsmId(4,1);
+        theirWay.addNode(tn1);
+        theirWay.addNode(tn2);
+        theirWay.addNode(tn3);
+        theirWay.setUser(User.createOsmUser(1111, "their"));
+        theirWay.setTimestamp(new Date());
+        their.addPrimitive(theirWay);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        assertEquals(1, visitor.getConflicts().size());
+        assertTrue(visitor.getConflicts().get(0).isMyDeleted());
+
+        Way myWay = (Way)my.getPrimitiveById(4, OsmPrimitiveType.WAY);
+        assertEquals(3, myWay.getNodesCount());
+
+        Node n = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertTrue(myWay.getNodes().contains(n));
+
+        assertFalse(myWay.isModified());
+    }
+
+    /**
+     * My dataset includes a deleted node.
+     * Their dataset includes a relation with three nodes, the first one being my node.
+     *
+     * => the merged relation should include all three nodes. There should be conflict for deleted
+     * node with isMyDeleted set
+     *
+     */
+    @Test
+    public void relationComplex_mergingADeletedNode() {
+
+
+        Node mn1 = new Node(new LatLon(0,0));
+        mn1.setOsmId(1,1);
+        mn1.setDeleted(true);
+        my.addPrimitive(mn1);
+
+
+        Node tn1 = new Node(new LatLon(0,0));
+        tn1.setOsmId(1,1);
+        their.addPrimitive(tn1);
+
+        Node tn2 = new Node(new LatLon(1,1));
+        tn2.setOsmId(2,1);
+        their.addPrimitive(tn2);
+
+        Node tn3 = new Node(new LatLon(2,2));
+        tn3.setOsmId(3,1);
+        their.addPrimitive(tn3);
+
+
+        Relation theirRelation = new Relation();
+        theirRelation.setOsmId(4,1);
+
+        theirRelation.addMember(new RelationMember("", tn1));
+        theirRelation.addMember(new RelationMember("", tn2));
+        theirRelation.addMember(new RelationMember("", tn3));
+        their.addPrimitive(theirRelation);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        Node n = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertTrue(n != null);
+
+        assertEquals(1, visitor.getConflicts().size());
+        assertTrue(visitor.getConflicts().hasConflictForMy(n));
+        assertTrue(visitor.getConflicts().get(0).isMyDeleted());
+
+        Relation r = (Relation)my.getPrimitiveById(4,OsmPrimitiveType.RELATION);
+        assertEquals(3, r.getMembersCount());
+
+        assertFalse(r.isModified());
+    }
+
+    /**
+     * Merge an incomplete way with two incomplete nodes into an empty dataset.
+     *
+     * Use case: a way loaded with a multiget, i.e. GET /api/0.6/ways?ids=123456
+     */
+    @Test
+    public void newIncompleteWay() {
+
+        Node n1 = new Node(1);
+        their.addPrimitive(n1);
+
+        Node n2 = new Node(2);
+        their.addPrimitive(n2);
+
+        Way w3 = new Way(3);
+        w3.setNodes(Arrays.asList(n1,n2));
+        their.addPrimitive(w3);
+        assertTrue(w3.isIncomplete());
+
+
+        DataSetMerger visitor = new DataSetMerger(my, their);
+        visitor.merge();
+
+        assertEquals(0,visitor.getConflicts().size());
+
+        OsmPrimitive p= my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertTrue(p.isIncomplete());
+        p= my.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertTrue(p.isIncomplete());
+        p= my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertNotNull(p);
+        assertTrue(p.isIncomplete());
+
+        Way w = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertNotNull(w);
+        assertTrue(p.isIncomplete());
+        assertEquals(2, w.getNodesCount());
+        assertTrue(w.getNode(0).isIncomplete());
+        assertTrue(w.getNode(1).isIncomplete());
+    }
+
+    /**
+     * Merge an incomplete way with two incomplete nodes into a dataset where the way already exists as complete way.
+     *
+     * Use case: a way loaded with a multiget, i.e. GET /api/0.6/ways?ids=123456 after a "Update selection " of this way
+     */
+    @Test
+    public void incompleteWayOntoCompleteWay() {
+
+        // an incomplete node
+        Node n1 = new Node(1);
+        their.addPrimitive(n1);
+
+        // another incomplete node
+        Node n2 = new Node(2);
+        their.addPrimitive(n2);
+
+        // an incomplete way with two incomplete nodes
+        Way w3 = new Way(3);
+        w3.setNodes(Arrays.asList(n1,n2));
+        their.addPrimitive(w3);
+
+
+        Node n4 = new Node(new LatLon(0,0));
+        n4.setOsmId(1,1);
+        my.addPrimitive(n4);
+
+        Node n5 = new Node(new LatLon(1,1));
+        n5.setOsmId(2,1);
+        my.addPrimitive(n5);
+
+        Way w6 = new Way(3, 1);
+        w6.setNodes(Arrays.asList(n4,n5));
+        my.addPrimitive(w6);
+
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        assertEquals(0,visitor.getConflicts().size());
+
+        OsmPrimitive p= my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertTrue(!p.isIncomplete());
+        p= my.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertTrue(!p.isIncomplete());
+        p= my.getPrimitiveById(3,OsmPrimitiveType.WAY);
+        assertNotNull(p);
+        assertTrue(!p.isIncomplete());
+
+        Way w = (Way)my.getPrimitiveById(3,OsmPrimitiveType.WAY);
+        assertNotNull(w);
+        assertTrue(!p.isIncomplete());
+        assertEquals(2, w.getNodesCount());
+        assertTrue(!w.getNode(0).isIncomplete());
+        assertTrue(!w.getNode(1).isIncomplete());
+    }
+
+    /**
+     * merge to complete nodes onto an incomplete way with the same two nodes, but incomplete.
+     * => both the nodes and the way should be complete in the target dataset after merging
+     */
+    @Test
+    public void twoCompleteNodesOntoAnIncompleteWay() {
+
+        // -- source dataset
+
+        // an complete node
+        Node n1 = new Node(1, 1);
+        n1.setCoor(new LatLon(1,1));
+        their.addPrimitive(n1);
+
+        // another complete node
+        Node n2 = new Node(2, 1);
+        n2.setCoor(new LatLon(2,2));
+        their.addPrimitive(n2);
+
+        // --- target dataset
+
+        Node n4 = new Node(1);
+        my.addPrimitive(n4);
+
+        Node n5 = new Node(2);
+        my.addPrimitive(n5);
+
+        Way w6 = new Way(3, 1);
+        w6.addNode(n4);
+        w6.addNode(n5);
+        my.addPrimitive(w6);
+
+        //-- merge it
+        DataSetMerger visitor = new DataSetMerger(my, their);
+        visitor.merge();
+
+        // -- test it
+        assertEquals(0,visitor.getConflicts().size());
+
+        Node n = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertFalse(n.isIncomplete());
+
+        n = (Node)my.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertFalse(n.isIncomplete());
+
+        Way w = (Way)my.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertNotNull(w);
+        assertFalse(w.hasIncompleteNodes());
+        assertTrue(w.isUsable());
+        assertEquals(2, w.getNodesCount());
+        assertEquals(1, w.getNode(0).getId());
+        assertEquals(2, w.getNode(1).getId());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java b/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
index 57e69b8..38ccd18 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
@@ -1,145 +1,145 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.coor.LatLon;
-
-/**
- * Some unit test cases for basic tag management on {@link OsmPrimitive}. Uses
- * {@link Node} for the tests, {@link OsmPrimitive} is abstract.
- *
- */
-public class OsmPrimitiveKeyHandlingTest {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * test query and get methods on a node withouth keys
-     */
-    @Test
-    public void emptyNode() {
-        Node n = new Node();
-        assertTrue(n.getKeys().size() == 0);
-        assertTrue(!n.hasKeys());
-        assertTrue(!n.hasKey("nosuchkey"));
-        assertTrue(n.keySet().isEmpty());
-
-        n.remove("nosuchkey"); // should work
-    }
-
-    /**
-     * Adds a tag to an empty node and test the query and get methods.
-     */
-    @Test
-    public void put() {
-        Node n = new Node();
-        n.put("akey", "avalue");
-        assertTrue(n.get("akey").equals("avalue"));
-        assertTrue(n.getKeys().size() == 1);
-
-        assertTrue(n.keySet().size() == 1);
-        assertTrue(n.keySet().contains("akey"));
-    }
-
-    /**
-     * Adds two tags to an empty node and test the query and get methods.
-     */
-    @Test
-    public void put2() {
-        Node n = new Node();
-        n.put("key.1", "value.1");
-        n.put("key.2", "value.2");
-        assertTrue(n.get("key.1").equals("value.1"));
-        assertTrue(n.get("key.2").equals("value.2"));
-        assertTrue(n.getKeys().size() == 2);
-        assertTrue(n.hasKeys());
-        assertTrue(n.hasKey("key.1"));
-        assertTrue(n.hasKey("key.2"));
-        assertTrue(!n.hasKey("nosuchkey"));
-    }
-
-    /**
-     * Removes tags from a node with two tags and test the state of the node.
-     */
-    @Test
-    public void remove() {
-        Node n = new Node();
-        n.put("key.1", "value.1");
-        n.put("key.2", "value.2");
-
-        n.remove("nosuchkey");               // should work
-        assertTrue(n.getKeys().size() == 2); // still 2 tags ?
-
-        n.remove("key.1");
-        assertTrue(n.getKeys().size() == 1);
-        assertTrue(!n.hasKey("key.1"));
-        assertTrue(n.get("key.1") == null);
-        assertTrue(n.hasKey("key.2"));
-        assertTrue(n.get("key.2").equals("value.2"));
-
-        n.remove("key.2");
-        assertTrue(n.getKeys().size() == 0);
-        assertTrue(!n.hasKey("key.1"));
-        assertTrue(n.get("key.1") == null);
-        assertTrue(!n.hasKey("key.2"));
-        assertTrue(n.get("key.2") == null);
-    }
-
-    /**
-     * Removes all tags from a node.
-     */
-    @Test
-    public void removeAll() {
-        Node n = new Node();
-
-        n.put("key.1", "value.1");
-        n.put("key.2", "value.2");
-
-        n.removeAll();
-        assertTrue(n.getKeys().size() == 0);
-    }
-
-    /**
-     * Test hasEqualSemanticAttributes on two nodes whose identical tags are added
-     * in different orders.
-     */
-    @Test
-    public void hasEqualSemanticAttributes() {
-        Node n1 = new Node(1);
-        n1.setCoor(new LatLon(0,0));
-        n1.put("key.1", "value.1");
-        n1.put("key.2", "value.2");
-
-        Node n2 = new Node(1);
-        n2.setCoor(new LatLon(0,0));
-        n2.put("key.2", "value.2");
-        n2.put("key.1", "value.1");
-
-        assertTrue(n1.hasEqualSemanticAttributes(n2));
-    }
-
-    /**
-     * Test hasEqualSemanticAttributes on two nodes with different tags.
-     */
-    @Test
-    public void hasEqualSemanticAttributes_2() {
-        Node n1 = new Node(1);
-        n1.setCoor(new LatLon(0,0));
-        n1.put("key.1", "value.1");
-        n1.put("key.2", "value.3");
-
-        Node n2 = new Node(1);
-        n2.setCoor(new LatLon(0,0));
-        n2.put("key.1", "value.1");
-        n2.put("key.2", "value.4");
-
-        assertTrue(!n1.hasEqualSemanticAttributes(n2));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * Some unit test cases for basic tag management on {@link OsmPrimitive}. Uses
+ * {@link Node} for the tests, {@link OsmPrimitive} is abstract.
+ *
+ */
+public class OsmPrimitiveKeyHandlingTest {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * test query and get methods on a node withouth keys
+     */
+    @Test
+    public void emptyNode() {
+        Node n = new Node();
+        assertTrue(n.getKeys().size() == 0);
+        assertTrue(!n.hasKeys());
+        assertTrue(!n.hasKey("nosuchkey"));
+        assertTrue(n.keySet().isEmpty());
+
+        n.remove("nosuchkey"); // should work
+    }
+
+    /**
+     * Adds a tag to an empty node and test the query and get methods.
+     */
+    @Test
+    public void put() {
+        Node n = new Node();
+        n.put("akey", "avalue");
+        assertTrue(n.get("akey").equals("avalue"));
+        assertTrue(n.getKeys().size() == 1);
+
+        assertTrue(n.keySet().size() == 1);
+        assertTrue(n.keySet().contains("akey"));
+    }
+
+    /**
+     * Adds two tags to an empty node and test the query and get methods.
+     */
+    @Test
+    public void put2() {
+        Node n = new Node();
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+        assertTrue(n.get("key.1").equals("value.1"));
+        assertTrue(n.get("key.2").equals("value.2"));
+        assertTrue(n.getKeys().size() == 2);
+        assertTrue(n.hasKeys());
+        assertTrue(n.hasKey("key.1"));
+        assertTrue(n.hasKey("key.2"));
+        assertTrue(!n.hasKey("nosuchkey"));
+    }
+
+    /**
+     * Removes tags from a node with two tags and test the state of the node.
+     */
+    @Test
+    public void remove() {
+        Node n = new Node();
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+
+        n.remove("nosuchkey");               // should work
+        assertTrue(n.getKeys().size() == 2); // still 2 tags ?
+
+        n.remove("key.1");
+        assertTrue(n.getKeys().size() == 1);
+        assertTrue(!n.hasKey("key.1"));
+        assertTrue(n.get("key.1") == null);
+        assertTrue(n.hasKey("key.2"));
+        assertTrue(n.get("key.2").equals("value.2"));
+
+        n.remove("key.2");
+        assertTrue(n.getKeys().size() == 0);
+        assertTrue(!n.hasKey("key.1"));
+        assertTrue(n.get("key.1") == null);
+        assertTrue(!n.hasKey("key.2"));
+        assertTrue(n.get("key.2") == null);
+    }
+
+    /**
+     * Removes all tags from a node.
+     */
+    @Test
+    public void removeAll() {
+        Node n = new Node();
+
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+
+        n.removeAll();
+        assertTrue(n.getKeys().size() == 0);
+    }
+
+    /**
+     * Test hasEqualSemanticAttributes on two nodes whose identical tags are added
+     * in different orders.
+     */
+    @Test
+    public void hasEqualSemanticAttributes() {
+        Node n1 = new Node(1);
+        n1.setCoor(new LatLon(0,0));
+        n1.put("key.1", "value.1");
+        n1.put("key.2", "value.2");
+
+        Node n2 = new Node(1);
+        n2.setCoor(new LatLon(0,0));
+        n2.put("key.2", "value.2");
+        n2.put("key.1", "value.1");
+
+        assertTrue(n1.hasEqualSemanticAttributes(n2));
+    }
+
+    /**
+     * Test hasEqualSemanticAttributes on two nodes with different tags.
+     */
+    @Test
+    public void hasEqualSemanticAttributes_2() {
+        Node n1 = new Node(1);
+        n1.setCoor(new LatLon(0,0));
+        n1.put("key.1", "value.1");
+        n1.put("key.2", "value.3");
+
+        Node n2 = new Node(1);
+        n2.setCoor(new LatLon(0,0));
+        n2.put("key.1", "value.1");
+        n2.put("key.2", "value.4");
+
+        assertTrue(!n1.hasEqualSemanticAttributes(n2));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java b/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
index e446cdc..95ec064 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
@@ -1,106 +1,106 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import static org.junit.Assert.assertFalse;
-
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.coor.LatLon;
-
-public class RelationTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void createNewRelation() {
-        new Relation(null);
-    }
-
-    @Test
-    public void equalSemenaticsToNull() {
-        Relation relation = new Relation();
-        assertFalse(relation.hasEqualTechnicalAttributes(null));
-    }
-
-    @Test
-    public void testBBox() {
-        DataSet ds = new DataSet();
-
-        Node n1 = new Node(new LatLon(10, 10));
-        Node n2 = new Node(new LatLon(20, 20));
-        Node n3 = new Node(new LatLon(30, 30));
-        Way w1 = new Way();
-        w1.addNode(n1);
-        w1.addNode(n2);
-        Relation r1 = new Relation();
-        Relation r2 = new Relation();
-        ds.addPrimitive(r1);
-        ds.addPrimitive(r2);
-        ds.addPrimitive(n1);
-        ds.addPrimitive(n2);
-        ds.addPrimitive(n3);
-        ds.addPrimitive(w1);
-        r1.addMember(new RelationMember("", n1));
-        r1.addMember(new RelationMember("", w1));
-        r1.addMember(new RelationMember("", r1));
-        r1.addMember(new RelationMember("", r2));
-        r2.addMember(new RelationMember("", r1));
-        r2.addMember(new RelationMember("", n3));
-
-        BBox bbox = new BBox(w1);
-        bbox.add(n3.getBBox());
-        Assert.assertEquals(bbox, r1.getBBox());
-        Assert.assertEquals(bbox, r2.getBBox());
-
-        n3.setCoor(new LatLon(40, 40));
-        bbox.add(n3.getBBox());
-        Assert.assertEquals(bbox, r1.getBBox());
-        Assert.assertEquals(bbox, r2.getBBox());
-
-        r1.removeMembersFor(r2);
-        Assert.assertEquals(w1.getBBox(), r1.getBBox());
-        Assert.assertEquals(bbox, r2.getBBox());
-
-        w1.addNode(n3);
-        Assert.assertEquals(w1.getBBox(), r1.getBBox());
-        Assert.assertEquals(w1.getBBox(), r2.getBBox());
-    }
-
-    @Test
-    public void testBBoxNotInDataset() {
-        Node n1 = new Node(new LatLon(10, 10));
-        Node n2 = new Node(new LatLon(20, 20));
-        Way w1 = new Way();
-        w1.addNode(n1);
-        w1.addNode(n2);
-        Relation r1 = new Relation();
-        r1.getBBox();
-        r1.addMember(new RelationMember("", w1));
-
-        Assert.assertEquals(new BBox(w1), r1.getBBox());
-
-        DataSet ds = new DataSet();
-        ds.addPrimitive(n1);
-        ds.addPrimitive(n2);
-        ds.addPrimitive(w1);
-        ds.addPrimitive(r1);
-
-        Assert.assertEquals(new BBox(w1), r1.getBBox());
-
-        ds.removePrimitive(r1);
-
-        n1.setCoor(new LatLon(30, 40));
-        Assert.assertEquals(new BBox(w1), r1.getBBox());
-
-        ds.addPrimitive(r1);
-        Assert.assertEquals(new BBox(w1), r1.getBBox());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+public class RelationTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void createNewRelation() {
+        new Relation(null);
+    }
+
+    @Test
+    public void equalSemenaticsToNull() {
+        Relation relation = new Relation();
+        assertFalse(relation.hasEqualTechnicalAttributes(null));
+    }
+
+    @Test
+    public void testBBox() {
+        DataSet ds = new DataSet();
+
+        Node n1 = new Node(new LatLon(10, 10));
+        Node n2 = new Node(new LatLon(20, 20));
+        Node n3 = new Node(new LatLon(30, 30));
+        Way w1 = new Way();
+        w1.addNode(n1);
+        w1.addNode(n2);
+        Relation r1 = new Relation();
+        Relation r2 = new Relation();
+        ds.addPrimitive(r1);
+        ds.addPrimitive(r2);
+        ds.addPrimitive(n1);
+        ds.addPrimitive(n2);
+        ds.addPrimitive(n3);
+        ds.addPrimitive(w1);
+        r1.addMember(new RelationMember("", n1));
+        r1.addMember(new RelationMember("", w1));
+        r1.addMember(new RelationMember("", r1));
+        r1.addMember(new RelationMember("", r2));
+        r2.addMember(new RelationMember("", r1));
+        r2.addMember(new RelationMember("", n3));
+
+        BBox bbox = new BBox(w1);
+        bbox.add(n3.getBBox());
+        Assert.assertEquals(bbox, r1.getBBox());
+        Assert.assertEquals(bbox, r2.getBBox());
+
+        n3.setCoor(new LatLon(40, 40));
+        bbox.add(n3.getBBox());
+        Assert.assertEquals(bbox, r1.getBBox());
+        Assert.assertEquals(bbox, r2.getBBox());
+
+        r1.removeMembersFor(r2);
+        Assert.assertEquals(w1.getBBox(), r1.getBBox());
+        Assert.assertEquals(bbox, r2.getBBox());
+
+        w1.addNode(n3);
+        Assert.assertEquals(w1.getBBox(), r1.getBBox());
+        Assert.assertEquals(w1.getBBox(), r2.getBBox());
+    }
+
+    @Test
+    public void testBBoxNotInDataset() {
+        Node n1 = new Node(new LatLon(10, 10));
+        Node n2 = new Node(new LatLon(20, 20));
+        Way w1 = new Way();
+        w1.addNode(n1);
+        w1.addNode(n2);
+        Relation r1 = new Relation();
+        r1.getBBox();
+        r1.addMember(new RelationMember("", w1));
+
+        Assert.assertEquals(new BBox(w1), r1.getBBox());
+
+        DataSet ds = new DataSet();
+        ds.addPrimitive(n1);
+        ds.addPrimitive(n2);
+        ds.addPrimitive(w1);
+        ds.addPrimitive(r1);
+
+        Assert.assertEquals(new BBox(w1), r1.getBBox());
+
+        ds.removePrimitive(r1);
+
+        n1.setCoor(new LatLon(30, 40));
+        Assert.assertEquals(new BBox(w1), r1.getBBox());
+
+        ds.addPrimitive(r1);
+        Assert.assertEquals(new BBox(w1), r1.getBBox());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryNodeTest.java b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryNodeTest.java
index fa8c5a0..a6e4771 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryNodeTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryNodeTest.java
@@ -1,52 +1,52 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm.history;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Date;
-
-import org.junit.Test;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.User;
-
-public class HistoryNodeTest {
-
-    @Test
-    public void historyNode() {
-        Date d = new Date();
-        HistoryNode node = new HistoryNode(
-                1l,
-                2l,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4l,
-                d,
-                new LatLon(0,0)
-                );
-
-        assertEquals(1, node.getId());
-        assertEquals(2, node.getVersion());
-        assertEquals(true, node.isVisible());
-        assertEquals("testuser", node.getUser().getName());
-        assertEquals(3, node.getUser().getId());
-        assertEquals(4, node.getChangesetId());
-        assertEquals(d, node.getTimestamp());
-    }
-
-    @Test
-    public void getType() {
-        Date d = new Date();
-        HistoryNode node = new HistoryNode(
-                1,
-                2,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4,
-                d,
-                new LatLon(0,0)
-                );
-
-        assertEquals(OsmPrimitiveType.NODE, node.getType());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.history;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.User;
+
+public class HistoryNodeTest {
+
+    @Test
+    public void historyNode() {
+        Date d = new Date();
+        HistoryNode node = new HistoryNode(
+                1l,
+                2l,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4l,
+                d,
+                new LatLon(0,0)
+                );
+
+        assertEquals(1, node.getId());
+        assertEquals(2, node.getVersion());
+        assertEquals(true, node.isVisible());
+        assertEquals("testuser", node.getUser().getName());
+        assertEquals(3, node.getUser().getId());
+        assertEquals(4, node.getChangesetId());
+        assertEquals(d, node.getTimestamp());
+    }
+
+    @Test
+    public void getType() {
+        Date d = new Date();
+        HistoryNode node = new HistoryNode(
+                1,
+                2,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4,
+                d,
+                new LatLon(0,0)
+                );
+
+        assertEquals(OsmPrimitiveType.NODE, node.getType());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
index 5507a81..29d473e 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
@@ -1,104 +1,104 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm.history;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.util.ArrayList;
-import java.util.Date;
-
-import org.junit.Test;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.User;
-
-public class HistoryWayTest {
-
-    @Test
-    public void wayTest() {
-        Date d = new Date();
-        HistoryWay way = new HistoryWay(
-                1,
-                2,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4,
-                d
-                );
-
-        assertEquals(1, way.getId());
-        assertEquals(2, way.getVersion());
-        assertEquals(true, way.isVisible());
-        assertEquals("testuser", way.getUser().getName());
-        assertEquals(3, way.getUser().getId());
-        assertEquals(4, way.getChangesetId());
-        assertEquals(d, way.getTimestamp());
-
-        assertEquals(0, way.getNumNodes());
-    }
-
-    @Test
-    public void getType() {
-        Date d = new Date();
-        HistoryWay way = new HistoryWay(
-                1,
-                2,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4,
-                d
-                );
-
-        assertEquals(OsmPrimitiveType.WAY, way.getType());
-    }
-
-    @Test
-    public void nodeManipulation() {
-        Date d = new Date();
-        HistoryWay way = new HistoryWay(
-                1,
-                2,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4,
-                d
-                );
-
-        way.addNode(1);
-        assertEquals(1, way.getNumNodes());
-        assertEquals(1, way.getNodeId(0));
-        try {
-            way.getNodeId(1);
-            fail("expected expection of type " + IndexOutOfBoundsException.class.toString());
-        } catch(IndexOutOfBoundsException e) {
-            // OK
-        }
-
-        way.addNode(5);
-        assertEquals(2, way.getNumNodes());
-        assertEquals(5, way.getNodeId(1));
-    }
-
-    @Test
-    public void iterating() {
-        Date d = new Date();
-        HistoryWay way = new HistoryWay(
-                1,
-                2,
-                true,
-                User.createOsmUser(3, "testuser"),
-                4,
-                d
-                );
-
-        way.addNode(1);
-        way.addNode(2);
-        ArrayList<Long> ids = new ArrayList<>();
-        for (long id : way.getNodes()) {
-            ids.add(id);
-        }
-
-        assertEquals(2, ids.size());
-        assertEquals(1, (long) ids.get(0));
-        assertEquals(2, (long) ids.get(1));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.history;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Date;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.User;
+
+public class HistoryWayTest {
+
+    @Test
+    public void wayTest() {
+        Date d = new Date();
+        HistoryWay way = new HistoryWay(
+                1,
+                2,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4,
+                d
+                );
+
+        assertEquals(1, way.getId());
+        assertEquals(2, way.getVersion());
+        assertEquals(true, way.isVisible());
+        assertEquals("testuser", way.getUser().getName());
+        assertEquals(3, way.getUser().getId());
+        assertEquals(4, way.getChangesetId());
+        assertEquals(d, way.getTimestamp());
+
+        assertEquals(0, way.getNumNodes());
+    }
+
+    @Test
+    public void getType() {
+        Date d = new Date();
+        HistoryWay way = new HistoryWay(
+                1,
+                2,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4,
+                d
+                );
+
+        assertEquals(OsmPrimitiveType.WAY, way.getType());
+    }
+
+    @Test
+    public void nodeManipulation() {
+        Date d = new Date();
+        HistoryWay way = new HistoryWay(
+                1,
+                2,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4,
+                d
+                );
+
+        way.addNode(1);
+        assertEquals(1, way.getNumNodes());
+        assertEquals(1, way.getNodeId(0));
+        try {
+            way.getNodeId(1);
+            fail("expected expection of type " + IndexOutOfBoundsException.class.toString());
+        } catch(IndexOutOfBoundsException e) {
+            // OK
+        }
+
+        way.addNode(5);
+        assertEquals(2, way.getNumNodes());
+        assertEquals(5, way.getNodeId(1));
+    }
+
+    @Test
+    public void iterating() {
+        Date d = new Date();
+        HistoryWay way = new HistoryWay(
+                1,
+                2,
+                true,
+                User.createOsmUser(3, "testuser"),
+                4,
+                d
+                );
+
+        way.addNode(1);
+        way.addNode(2);
+        ArrayList<Long> ids = new ArrayList<>();
+        for (long id : way.getNodes()) {
+            ids.add(id);
+        }
+
+        assertEquals(2, ids.size());
+        assertEquals(1, (long) ids.get(0));
+        assertEquals(2, (long) ids.get(1));
+    }
+}
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 fe3ca30..2e3f365 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
@@ -1,409 +1,409 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm.visitor;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Collection;
-
-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.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.Way;
-
-public class MergeSourceBuildingVisitorTest {
-
-    protected OsmPrimitive lookupByName(Collection<? extends OsmPrimitive> primitives, String name) {
-        if (primitives == null) return null;
-        if (name == null) return null;
-        for (OsmPrimitive primitive: primitives) {
-            if (name.equals(primitive.get("name")))
-                return primitive;
-        }
-        return null;
-    }
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void testNodes() {
-        DataSet source = new DataSet();
-        Node n1 = new Node(1);
-        Node n2 = new Node(new LatLon(10.0,10.0));
-        n2.put("name","n2");
-        Node n3 = new Node(3);
-        Node n4 = new Node(new LatLon(20.0,20.0));
-        n4.put("name","n4");
-        source.addPrimitive(n1);
-        source.addPrimitive(n2);
-        source.addPrimitive(n3);
-        source.addPrimitive(n4);
-        source.setSelected(n1,n2);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(2, hull.getNodes().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Node.class);
-
-        p = hull.getPrimitiveById(3,OsmPrimitiveType.NODE);
-        assertNull(p);
-
-        p = lookupByName(hull.getNodes(), "n2");
-        assertNotNull(p);
-
-        p = lookupByName(hull.getNodes(), "n4");
-        assertNull(p);
-    }
-
-
-    @Test
-    public void testOneWay() {
-        DataSet source = new DataSet();
-        Node n1 = new Node(1);
-        Node n2 = new Node(2);
-        Way w1 = new Way(3, 1);
-        w1.addNode(n1);
-        w1.addNode(n2);
-        source.addPrimitive(n1);
-        source.addPrimitive(n2);
-        source.addPrimitive(w1);
-        source.setSelected(w1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-        assertEquals(2, hull.getNodes().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Node.class);
-
-        p = hull.getPrimitiveById(2,OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Node.class);
-
-        p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Way.class);
-    }
-
-    @Test
-    public void testOneWayNodesSelectedToo() {
-        DataSet source = new DataSet();
-        Node n1 = new Node(1);
-        Node n2 = new Node(2);
-        Way w1 = new Way(3, 1);
-        w1.addNode(n1);
-        w1.addNode(n2);
-        source.addPrimitive(n1);
-        source.addPrimitive(n2);
-        source.addPrimitive(w1);
-        source.setSelected(w1,n1,n2);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-        assertEquals(2, hull.getNodes().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Node.class);
-
-        p = hull.getPrimitiveById(2, OsmPrimitiveType.NODE);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Node.class);
-
-        p = hull.getPrimitiveById(3,OsmPrimitiveType.WAY);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Way.class);
-    }
-
-    @Test
-    public void testOneWayIncomplete() {
-        DataSet source = new DataSet();
-        Way w1 = new Way(3);
-        source.addPrimitive(w1);
-        source.setSelected(w1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Way.class);
-        assertTrue(p.isIncomplete());
-    }
-
-    @Test
-    public void testOneRelationExistingMembersSelected() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation(1, 1);
-        Node n20 = new Node(20, 1);
-        n20.setCoor(new LatLon(0, 0));
-        r1.addMember(new RelationMember("node-20",n20));
-        Way w30 = new Way(30, 1);
-        Node n21  = new Node(21);
-        w30.addNode(n21);
-        Node n22 = new Node(22);
-        w30.addNode(n22);
-        r1.addMember(new RelationMember("way-30",w30));
-        Relation r40 = new Relation(40);
-        r1.addMember(new RelationMember("relation-40", r40));
-        source.addPrimitive(n20);
-        source.addPrimitive(n21);
-        source.addPrimitive(n22);
-        source.addPrimitive(w30);
-        source.addPrimitive(r40);
-        source.addPrimitive(r1);
-        source.setSelected(r1,n20,w30,r40);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-        assertEquals(3, hull.getNodes().size());
-        assertEquals(2, hull.getRelations().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Relation.class);
-
-        Way w = (Way)hull.getPrimitiveById(30,OsmPrimitiveType.WAY);
-        assertNotNull(w);
-        assertEquals(2, w.getNodesCount());
-        Node n = (Node)hull.getPrimitiveById(21, OsmPrimitiveType.NODE);
-        assertNotNull(n);
-        assertTrue(w.containsNode(n));
-
-        n = (Node)hull.getPrimitiveById(22,OsmPrimitiveType.NODE);
-        assertNotNull(n);
-        assertTrue(w.containsNode(n));
-
-        Relation r = (Relation)hull.getPrimitiveById(40,OsmPrimitiveType.RELATION);
-        assertNotNull(r);
-
-        r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(r);
-        assertEquals(3, r.getMembersCount());
-        RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20,OsmPrimitiveType.NODE));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION));
-        assertTrue(r.getMembers().contains(m));
-    }
-
-    @Test
-    public void testOneRelationExistingMembersNotSelected() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation(1, 1);
-        Node n20 = new Node(20);
-        r1.addMember(new RelationMember("node-20",n20));
-        Way w30 = new Way(30, 1);
-        Node n21;
-        w30.addNode(n21 = new Node(21));
-        Node n22;
-        w30.addNode(n22 = new Node(22));
-        r1.addMember(new RelationMember("way-30",w30));
-        Relation r40 = new Relation(40);
-        r1.addMember(new RelationMember("relation-40", r40));
-        source.addPrimitive(n20);
-        source.addPrimitive(n21);
-        source.addPrimitive(n22);
-        source.addPrimitive(w30);
-        source.addPrimitive(r40);
-        source.addPrimitive(r1);
-        source.setSelected(r1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-        assertEquals(1, hull.getNodes().size());
-        assertEquals(2, hull.getRelations().size());
-
-        OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(p);
-        assertEquals(p.getClass(), Relation.class);
-
-        Way w = (Way)hull.getPrimitiveById(30, OsmPrimitiveType.WAY);
-        assertNotNull(w);
-        assertTrue(w.isIncomplete());
-
-
-        Node n = (Node)hull.getPrimitiveById(21,OsmPrimitiveType.NODE);
-        assertNull(n);
-
-        n = (Node)hull.getPrimitiveById(22, OsmPrimitiveType.NODE);
-        assertNull(n);
-
-        Relation r = (Relation)hull.getPrimitiveById(40, OsmPrimitiveType.RELATION);
-        assertNotNull(r);
-        assertTrue(r.isIncomplete());
-
-        r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(r);
-        assertEquals(3, r.getMembersCount());
-        RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20, OsmPrimitiveType.NODE));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION));
-        assertTrue(r.getMembers().contains(m));
-    }
-
-    @Test
-    public void testOneRelationNewMembersNotSelected() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation();
-        r1.put("name", "r1");
-        Node n20 = new Node(new LatLon(20.0,20.0));
-        n20.put("name", "n20");
-        r1.addMember(new RelationMember("node-20",n20));
-
-        Way w30 = new Way();
-        w30.put("name", "w30");
-        Node n21;
-        w30.addNode(n21 = new Node(new LatLon(21.0,21.0)));
-        n21.put("name","n21");
-        Node n22;
-        w30.addNode(n22 = new Node(new LatLon(22.0,22.0)));
-        n22.put("name","n22");
-        r1.addMember(new RelationMember("way-30",w30));
-        Relation r40 = new Relation();
-        r40.put("name", "r40");
-        r1.addMember(new RelationMember("relation-40", r40));
-
-        source.addPrimitive(n20);
-        source.addPrimitive(n21);
-        source.addPrimitive(n22);
-        source.addPrimitive(w30);
-        source.addPrimitive(r40);
-        source.addPrimitive(r1);
-        source.setSelected(r1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getWays().size());
-        assertEquals(3, hull.getNodes().size());
-        assertEquals(2, hull.getRelations().size());
-
-        OsmPrimitive p = lookupByName(hull.getRelations(), "r1");
-        assertNotNull(p);
-        assertEquals(p.getClass(), Relation.class);
-
-        Way w = (Way)lookupByName(hull.getWays(), "w30");
-        assertNotNull(w);
-        assertEquals(2, w.getNodesCount());
-
-        Node n = (Node)lookupByName(hull.getNodes(), "n21");
-        assertNotNull(n);
-        assertTrue(w.containsNode(n));
-
-        n = (Node)lookupByName(hull.getNodes(), "n22");
-        assertNotNull(n);
-        assertTrue(w.containsNode(n));
-
-        Relation r = (Relation)lookupByName(hull.getRelations(), "r40");
-        assertNotNull(r);
-
-        r = (Relation)lookupByName(hull.getRelations(), "r1");
-        assertNotNull(r);
-        assertEquals(3, r.getMembersCount());
-        RelationMember m = new RelationMember("node-20", lookupByName(hull.getNodes(), "n20"));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("way-30", lookupByName(hull.getWays(), "w30"));
-        assertTrue(r.getMembers().contains(m));
-        m = new RelationMember("relation-40", lookupByName(hull.getRelations(), "r40"));
-        assertTrue(r.getMembers().contains(m));
-    }
-
-    @Test
-    public void testOneRelationExistingRecursive() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation(1, 1);
-        r1.addMember(new RelationMember("relation-1",r1));
-        source.addPrimitive(r1);
-        source.setSelected(r1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getRelations().size());
-
-        Relation r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(r);
-        assertEquals(1, r.getMembersCount());
-        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
-    }
-
-    @Test
-    public void testOneRelationNewRecursive() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation();
-        r1.put("name", "r1");
-        r1.addMember(new RelationMember("relation-1",r1));
-        source.addPrimitive(r1);
-        source.setSelected(r1);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(1, hull.getRelations().size());
-
-        Relation r = (Relation)lookupByName(hull.getRelations(), "r1");
-        assertNotNull(r);
-        assertEquals(1, r.getMembersCount());
-        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
-    }
-
-    @Test
-    public void testTwoRelationExistingCircular() {
-        DataSet source = new DataSet();
-        Relation r1 = new Relation(1, 1);
-        source.addPrimitive(r1);
-        Relation r2 = new Relation(2, 3);
-        source.addPrimitive(r2);
-        r1.addMember(new RelationMember("relation-2",r2));
-        r2.addMember(new RelationMember("relation-1",r1));
-        source.setSelected(r1,r2);
-
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
-        DataSet hull = builder.build();
-        assertNotNull(hull);
-        assertEquals(2, hull.getRelations().size());
-
-        r1 = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
-        assertNotNull(r1);
-        r2 = (Relation)hull.getPrimitiveById(2, OsmPrimitiveType.RELATION);
-        assertNotNull(r2);
-        assertEquals(1, r1.getMembersCount());
-        assertTrue(r1.getMembers().contains(new RelationMember("relation-2",r2)));
-        assertEquals(1, r2.getMembersCount());
-        assertTrue(r2.getMembers().contains(new RelationMember("relation-1",r1)));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.visitor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+
+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.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class MergeSourceBuildingVisitorTest {
+
+    protected OsmPrimitive lookupByName(Collection<? extends OsmPrimitive> primitives, String name) {
+        if (primitives == null) return null;
+        if (name == null) return null;
+        for (OsmPrimitive primitive: primitives) {
+            if (name.equals(primitive.get("name")))
+                return primitive;
+        }
+        return null;
+    }
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void testNodes() {
+        DataSet source = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(new LatLon(10.0,10.0));
+        n2.put("name","n2");
+        Node n3 = new Node(3);
+        Node n4 = new Node(new LatLon(20.0,20.0));
+        n4.put("name","n4");
+        source.addPrimitive(n1);
+        source.addPrimitive(n2);
+        source.addPrimitive(n3);
+        source.addPrimitive(n4);
+        source.setSelected(n1,n2);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(2, hull.getNodes().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Node.class);
+
+        p = hull.getPrimitiveById(3,OsmPrimitiveType.NODE);
+        assertNull(p);
+
+        p = lookupByName(hull.getNodes(), "n2");
+        assertNotNull(p);
+
+        p = lookupByName(hull.getNodes(), "n4");
+        assertNull(p);
+    }
+
+
+    @Test
+    public void testOneWay() {
+        DataSet source = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(2);
+        Way w1 = new Way(3, 1);
+        w1.addNode(n1);
+        w1.addNode(n2);
+        source.addPrimitive(n1);
+        source.addPrimitive(n2);
+        source.addPrimitive(w1);
+        source.setSelected(w1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+        assertEquals(2, hull.getNodes().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Node.class);
+
+        p = hull.getPrimitiveById(2,OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Node.class);
+
+        p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Way.class);
+    }
+
+    @Test
+    public void testOneWayNodesSelectedToo() {
+        DataSet source = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(2);
+        Way w1 = new Way(3, 1);
+        w1.addNode(n1);
+        w1.addNode(n2);
+        source.addPrimitive(n1);
+        source.addPrimitive(n2);
+        source.addPrimitive(w1);
+        source.setSelected(w1,n1,n2);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+        assertEquals(2, hull.getNodes().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Node.class);
+
+        p = hull.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Node.class);
+
+        p = hull.getPrimitiveById(3,OsmPrimitiveType.WAY);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Way.class);
+    }
+
+    @Test
+    public void testOneWayIncomplete() {
+        DataSet source = new DataSet();
+        Way w1 = new Way(3);
+        source.addPrimitive(w1);
+        source.setSelected(w1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Way.class);
+        assertTrue(p.isIncomplete());
+    }
+
+    @Test
+    public void testOneRelationExistingMembersSelected() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation(1, 1);
+        Node n20 = new Node(20, 1);
+        n20.setCoor(new LatLon(0, 0));
+        r1.addMember(new RelationMember("node-20",n20));
+        Way w30 = new Way(30, 1);
+        Node n21  = new Node(21);
+        w30.addNode(n21);
+        Node n22 = new Node(22);
+        w30.addNode(n22);
+        r1.addMember(new RelationMember("way-30",w30));
+        Relation r40 = new Relation(40);
+        r1.addMember(new RelationMember("relation-40", r40));
+        source.addPrimitive(n20);
+        source.addPrimitive(n21);
+        source.addPrimitive(n22);
+        source.addPrimitive(w30);
+        source.addPrimitive(r40);
+        source.addPrimitive(r1);
+        source.setSelected(r1,n20,w30,r40);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+        assertEquals(3, hull.getNodes().size());
+        assertEquals(2, hull.getRelations().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Relation.class);
+
+        Way w = (Way)hull.getPrimitiveById(30,OsmPrimitiveType.WAY);
+        assertNotNull(w);
+        assertEquals(2, w.getNodesCount());
+        Node n = (Node)hull.getPrimitiveById(21, OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertTrue(w.containsNode(n));
+
+        n = (Node)hull.getPrimitiveById(22,OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertTrue(w.containsNode(n));
+
+        Relation r = (Relation)hull.getPrimitiveById(40,OsmPrimitiveType.RELATION);
+        assertNotNull(r);
+
+        r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(r);
+        assertEquals(3, r.getMembersCount());
+        RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20,OsmPrimitiveType.NODE));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION));
+        assertTrue(r.getMembers().contains(m));
+    }
+
+    @Test
+    public void testOneRelationExistingMembersNotSelected() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation(1, 1);
+        Node n20 = new Node(20);
+        r1.addMember(new RelationMember("node-20",n20));
+        Way w30 = new Way(30, 1);
+        Node n21;
+        w30.addNode(n21 = new Node(21));
+        Node n22;
+        w30.addNode(n22 = new Node(22));
+        r1.addMember(new RelationMember("way-30",w30));
+        Relation r40 = new Relation(40);
+        r1.addMember(new RelationMember("relation-40", r40));
+        source.addPrimitive(n20);
+        source.addPrimitive(n21);
+        source.addPrimitive(n22);
+        source.addPrimitive(w30);
+        source.addPrimitive(r40);
+        source.addPrimitive(r1);
+        source.setSelected(r1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+        assertEquals(1, hull.getNodes().size());
+        assertEquals(2, hull.getRelations().size());
+
+        OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(p);
+        assertEquals(p.getClass(), Relation.class);
+
+        Way w = (Way)hull.getPrimitiveById(30, OsmPrimitiveType.WAY);
+        assertNotNull(w);
+        assertTrue(w.isIncomplete());
+
+
+        Node n = (Node)hull.getPrimitiveById(21,OsmPrimitiveType.NODE);
+        assertNull(n);
+
+        n = (Node)hull.getPrimitiveById(22, OsmPrimitiveType.NODE);
+        assertNull(n);
+
+        Relation r = (Relation)hull.getPrimitiveById(40, OsmPrimitiveType.RELATION);
+        assertNotNull(r);
+        assertTrue(r.isIncomplete());
+
+        r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(r);
+        assertEquals(3, r.getMembersCount());
+        RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20, OsmPrimitiveType.NODE));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION));
+        assertTrue(r.getMembers().contains(m));
+    }
+
+    @Test
+    public void testOneRelationNewMembersNotSelected() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation();
+        r1.put("name", "r1");
+        Node n20 = new Node(new LatLon(20.0,20.0));
+        n20.put("name", "n20");
+        r1.addMember(new RelationMember("node-20",n20));
+
+        Way w30 = new Way();
+        w30.put("name", "w30");
+        Node n21;
+        w30.addNode(n21 = new Node(new LatLon(21.0,21.0)));
+        n21.put("name","n21");
+        Node n22;
+        w30.addNode(n22 = new Node(new LatLon(22.0,22.0)));
+        n22.put("name","n22");
+        r1.addMember(new RelationMember("way-30",w30));
+        Relation r40 = new Relation();
+        r40.put("name", "r40");
+        r1.addMember(new RelationMember("relation-40", r40));
+
+        source.addPrimitive(n20);
+        source.addPrimitive(n21);
+        source.addPrimitive(n22);
+        source.addPrimitive(w30);
+        source.addPrimitive(r40);
+        source.addPrimitive(r1);
+        source.setSelected(r1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getWays().size());
+        assertEquals(3, hull.getNodes().size());
+        assertEquals(2, hull.getRelations().size());
+
+        OsmPrimitive p = lookupByName(hull.getRelations(), "r1");
+        assertNotNull(p);
+        assertEquals(p.getClass(), Relation.class);
+
+        Way w = (Way)lookupByName(hull.getWays(), "w30");
+        assertNotNull(w);
+        assertEquals(2, w.getNodesCount());
+
+        Node n = (Node)lookupByName(hull.getNodes(), "n21");
+        assertNotNull(n);
+        assertTrue(w.containsNode(n));
+
+        n = (Node)lookupByName(hull.getNodes(), "n22");
+        assertNotNull(n);
+        assertTrue(w.containsNode(n));
+
+        Relation r = (Relation)lookupByName(hull.getRelations(), "r40");
+        assertNotNull(r);
+
+        r = (Relation)lookupByName(hull.getRelations(), "r1");
+        assertNotNull(r);
+        assertEquals(3, r.getMembersCount());
+        RelationMember m = new RelationMember("node-20", lookupByName(hull.getNodes(), "n20"));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("way-30", lookupByName(hull.getWays(), "w30"));
+        assertTrue(r.getMembers().contains(m));
+        m = new RelationMember("relation-40", lookupByName(hull.getRelations(), "r40"));
+        assertTrue(r.getMembers().contains(m));
+    }
+
+    @Test
+    public void testOneRelationExistingRecursive() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation(1, 1);
+        r1.addMember(new RelationMember("relation-1",r1));
+        source.addPrimitive(r1);
+        source.setSelected(r1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getRelations().size());
+
+        Relation r = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(r);
+        assertEquals(1, r.getMembersCount());
+        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
+    }
+
+    @Test
+    public void testOneRelationNewRecursive() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation();
+        r1.put("name", "r1");
+        r1.addMember(new RelationMember("relation-1",r1));
+        source.addPrimitive(r1);
+        source.setSelected(r1);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(1, hull.getRelations().size());
+
+        Relation r = (Relation)lookupByName(hull.getRelations(), "r1");
+        assertNotNull(r);
+        assertEquals(1, r.getMembersCount());
+        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
+    }
+
+    @Test
+    public void testTwoRelationExistingCircular() {
+        DataSet source = new DataSet();
+        Relation r1 = new Relation(1, 1);
+        source.addPrimitive(r1);
+        Relation r2 = new Relation(2, 3);
+        source.addPrimitive(r2);
+        r1.addMember(new RelationMember("relation-2",r2));
+        r2.addMember(new RelationMember("relation-1",r1));
+        source.setSelected(r1,r2);
+
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source);
+        DataSet hull = builder.build();
+        assertNotNull(hull);
+        assertEquals(2, hull.getRelations().size());
+
+        r1 = (Relation)hull.getPrimitiveById(1, OsmPrimitiveType.RELATION);
+        assertNotNull(r1);
+        r2 = (Relation)hull.getPrimitiveById(2, OsmPrimitiveType.RELATION);
+        assertNotNull(r2);
+        assertEquals(1, r1.getMembersCount());
+        assertTrue(r1.getMembers().contains(new RelationMember("relation-2",r2)));
+        assertEquals(1, r2.getMembersCount());
+        assertTrue(r2.getMembers().contains(new RelationMember("relation-1",r1)));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java b/test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java
index 64f3309..cbcfe8c 100644
--- a/test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java
+++ b/test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java
@@ -57,13 +57,8 @@ public class ProjectionRegressionTest {
         setUp();
 
         Map<String, Projection> supportedCodesMap = new HashMap<>();
-        for (ProjectionChoice pc : ProjectionPreference.getProjectionChoices()) {
-            for (String code : pc.allCodes()) {
-                Collection<String> pref = pc.getPreferencesFromCode(code);
-                pc.setPreferences(pref);
-                Projection p = pc.getProjection();
-                supportedCodesMap.put(code, p);
-            }
+        for (String code : Projections.getAllProjectionCodes()) {
+            supportedCodesMap.put(code, Projections.getProjectionByCode(code));
         }
 
         List<TestData> prevData = new ArrayList<>();
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateNodeTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateNodeTest.java
index cf6a0ee..4370fe4 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateNodeTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateNodeTest.java
@@ -1,46 +1,46 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.junit.Assert.assertEquals;
-
-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.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
-/**
- * JUnit Test of "Duplicate node" validation test.
- */
-public class DuplicateNodeTest {
-
-    /**
-     * Setup test by initializing JOSM preferences and projection.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Test of "Duplicate node" validation test.
-     */
-    @Test
-    public void test() {
-        DataSet ds = new DataSet();
-
-        Node a = new Node(new LatLon(10.0, 5.0));
-        Node b = new Node(new LatLon(10.0, 5.0));
-        ds.addPrimitive(a);
-        ds.addPrimitive(b);
-
-        DuplicateNode test = new DuplicateNode();
-        test.startTest(NullProgressMonitor.INSTANCE);
-        test.visit(ds.allPrimitives());
-        test.endTest();
-
-        assertEquals(1, test.getErrors().size());
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+
+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.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * JUnit Test of "Duplicate node" validation test.
+ */
+public class DuplicateNodeTest {
+
+    /**
+     * Setup test by initializing JOSM preferences and projection.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of "Duplicate node" validation test.
+     */
+    @Test
+    public void test() {
+        DataSet ds = new DataSet();
+
+        Node a = new Node(new LatLon(10.0, 5.0));
+        Node b = new Node(new LatLon(10.0, 5.0));
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+
+        DuplicateNode test = new DuplicateNode();
+        test.startTest(NullProgressMonitor.INSTANCE);
+        test.visit(ds.allPrimitives());
+        test.endTest();
+
+        assertEquals(1, test.getErrors().size());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/InternetTagsTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/InternetTagsTest.java
index 38d2cbf..0bc9fb3 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/InternetTagsTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/InternetTagsTest.java
@@ -1,79 +1,79 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.data.validation.routines.AbstractValidator;
-import org.openstreetmap.josm.data.validation.routines.EmailValidator;
-import org.openstreetmap.josm.data.validation.routines.UrlValidator;
-
-/**
- * JUnit Test of "Internet Tags" validation test.
- */
-public class InternetTagsTest {
-
-    private static InternetTags TEST;
-
-    /**
-     * Setup test by initializing JOSM preferences and projection.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-        TEST = new InternetTags();
-    }
-
-    /**
-     * Test of "Internet Tags" validation test.
-     */
-    @Test
-    public void test() {
-
-        // Valid URLs
-        testUrl("url", "www.domain.com", true);                                // No protocol
-        testUrl("url", "http://josm.openstreetmap.de", true);                  // Simple HTTP
-        testUrl("url", "http://josm.openstreetmap.de/", true);                 // Simple HTTP + slash
-        testUrl("website", "https://www.openstreetmap.org", true);             // Simple HTTPS
-        testUrl("heritage:website", "http://www.unesco.org", true);            // Key with :
-        testUrl("website", "http://www.nu-lounge.today", true);                // see #10810: new TLD
-        testUrl("website", "http://xn--80akeqobjv1b0d3a.xn--p1ai", true);      // see #10862: IDN URL in ASCII form
-        testUrl("website", "http://xn--80akeqobjv1b0d3a.xn--p1ai/", true);     // see #10862: IDN URL in ASCII form + slash
-        testUrl("website", "http://золотаяцепь.рф", true);                     // see #10862: IDN URL in Unicode form
-        testUrl("website", "http://золотаяцепь.рф/", true);                    // see #10862: IDN URL in Unicode form + slash
-
-        // Invalid URLs
-        testUrl("url", "something://www.domain.com", false);                   // invalid protocol
-        testUrl("url", "http://www.domain.invalidtld", false);                 // invalid TLD
-
-        // Valid E-mails
-        testEmail("email", "contact at www.domain.com", true);                    // Simple email
-        testEmail("contact:email", "john.doe at other-domain.org", true);         // Key with : + dash in domain
-
-        // Invalid E-mails
-        testEmail("email", "contact at www.domain.com", false);                // No @
-        testEmail("contact:email", "john.doe at other-domain.invalidtld", false); // invalid TLD
-    }
-
-    private static void testKey(String key, String value, boolean valid, AbstractValidator validator, int code) {
-        TestError error = TEST.validateTag(OsmUtils.createPrimitive("node "+key+"="+value+""), key, validator, code);
-        if (valid) {
-            assertNull(error != null ? error.getMessage() : null, error);
-        } else {
-            assertNotNull(error);
-        }
-    }
-
-    private static void testUrl(String key, String value, boolean valid) {
-        testKey(key, value, valid, UrlValidator.getInstance(), InternetTags.INVALID_URL);
-    }
-
-    private static void testEmail(String key, String value, boolean valid) {
-        testKey(key, value, valid, EmailValidator.getInstance(), InternetTags.INVALID_EMAIL);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.data.validation.routines.AbstractValidator;
+import org.openstreetmap.josm.data.validation.routines.EmailValidator;
+import org.openstreetmap.josm.data.validation.routines.UrlValidator;
+
+/**
+ * JUnit Test of "Internet Tags" validation test.
+ */
+public class InternetTagsTest {
+
+    private static InternetTags TEST;
+
+    /**
+     * Setup test by initializing JOSM preferences and projection.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+        TEST = new InternetTags();
+    }
+
+    /**
+     * Test of "Internet Tags" validation test.
+     */
+    @Test
+    public void test() {
+
+        // Valid URLs
+        testUrl("url", "www.domain.com", true);                                // No protocol
+        testUrl("url", "http://josm.openstreetmap.de", true);                  // Simple HTTP
+        testUrl("url", "http://josm.openstreetmap.de/", true);                 // Simple HTTP + slash
+        testUrl("website", "https://www.openstreetmap.org", true);             // Simple HTTPS
+        testUrl("heritage:website", "http://www.unesco.org", true);            // Key with :
+        testUrl("website", "http://www.nu-lounge.today", true);                // see #10810: new TLD
+        testUrl("website", "http://xn--80akeqobjv1b0d3a.xn--p1ai", true);      // see #10862: IDN URL in ASCII form
+        testUrl("website", "http://xn--80akeqobjv1b0d3a.xn--p1ai/", true);     // see #10862: IDN URL in ASCII form + slash
+        testUrl("website", "http://золотаяцепь.рф", true);                     // see #10862: IDN URL in Unicode form
+        testUrl("website", "http://золотаяцепь.рф/", true);                    // see #10862: IDN URL in Unicode form + slash
+
+        // Invalid URLs
+        testUrl("url", "something://www.domain.com", false);                   // invalid protocol
+        testUrl("url", "http://www.domain.invalidtld", false);                 // invalid TLD
+
+        // Valid E-mails
+        testEmail("email", "contact at www.domain.com", true);                    // Simple email
+        testEmail("contact:email", "john.doe at other-domain.org", true);         // Key with : + dash in domain
+
+        // Invalid E-mails
+        testEmail("email", "contact at www.domain.com", false);                // No @
+        testEmail("contact:email", "john.doe at other-domain.invalidtld", false); // invalid TLD
+    }
+
+    private static void testKey(String key, String value, boolean valid, AbstractValidator validator, int code) {
+        TestError error = TEST.validateTag(OsmUtils.createPrimitive("node "+key+"="+value+""), key, validator, code);
+        if (valid) {
+            assertNull(error != null ? error.getMessage() : null, error);
+        } else {
+            assertNotNull(error);
+        }
+    }
+
+    private static void testUrl(String key, String value, boolean valid) {
+        testKey(key, value, valid, UrlValidator.getInstance(), InternetTags.INVALID_URL);
+    }
+
+    private static void testEmail(String key, String value, boolean valid) {
+        testKey(key, value, valid, EmailValidator.getInstance(), InternetTags.INVALID_EMAIL);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
index 59fff85..8e21874 100644
--- a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
@@ -1,117 +1,117 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Comparator;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetReader;
-import org.openstreetmap.josm.gui.tagging.TaggingPresets;
-import org.openstreetmap.josm.io.Compression;
-import org.openstreetmap.josm.io.IllegalDataException;
-import org.openstreetmap.josm.io.OsmReader;
-import org.xml.sax.SAXException;
-
-/**
- * Unit tests of {@link DefaultNameFormatter} class.
- *
- */
-public class DefaultNameFormatterTest {
-
-    /**
-     * Setup tests
-     */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9632">#9632</a>.
-     * @throws IllegalDataException
-     * @throws IOException
-     * @throws SAXException
-     */
-    @Test
-    public void testTicket9632() throws IllegalDataException, IOException, SAXException {
-        String source = "http://josm.openstreetmap.de/josmfile?page=Presets/BicycleJunction&preset";
-        TaggingPresets.addTaggingPresets(TaggingPresetReader.readAll(source, true));
-
-        Comparator<Relation> comparator = DefaultNameFormatter.getInstance().getRelationComparator();
-
-        try (InputStream is = new FileInputStream(TestUtils.getRegressionDataFile(9632, "data.osm.zip"))) {
-            DataSet ds = OsmReader.parseDataSet(Compression.ZIP.getUncompressedInputStream(is), null);
-
-            // Test with 3 known primitives causing the problem. Correct order is p1, p3, p2 with this preset
-            Relation p1 = (Relation) ds.getPrimitiveById(2983382, OsmPrimitiveType.RELATION);
-            Relation p2 = (Relation) ds.getPrimitiveById(550315, OsmPrimitiveType.RELATION);
-            Relation p3 = (Relation) ds.getPrimitiveById(167042, OsmPrimitiveType.RELATION);
-
-            System.out.println("p1: "+DefaultNameFormatter.getInstance().format(p1)+" - "+p1); // route_master ("Bus 453", 6 members)
-            System.out.println("p2: "+DefaultNameFormatter.getInstance().format(p2)+" - "+p2); // TMC ("A 6 Kaiserslautern - Mannheim [negative]", 123 members)
-            System.out.println("p3: "+DefaultNameFormatter.getInstance().format(p3)+" - "+p3); // route(lcn Sal  Salier-Radweg(412 members)
-
-            assertTrue(comparator.compare(p1, p2) == -1); // p1 < p2
-            assertTrue(comparator.compare(p2, p1) ==  1); // p2 > p1
-
-            assertTrue(comparator.compare(p1, p3) == -1); // p1 < p3
-            assertTrue(comparator.compare(p3, p1) ==  1); // p3 > p1
-            assertTrue(comparator.compare(p2, p3) ==  1); // p2 > p3
-            assertTrue(comparator.compare(p3, p2) == -1); // p3 < p2
-
-            Relation[] relations = new ArrayList<>(ds.getRelations()).toArray(new Relation[0]);
-
-            TestUtils.checkComparableContract(comparator, relations);
-        }
-    }
-
-    /**
-     * Tests formatting of relation names.
-     */
-    @Test
-    public void testRelationName() {
-        assertThat(getFormattedRelationName("X=Y"), is("relation (0, 0 members)"));
-        assertThat(getFormattedRelationName("name=Foo"), is("relation (\"Foo\", 0 members)"));
-        assertThat(getFormattedRelationName("type=route route=tram ref=123"), is("route (\"123\", 0 members)"));
-        assertThat(getFormattedRelationName("type=multipolygon building=yes"), is("multipolygon (\"building\", 0 members)"));
-        assertThat(getFormattedRelationName("type=multipolygon building=yes ref=123"), is("multipolygon (\"123\", 0 members)"));
-        assertThat(getFormattedRelationName("type=multipolygon building=yes addr:housenumber=123"), is("multipolygon (\"building\", 0 members)"));
-        assertThat(getFormattedRelationName("type=multipolygon building=residential addr:housenumber=123"), is("multipolygon (\"residential\", 0 members)"));
-    }
-
-    /**
-     * Tests formatting of way names.
-     */
-    @Test
-    public void testWayName() {
-        assertThat(getFormattedWayName("building=yes"), is("building (0 nodes)"));
-        assertThat(getFormattedWayName("building=yes addr:housenumber=123"), is("House number 123 (0 nodes)"));
-        assertThat(getFormattedWayName("building=yes addr:housenumber=123 addr:street=FooStreet"), is("House number 123 at FooStreet (0 nodes)"));
-        assertThat(getFormattedWayName("building=yes addr:housenumber=123 addr:housename=FooName"), is("House FooName (0 nodes)"));
-    }
-
-    static String getFormattedRelationName(String tagsString) {
-        return DefaultNameFormatter.getInstance().format((Relation) OsmUtils.createPrimitive("relation " + tagsString))
-                .replace("\u200E", "").replace("\u200F", "");
-    }
-
-    static String getFormattedWayName(String tagsString) {
-        return DefaultNameFormatter.getInstance().format((Way) OsmUtils.createPrimitive("way " + tagsString))
-                .replace("\u200E", "").replace("\u200F", "");
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetReader;
+import org.openstreetmap.josm.gui.tagging.TaggingPresets;
+import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+import org.xml.sax.SAXException;
+
+/**
+ * Unit tests of {@link DefaultNameFormatter} class.
+ *
+ */
+public class DefaultNameFormatterTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9632">#9632</a>.
+     * @throws IllegalDataException
+     * @throws IOException
+     * @throws SAXException
+     */
+    @Test
+    public void testTicket9632() throws IllegalDataException, IOException, SAXException {
+        String source = "http://josm.openstreetmap.de/josmfile?page=Presets/BicycleJunction&preset";
+        TaggingPresets.addTaggingPresets(TaggingPresetReader.readAll(source, true));
+
+        Comparator<Relation> comparator = DefaultNameFormatter.getInstance().getRelationComparator();
+
+        try (InputStream is = new FileInputStream(TestUtils.getRegressionDataFile(9632, "data.osm.zip"))) {
+            DataSet ds = OsmReader.parseDataSet(Compression.ZIP.getUncompressedInputStream(is), null);
+
+            // Test with 3 known primitives causing the problem. Correct order is p1, p3, p2 with this preset
+            Relation p1 = (Relation) ds.getPrimitiveById(2983382, OsmPrimitiveType.RELATION);
+            Relation p2 = (Relation) ds.getPrimitiveById(550315, OsmPrimitiveType.RELATION);
+            Relation p3 = (Relation) ds.getPrimitiveById(167042, OsmPrimitiveType.RELATION);
+
+            System.out.println("p1: "+DefaultNameFormatter.getInstance().format(p1)+" - "+p1); // route_master ("Bus 453", 6 members)
+            System.out.println("p2: "+DefaultNameFormatter.getInstance().format(p2)+" - "+p2); // TMC ("A 6 Kaiserslautern - Mannheim [negative]", 123 members)
+            System.out.println("p3: "+DefaultNameFormatter.getInstance().format(p3)+" - "+p3); // route(lcn Sal  Salier-Radweg(412 members)
+
+            assertTrue(comparator.compare(p1, p2) == -1); // p1 < p2
+            assertTrue(comparator.compare(p2, p1) ==  1); // p2 > p1
+
+            assertTrue(comparator.compare(p1, p3) == -1); // p1 < p3
+            assertTrue(comparator.compare(p3, p1) ==  1); // p3 > p1
+            assertTrue(comparator.compare(p2, p3) ==  1); // p2 > p3
+            assertTrue(comparator.compare(p3, p2) == -1); // p3 < p2
+
+            Relation[] relations = new ArrayList<>(ds.getRelations()).toArray(new Relation[0]);
+
+            TestUtils.checkComparableContract(comparator, relations);
+        }
+    }
+
+    /**
+     * Tests formatting of relation names.
+     */
+    @Test
+    public void testRelationName() {
+        assertThat(getFormattedRelationName("X=Y"), is("relation (0, 0 members)"));
+        assertThat(getFormattedRelationName("name=Foo"), is("relation (\"Foo\", 0 members)"));
+        assertThat(getFormattedRelationName("type=route route=tram ref=123"), is("route (\"123\", 0 members)"));
+        assertThat(getFormattedRelationName("type=multipolygon building=yes"), is("multipolygon (\"building\", 0 members)"));
+        assertThat(getFormattedRelationName("type=multipolygon building=yes ref=123"), is("multipolygon (\"123\", 0 members)"));
+        assertThat(getFormattedRelationName("type=multipolygon building=yes addr:housenumber=123"), is("multipolygon (\"building\", 0 members)"));
+        assertThat(getFormattedRelationName("type=multipolygon building=residential addr:housenumber=123"), is("multipolygon (\"residential\", 0 members)"));
+    }
+
+    /**
+     * Tests formatting of way names.
+     */
+    @Test
+    public void testWayName() {
+        assertThat(getFormattedWayName("building=yes"), is("building (0 nodes)"));
+        assertThat(getFormattedWayName("building=yes addr:housenumber=123"), is("House number 123 (0 nodes)"));
+        assertThat(getFormattedWayName("building=yes addr:housenumber=123 addr:street=FooStreet"), is("House number 123 at FooStreet (0 nodes)"));
+        assertThat(getFormattedWayName("building=yes addr:housenumber=123 addr:housename=FooName"), is("House FooName (0 nodes)"));
+    }
+
+    static String getFormattedRelationName(String tagsString) {
+        return DefaultNameFormatter.getInstance().format((Relation) OsmUtils.createPrimitive("relation " + tagsString))
+                .replace("\u200E", "").replace("\u200F", "");
+    }
+
+    static String getFormattedWayName(String tagsString) {
+        return DefaultNameFormatter.getInstance().format((Way) OsmUtils.createPrimitive("way " + tagsString))
+                .replace("\u200E", "").replace("\u200F", "");
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/JosmUserIdentityManagerTest.groovy b/test/unit/org/openstreetmap/josm/gui/JosmUserIdentityManagerTest.groovy
index 79c8cdd..0ec6fbc 100644
--- a/test/unit/org/openstreetmap/josm/gui/JosmUserIdentityManagerTest.groovy
+++ b/test/unit/org/openstreetmap/josm/gui/JosmUserIdentityManagerTest.groovy
@@ -1,315 +1,315 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui;
-
-import static org.junit.Assert.*
-
-import org.junit.BeforeClass
-import org.junit.Test
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.Main
-import org.openstreetmap.josm.data.osm.UserInfo
-
-class JosmUserIdentityManagerTest {
-
-	final shouldFail = new GroovyTestCase().&shouldFail
-
-	@BeforeClass
-	public static void initTestCase() {
-	    JOSMFixture.createUnitTestFixture().init()
-	}
-
-	@Test
-	public void test_SingletonAccess() {
-
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		// created ?
-		assert im != null
-
-		// registered as listener ?
-		assert Main.pref. at listeners.contains(im)
-
-		JosmUserIdentityManager im2 = JosmUserIdentityManager.getInstance()
-
-		// only one instance
-		assert im == im2
-	}
-
-	@Test
-	public void test_setAnonymouse() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		im.setPartiallyIdentified "test"
-		im.setAnonymous()
-
-		assert im.isAnonymous()
-		assert ! im.isPartiallyIdentified()
-		assert ! im.isFullyIdentified()
-
-		assert im.getUserId() == 0
-		assert im.getUserName() == null
-		assert im.getUserInfo() == null
-	}
-
-	@Test
-	public void test_setPartiallyIdentified() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		im.setPartiallyIdentified "test"
-
-		shouldFail(IllegalArgumentException) {
-		    im.setPartiallyIdentified null
-		}
-
-		shouldFail(IllegalArgumentException) {
-			im.setPartiallyIdentified ""
-		}
-
-		shouldFail(IllegalArgumentException) {
-			im.setPartiallyIdentified "  \t  "
-		}
-
-		im.setPartiallyIdentified "test"
-
-		assert ! im.isAnonymous()
-		assert im.isPartiallyIdentified()
-		assert ! im.isFullyIdentified()
-
-		assert im.getUserId() == 0
-		assert im.getUserName() == "test"
-		assert im.getUserInfo() == null
-	}
-
-
-	@Test
-	public void test_setFullyIdentified() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		UserInfo userInfo = new UserInfo(id: 1, description: "a description")
-
-		im.setFullyIdentified "test", userInfo
-
-		shouldFail(IllegalArgumentException) {
-			im.setFullyIdentified null, userInfo
-		}
-		shouldFail(IllegalArgumentException) {
-			im.setFullyIdentified "", userInfo
-		}
-		shouldFail(IllegalArgumentException) {
-			im.setFullyIdentified " \t ", userInfo
-		}
-		shouldFail(IllegalArgumentException) {
-			im.setFullyIdentified "test", null
-		}
-
-		im.setFullyIdentified "test", userInfo
-
-		assert ! im.isAnonymous()
-		assert ! im.isPartiallyIdentified()
-		assert im.isFullyIdentified()
-
-		assert im.getUserId() == 1
-		assert im.getUserName() == "test"
-		assert im.getUserInfo() == userInfo
-	}
-
-	/**
-	 * Preferences include neither an url nor a user name => we have
-	 * an anonymous user
-	 */
-	@Test
-	public void initFromPreferences_1() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		// reset it
-		im. at userName = null
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.url", null
-		Main.pref.put "osm-server.username", null
-
-		im.initFromPreferences()
-
-		assert im.isAnonymous()
-	}
-
-	/**
-	 * Preferences include neither an url nor a user name => we have
-	 * an annoymous user
-	 */
-	@Test
-	public void initFromPreferences_2() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		// reset it
-		im. at userName = null
-		im. at userInfo = null
-
-		// for this test we disable the listener
-		Main.pref.removePreferenceChangeListener im
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		Main.pref.put "osm-server.username", null
-
-		im.initFromPreferences()
-
-		assert im.isAnonymous()
-	}
-
-	/**
-	 * Preferences include an user name => we have a partially identified user
-	 */
-	@Test
-	public void initFromPreferences_3() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-        // for this test we disable the listener
-		Main.pref.removePreferenceChangeListener im
-
-		// reset it
-		im. at userName = null
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		Main.pref.put "osm-server.username", "test"
-
-		im.initFromPreferences()
-
-		assert im.isPartiallyIdentified()
-	}
-
-	/**
-	 * Preferences include an user name which is different from the current
-	 * user name and we are currently fully identifed => josm user becomes
-	 * partially identified
-	 */
-	@Test
-	public void initFromPreferences_4() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-        // for this test we disable the listener
-		Main.pref.removePreferenceChangeListener im
-
-		im.setFullyIdentified "test1", new UserInfo(id: 1)
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		Main.pref.put "osm-server.username", "test2"
-
-		im.initFromPreferences()
-
-		assert im.isPartiallyIdentified()
-	}
-
-	/**
-	 * Preferences include an user name which is the same as the current
-	 * user name and we are currently fully identifed => josm user remains
-	 * fully identified
-	 */
-	@Test
-	public void initFromPreferences_5() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-        // for this test we disable the listener
-		Main.pref.removePreferenceChangeListener im
-
-		im.setFullyIdentified "test1", new UserInfo(id: 1)
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		Main.pref.put "osm-server.username", "test1"
-
-		im.initFromPreferences()
-
-		assert im.isFullyIdentified()
-	}
-
-	@Test
-	public void apiUrlChanged() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		// make sure im is a preference change listener
-		Main.pref.addPreferenceChangeListener im
-
-		// reset it
-		im. at userName = null
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		assert im.isAnonymous()
-
-         Main.pref.put "osm-server.url", null
-         assert im.isAnonymous()
-
-		// reset it
-		im. at userName = "test"
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		assert im.isPartiallyIdentified()
-		assert im.getUserName() == "test"
-
-		Main.pref.put "osm-server.url", null
-		assert im.isAnonymous()
-
-		// reset it
-		im. at userName = "test"
-		im. at userInfo = new UserInfo(id:1)
-
-		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
-		assert im.isPartiallyIdentified()
-		assert im.getUserName() == "test"
-
-		// reset it
-		im. at userName = "test"
-		im. at userInfo = new UserInfo(id:1)
-
-
-		Main.pref.put "osm-server.url", null
-		assert im.isAnonymous()
-	}
-
-	@Test
-	public void userNameChanged() {
-		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
-
-		// make sure im is a preference change listener
-		Main.pref.addPreferenceChangeListener im
-
-		// reset it
-		im. at userName = null
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.username", "test"
-		assert im.isPartiallyIdentified()
-		assert im.getUserName() == "test"
-
-		Main.pref.put "osm-server.username", null
-		assert im.isAnonymous()
-
-		// reset it
-		im. at userName = "test1"
-		im. at userInfo = null
-
-		Main.pref.put "osm-server.username", "test2"
-		assert im.isPartiallyIdentified()
-		assert im.getUserName() == "test2"
-
-		Main.pref.put "osm-server.username", null
-		assert im.isAnonymous()
-
-		// reset it
-		im. at userName = "test1"
-		im. at userInfo = new UserInfo(id:1)
-
-		Main.pref.put "osm-server.username", "test2"
-		assert im.isPartiallyIdentified()
-		assert im.getUserName() == "test2"
-
-		// reset it
-		im. at userName = "test1"
-		im. at userInfo = new UserInfo(id:1)
-
-
-		Main.pref.put "osm-server.username", null
-		assert im.isAnonymous()
-	}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.junit.Assert.*
+
+import org.junit.BeforeClass
+import org.junit.Test
+import org.openstreetmap.josm.JOSMFixture
+import org.openstreetmap.josm.Main
+import org.openstreetmap.josm.data.osm.UserInfo
+
+class JosmUserIdentityManagerTest {
+
+	final shouldFail = new GroovyTestCase().&shouldFail
+
+	@BeforeClass
+	public static void initTestCase() {
+	    JOSMFixture.createUnitTestFixture().init()
+	}
+
+	@Test
+	public void test_SingletonAccess() {
+
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		// created ?
+		assert im != null
+
+		// registered as listener ?
+		assert Main.pref. at listeners.contains(im)
+
+		JosmUserIdentityManager im2 = JosmUserIdentityManager.getInstance()
+
+		// only one instance
+		assert im == im2
+	}
+
+	@Test
+	public void test_setAnonymouse() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		im.setPartiallyIdentified "test"
+		im.setAnonymous()
+
+		assert im.isAnonymous()
+		assert ! im.isPartiallyIdentified()
+		assert ! im.isFullyIdentified()
+
+		assert im.getUserId() == 0
+		assert im.getUserName() == null
+		assert im.getUserInfo() == null
+	}
+
+	@Test
+	public void test_setPartiallyIdentified() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		im.setPartiallyIdentified "test"
+
+		shouldFail(IllegalArgumentException) {
+		    im.setPartiallyIdentified null
+		}
+
+		shouldFail(IllegalArgumentException) {
+			im.setPartiallyIdentified ""
+		}
+
+		shouldFail(IllegalArgumentException) {
+			im.setPartiallyIdentified "  \t  "
+		}
+
+		im.setPartiallyIdentified "test"
+
+		assert ! im.isAnonymous()
+		assert im.isPartiallyIdentified()
+		assert ! im.isFullyIdentified()
+
+		assert im.getUserId() == 0
+		assert im.getUserName() == "test"
+		assert im.getUserInfo() == null
+	}
+
+
+	@Test
+	public void test_setFullyIdentified() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		UserInfo userInfo = new UserInfo(id: 1, description: "a description")
+
+		im.setFullyIdentified "test", userInfo
+
+		shouldFail(IllegalArgumentException) {
+			im.setFullyIdentified null, userInfo
+		}
+		shouldFail(IllegalArgumentException) {
+			im.setFullyIdentified "", userInfo
+		}
+		shouldFail(IllegalArgumentException) {
+			im.setFullyIdentified " \t ", userInfo
+		}
+		shouldFail(IllegalArgumentException) {
+			im.setFullyIdentified "test", null
+		}
+
+		im.setFullyIdentified "test", userInfo
+
+		assert ! im.isAnonymous()
+		assert ! im.isPartiallyIdentified()
+		assert im.isFullyIdentified()
+
+		assert im.getUserId() == 1
+		assert im.getUserName() == "test"
+		assert im.getUserInfo() == userInfo
+	}
+
+	/**
+	 * Preferences include neither an url nor a user name => we have
+	 * an anonymous user
+	 */
+	@Test
+	public void initFromPreferences_1() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		// reset it
+		im. at userName = null
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.url", null
+		Main.pref.put "osm-server.username", null
+
+		im.initFromPreferences()
+
+		assert im.isAnonymous()
+	}
+
+	/**
+	 * Preferences include neither an url nor a user name => we have
+	 * an annoymous user
+	 */
+	@Test
+	public void initFromPreferences_2() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		// reset it
+		im. at userName = null
+		im. at userInfo = null
+
+		// for this test we disable the listener
+		Main.pref.removePreferenceChangeListener im
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		Main.pref.put "osm-server.username", null
+
+		im.initFromPreferences()
+
+		assert im.isAnonymous()
+	}
+
+	/**
+	 * Preferences include an user name => we have a partially identified user
+	 */
+	@Test
+	public void initFromPreferences_3() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+        // for this test we disable the listener
+		Main.pref.removePreferenceChangeListener im
+
+		// reset it
+		im. at userName = null
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		Main.pref.put "osm-server.username", "test"
+
+		im.initFromPreferences()
+
+		assert im.isPartiallyIdentified()
+	}
+
+	/**
+	 * Preferences include an user name which is different from the current
+	 * user name and we are currently fully identifed => josm user becomes
+	 * partially identified
+	 */
+	@Test
+	public void initFromPreferences_4() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+        // for this test we disable the listener
+		Main.pref.removePreferenceChangeListener im
+
+		im.setFullyIdentified "test1", new UserInfo(id: 1)
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		Main.pref.put "osm-server.username", "test2"
+
+		im.initFromPreferences()
+
+		assert im.isPartiallyIdentified()
+	}
+
+	/**
+	 * Preferences include an user name which is the same as the current
+	 * user name and we are currently fully identifed => josm user remains
+	 * fully identified
+	 */
+	@Test
+	public void initFromPreferences_5() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+        // for this test we disable the listener
+		Main.pref.removePreferenceChangeListener im
+
+		im.setFullyIdentified "test1", new UserInfo(id: 1)
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		Main.pref.put "osm-server.username", "test1"
+
+		im.initFromPreferences()
+
+		assert im.isFullyIdentified()
+	}
+
+	@Test
+	public void apiUrlChanged() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		// make sure im is a preference change listener
+		Main.pref.addPreferenceChangeListener im
+
+		// reset it
+		im. at userName = null
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		assert im.isAnonymous()
+
+         Main.pref.put "osm-server.url", null
+         assert im.isAnonymous()
+
+		// reset it
+		im. at userName = "test"
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		assert im.isPartiallyIdentified()
+		assert im.getUserName() == "test"
+
+		Main.pref.put "osm-server.url", null
+		assert im.isAnonymous()
+
+		// reset it
+		im. at userName = "test"
+		im. at userInfo = new UserInfo(id:1)
+
+		Main.pref.put "osm-server.url", "http://api.openstreetmap.org"
+		assert im.isPartiallyIdentified()
+		assert im.getUserName() == "test"
+
+		// reset it
+		im. at userName = "test"
+		im. at userInfo = new UserInfo(id:1)
+
+
+		Main.pref.put "osm-server.url", null
+		assert im.isAnonymous()
+	}
+
+	@Test
+	public void userNameChanged() {
+		JosmUserIdentityManager im = JosmUserIdentityManager.getInstance()
+
+		// make sure im is a preference change listener
+		Main.pref.addPreferenceChangeListener im
+
+		// reset it
+		im. at userName = null
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.username", "test"
+		assert im.isPartiallyIdentified()
+		assert im.getUserName() == "test"
+
+		Main.pref.put "osm-server.username", null
+		assert im.isAnonymous()
+
+		// reset it
+		im. at userName = "test1"
+		im. at userInfo = null
+
+		Main.pref.put "osm-server.username", "test2"
+		assert im.isPartiallyIdentified()
+		assert im.getUserName() == "test2"
+
+		Main.pref.put "osm-server.username", null
+		assert im.isAnonymous()
+
+		// reset it
+		im. at userName = "test1"
+		im. at userInfo = new UserInfo(id:1)
+
+		Main.pref.put "osm-server.username", "test2"
+		assert im.isPartiallyIdentified()
+		assert im.getUserName() == "test2"
+
+		// reset it
+		im. at userName = "test1"
+		im. at userInfo = new UserInfo(id:1)
+
+
+		Main.pref.put "osm-server.username", null
+		assert im.isAnonymous()
+	}
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/SystemOfMeasurementTest.java b/test/unit/org/openstreetmap/josm/gui/SystemOfMeasurementTest.java
index 35b28c4..15c0701 100644
--- a/test/unit/org/openstreetmap/josm/gui/SystemOfMeasurementTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/SystemOfMeasurementTest.java
@@ -1,128 +1,128 @@
-package org.openstreetmap.josm.gui;
-
-import static org.junit.Assert.assertEquals;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.SystemOfMeasurement;
-
-/**
- * Unit tests of {@link SystemOfMeasurement} class.
- */
-public class SystemOfMeasurementTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Test of {@link SystemOfMeasurement#getDistText} method.
-     */
-    @Test
-    public void testGetDistText() {
-
-        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-1));
-        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-0.99));
-        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-0));
-        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(0));
-
-        assertEquals("0.01 m", SystemOfMeasurement.METRIC.getDistText(0.01));
-
-        assertEquals("0.99 m", SystemOfMeasurement.METRIC.getDistText(0.99));
-        assertEquals("1.00 m", SystemOfMeasurement.METRIC.getDistText(1.0));
-        assertEquals("1.01 m", SystemOfMeasurement.METRIC.getDistText(1.01));
-
-        assertEquals("9.99 m", SystemOfMeasurement.METRIC.getDistText(9.99));
-        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.0));
-        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.01));
-        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.049));
-        assertEquals("10.1 m", SystemOfMeasurement.METRIC.getDistText(10.050));
-        assertEquals("10.1 m", SystemOfMeasurement.METRIC.getDistText(10.051));
-
-        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(99.99));
-        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(100.0));
-        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(100.01));
-
-        assertEquals("1000.0 m", SystemOfMeasurement.METRIC.getDistText(999.99)); // TODO ? 1.00 km should be better
-        assertEquals("1000.0 m", SystemOfMeasurement.METRIC.getDistText(1000.0)); // TODO ? 1.00 km should be better
-        assertEquals("1.00 km", SystemOfMeasurement.METRIC.getDistText(1000.01));
-
-        assertEquals("10.00 km", SystemOfMeasurement.METRIC.getDistText(9999.99)); // TODO ? 10.0 km should be better
-        assertEquals("10.0 km", SystemOfMeasurement.METRIC.getDistText(10000.0));
-        assertEquals("10.0 km", SystemOfMeasurement.METRIC.getDistText(10000.01));
-
-        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(99999.99));
-        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(100000.0));
-        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(100000.01));
-    }
-
-    /**
-     * Test of {@link SystemOfMeasurement#getDistText} method with a non-English locale.
-     */
-    @Test
-    public void testGetDistTextLocalized() {
-        final DecimalFormat format = new DecimalFormat("0.000", DecimalFormatSymbols.getInstance(Locale.GERMAN));
-        assertEquals("0,001 m", SystemOfMeasurement.METRIC.getDistText(0.001, format, 1e-6));
-        assertEquals("< 0,010 m", SystemOfMeasurement.METRIC.getDistText(0.001, format, 0.01));
-        assertEquals("10,051 m", SystemOfMeasurement.METRIC.getDistText(10.0514, format, 0.01));
-        assertEquals("10,052 m", SystemOfMeasurement.METRIC.getDistText(10.0515, format, 0.01));
-        assertEquals("100,000 km", SystemOfMeasurement.METRIC.getDistText(100000.0, format, 0.01));
-    }
-
-    /**
-     * Test of {@link SystemOfMeasurement#getAreaText} method.
-     */
-    @Test
-    public void testGetAreaText() {
-        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-1));
-        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-0.99));
-        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-0));
-        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(0));
-
-        assertEquals("0.01 m²", SystemOfMeasurement.METRIC.getAreaText(0.01));
-
-        assertEquals("0.99 m²", SystemOfMeasurement.METRIC.getAreaText(0.99));
-        assertEquals("1.00 m²", SystemOfMeasurement.METRIC.getAreaText(1.0));
-        assertEquals("1.01 m²", SystemOfMeasurement.METRIC.getAreaText(1.01));
-
-        assertEquals("9.99 m²", SystemOfMeasurement.METRIC.getAreaText(9.99));
-        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.0));
-        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.01));
-        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.049));
-        assertEquals("10.1 m²", SystemOfMeasurement.METRIC.getAreaText(10.050));
-        assertEquals("10.1 m²", SystemOfMeasurement.METRIC.getAreaText(10.051));
-
-        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(99.99));
-        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(100.0));
-        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(100.01));
-
-        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(999.99));
-        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(1000.0));
-        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(1000.01));
-
-        assertEquals("10000.0 m²", SystemOfMeasurement.METRIC.getAreaText(9999.99)); // TODO ? 1.00 ha should be better
-        assertEquals("10000.0 m²", SystemOfMeasurement.METRIC.getAreaText(10000.0)); // TODO ? 1.00 ha should be better
-        assertEquals("1.00 ha", SystemOfMeasurement.METRIC.getAreaText(10000.01));
-
-        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(99999.99));
-        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(100000.0));
-        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(100000.01));
-
-        assertEquals("100.0 ha", SystemOfMeasurement.METRIC.getAreaText(999999.99)); // TODO ? 1.00 km² should be better
-        assertEquals("1.00 km²", SystemOfMeasurement.METRIC.getAreaText(1000000.0));
-        assertEquals("1.00 km²", SystemOfMeasurement.METRIC.getAreaText(1000000.01));
-
-        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(9999999.99));
-        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(10000000.0));
-        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(10000000.01));
-    }
-}
+package org.openstreetmap.josm.gui;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.SystemOfMeasurement;
+
+/**
+ * Unit tests of {@link SystemOfMeasurement} class.
+ */
+public class SystemOfMeasurementTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of {@link SystemOfMeasurement#getDistText} method.
+     */
+    @Test
+    public void testGetDistText() {
+
+        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-1));
+        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-0.99));
+        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(-0));
+        assertEquals("< 0.01 m", SystemOfMeasurement.METRIC.getDistText(0));
+
+        assertEquals("0.01 m", SystemOfMeasurement.METRIC.getDistText(0.01));
+
+        assertEquals("0.99 m", SystemOfMeasurement.METRIC.getDistText(0.99));
+        assertEquals("1.00 m", SystemOfMeasurement.METRIC.getDistText(1.0));
+        assertEquals("1.01 m", SystemOfMeasurement.METRIC.getDistText(1.01));
+
+        assertEquals("9.99 m", SystemOfMeasurement.METRIC.getDistText(9.99));
+        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.0));
+        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.01));
+        assertEquals("10.0 m", SystemOfMeasurement.METRIC.getDistText(10.049));
+        assertEquals("10.1 m", SystemOfMeasurement.METRIC.getDistText(10.050));
+        assertEquals("10.1 m", SystemOfMeasurement.METRIC.getDistText(10.051));
+
+        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(99.99));
+        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(100.0));
+        assertEquals("100.0 m", SystemOfMeasurement.METRIC.getDistText(100.01));
+
+        assertEquals("1000.0 m", SystemOfMeasurement.METRIC.getDistText(999.99)); // TODO ? 1.00 km should be better
+        assertEquals("1000.0 m", SystemOfMeasurement.METRIC.getDistText(1000.0)); // TODO ? 1.00 km should be better
+        assertEquals("1.00 km", SystemOfMeasurement.METRIC.getDistText(1000.01));
+
+        assertEquals("10.00 km", SystemOfMeasurement.METRIC.getDistText(9999.99)); // TODO ? 10.0 km should be better
+        assertEquals("10.0 km", SystemOfMeasurement.METRIC.getDistText(10000.0));
+        assertEquals("10.0 km", SystemOfMeasurement.METRIC.getDistText(10000.01));
+
+        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(99999.99));
+        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(100000.0));
+        assertEquals("100.0 km", SystemOfMeasurement.METRIC.getDistText(100000.01));
+    }
+
+    /**
+     * Test of {@link SystemOfMeasurement#getDistText} method with a non-English locale.
+     */
+    @Test
+    public void testGetDistTextLocalized() {
+        final DecimalFormat format = new DecimalFormat("0.000", DecimalFormatSymbols.getInstance(Locale.GERMAN));
+        assertEquals("0,001 m", SystemOfMeasurement.METRIC.getDistText(0.001, format, 1e-6));
+        assertEquals("< 0,010 m", SystemOfMeasurement.METRIC.getDistText(0.001, format, 0.01));
+        assertEquals("10,051 m", SystemOfMeasurement.METRIC.getDistText(10.0514, format, 0.01));
+        assertEquals("10,052 m", SystemOfMeasurement.METRIC.getDistText(10.0515, format, 0.01));
+        assertEquals("100,000 km", SystemOfMeasurement.METRIC.getDistText(100000.0, format, 0.01));
+    }
+
+    /**
+     * Test of {@link SystemOfMeasurement#getAreaText} method.
+     */
+    @Test
+    public void testGetAreaText() {
+        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-1));
+        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-0.99));
+        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(-0));
+        assertEquals("< 0.01 m²", SystemOfMeasurement.METRIC.getAreaText(0));
+
+        assertEquals("0.01 m²", SystemOfMeasurement.METRIC.getAreaText(0.01));
+
+        assertEquals("0.99 m²", SystemOfMeasurement.METRIC.getAreaText(0.99));
+        assertEquals("1.00 m²", SystemOfMeasurement.METRIC.getAreaText(1.0));
+        assertEquals("1.01 m²", SystemOfMeasurement.METRIC.getAreaText(1.01));
+
+        assertEquals("9.99 m²", SystemOfMeasurement.METRIC.getAreaText(9.99));
+        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.0));
+        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.01));
+        assertEquals("10.0 m²", SystemOfMeasurement.METRIC.getAreaText(10.049));
+        assertEquals("10.1 m²", SystemOfMeasurement.METRIC.getAreaText(10.050));
+        assertEquals("10.1 m²", SystemOfMeasurement.METRIC.getAreaText(10.051));
+
+        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(99.99));
+        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(100.0));
+        assertEquals("100.0 m²", SystemOfMeasurement.METRIC.getAreaText(100.01));
+
+        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(999.99));
+        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(1000.0));
+        assertEquals("1000.0 m²", SystemOfMeasurement.METRIC.getAreaText(1000.01));
+
+        assertEquals("10000.0 m²", SystemOfMeasurement.METRIC.getAreaText(9999.99)); // TODO ? 1.00 ha should be better
+        assertEquals("10000.0 m²", SystemOfMeasurement.METRIC.getAreaText(10000.0)); // TODO ? 1.00 ha should be better
+        assertEquals("1.00 ha", SystemOfMeasurement.METRIC.getAreaText(10000.01));
+
+        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(99999.99));
+        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(100000.0));
+        assertEquals("10.0 ha", SystemOfMeasurement.METRIC.getAreaText(100000.01));
+
+        assertEquals("100.0 ha", SystemOfMeasurement.METRIC.getAreaText(999999.99)); // TODO ? 1.00 km² should be better
+        assertEquals("1.00 km²", SystemOfMeasurement.METRIC.getAreaText(1000000.0));
+        assertEquals("1.00 km²", SystemOfMeasurement.METRIC.getAreaText(1000000.01));
+
+        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(9999999.99));
+        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(10000000.0));
+        assertEquals("10.0 km²", SystemOfMeasurement.METRIC.getAreaText(10000000.01));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java
index 759656b..26dafe8 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java
@@ -1,723 +1,723 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.nodes;
-
-import static org.fest.reflect.core.Reflection.field;
-import static org.fest.reflect.core.Reflection.method;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.swing.DefaultListSelectionModel;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.DatasetFactory;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListMergeModel;
-
-public class NodeListMergeModelTest {
-
-    private DatasetFactory my = new DatasetFactory();
-    private DatasetFactory their = new DatasetFactory();
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @SuppressWarnings("unchecked")
-    protected List<Node> inspectNodeList(NodeListMergeModel model, String name) {
-        return method("get" + name + "Entries")
-        .withReturnType(List.class)
-        .in(model)
-        .invoke();
-    }
-
-    protected DefaultListSelectionModel inspectListSelectionModel(NodeListMergeModel model, String name) {
-        return field(name).ofType(DefaultListSelectionModel.class)
-        .in(model)
-        .get();
-    }
-
-    protected void ensureSelected(DefaultListSelectionModel model, Object... idx) {
-        if (idx == null) return;
-        for (int i=0; i < idx.length; i++) {
-            if (idx[i] instanceof Integer) {
-                int j = (Integer)idx[i];
-                assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
-                break;
-            }
-            try {
-                int rows[] = (int[])idx[i];
-                if (rows.length != 2) {
-                    fail("illegal selection range. Either null or not length 2: " + Arrays.toString(rows));
-                }
-                if (rows[0] > rows[1]) {
-                    fail("illegal selection range. lower bound > upper bound ");
-                }
-                for (int j = rows[0]; j <= rows[1]; j++) {
-                    assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
-                }
-            } catch(ClassCastException e) {
-                fail("illegal selection range:" + idx[i]);
-            }
-        }
-    }
-
-    @Test
-    public void test_copyMyNodesToTop_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        model.copyMyToTop(new int[]{0});
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-
-        assertEquals(1, mergedNodes.size());
-        assertEquals(2, mergedNodes.get(0).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0);
-
-    }
-
-
-    @Test
-    public void test_copyMyNodesToTop_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToTop(new int[]{0});
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(2, mergedNodes.size());
-        assertEquals(2, mergedNodes.get(0).getId());
-        assertEquals(1, mergedNodes.get(1).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0);
-
-    }
-
-    @Test
-    public void test_copyMyNodesToTop_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToTop(new int[]{1}); // copy node 3
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(2, mergedNodes.size());
-        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
-        assertEquals(1, mergedNodes.get(1).getId()); // already merged node 1 at position 1
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0);
-    }
-
-    @Test
-    public void test_copyMyNodesToTop_4() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        myWay.addNode(my.addNode(4));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToTop(new int[]{1,2}); // copy node 3 and 4
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(3, mergedNodes.size());
-        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
-        assertEquals(4, mergedNodes.get(1).getId()); // my node 4 at position 1
-        assertEquals(1, mergedNodes.get(2).getId()); // already merged node 1 at position 2
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0,1); // first two rows selected
-    }
-
-
-    @Test
-    public void test_copyMyNodesToEnd_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        model.copyMyToEnd(new int[]{0});
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-
-        assertEquals(1, mergedNodes.size());
-        assertEquals(2, mergedNodes.get(0).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0);
-    }
-
-    @Test
-    public void test_copyMyNodesToEnd_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToEnd(new int[]{0});
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(2, mergedNodes.size());
-        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
-        assertEquals(2, mergedNodes.get(1).getId()); // copied node 2 at position 1
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 1);
-    }
-
-    @Test
-    public void test_copyMyNodesToEnd_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToEnd(new int[]{1}); // copy node 3
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(2, mergedNodes.size());
-        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
-        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
-
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 1);
-    }
-
-    @Test
-    public void test_copyMyNodesToEnd_4() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        myWay.addNode(my.addNode(4));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(1));
-
-        model.copyMyToEnd(new int[]{1,2}); // copy node 3 and 4
-
-        mergedNodes = inspectNodeList(model, "Merged");
-        assertEquals(3, mergedNodes.size());
-        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
-        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
-        assertEquals(4, mergedNodes.get(2).getId()); // my node 4 at position 2
-
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 1,2); // last two rows selected
-    }
-
-    /* ----------------------------------------------------------------------------- */
-    /* copyMyNodesBeforeCurrent                                                      */
-    /* ----------------------------------------------------------------------------- */
-
-    @Test
-    public void test_copyMyNodesBeforeCurrent_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.copyMyBeforeCurrent(new int[]{0}, 1);
-
-        assertEquals(4, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
-        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
-        assertEquals(11, mergedNodes.get(2).getId()); // already merged node
-        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 1); // position 1 selected
-    }
-
-
-    @Test
-    public void test_copyMyNodesBeforeCurrent_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.copyMyBeforeCurrent(new int[]{0,1}, 0);
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(1, mergedNodes.get(0).getId());  // copied node 1 at position 0
-        assertEquals(2, mergedNodes.get(1).getId());  // copied node 2 at position 1
-        assertEquals(10, mergedNodes.get(2).getId()); // already merged node
-        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
-        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0,1); // position 0 and 1 selected
-    }
-
-    @Test
-    public void test_copyMyNodesBeforeCurrent_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        try {
-            model.copyMyBeforeCurrent(new int[]{0,1}, -1);
-            fail("expected IllegalArgumentException");
-        } catch(IllegalArgumentException e) {
-            // OK
-        }
-
-        try {
-            model.copyMyBeforeCurrent(new int[]{0,1}, 4);
-            fail("expected IllegalArgumentException");
-        } catch(IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /* ----------------------------------------------------------------------------- */
-    /* copyMyNodesAfterCurrent                                                       */
-    /* ----------------------------------------------------------------------------- */
-    @Test
-    public void test_copyMyNodesAfterCurrent_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.copyMyAfterCurrent(new int[]{0}, 1);
-
-        assertEquals(4, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
-        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
-        assertEquals(1, mergedNodes.get(2).getId());  // copied node 1 at position 2
-        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 2); // position 1 selected
-    }
-
-
-    @Test
-    public void test_copyMyNodesAfterCurrent_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.copyMyAfterCurrent(new int[]{0,1}, 2);
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
-        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
-        assertEquals(12, mergedNodes.get(2).getId()); // already merged node
-        assertEquals(1, mergedNodes.get(3).getId());  // copied node 1 at position 3
-        assertEquals(2, mergedNodes.get(4).getId());  // copied node 2 at position 4
-
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 3,4); // position 3,4 selected
-    }
-
-    @Test
-    public void test_copyMyNodesAfterCurrent_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = my.addWay(1, 1);
-        myWay.addNode(my.addNode(1));
-        myWay.addNode(my.addNode(2));
-        myWay.addNode(my.addNode(3));
-        Way theirWay = their.addWay(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.copyMyAfterCurrent(new int[]{0,2}, 0);
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
-        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
-        assertEquals(3, mergedNodes.get(2).getId());  // copied node 3 at position 2
-        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
-        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 1,2); // position 1,2 selected
-    }
-
-
-    /* ----------------------------------------------------------------------------- */
-    /* moveUpMergedNodes                                                       */
-    /* ----------------------------------------------------------------------------- */
-    @Test
-    public void test_moveUpMergedNodes_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.moveUpMerged(new int[]{1});
-
-        assertEquals(3, mergedNodes.size());
-        assertEquals(11, mergedNodes.get(0).getId());
-        assertEquals(10, mergedNodes.get(1).getId());
-        assertEquals(12, mergedNodes.get(2).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0); // position 1 selecte0
-    }
-
-    @Test
-    public void test_moveUpMergedNodes_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-        mergedNodes.add(new Node(13));
-        mergedNodes.add(new Node(14));
-
-        model.moveUpMerged(new int[]{1,4});
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(11, mergedNodes.get(0).getId());
-        assertEquals(10, mergedNodes.get(1).getId());
-        assertEquals(12, mergedNodes.get(2).getId());
-        assertEquals(14, mergedNodes.get(3).getId());
-        assertEquals(13, mergedNodes.get(4).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0,3); // position 0 and 3 selecte0
-    }
-
-    @Test
-    public void test_moveUpMergedNodes_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-        mergedNodes.add(new Node(13));
-        mergedNodes.add(new Node(14));
-
-        model.moveUpMerged(new int[]{1,2,3,4});
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(11, mergedNodes.get(0).getId());
-        assertEquals(12, mergedNodes.get(1).getId());
-        assertEquals(13, mergedNodes.get(2).getId());
-        assertEquals(14, mergedNodes.get(3).getId());
-        assertEquals(10, mergedNodes.get(4).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 0,1,2,3);
-    }
-
-    /* ----------------------------------------------------------------------------- */
-    /* moveDownMergedNodes                                                       */
-    /* ----------------------------------------------------------------------------- */
-    @Test
-    public void test_moveDownMergedNodes_1() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-
-        model.moveDownMerged(new int[]{1});
-
-        assertEquals(3, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId());
-        assertEquals(12, mergedNodes.get(1).getId());
-        assertEquals(11, mergedNodes.get(2).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 2);
-    }
-
-    @Test
-    public void test_moveDownMergedNodes_2() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-        mergedNodes.add(new Node(13));
-        mergedNodes.add(new Node(14));
-
-        model.moveDownMerged(new int[]{1,3});
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId());
-        assertEquals(12, mergedNodes.get(1).getId());
-        assertEquals(11, mergedNodes.get(2).getId());
-        assertEquals(14, mergedNodes.get(3).getId());
-        assertEquals(13, mergedNodes.get(4).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 2,4);
-    }
-
-    @Test
-    public void test_moveDownMergedNodes_3() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1, 1);
-        myWay.addNode(new Node(1));
-        myWay.addNode(new Node(2));
-        Way theirWay = new Way(1);
-
-        model.populate(myWay, theirWay, null);
-        List<Node> mergedNodes = inspectNodeList(model, "Merged");
-        mergedNodes.add(new Node(10));
-        mergedNodes.add(new Node(11));
-        mergedNodes.add(new Node(12));
-        mergedNodes.add(new Node(13));
-        mergedNodes.add(new Node(14));
-
-        model.moveDownMerged(new int[]{1,2,3});
-
-        assertEquals(5, mergedNodes.size());
-        assertEquals(10, mergedNodes.get(0).getId());
-        assertEquals(14, mergedNodes.get(1).getId());
-        assertEquals(11, mergedNodes.get(2).getId());
-        assertEquals(12, mergedNodes.get(3).getId());
-        assertEquals(13, mergedNodes.get(4).getId());
-
-        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
-        ensureSelected(mergedSelection, 2,3,4);
-    }
-
-    /* ----------------------------------------------------------------------------- */
-    /* PropertyChangeListener                                                        */
-    /* ----------------------------------------------------------------------------- */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void addPropertyChangeListener() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-
-        model.addPropertyChangeListener(listener);
-
-        List<PropertyChangeListener> listeners = field("listeners")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, listeners.size());
-        assertEquals(listener, listeners.get(0));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void removePropertyChangeListener() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-
-        model.addPropertyChangeListener(listener);
-        model.removePropertyChangeListener(listener);
-
-        List<PropertyChangeListener> listeners = field("listeners")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, listeners.size());
-    }
-
-    /* ----------------------------------------------------------------------------- */
-    /* property frozen                                                               */
-    /* ----------------------------------------------------------------------------- */
-    @Test
-    public void setFrozen() {
-        NodeListMergeModel model = new NodeListMergeModel();
-        model.setFrozen(true);
-        assertTrue(model.isFrozen());
-
-        model.setFrozen(false);
-        assertTrue(!model.isFrozen());
-    }
-
-    @Test
-    public void setFrozenWithPropertyChangeNotification() {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        class MyListener implements PropertyChangeListener {
-            public ArrayList<PropertyChangeEvent> events = new ArrayList<>();
-
-            public void propertyChange(PropertyChangeEvent evt) {
-                events.add(evt);
-            }
-        }
-        MyListener listener = new MyListener();
-        model.addPropertyChangeListener(listener);
-        boolean oldValue = model.isFrozen();
-        model.setFrozen(!oldValue);
-        assertEquals(!oldValue, model.isFrozen());
-
-        assertEquals(1, listener.events.size());
-        assertEquals(oldValue, listener.events.get(0).getOldValue());
-        assertEquals(!oldValue, listener.events.get(0).getNewValue());
-    }
-
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.nodes;
+
+import static org.fest.reflect.core.Reflection.field;
+import static org.fest.reflect.core.Reflection.method;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.DefaultListSelectionModel;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.DatasetFactory;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListMergeModel;
+
+public class NodeListMergeModelTest {
+
+    private DatasetFactory my = new DatasetFactory();
+    private DatasetFactory their = new DatasetFactory();
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @SuppressWarnings("unchecked")
+    protected List<Node> inspectNodeList(NodeListMergeModel model, String name) {
+        return method("get" + name + "Entries")
+        .withReturnType(List.class)
+        .in(model)
+        .invoke();
+    }
+
+    protected DefaultListSelectionModel inspectListSelectionModel(NodeListMergeModel model, String name) {
+        return field(name).ofType(DefaultListSelectionModel.class)
+        .in(model)
+        .get();
+    }
+
+    protected void ensureSelected(DefaultListSelectionModel model, Object... idx) {
+        if (idx == null) return;
+        for (int i=0; i < idx.length; i++) {
+            if (idx[i] instanceof Integer) {
+                int j = (Integer)idx[i];
+                assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
+                break;
+            }
+            try {
+                int rows[] = (int[])idx[i];
+                if (rows.length != 2) {
+                    fail("illegal selection range. Either null or not length 2: " + Arrays.toString(rows));
+                }
+                if (rows[0] > rows[1]) {
+                    fail("illegal selection range. lower bound > upper bound ");
+                }
+                for (int j = rows[0]; j <= rows[1]; j++) {
+                    assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
+                }
+            } catch(ClassCastException e) {
+                fail("illegal selection range:" + idx[i]);
+            }
+        }
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        model.copyMyToTop(new int[]{0});
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+
+        assertEquals(1, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+
+    }
+
+
+    @Test
+    public void test_copyMyNodesToTop_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{0});
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+        assertEquals(1, mergedNodes.get(1).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{1}); // copy node 3
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
+        assertEquals(1, mergedNodes.get(1).getId()); // already merged node 1 at position 1
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        myWay.addNode(my.addNode(4));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{1,2}); // copy node 3 and 4
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(3, mergedNodes.size());
+        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
+        assertEquals(4, mergedNodes.get(1).getId()); // my node 4 at position 1
+        assertEquals(1, mergedNodes.get(2).getId()); // already merged node 1 at position 2
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0,1); // first two rows selected
+    }
+
+
+    @Test
+    public void test_copyMyNodesToEnd_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        model.copyMyToEnd(new int[]{0});
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+
+        assertEquals(1, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{0});
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(2, mergedNodes.get(1).getId()); // copied node 2 at position 1
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{1}); // copy node 3
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
+
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        myWay.addNode(my.addNode(4));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{1,2}); // copy node 3 and 4
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(3, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
+        assertEquals(4, mergedNodes.get(2).getId()); // my node 4 at position 2
+
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1,2); // last two rows selected
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* copyMyNodesBeforeCurrent                                                      */
+    /* ----------------------------------------------------------------------------- */
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyBeforeCurrent(new int[]{0}, 1);
+
+        assertEquals(4, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
+        assertEquals(11, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1); // position 1 selected
+    }
+
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyBeforeCurrent(new int[]{0,1}, 0);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId());  // copied node 1 at position 0
+        assertEquals(2, mergedNodes.get(1).getId());  // copied node 2 at position 1
+        assertEquals(10, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0,1); // position 0 and 1 selected
+    }
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        try {
+            model.copyMyBeforeCurrent(new int[]{0,1}, -1);
+            fail("expected IllegalArgumentException");
+        } catch(IllegalArgumentException e) {
+            // OK
+        }
+
+        try {
+            model.copyMyBeforeCurrent(new int[]{0,1}, 4);
+            fail("expected IllegalArgumentException");
+        } catch(IllegalArgumentException e) {
+            // OK
+        }
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* copyMyNodesAfterCurrent                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_copyMyNodesAfterCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0}, 1);
+
+        assertEquals(4, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(2).getId());  // copied node 1 at position 2
+        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2); // position 1 selected
+    }
+
+
+    @Test
+    public void test_copyMyNodesAfterCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0,1}, 2);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(3).getId());  // copied node 1 at position 3
+        assertEquals(2, mergedNodes.get(4).getId());  // copied node 2 at position 4
+
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 3,4); // position 3,4 selected
+    }
+
+    @Test
+    public void test_copyMyNodesAfterCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0,2}, 0);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
+        assertEquals(3, mergedNodes.get(2).getId());  // copied node 3 at position 2
+        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1,2); // position 1,2 selected
+    }
+
+
+    /* ----------------------------------------------------------------------------- */
+    /* moveUpMergedNodes                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_moveUpMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.moveUpMerged(new int[]{1});
+
+        assertEquals(3, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(10, mergedNodes.get(1).getId());
+        assertEquals(12, mergedNodes.get(2).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0); // position 1 selecte0
+    }
+
+    @Test
+    public void test_moveUpMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveUpMerged(new int[]{1,4});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(10, mergedNodes.get(1).getId());
+        assertEquals(12, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0,3); // position 0 and 3 selecte0
+    }
+
+    @Test
+    public void test_moveUpMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveUpMerged(new int[]{1,2,3,4});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(13, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(10, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0,1,2,3);
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* moveDownMergedNodes                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_moveDownMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.moveDownMerged(new int[]{1});
+
+        assertEquals(3, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2);
+    }
+
+    @Test
+    public void test_moveDownMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveDownMerged(new int[]{1,3});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2,4);
+    }
+
+    @Test
+    public void test_moveDownMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveDownMerged(new int[]{1,2,3});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(14, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+        assertEquals(12, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2,3,4);
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* PropertyChangeListener                                                        */
+    /* ----------------------------------------------------------------------------- */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void addPropertyChangeListener() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+
+        model.addPropertyChangeListener(listener);
+
+        List<PropertyChangeListener> listeners = field("listeners")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, listeners.size());
+        assertEquals(listener, listeners.get(0));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void removePropertyChangeListener() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+
+        model.addPropertyChangeListener(listener);
+        model.removePropertyChangeListener(listener);
+
+        List<PropertyChangeListener> listeners = field("listeners")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, listeners.size());
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* property frozen                                                               */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void setFrozen() {
+        NodeListMergeModel model = new NodeListMergeModel();
+        model.setFrozen(true);
+        assertTrue(model.isFrozen());
+
+        model.setFrozen(false);
+        assertTrue(!model.isFrozen());
+    }
+
+    @Test
+    public void setFrozenWithPropertyChangeNotification() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        class MyListener implements PropertyChangeListener {
+            public ArrayList<PropertyChangeEvent> events = new ArrayList<>();
+
+            public void propertyChange(PropertyChangeEvent evt) {
+                events.add(evt);
+            }
+        }
+        MyListener listener = new MyListener();
+        model.addPropertyChangeListener(listener);
+        boolean oldValue = model.isFrozen();
+        model.setFrozen(!oldValue);
+        assertEquals(!oldValue, model.isFrozen());
+
+        assertEquals(1, listener.events.size());
+        assertEquals(oldValue, listener.events.get(0).getOldValue());
+        assertEquals(!oldValue, listener.events.get(0).getNewValue());
+    }
+
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/properties/PropertiesMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/properties/PropertiesMergeModelTest.java
index 597f5f9..41b29fb 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/properties/PropertiesMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/properties/PropertiesMergeModelTest.java
@@ -1,142 +1,142 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.properties;
-
-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 org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.conflict.Conflict;
-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;
-import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.gui.conflict.pair.properties.PropertiesMergeModel;
-
-public class PropertiesMergeModelTest {
-
-    public static abstract class TestObserver implements Observer {
-        public int numInvocations;
-
-        public void update(Observable o, Object arg) {
-            numInvocations++;
-            test();
-        }
-
-        public abstract void test();
-
-        public void assertNumInvocations(int count) {
-            assertEquals(count, numInvocations);
-        }
-    }
-
-    PropertiesMergeModel model;
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Setup test.
-     */
-    @Before
-    public void setUp() {
-        model = new PropertiesMergeModel();
-    }
-
-    private void populate(OsmPrimitive my, OsmPrimitive their) {
-        model.populate(new Conflict<>(my, their));
-    }
-
-    @Test
-    public void populate() {
-        DataSet d1 = new DataSet();
-        DataSet d2 = new DataSet();
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        d1.addPrimitive(n1);
-        d2.addPrimitive(n2);
-        populate(n1, n2);
-
-        Way w1 = new Way(1);
-        Way w2 = new Way(1);
-        d1.addPrimitive(w1);
-        d2.addPrimitive(w2);
-        populate(w2, w2);
-
-        Relation r1 = new Relation(1);
-        Relation r2 = new Relation(1);
-        d1.addPrimitive(r1);
-        d2.addPrimitive(r2);
-        populate(r1, r2);
-    }
-
-    @Test
-    public void decidingAboutCoords() {
-        DataSet d1 = new DataSet();
-        DataSet d2 = new DataSet();
-
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        d1.addPrimitive(n1);
-        d2.addPrimitive(n2);
-        populate(n1, n2);
-        assertFalse(model.hasCoordConflict());
-
-        n1.setCoor(new LatLon(1,1));
-        populate(n1, n2);
-        assertTrue(model.hasCoordConflict());
-
-
-        n1.cloneFrom(new Node(1));
-        n2.setCoor(new LatLon(2,2));
-        populate(n1, n2);
-        assertTrue(model.hasCoordConflict());
-
-        n1.setCoor(new LatLon(1,1));
-        n2.setCoor(new LatLon(2,2));
-        populate(n1, n2);
-        assertTrue(model.hasCoordConflict());
-
-        // decide KEEP_MINE  and ensure notification via Observable
-        //
-        TestObserver observerTest;
-        model.addObserver(
-                observerTest = new TestObserver() {
-                    @Override
-                    public void test() {
-                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
-                    }
-                }
-        );
-        model.decideCoordsConflict(MergeDecisionType.KEEP_MINE);
-        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
-        observerTest.assertNumInvocations(1);
-
-        // decide KEEP_THEIR and  ensure notification via Observable
-        //
-        model.deleteObserver(observerTest);
-        model.addObserver(
-                observerTest = new TestObserver() {
-                    @Override
-                    public void test() {
-                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
-                    }
-                }
-        );
-        model.decideCoordsConflict(MergeDecisionType.KEEP_THEIR);
-        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
-        observerTest.assertNumInvocations(1);
-        model.deleteObserver(observerTest);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.properties;
+
+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 org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.conflict.Conflict;
+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;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.properties.PropertiesMergeModel;
+
+public class PropertiesMergeModelTest {
+
+    public static abstract class TestObserver implements Observer {
+        public int numInvocations;
+
+        public void update(Observable o, Object arg) {
+            numInvocations++;
+            test();
+        }
+
+        public abstract void test();
+
+        public void assertNumInvocations(int count) {
+            assertEquals(count, numInvocations);
+        }
+    }
+
+    PropertiesMergeModel model;
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        model = new PropertiesMergeModel();
+    }
+
+    private void populate(OsmPrimitive my, OsmPrimitive their) {
+        model.populate(new Conflict<>(my, their));
+    }
+
+    @Test
+    public void populate() {
+        DataSet d1 = new DataSet();
+        DataSet d2 = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        d1.addPrimitive(n1);
+        d2.addPrimitive(n2);
+        populate(n1, n2);
+
+        Way w1 = new Way(1);
+        Way w2 = new Way(1);
+        d1.addPrimitive(w1);
+        d2.addPrimitive(w2);
+        populate(w2, w2);
+
+        Relation r1 = new Relation(1);
+        Relation r2 = new Relation(1);
+        d1.addPrimitive(r1);
+        d2.addPrimitive(r2);
+        populate(r1, r2);
+    }
+
+    @Test
+    public void decidingAboutCoords() {
+        DataSet d1 = new DataSet();
+        DataSet d2 = new DataSet();
+
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        d1.addPrimitive(n1);
+        d2.addPrimitive(n2);
+        populate(n1, n2);
+        assertFalse(model.hasCoordConflict());
+
+        n1.setCoor(new LatLon(1,1));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+
+        n1.cloneFrom(new Node(1));
+        n2.setCoor(new LatLon(2,2));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+        n1.setCoor(new LatLon(1,1));
+        n2.setCoor(new LatLon(2,2));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+        // decide KEEP_MINE  and ensure notification via Observable
+        //
+        TestObserver observerTest;
+        model.addObserver(
+                observerTest = new TestObserver() {
+                    @Override
+                    public void test() {
+                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
+                    }
+                }
+        );
+        model.decideCoordsConflict(MergeDecisionType.KEEP_MINE);
+        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
+        observerTest.assertNumInvocations(1);
+
+        // decide KEEP_THEIR and  ensure notification via Observable
+        //
+        model.deleteObserver(observerTest);
+        model.addObserver(
+                observerTest = new TestObserver() {
+                    @Override
+                    public void test() {
+                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
+                    }
+                }
+        );
+        model.decideCoordsConflict(MergeDecisionType.KEEP_THEIR);
+        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
+        observerTest.assertNumInvocations(1);
+        model.deleteObserver(observerTest);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java
index 43ad080..def199c 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java
@@ -1,151 +1,151 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.tags;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
-
-public class TagMergeItemTest {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void test_TagMergeItem() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_2() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        n1.put("key", "myvalue");
-        n2.put("key", "theirvalue");
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_3() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        n1.put("key", "myvalue");
-        // n2 does not have this key
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertNull(item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_4() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        // n1 does not have this key
-        // n1.put("key", "myvalue");
-        n2.put("key", "theirvalue");
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertNull(item.getMyTagValue());
-        assertEquals("theirvalue",item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-
-    @Test
-    public void test_decide() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_MINE);
-        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-    }
-
-    @Test()
-    public void test_decide_1() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        try {
-            item.decide(null);
-            fail("expected IllegalArgumentException not thrown");
-        } catch(IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    @Test()
-    public void test_applyToMyPrimitive() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_MINE);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        item.applyToMyPrimitive(n1);
-        assertEquals("myvalue", n1.get("key"));
-
-        n1 = new Node(1);
-        item.applyToMyPrimitive(n1);
-        assertEquals("myvalue", n1.get("key"));
-
-    }
-
-    @Test()
-    public void test_applyToMyPrimitive_2() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_THEIR);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        item.applyToMyPrimitive(n1);
-        assertEquals("theirvalue", n1.get("key"));
-
-        n1 = new Node(1);
-        item.applyToMyPrimitive(n1);
-        assertEquals("theirvalue", n1.get("key"));
-    }
-
-    @Test()
-    public void test_applyToMyPrimitive_3() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        // item is undecided
-        // item.decide(MergeDecisionType.KEEP_THEIR);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        try {
-            item.applyToMyPrimitive(n1);
-            fail("expected IllegalStateException");
-        } catch(IllegalStateException e) {
-            // OK
-        }
-    }
-
-    @Test()
-    public void test_applyToMyPrimitive_4() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-
-        try {
-            item.applyToMyPrimitive(null);
-            fail("expected IllegalArgumentException");
-        } catch(IllegalArgumentException e) {
-            // OK
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.tags;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
+
+public class TagMergeItemTest {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void test_TagMergeItem() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_2() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        n1.put("key", "myvalue");
+        n2.put("key", "theirvalue");
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_3() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        n1.put("key", "myvalue");
+        // n2 does not have this key
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertNull(item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_4() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        // n1 does not have this key
+        // n1.put("key", "myvalue");
+        n2.put("key", "theirvalue");
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertNull(item.getMyTagValue());
+        assertEquals("theirvalue",item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+
+    @Test
+    public void test_decide() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_MINE);
+        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+    }
+
+    @Test()
+    public void test_decide_1() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        try {
+            item.decide(null);
+            fail("expected IllegalArgumentException not thrown");
+        } catch(IllegalArgumentException e) {
+            // OK
+        }
+    }
+
+    @Test()
+    public void test_applyToMyPrimitive() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_MINE);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        item.applyToMyPrimitive(n1);
+        assertEquals("myvalue", n1.get("key"));
+
+        n1 = new Node(1);
+        item.applyToMyPrimitive(n1);
+        assertEquals("myvalue", n1.get("key"));
+
+    }
+
+    @Test()
+    public void test_applyToMyPrimitive_2() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_THEIR);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        item.applyToMyPrimitive(n1);
+        assertEquals("theirvalue", n1.get("key"));
+
+        n1 = new Node(1);
+        item.applyToMyPrimitive(n1);
+        assertEquals("theirvalue", n1.get("key"));
+    }
+
+    @Test()
+    public void test_applyToMyPrimitive_3() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        // item is undecided
+        // item.decide(MergeDecisionType.KEEP_THEIR);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        try {
+            item.applyToMyPrimitive(n1);
+            fail("expected IllegalStateException");
+        } catch(IllegalStateException e) {
+            // OK
+        }
+    }
+
+    @Test()
+    public void test_applyToMyPrimitive_4() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+
+        try {
+            item.applyToMyPrimitive(null);
+            fail("expected IllegalArgumentException");
+        } catch(IllegalArgumentException e) {
+            // OK
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java
index 4412c88..6a50a7a 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java
@@ -1,232 +1,232 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.tags;
-
-import static org.fest.reflect.core.Reflection.field;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.List;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeModel;
-
- at SuppressWarnings("unchecked")
-public class TagMergeModelTest {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void addPropertyChangeListener() {
-        TagMergeModel model = new TagMergeModel();
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-        model.addPropertyChangeListener(listener);
-
-        List<?> list = field("listeners").ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        assertEquals(listener, list.get(0));
-    }
-
-    @Test
-    public void removePropertyChangeListener() {
-        TagMergeModel model = new TagMergeModel();
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-        model.addPropertyChangeListener(listener);
-        model.removePropertyChangeListener(listener);
-
-        List<?> list = field("listeners")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateNoConflichts() {
-        Node my = new Node(1);
-        Node their = new Node(1);
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateNoConflicts1() {
-        Node my = new Node(1);
-        my.put("key", "value");
-        Node their = new Node(1);
-        their.put("key", "value");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateMissingKeyMine() {
-        Node my = new Node(1);
-        Node their = new Node(1);
-        their.put("key", "value");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertNull(item.getMyTagValue());
-        assertEquals("value", item.getTheirTagValue());
-    }
-
-    @Test
-    public void populateMissingKeyTheir() {
-        Node my = new Node(1);
-        my.put("key", "value");
-        Node their = new Node(1);
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertNull(item.getTheirTagValue());
-        assertEquals("value", item.getMyTagValue());
-    }
-
-    @Test
-    public void populateConflictingValues() {
-        Node my = new Node(1);
-        my.put("key", "myvalue");
-        Node their = new Node(1);
-        their.put("key", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-    }
-
-    @Test
-    public void addItem() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.addItem(item);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-    }
-
-    @Test
-    public void decide() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.addItem(item);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        model.decide(0, MergeDecisionType.KEEP_MINE);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-
-        model.decide(0, MergeDecisionType.KEEP_THEIR);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.KEEP_THEIR, item.getMergeDecision());
-
-        model.decide(0, MergeDecisionType.UNDECIDED);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void decideMultiple() {
-
-        TagMergeModel model = new TagMergeModel();
-        for (int i=0; i < 10; i++) {
-            model.addItem(new TagMergeItem("key-" + i, "myvalue-" + i, "theirvalue-" +i));
-        }
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(10, list.size());
-
-        model.decide(new int[] {0, 3, 5}, MergeDecisionType.KEEP_MINE);
-        for (int i = 0; i< 10; i++) {
-            TagMergeItem item = list.get(i);
-            if (i == 0 || i == 3 || i == 5) {
-                assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-            } else {
-                assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-            }
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.tags;
+
+import static org.fest.reflect.core.Reflection.field;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeModel;
+
+ at SuppressWarnings("unchecked")
+public class TagMergeModelTest {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void addPropertyChangeListener() {
+        TagMergeModel model = new TagMergeModel();
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+        model.addPropertyChangeListener(listener);
+
+        List<?> list = field("listeners").ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        assertEquals(listener, list.get(0));
+    }
+
+    @Test
+    public void removePropertyChangeListener() {
+        TagMergeModel model = new TagMergeModel();
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+        model.addPropertyChangeListener(listener);
+        model.removePropertyChangeListener(listener);
+
+        List<?> list = field("listeners")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateNoConflichts() {
+        Node my = new Node(1);
+        Node their = new Node(1);
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateNoConflicts1() {
+        Node my = new Node(1);
+        my.put("key", "value");
+        Node their = new Node(1);
+        their.put("key", "value");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateMissingKeyMine() {
+        Node my = new Node(1);
+        Node their = new Node(1);
+        their.put("key", "value");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertNull(item.getMyTagValue());
+        assertEquals("value", item.getTheirTagValue());
+    }
+
+    @Test
+    public void populateMissingKeyTheir() {
+        Node my = new Node(1);
+        my.put("key", "value");
+        Node their = new Node(1);
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertNull(item.getTheirTagValue());
+        assertEquals("value", item.getMyTagValue());
+    }
+
+    @Test
+    public void populateConflictingValues() {
+        Node my = new Node(1);
+        my.put("key", "myvalue");
+        Node their = new Node(1);
+        their.put("key", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+    }
+
+    @Test
+    public void addItem() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.addItem(item);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+    }
+
+    @Test
+    public void decide() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.addItem(item);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        model.decide(0, MergeDecisionType.KEEP_MINE);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+
+        model.decide(0, MergeDecisionType.KEEP_THEIR);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.KEEP_THEIR, item.getMergeDecision());
+
+        model.decide(0, MergeDecisionType.UNDECIDED);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void decideMultiple() {
+
+        TagMergeModel model = new TagMergeModel();
+        for (int i=0; i < 10; i++) {
+            model.addItem(new TagMergeItem("key-" + i, "myvalue-" + i, "theirvalue-" +i));
+        }
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(10, list.size());
+
+        model.decide(new int[] {0, 3, 5}, MergeDecisionType.KEEP_MINE);
+        for (int i = 0; i< 10; i++) {
+            TagMergeItem item = list.get(i);
+            if (i == 0 || i == 3 || i == 5) {
+                assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+            } else {
+                assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy b/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
index 9a93221..1e0dd6d 100644
--- a/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
@@ -1,219 +1,219 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-import org.junit.Test 
-import org.openstreetmap.josm.io.ChangesetQuery.ChangesetQueryUrlException;
-import org.openstreetmap.josm.io.ChangesetQuery.ChangesetQueryUrlParser;
-
-
-import static org.junit.Assert.*;
-
-class ChangesetQueryUrlParserTest {
-	final shouldFail = new GroovyTestCase().&shouldFail
-	
-	@Test
-	public void test_constructor() {
-	    ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-	}
-	
-	@Test
-	public void test_parse_basic() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		
-		// OK
-		parser.parse ""
-		
-		// should be OK
-		ChangesetQuery q = parser.parse(null)
-		assert q != null
-		
-		// should be OK
-		q = parser.parse("")
-		assert q != null
-	}
-	
-	@Test 
-	public void test_uid() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("uid=1234")
-		assert q != null
-		
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("uid=0")				
-		}
-		
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("uid=-1")               
-		}
-		
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("uid=abc")               
-		}
-	}
-	
-	@Test 
-	public void test_display_name() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("display_name=abcd")
-		assert q != null
-		assert q. at userName == "abcd"
-	}
-	
-	
-	@Test 
-	public void test_open() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("open=true")
-		assert q != null
-		assert q. at open == true
-		
-		// OK
-		q = parser.parse("open=false")
-		assert q != null
-		assert q. at open == false
-		
-		// illegal value for open 
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("open=abcd")               
-		}   		
-	}
-	
-	@Test 
-	public void test_closed() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("closed=true")
-		assert q != null
-		assert q. at closed == true
-		
-		// OK
-		q = parser.parse("closed=false")
-		assert q != null
-		assert q. at closed == false
-		
-		// illegal value for open 
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("closed=abcd")               
-		}           
-	}
-	
-	
-	@Test 
-	public void test_uid_and_display_name() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// we can't have both an uid and a display name 
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("uid=1&display_name=abcd")               
-		}		
-	}
-	
-	@Test 
-	public void test_time() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("time=2009-12-25T10:00:00Z")
-		assert q != null
-		assert q. at closedAfter != null   
-		Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
-		cal.setTime(q. at closedAfter);
-		assert cal.get(Calendar.YEAR) == 2009
-		assert cal.get(Calendar.MONTH) == 11 // calendar is 0-based
-		assert cal.get(Calendar.DAY_OF_MONTH) == 25
-		assert cal.get(Calendar.HOUR_OF_DAY) == 10
-		assert cal.get(Calendar.MINUTE) == 0
-		assert cal.get(Calendar.SECOND) == 0
-		
-		// OK
-		q = parser.parse("time=2009-12-25T10:00:00Z,2009-11-25T10:00:00Z")
-		assert q!= null
-		assert q. at closedAfter != null
-		assert q. at createdBefore != null
-		
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("time=asdf")               
-		}   		
-	}
-	
-	@Test 
-	public void test_bbox() {
-		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-		def ChangesetQuery q
-		
-		// OK
-		q = parser.parse("bbox=-1,-1,1,1")
-		assert q != null
-		assert q. at bounds != null
-		
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("bbox=-91,-1,1,1")               
-		}           
-				
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("bbox=-1,-181,1,1")               
-		}           
-		
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("bbox=-1,-1,91,1")               
-		}           
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("bbox=-1,-1,1,181")               
-		}  
-		// should fail
-		shouldFail(ChangesetQueryUrlException) {
-			q = parser.parse("bbox=-1,-1,1")               
-		}  
-	}
-
-    @Test
-    public void test_changeset_ids() {
-        ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
-        def ChangesetQuery q
-
-        // OK
-        q = parser.parse("changesets=1,2,3")
-        assert q != null
-        assert q. at changesetIds.containsAll(Arrays.asList(1L, 2L, 3L))
-        assert q. at changesetIds.size() == 3
-
-        // OK
-        q = parser.parse("changesets=1,2,3,4,1")
-        assert q != null
-        assert q. at changesetIds.containsAll(Arrays.asList(1L, 2L, 3L, 4L))
-        assert q. at changesetIds.size() == 4
-
-        // OK
-        q = parser.parse("changesets=")
-        assert q != null
-        assert q. at changesetIds.size() == 0
-
-        // should fail
-        shouldFail(ChangesetQueryUrlException) {
-            q = parser.parse("changesets=foo")
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.junit.Test 
+import org.openstreetmap.josm.io.ChangesetQuery.ChangesetQueryUrlException;
+import org.openstreetmap.josm.io.ChangesetQuery.ChangesetQueryUrlParser;
+
+
+import static org.junit.Assert.*;
+
+class ChangesetQueryUrlParserTest {
+	final shouldFail = new GroovyTestCase().&shouldFail
+	
+	@Test
+	public void test_constructor() {
+	    ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+	}
+	
+	@Test
+	public void test_parse_basic() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		
+		// OK
+		parser.parse ""
+		
+		// should be OK
+		ChangesetQuery q = parser.parse(null)
+		assert q != null
+		
+		// should be OK
+		q = parser.parse("")
+		assert q != null
+	}
+	
+	@Test 
+	public void test_uid() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("uid=1234")
+		assert q != null
+		
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("uid=0")				
+		}
+		
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("uid=-1")               
+		}
+		
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("uid=abc")               
+		}
+	}
+	
+	@Test 
+	public void test_display_name() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("display_name=abcd")
+		assert q != null
+		assert q. at userName == "abcd"
+	}
+	
+	
+	@Test 
+	public void test_open() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("open=true")
+		assert q != null
+		assert q. at open == true
+		
+		// OK
+		q = parser.parse("open=false")
+		assert q != null
+		assert q. at open == false
+		
+		// illegal value for open 
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("open=abcd")               
+		}   		
+	}
+	
+	@Test 
+	public void test_closed() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("closed=true")
+		assert q != null
+		assert q. at closed == true
+		
+		// OK
+		q = parser.parse("closed=false")
+		assert q != null
+		assert q. at closed == false
+		
+		// illegal value for open 
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("closed=abcd")               
+		}           
+	}
+	
+	
+	@Test 
+	public void test_uid_and_display_name() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// we can't have both an uid and a display name 
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("uid=1&display_name=abcd")               
+		}		
+	}
+	
+	@Test 
+	public void test_time() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("time=2009-12-25T10:00:00Z")
+		assert q != null
+		assert q. at closedAfter != null   
+		Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
+		cal.setTime(q. at closedAfter);
+		assert cal.get(Calendar.YEAR) == 2009
+		assert cal.get(Calendar.MONTH) == 11 // calendar is 0-based
+		assert cal.get(Calendar.DAY_OF_MONTH) == 25
+		assert cal.get(Calendar.HOUR_OF_DAY) == 10
+		assert cal.get(Calendar.MINUTE) == 0
+		assert cal.get(Calendar.SECOND) == 0
+		
+		// OK
+		q = parser.parse("time=2009-12-25T10:00:00Z,2009-11-25T10:00:00Z")
+		assert q!= null
+		assert q. at closedAfter != null
+		assert q. at createdBefore != null
+		
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("time=asdf")               
+		}   		
+	}
+	
+	@Test 
+	public void test_bbox() {
+		ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+		def ChangesetQuery q
+		
+		// OK
+		q = parser.parse("bbox=-1,-1,1,1")
+		assert q != null
+		assert q. at bounds != null
+		
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("bbox=-91,-1,1,1")               
+		}           
+				
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("bbox=-1,-181,1,1")               
+		}           
+		
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("bbox=-1,-1,91,1")               
+		}           
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("bbox=-1,-1,1,181")               
+		}  
+		// should fail
+		shouldFail(ChangesetQueryUrlException) {
+			q = parser.parse("bbox=-1,-1,1")               
+		}  
+	}
+
+    @Test
+    public void test_changeset_ids() {
+        ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
+        def ChangesetQuery q
+
+        // OK
+        q = parser.parse("changesets=1,2,3")
+        assert q != null
+        assert q. at changesetIds.containsAll(Arrays.asList(1L, 2L, 3L))
+        assert q. at changesetIds.size() == 3
+
+        // OK
+        q = parser.parse("changesets=1,2,3,4,1")
+        assert q != null
+        assert q. at changesetIds.containsAll(Arrays.asList(1L, 2L, 3L, 4L))
+        assert q. at changesetIds.size() == 4
+
+        // OK
+        q = parser.parse("changesets=")
+        assert q != null
+        assert q. at changesetIds.size() == 0
+
+        // should fail
+        shouldFail(ChangesetQueryUrlException) {
+            q = parser.parse("changesets=foo")
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
index aa506ed..b293a65 100644
--- a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
@@ -1,196 +1,196 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.*
-
-import org.junit.Test
-import org.openstreetmap.josm.data.coor.LatLon
-import org.openstreetmap.josm.data.osm.Changeset
-import org.openstreetmap.josm.data.osm.Node
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType
-import org.openstreetmap.josm.data.osm.Relation
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId
-import org.openstreetmap.josm.data.osm.Way
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor
-import org.openstreetmap.josm.tools.XmlParsingException
-
-class DiffResultProcessorTest {
-
-
-	@Test
-	public void testConstructor() {
-		Node n = new Node(1)
-		// these calls should not fail
-		//
-		def DiffResultProcessor processor  = new DiffResultProcessor(null)
-		processor  = new DiffResultProcessor([])
-		processor  = new DiffResultProcessor([n])
-	}
-
-	@Test
-	public void testParse_NOK_Cases() {
-		def DiffResultProcessor processor  = new DiffResultProcessor([])
-
-		final shouldFail = new GroovyTestCase().&shouldFail
-
-		shouldFail(IllegalArgumentException) {
-		    processor.parse null, NullProgressMonitor.INSTANCE
-		}
-
-		shouldFail(XmlParsingException) {
-			processor.parse "", NullProgressMonitor.INSTANCE
-		}
-
-		shouldFail(XmlParsingException) {
-			processor.parse "<x></x>", NullProgressMonitor.INSTANCE
-		}
-	}
-
-	@Test
-	public void testParse_OK_Cases() {
-		def DiffResultProcessor processor  = new DiffResultProcessor([])
-		String doc = """\
-		<diffResult version="0.6" generator="Test Data">
-		    <node old_id="-1" new_id="1" new_version="1"/>
-		    <way old_id="-2" new_id="2" new_version="1"/>
-		    <relation old_id="-3" new_id="3" new_version="1"/>
-		</diffResult>
-		"""
-
-		processor.parse doc, null
-		assert processor. at diffResults.size() == 3
-		SimplePrimitiveId id = new SimplePrimitiveId(-1, OsmPrimitiveType.NODE)
-		def entry = processor. at diffResults[id]
-		assert entry != null
-		assert entry.new_id == 1
-		assert entry.new_version == 1
-
-		id = new SimplePrimitiveId(-2, OsmPrimitiveType.WAY)
-		entry = processor. at diffResults[id]
-		assert entry != null
-		assert entry.new_id == 2
-		assert entry.new_version == 1
-
-		id = new SimplePrimitiveId(-3, OsmPrimitiveType.RELATION)
-		entry = processor. at diffResults[id]
-		assert entry != null
-		assert entry.new_id == 3
-		assert entry.new_version == 1
-	}
-
-	@Test
-	public void testPostProcess_Invocation_Variants() {
-		def DiffResultProcessor processor  = new DiffResultProcessor([])
-		String doc = """\
-        <diffResult version="0.6" generator="Test Data">
-            <node old_id="-1" new_id="1" new_version="1"/>
-            <way old_id="-2" new_id="2" new_version="1"/>
-            <relation old_id="-3" new_id="3" new_version="1"/>
-        </diffResult>
-        """
-
-		processor.parse doc, null
-
-		// should all be ok
-		//
-		processor.postProcess null, null
-		processor.postProcess null, NullProgressMonitor.INSTANCE
-		processor.postProcess new Changeset(1), null
-		processor.postProcess new Changeset(1), NullProgressMonitor.INSTANCE
-	}
-
-	@Test
-	public void testPostProcess_OK() {
-
-		Node n = new Node()
-		Way w = new Way()
-		Relation r = new Relation()
-
-		String doc = """\
-	        <diffResult version="0.6" generator="Test Data">
-	            <node old_id="${n.uniqueId}" new_id="1" new_version="10"/>
-	            <way old_id="${w.uniqueId}" new_id="2" new_version="11"/>
-	            <relation old_id="${r.uniqueId}" new_id="3" new_version="12"/>
-	        </diffResult>
-	        """
-
-		def DiffResultProcessor processor  = new DiffResultProcessor([n,w,r])
-		processor.parse doc, null
-		def processed = processor.postProcess(new Changeset(5), null)
-		assert processed.size() == 3
-		n = processed.find {it.uniqueId == 1}
-		assert n.changesetId == 5
-		assert n.version == 10
-
-		w = processed.find {it.uniqueId == 2}
-		assert w.changesetId == 5
-		assert w.version == 11
-
-		r = processed.find {it.uniqueId == 3}
-		assert r.changesetId == 5
-		assert r.version == 12
-	}
-
-	@Test
-	public void testPostProcess_ForCreatedElement() {
-
-		Node n = new Node()
-		String doc = """\
-            <diffResult version="0.6" generator="Test Data">
-                <node old_id="${n.uniqueId}" new_id="1" new_version="1"/>
-            </diffResult>
-            """
-
-		def DiffResultProcessor processor  = new DiffResultProcessor([n])
-		processor.parse doc, null
-		def processed = processor.postProcess(new Changeset(5), null)
-		assert processed.size() == 1
-		n = processed.find {it.uniqueId == 1}
-		assert n.changesetId == 5
-		assert n.version == 1
-	}
-
-	@Test
-	public void testPostProcess_ForModifiedElement() {
-
-		Node n = new Node(1)
-		n.coor = new LatLon(1,1)
-		n.setOsmId 1, 2
-		n.modified = true
-		String doc = """\
-            <diffResult version="0.6" generator="Test Data">
-                <node old_id="${n.uniqueId}" new_id="${n.uniqueId}" new_version="3"/>
-            </diffResult>
-            """
-
-		def DiffResultProcessor processor  = new DiffResultProcessor([n])
-		processor.parse doc, null
-		def processed = processor.postProcess(new Changeset(5), null)
-		assert processed.size() == 1
-		n = processed.find {it.uniqueId == 1}
-		assert n.changesetId == 5
-		assert n.version == 3
-	}
-
-	@Test
-	public void testPostProcess_ForDeletedElement() {
-
-		Node n = new Node(1)
-		n.coor = new LatLon(1,1)
-		n.setOsmId 1, 2
-		n.deleted = true
-		String doc = """\
-            <diffResult version="0.6" generator="Test Data">
-                <node old_id="${n.uniqueId}"/>
-            </diffResult>
-            """
-
-		def DiffResultProcessor processor  = new DiffResultProcessor([n])
-		processor.parse doc, null
-		def processed = processor.postProcess(new Changeset(5), null)
-		assert processed.size() == 1
-		n = processed.find {it.uniqueId == 1}
-		assert n.changesetId == 5
-		assert n.version == 2
-	}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.*
+
+import org.junit.Test
+import org.openstreetmap.josm.data.coor.LatLon
+import org.openstreetmap.josm.data.osm.Changeset
+import org.openstreetmap.josm.data.osm.Node
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType
+import org.openstreetmap.josm.data.osm.Relation
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId
+import org.openstreetmap.josm.data.osm.Way
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor
+import org.openstreetmap.josm.tools.XmlParsingException
+
+class DiffResultProcessorTest {
+
+
+	@Test
+	public void testConstructor() {
+		Node n = new Node(1)
+		// these calls should not fail
+		//
+		def DiffResultProcessor processor  = new DiffResultProcessor(null)
+		processor  = new DiffResultProcessor([])
+		processor  = new DiffResultProcessor([n])
+	}
+
+	@Test
+	public void testParse_NOK_Cases() {
+		def DiffResultProcessor processor  = new DiffResultProcessor([])
+
+		final shouldFail = new GroovyTestCase().&shouldFail
+
+		shouldFail(IllegalArgumentException) {
+		    processor.parse null, NullProgressMonitor.INSTANCE
+		}
+
+		shouldFail(XmlParsingException) {
+			processor.parse "", NullProgressMonitor.INSTANCE
+		}
+
+		shouldFail(XmlParsingException) {
+			processor.parse "<x></x>", NullProgressMonitor.INSTANCE
+		}
+	}
+
+	@Test
+	public void testParse_OK_Cases() {
+		def DiffResultProcessor processor  = new DiffResultProcessor([])
+		String doc = """\
+		<diffResult version="0.6" generator="Test Data">
+		    <node old_id="-1" new_id="1" new_version="1"/>
+		    <way old_id="-2" new_id="2" new_version="1"/>
+		    <relation old_id="-3" new_id="3" new_version="1"/>
+		</diffResult>
+		"""
+
+		processor.parse doc, null
+		assert processor. at diffResults.size() == 3
+		SimplePrimitiveId id = new SimplePrimitiveId(-1, OsmPrimitiveType.NODE)
+		def entry = processor. at diffResults[id]
+		assert entry != null
+		assert entry.new_id == 1
+		assert entry.new_version == 1
+
+		id = new SimplePrimitiveId(-2, OsmPrimitiveType.WAY)
+		entry = processor. at diffResults[id]
+		assert entry != null
+		assert entry.new_id == 2
+		assert entry.new_version == 1
+
+		id = new SimplePrimitiveId(-3, OsmPrimitiveType.RELATION)
+		entry = processor. at diffResults[id]
+		assert entry != null
+		assert entry.new_id == 3
+		assert entry.new_version == 1
+	}
+
+	@Test
+	public void testPostProcess_Invocation_Variants() {
+		def DiffResultProcessor processor  = new DiffResultProcessor([])
+		String doc = """\
+        <diffResult version="0.6" generator="Test Data">
+            <node old_id="-1" new_id="1" new_version="1"/>
+            <way old_id="-2" new_id="2" new_version="1"/>
+            <relation old_id="-3" new_id="3" new_version="1"/>
+        </diffResult>
+        """
+
+		processor.parse doc, null
+
+		// should all be ok
+		//
+		processor.postProcess null, null
+		processor.postProcess null, NullProgressMonitor.INSTANCE
+		processor.postProcess new Changeset(1), null
+		processor.postProcess new Changeset(1), NullProgressMonitor.INSTANCE
+	}
+
+	@Test
+	public void testPostProcess_OK() {
+
+		Node n = new Node()
+		Way w = new Way()
+		Relation r = new Relation()
+
+		String doc = """\
+	        <diffResult version="0.6" generator="Test Data">
+	            <node old_id="${n.uniqueId}" new_id="1" new_version="10"/>
+	            <way old_id="${w.uniqueId}" new_id="2" new_version="11"/>
+	            <relation old_id="${r.uniqueId}" new_id="3" new_version="12"/>
+	        </diffResult>
+	        """
+
+		def DiffResultProcessor processor  = new DiffResultProcessor([n,w,r])
+		processor.parse doc, null
+		def processed = processor.postProcess(new Changeset(5), null)
+		assert processed.size() == 3
+		n = processed.find {it.uniqueId == 1}
+		assert n.changesetId == 5
+		assert n.version == 10
+
+		w = processed.find {it.uniqueId == 2}
+		assert w.changesetId == 5
+		assert w.version == 11
+
+		r = processed.find {it.uniqueId == 3}
+		assert r.changesetId == 5
+		assert r.version == 12
+	}
+
+	@Test
+	public void testPostProcess_ForCreatedElement() {
+
+		Node n = new Node()
+		String doc = """\
+            <diffResult version="0.6" generator="Test Data">
+                <node old_id="${n.uniqueId}" new_id="1" new_version="1"/>
+            </diffResult>
+            """
+
+		def DiffResultProcessor processor  = new DiffResultProcessor([n])
+		processor.parse doc, null
+		def processed = processor.postProcess(new Changeset(5), null)
+		assert processed.size() == 1
+		n = processed.find {it.uniqueId == 1}
+		assert n.changesetId == 5
+		assert n.version == 1
+	}
+
+	@Test
+	public void testPostProcess_ForModifiedElement() {
+
+		Node n = new Node(1)
+		n.coor = new LatLon(1,1)
+		n.setOsmId 1, 2
+		n.modified = true
+		String doc = """\
+            <diffResult version="0.6" generator="Test Data">
+                <node old_id="${n.uniqueId}" new_id="${n.uniqueId}" new_version="3"/>
+            </diffResult>
+            """
+
+		def DiffResultProcessor processor  = new DiffResultProcessor([n])
+		processor.parse doc, null
+		def processed = processor.postProcess(new Changeset(5), null)
+		assert processed.size() == 1
+		n = processed.find {it.uniqueId == 1}
+		assert n.changesetId == 5
+		assert n.version == 3
+	}
+
+	@Test
+	public void testPostProcess_ForDeletedElement() {
+
+		Node n = new Node(1)
+		n.coor = new LatLon(1,1)
+		n.setOsmId 1, 2
+		n.deleted = true
+		String doc = """\
+            <diffResult version="0.6" generator="Test Data">
+                <node old_id="${n.uniqueId}"/>
+            </diffResult>
+            """
+
+		def DiffResultProcessor processor  = new DiffResultProcessor([n])
+		processor.parse doc, null
+		def processed = processor.postProcess(new Changeset(5), null)
+		assert processed.size() == 1
+		n = processed.find {it.uniqueId == 1}
+		assert n.changesetId == 5
+		assert n.version == 2
+	}
 }
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.groovy b/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.groovy
index ef834b3..55651b0 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.groovy
@@ -1,207 +1,207 @@
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.*
-
-import org.junit.Test
-import org.openstreetmap.josm.data.coor.LatLon
-import org.openstreetmap.josm.data.osm.Changeset
-import org.openstreetmap.josm.data.osm.Node
-
-class OsmChangeBuilderTest {
-
-	/**
-	 * Test various constructor invocations
-	 */
-	@Test
-	public void testConstructor() {
-		def Changeset cs = new Changeset(1)
-		// should not fail
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-
-		// should not fail either - null allowed
-		builder = new OsmChangeBuilder(null)
-
-		// should not fail
-		builder = new OsmChangeBuilder(cs, "0.5")
-
-		builder = new OsmChangeBuilder(cs, null)
-
-		builder = new OsmChangeBuilder(null, null)
-	}
-
-	/**
-	 * Test the sequence of method calls. Should throw IllegalStateException if
-	 * the protocol start(),append()*, finish() is violated.
-	 */
-	@Test
-	public void testSequenceOfMethodCalls() {
-		def Changeset cs = new Changeset(1)
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-
-		final shouldFail = new GroovyTestCase().&shouldFail
-
-		// should be OK
-		builder.start()
-		Node n = new Node(new LatLon(0,0))
-		builder.append n
-		builder.finish()
-
-		shouldFail(IllegalStateException) {
-			builder = new OsmChangeBuilder(cs)
-			builder.append n
-		}
-
-		shouldFail(IllegalStateException) {
-			builder = new OsmChangeBuilder(cs)
-			builder.append([n])
-		}
-
-		shouldFail(IllegalStateException) {
-			builder = new OsmChangeBuilder(cs)
-			builder.finish()
-		}
-
-		shouldFail(IllegalStateException) {
-			builder = new OsmChangeBuilder(cs)
-			builder.start()
-			builder.start()
-		}
-	}
-
-	@Test
-	public void testDocumentWithNewNode() {
-		def Changeset cs = new Changeset(1)
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-		Node n = new Node(new LatLon(0,0))
-
-		builder.start()
-		builder.append n
-		builder.finish()
-
-		def doc = new XmlParser().parseText(builder.document)
-		assert doc. at version == "0.6"
-		assert doc. at generator == "JOSM"
-		assert doc.name() == "osmChange"
-		assert doc.children().size() == 1
-		def create = doc.create
-		assert create != null
-
-		assert create.size() == 1
-		def nodes = create[0].node
-		assert nodes.size() == 1
-		def node = nodes[0]
-		assert node. at id == n.uniqueId.toString()
-		assert node. at lat != null
-		assert node. at lon != null
-		assert node. at changeset == cs.id.toString()
-	}
-
-	/**
-	 * Test building a document with a modified node
-	 */
-	@Test
-	public void testDocumentWithModifiedNode() {
-		def Changeset cs = new Changeset(1)
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-		Node n = new Node(1)
-		n.coor = new LatLon(0,0)
-		n.incomplete = false
-		n.modified = true
-
-		builder.start()
-		builder.append n
-		builder.finish()
-
-		def doc = new XmlParser().parseText(builder.document)
-		assert doc. at version == "0.6"
-		assert doc. at generator == "JOSM"
-		assert doc.name() == "osmChange"
-		assert doc.children().size() == 1
-		def modify = doc.modify
-		assert modify != null
-
-		assert modify.size() == 1
-		def nodes = modify[0].node
-		assert nodes.size() == 1
-		def node = nodes[0]
-		assert node. at id == n.uniqueId.toString()
-		assert node. at lat != null
-		assert node. at lon != null
-		assert node. at changeset == cs.id.toString()
-	}
-
-	/**
-	 * Test building a document with a deleted node
-	 */
-	@Test
-	public void testDocumentWithDeletedNode() {
-		def Changeset cs = new Changeset(1)
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-		Node n = new Node(1)
-		n.coor = new LatLon(0,0)
-		n.incomplete = false
-		n.deleted = true
-
-		builder.start()
-		builder.append n
-		builder.finish()
-
-		def doc = new XmlParser().parseText(builder.document)
-		assert doc. at version == "0.6"
-		assert doc. at generator == "JOSM"
-		assert doc.name() == "osmChange"
-		assert doc.children().size() == 1
-		def delete = doc.delete
-		assert delete != null
-
-		assert delete.size() == 1
-		def nodes = delete[0].node
-		assert nodes.size() == 1
-		def node = nodes[0]
-		assert node. at id == n.uniqueId.toString()
-		assert node. at lat == null
-		assert node. at lon == null
-		assert node. at changeset == cs.id.toString()
-	}
-
-	/**
-	 * Test building a mixed document.
-	 *
-	 */
-	@Test
-	public void testMixed() {
-		def Changeset cs = new Changeset(1)
-		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
-		Node n1 = new Node(1)
-		n1.coor = new LatLon(0,0)
-		n1.incomplete = false
-		n1.deleted = true
-
-		Node n2 = new Node(new LatLon(0,0))
-
-		Node n3 = new Node(2)
-		n3.coor = new LatLon(0,0)
-		n3.incomplete = false
-		n3.modified = true
-
-		builder.start()
-		builder.append([n1,n2,n3])
-		builder.finish()
-
-		def doc = new XmlParser().parseText(builder.document)
-
-		assert doc.children().size() == 3
-		assert doc.children()[0].name() == "delete"
-		assert doc.children()[1].name() == "create"
-		assert doc.children()[2].name() == "modify"
-
-		def node = doc.children()[0].node[0]
-		assert node. at id == n1.uniqueId.toString()
-
-		node = doc.children()[1].node[0]
-		assert node. at id == n2.uniqueId.toString()
-
-		node = doc.children()[2].node[0]
-		assert node. at id == n3.uniqueId.toString()
-	}
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.*
+
+import org.junit.Test
+import org.openstreetmap.josm.data.coor.LatLon
+import org.openstreetmap.josm.data.osm.Changeset
+import org.openstreetmap.josm.data.osm.Node
+
+class OsmChangeBuilderTest {
+
+	/**
+	 * Test various constructor invocations
+	 */
+	@Test
+	public void testConstructor() {
+		def Changeset cs = new Changeset(1)
+		// should not fail
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+
+		// should not fail either - null allowed
+		builder = new OsmChangeBuilder(null)
+
+		// should not fail
+		builder = new OsmChangeBuilder(cs, "0.5")
+
+		builder = new OsmChangeBuilder(cs, null)
+
+		builder = new OsmChangeBuilder(null, null)
+	}
+
+	/**
+	 * Test the sequence of method calls. Should throw IllegalStateException if
+	 * the protocol start(),append()*, finish() is violated.
+	 */
+	@Test
+	public void testSequenceOfMethodCalls() {
+		def Changeset cs = new Changeset(1)
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+
+		final shouldFail = new GroovyTestCase().&shouldFail
+
+		// should be OK
+		builder.start()
+		Node n = new Node(new LatLon(0,0))
+		builder.append n
+		builder.finish()
+
+		shouldFail(IllegalStateException) {
+			builder = new OsmChangeBuilder(cs)
+			builder.append n
+		}
+
+		shouldFail(IllegalStateException) {
+			builder = new OsmChangeBuilder(cs)
+			builder.append([n])
+		}
+
+		shouldFail(IllegalStateException) {
+			builder = new OsmChangeBuilder(cs)
+			builder.finish()
+		}
+
+		shouldFail(IllegalStateException) {
+			builder = new OsmChangeBuilder(cs)
+			builder.start()
+			builder.start()
+		}
+	}
+
+	@Test
+	public void testDocumentWithNewNode() {
+		def Changeset cs = new Changeset(1)
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+		Node n = new Node(new LatLon(0,0))
+
+		builder.start()
+		builder.append n
+		builder.finish()
+
+		def doc = new XmlParser().parseText(builder.document)
+		assert doc. at version == "0.6"
+		assert doc. at generator == "JOSM"
+		assert doc.name() == "osmChange"
+		assert doc.children().size() == 1
+		def create = doc.create
+		assert create != null
+
+		assert create.size() == 1
+		def nodes = create[0].node
+		assert nodes.size() == 1
+		def node = nodes[0]
+		assert node. at id == n.uniqueId.toString()
+		assert node. at lat != null
+		assert node. at lon != null
+		assert node. at changeset == cs.id.toString()
+	}
+
+	/**
+	 * Test building a document with a modified node
+	 */
+	@Test
+	public void testDocumentWithModifiedNode() {
+		def Changeset cs = new Changeset(1)
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+		Node n = new Node(1)
+		n.coor = new LatLon(0,0)
+		n.incomplete = false
+		n.modified = true
+
+		builder.start()
+		builder.append n
+		builder.finish()
+
+		def doc = new XmlParser().parseText(builder.document)
+		assert doc. at version == "0.6"
+		assert doc. at generator == "JOSM"
+		assert doc.name() == "osmChange"
+		assert doc.children().size() == 1
+		def modify = doc.modify
+		assert modify != null
+
+		assert modify.size() == 1
+		def nodes = modify[0].node
+		assert nodes.size() == 1
+		def node = nodes[0]
+		assert node. at id == n.uniqueId.toString()
+		assert node. at lat != null
+		assert node. at lon != null
+		assert node. at changeset == cs.id.toString()
+	}
+
+	/**
+	 * Test building a document with a deleted node
+	 */
+	@Test
+	public void testDocumentWithDeletedNode() {
+		def Changeset cs = new Changeset(1)
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+		Node n = new Node(1)
+		n.coor = new LatLon(0,0)
+		n.incomplete = false
+		n.deleted = true
+
+		builder.start()
+		builder.append n
+		builder.finish()
+
+		def doc = new XmlParser().parseText(builder.document)
+		assert doc. at version == "0.6"
+		assert doc. at generator == "JOSM"
+		assert doc.name() == "osmChange"
+		assert doc.children().size() == 1
+		def delete = doc.delete
+		assert delete != null
+
+		assert delete.size() == 1
+		def nodes = delete[0].node
+		assert nodes.size() == 1
+		def node = nodes[0]
+		assert node. at id == n.uniqueId.toString()
+		assert node. at lat == null
+		assert node. at lon == null
+		assert node. at changeset == cs.id.toString()
+	}
+
+	/**
+	 * Test building a mixed document.
+	 *
+	 */
+	@Test
+	public void testMixed() {
+		def Changeset cs = new Changeset(1)
+		OsmChangeBuilder builder = new OsmChangeBuilder(cs)
+		Node n1 = new Node(1)
+		n1.coor = new LatLon(0,0)
+		n1.incomplete = false
+		n1.deleted = true
+
+		Node n2 = new Node(new LatLon(0,0))
+
+		Node n3 = new Node(2)
+		n3.coor = new LatLon(0,0)
+		n3.incomplete = false
+		n3.modified = true
+
+		builder.start()
+		builder.append([n1,n2,n3])
+		builder.finish()
+
+		def doc = new XmlParser().parseText(builder.document)
+
+		assert doc.children().size() == 3
+		assert doc.children()[0].name() == "delete"
+		assert doc.children()[1].name() == "create"
+		assert doc.children()[2].name() == "modify"
+
+		def node = doc.children()[0].node[0]
+		assert node. at id == n1.uniqueId.toString()
+
+		node = doc.children()[1].node[0]
+		assert node. at id == n2.uniqueId.toString()
+
+		node = doc.children()[2].node[0]
+		assert node. at id == n3.uniqueId.toString()
+	}
 }
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.groovy b/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.groovy
index 5ae3ced..d53f330 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.groovy
@@ -1,216 +1,216 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import org.junit.Test
-
-import java.nio.charset.StandardCharsets
-
-import org.openstreetmap.josm.data.osm.ChangesetDataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
-import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.data.osm.history.HistoryRelation;
-import org.openstreetmap.josm.data.osm.history.HistoryWay;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-
-
-class OsmChangesetContentParserTest {
-	final shouldFail = new GroovyTestCase().&shouldFail
-
-	@Test
-	public void test_Constructor() {
-	    OsmChangesetContentParser parser 
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(new ByteArrayInputStream("".bytes))
-
-        shouldFail(IllegalArgumentException) {
-            parser = new OsmChangesetContentParser((String) null)
-        }
-
-        shouldFail(IllegalArgumentException) {
-            parser = new OsmChangesetContentParser((InputStream) null)
-        }
-	}
-	
-	
-	@Test
-	public void test_parse_arguments() {
-		OsmChangesetContentParser parser 
-		
-		def String doc = """
-		    <osmChange version="0.6" generator="OpenStreetMap server">
-		    </osmChange>
-		"""
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8)))
-		parser.parse null
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8)))
-		parser.parse NullProgressMonitor.INSTANCE
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(doc)	
-		parser.parse null		
-	}	
-	
-	/**
-	 * A simple changeset content document with one created node 
-	 * 
-	 */
-	@Test
-	public void test_OK_OneCreatedNode() {
-		OsmChangesetContentParser parser 
-		
-		def String doc = """
-            <osmChange version="0.6" generator="OpenStreetMap server">
-		      <create>
-		        <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
-		      </create>
-            </osmChange>
-        """
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(doc) 
-		ChangesetDataSet ds = parser.parse()
-
-        assert ds.size() == 1		
-		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
-		assert p != null
-		assert p.getId() == 1
-		assert p.getVersion() == 1
-		assert p.getChangesetId() == 1
-		assert p.getTimestamp() != null
-		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.CREATED
-		assert ds.isCreated(p.getPrimitiveId())
-	}
-	
-	/**
-	 * A simple changeset content document with one updated node 
-	 * 
-	 */
-	@Test
-	public void test_OK_OneUpdatedNode() {
-		OsmChangesetContentParser parser 
-		
-		def String doc = """
-            <osmChange version="0.6" generator="OpenStreetMap server">
-              <modify>
-                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
-              </modify>
-            </osmChange>
-        """
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(doc) 
-		ChangesetDataSet ds = parser.parse()
-		
-		assert ds.size() == 1       
-		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
-		assert p != null
-		assert p.getId() == 1
-		assert p.getVersion() == 1
-		assert p.getChangesetId() == 1
-		assert p.getTimestamp() != null
-		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.UPDATED
-		assert ds.isUpdated(p.getPrimitiveId())
-	}
-	
-	/**
-	 * A simple changeset content document with one deleted node 
-	 * 
-	 */
-	@Test
-	public void test_OK_OneDeletedNode() {
-		OsmChangesetContentParser parser 
-		
-		def String doc = """
-            <osmChange version="0.6" generator="OpenStreetMap server">
-              <delete>
-                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
-              </delete>
-            </osmChange>
-        """
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(doc) 
-		ChangesetDataSet ds = parser.parse()
-		
-		assert ds.size() == 1       
-		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
-		assert p != null
-		assert p.getId() == 1
-		assert p.getVersion() == 1
-		assert p.getChangesetId() == 1
-		assert p.getTimestamp() != null
-		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.DELETED
-		assert ds.isDeleted(p.getPrimitiveId())
-	}
-	
-	/**
-	 * A more complex test with a document including nodes, ways, and relations. 
-	 * 
-	 */
-	@Test
-	public void test_OK_ComplexTestCase() {
-		OsmChangesetContentParser parser 
-		
-		def String doc = """
-            <osmChange version="0.6" generator="OpenStreetMap server">
-              <create>
-                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22">
-		          <tag k="a.key" v="a.value" />
-		        </node>
-              </create>
-              <modify>
-               <way id="2" version="2" visible="true" changeset="1" timestamp="2009-12-22">
-		          <nd ref="21"/>
-		          <nd ref="22"/>
-		       </way>
-             </modify>
-		     <delete>
-                <relation id="3" version="3" visible="true" changeset="1" timestamp="2009-12-22" />
-              </delete>
-            </osmChange>
-        """
-		
-		// should be OK 
-		parser = new OsmChangesetContentParser(doc) 
-		ChangesetDataSet ds = parser.parse()
-		
-		assert ds.size() == 3       
-		
-		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
-		assert p != null
-		assert p.getId() == 1
-		assert p.getVersion() == 1
-		assert p.getChangesetId() == 1
-		assert p.getTimestamp() != null
-		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.CREATED
-		assert ds.isCreated(p.getPrimitiveId())
-		assert p.get("a.key") == "a.value"
-		
-		HistoryWay w = (HistoryWay)ds.getPrimitive(new SimplePrimitiveId(2, OsmPrimitiveType.WAY));
-		assert w != null
-		assert w.getId() == 2
-		assert w.getVersion() == 2
-		assert w.getChangesetId() == 1
-		assert w.getTimestamp() != null
-		assert ds.getModificationType(w.getPrimitiveId()) == ChangesetModificationType.UPDATED
-		assert ds.isUpdated(w.getPrimitiveId())
-		assert w.getNumNodes() == 2
-		assert w.getNodes() == [21,22]
-		
-		HistoryRelation r = (HistoryRelation)ds.getPrimitive(new SimplePrimitiveId(3, OsmPrimitiveType.RELATION));
-		assert r != null
-		assert r.getId() == 3
-		assert r.getVersion() == 3
-		assert r.getChangesetId() == 1
-		assert r.getTimestamp() != null
-		assert ds.getModificationType(r.getPrimitiveId()) == ChangesetModificationType.DELETED
-		assert ds.isDeleted(r.getPrimitiveId())
-	}
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import org.junit.Test
+
+import java.nio.charset.StandardCharsets
+
+import org.openstreetmap.josm.data.osm.ChangesetDataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryRelation;
+import org.openstreetmap.josm.data.osm.history.HistoryWay;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+
+class OsmChangesetContentParserTest {
+	final shouldFail = new GroovyTestCase().&shouldFail
+
+	@Test
+	public void test_Constructor() {
+	    OsmChangesetContentParser parser 
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(new ByteArrayInputStream("".bytes))
+
+        shouldFail(IllegalArgumentException) {
+            parser = new OsmChangesetContentParser((String) null)
+        }
+
+        shouldFail(IllegalArgumentException) {
+            parser = new OsmChangesetContentParser((InputStream) null)
+        }
+	}
+	
+	
+	@Test
+	public void test_parse_arguments() {
+		OsmChangesetContentParser parser 
+		
+		def String doc = """
+		    <osmChange version="0.6" generator="OpenStreetMap server">
+		    </osmChange>
+		"""
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8)))
+		parser.parse null
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8)))
+		parser.parse NullProgressMonitor.INSTANCE
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(doc)	
+		parser.parse null		
+	}	
+	
+	/**
+	 * A simple changeset content document with one created node 
+	 * 
+	 */
+	@Test
+	public void test_OK_OneCreatedNode() {
+		OsmChangesetContentParser parser 
+		
+		def String doc = """
+            <osmChange version="0.6" generator="OpenStreetMap server">
+		      <create>
+		        <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
+		      </create>
+            </osmChange>
+        """
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(doc) 
+		ChangesetDataSet ds = parser.parse()
+
+        assert ds.size() == 1		
+		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
+		assert p != null
+		assert p.getId() == 1
+		assert p.getVersion() == 1
+		assert p.getChangesetId() == 1
+		assert p.getTimestamp() != null
+		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.CREATED
+		assert ds.isCreated(p.getPrimitiveId())
+	}
+	
+	/**
+	 * A simple changeset content document with one updated node 
+	 * 
+	 */
+	@Test
+	public void test_OK_OneUpdatedNode() {
+		OsmChangesetContentParser parser 
+		
+		def String doc = """
+            <osmChange version="0.6" generator="OpenStreetMap server">
+              <modify>
+                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
+              </modify>
+            </osmChange>
+        """
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(doc) 
+		ChangesetDataSet ds = parser.parse()
+		
+		assert ds.size() == 1       
+		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
+		assert p != null
+		assert p.getId() == 1
+		assert p.getVersion() == 1
+		assert p.getChangesetId() == 1
+		assert p.getTimestamp() != null
+		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.UPDATED
+		assert ds.isUpdated(p.getPrimitiveId())
+	}
+	
+	/**
+	 * A simple changeset content document with one deleted node 
+	 * 
+	 */
+	@Test
+	public void test_OK_OneDeletedNode() {
+		OsmChangesetContentParser parser 
+		
+		def String doc = """
+            <osmChange version="0.6" generator="OpenStreetMap server">
+              <delete>
+                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22" />
+              </delete>
+            </osmChange>
+        """
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(doc) 
+		ChangesetDataSet ds = parser.parse()
+		
+		assert ds.size() == 1       
+		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
+		assert p != null
+		assert p.getId() == 1
+		assert p.getVersion() == 1
+		assert p.getChangesetId() == 1
+		assert p.getTimestamp() != null
+		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.DELETED
+		assert ds.isDeleted(p.getPrimitiveId())
+	}
+	
+	/**
+	 * A more complex test with a document including nodes, ways, and relations. 
+	 * 
+	 */
+	@Test
+	public void test_OK_ComplexTestCase() {
+		OsmChangesetContentParser parser 
+		
+		def String doc = """
+            <osmChange version="0.6" generator="OpenStreetMap server">
+              <create>
+                <node id="1" version="1" visible="true" changeset="1" lat="1.0" lon="1.0" timestamp="2009-12-22">
+		          <tag k="a.key" v="a.value" />
+		        </node>
+              </create>
+              <modify>
+               <way id="2" version="2" visible="true" changeset="1" timestamp="2009-12-22">
+		          <nd ref="21"/>
+		          <nd ref="22"/>
+		       </way>
+             </modify>
+		     <delete>
+                <relation id="3" version="3" visible="true" changeset="1" timestamp="2009-12-22" />
+              </delete>
+            </osmChange>
+        """
+		
+		// should be OK 
+		parser = new OsmChangesetContentParser(doc) 
+		ChangesetDataSet ds = parser.parse()
+		
+		assert ds.size() == 3       
+		
+		HistoryOsmPrimitive p = ds.getPrimitive(new SimplePrimitiveId(1, OsmPrimitiveType.NODE));
+		assert p != null
+		assert p.getId() == 1
+		assert p.getVersion() == 1
+		assert p.getChangesetId() == 1
+		assert p.getTimestamp() != null
+		assert ds.getModificationType(p.getPrimitiveId()) == ChangesetModificationType.CREATED
+		assert ds.isCreated(p.getPrimitiveId())
+		assert p.get("a.key") == "a.value"
+		
+		HistoryWay w = (HistoryWay)ds.getPrimitive(new SimplePrimitiveId(2, OsmPrimitiveType.WAY));
+		assert w != null
+		assert w.getId() == 2
+		assert w.getVersion() == 2
+		assert w.getChangesetId() == 1
+		assert w.getTimestamp() != null
+		assert ds.getModificationType(w.getPrimitiveId()) == ChangesetModificationType.UPDATED
+		assert ds.isUpdated(w.getPrimitiveId())
+		assert w.getNumNodes() == 2
+		assert w.getNodes() == [21,22]
+		
+		HistoryRelation r = (HistoryRelation)ds.getPrimitive(new SimplePrimitiveId(3, OsmPrimitiveType.RELATION));
+		assert r != null
+		assert r.getId() == 3
+		assert r.getVersion() == 3
+		assert r.getChangesetId() == 1
+		assert r.getTimestamp() != null
+		assert ds.getModificationType(r.getPrimitiveId()) == ChangesetModificationType.DELETED
+		assert ds.isDeleted(r.getPrimitiveId())
+	}
+}
diff --git a/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.groovy b/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.groovy
index 1840679..37ea52a 100644
--- a/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.groovy
@@ -1,211 +1,211 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io;
-
-import static org.junit.Assert.*
-
-import java.nio.charset.StandardCharsets
-
-import org.junit.Test
-import org.openstreetmap.josm.data.osm.DataSet
-import org.openstreetmap.josm.data.osm.Node
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType
-
-class ParseWithChangesetReaderTest {
-
-    private DataSet getDataSet(String doc) {
-        InputStream is = new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8))
-        DataSet ds = new OsmReader().parseDataSet(is, null)
-        is.close()
-        return ds
-    }
-
-	/**
-	 * A new node with a changeset id. Ignore it.
-	 */
-	@Test
-	public void test_1() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="-1" lat="0.0" lon="0.0" changeset="1">
-            <tag k="external-id" v="-1"/>
-        </node>
-        </osm>
-        """
-
-		DataSet ds = getDataSet(doc)
-        Node n = ds.nodes.find {it.get("external-id") == "-1"}
-		assert n != null
-		assert n.changesetId == 0
-	}
-
-	/**
-	 * A new node with an invalid changeset id. Ignore it.
-	 */
-	@Test
-	public void test_11() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="-1" lat="0.0" lon="0.0" changeset="0">
-		    <tag k="external-id" v="-1"/>
-		</node>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.nodes.find {it.get("external-id") == "-1"}
-		assert n != null
-		assert n.changesetId == 0
-	}
-
-	/**
-	 * A new node with an invalid changeset id. Ignore it.
-	 */
-	@Test
-	public void test_12() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="-1" lat="0.0" lon="0.0" changeset="-1">
-		    <tag k="external-id" v="-1"/>
-        </node>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.nodes.find {it.get("external-id") == "-1"}
-		assert n != null
-		assert n.changesetId == 0
-	}
-
-	/**
-	 * A new node with an invalid changeset id. Ignore it.
-	 */
-	@Test
-	public void test_13() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="-1" lat="0.0" lon="0.0" changeset="aaa">
-		    <tag k="external-id" v="-1"/>
-        </node>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.nodes.find {it.get("external-id") == "-1"}
-		assert n != null
-		assert n.changesetId == 0
-	}
-
-	/**
-	 * A new node with a missing changeset id. That's fine. The changeset id
-	 * is reset to 0.
-	 */
-	@Test
-	public void test_14() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="-1" lat="0.0" lon="0.0" >
-		    <tag k="external-id" v="-1"/>
-        </node>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.nodes.find {it.get("external-id") == "-1"}
-		assert n != null
-		assert n.changesetId == 0
-	}
-
-
-	/**
-	 * An existing node with a missing changeset id. That's fine. The changeset id
-	 * is reset to 0.
-	 */
-	@Test
-	public void test_2() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="1" lat="0.0" lon="0.0" version="1"/>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.getPrimitiveById(1, OsmPrimitiveType.NODE)
-		assert n != null
-		assert n.uniqueId == 1
-		assert n.changesetId == 0
-	}
-
-	/**
-     * An existing node with a valid changeset id id. That's fine. The changeset id
-     * is applied.
-     */
-	@Test
-	public void test_3() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="1" lat="0.0" lon="0.0" version="1" changeset="4"/>
-        </osm>
-        """
-
-        DataSet ds = getDataSet(doc)
-		Node n = ds.getPrimitiveById(1, OsmPrimitiveType.NODE)
-		assert n != null
-		assert n.uniqueId == 1
-		assert n.changesetId == 4
-	}
-
-	/**
-	 * An existing node with an invalid changeset id. That's a problem. An exception
-	 * is thrown.
-	 */
-	@Test
-	public void test_4() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="1" lat="0.0" lon="0.0" version="1" changeset="-1"/>
-        </osm>
-        """
-
-		final shouldFail = new GroovyTestCase().&shouldFail
-
-		shouldFail(IllegalDataException) {
-            DataSet ds = getDataSet(doc)
-		}
-	}
-	/**
-	 * An existing node with an invalid changeset id. That's a problem. An exception
-	 * is thrown.
-	 */
-	@Test
-	public void test_5() {
-		String doc = """\
-         <osm version="0.6">
-        <node id="1" lat="0.0" lon="0.0" version="1" changeset="0"/>
-        </osm>
-        """
-
-		final shouldFail = new GroovyTestCase().&shouldFail
-
-		shouldFail(IllegalDataException) {
-            DataSet ds = getDataSet(doc)
-		}
-	}
-	/**
-	 * An existing node with an invalid changeset id. That's a problem. An exception
-	 * is thrown.
-	 */
-	@Test
-	public void test_6() {
-		String doc = """\
-	         <osm version="0.6">
-	        <node id="1" lat="0.0" lon="0.0" version="1" changeset="abc"/>
-	        </osm>
-	        """
-
-		final shouldFail = new GroovyTestCase().&shouldFail
-
-		shouldFail(IllegalDataException) {
-            DataSet ds = getDataSet(doc)
-		}
-	}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.*
+
+import java.nio.charset.StandardCharsets
+
+import org.junit.Test
+import org.openstreetmap.josm.data.osm.DataSet
+import org.openstreetmap.josm.data.osm.Node
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType
+
+class ParseWithChangesetReaderTest {
+
+    private DataSet getDataSet(String doc) {
+        InputStream is = new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8))
+        DataSet ds = new OsmReader().parseDataSet(is, null)
+        is.close()
+        return ds
+    }
+
+	/**
+	 * A new node with a changeset id. Ignore it.
+	 */
+	@Test
+	public void test_1() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="-1" lat="0.0" lon="0.0" changeset="1">
+            <tag k="external-id" v="-1"/>
+        </node>
+        </osm>
+        """
+
+		DataSet ds = getDataSet(doc)
+        Node n = ds.nodes.find {it.get("external-id") == "-1"}
+		assert n != null
+		assert n.changesetId == 0
+	}
+
+	/**
+	 * A new node with an invalid changeset id. Ignore it.
+	 */
+	@Test
+	public void test_11() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="-1" lat="0.0" lon="0.0" changeset="0">
+		    <tag k="external-id" v="-1"/>
+		</node>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.nodes.find {it.get("external-id") == "-1"}
+		assert n != null
+		assert n.changesetId == 0
+	}
+
+	/**
+	 * A new node with an invalid changeset id. Ignore it.
+	 */
+	@Test
+	public void test_12() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="-1" lat="0.0" lon="0.0" changeset="-1">
+		    <tag k="external-id" v="-1"/>
+        </node>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.nodes.find {it.get("external-id") == "-1"}
+		assert n != null
+		assert n.changesetId == 0
+	}
+
+	/**
+	 * A new node with an invalid changeset id. Ignore it.
+	 */
+	@Test
+	public void test_13() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="-1" lat="0.0" lon="0.0" changeset="aaa">
+		    <tag k="external-id" v="-1"/>
+        </node>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.nodes.find {it.get("external-id") == "-1"}
+		assert n != null
+		assert n.changesetId == 0
+	}
+
+	/**
+	 * A new node with a missing changeset id. That's fine. The changeset id
+	 * is reset to 0.
+	 */
+	@Test
+	public void test_14() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="-1" lat="0.0" lon="0.0" >
+		    <tag k="external-id" v="-1"/>
+        </node>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.nodes.find {it.get("external-id") == "-1"}
+		assert n != null
+		assert n.changesetId == 0
+	}
+
+
+	/**
+	 * An existing node with a missing changeset id. That's fine. The changeset id
+	 * is reset to 0.
+	 */
+	@Test
+	public void test_2() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="1" lat="0.0" lon="0.0" version="1"/>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.getPrimitiveById(1, OsmPrimitiveType.NODE)
+		assert n != null
+		assert n.uniqueId == 1
+		assert n.changesetId == 0
+	}
+
+	/**
+     * An existing node with a valid changeset id id. That's fine. The changeset id
+     * is applied.
+     */
+	@Test
+	public void test_3() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="1" lat="0.0" lon="0.0" version="1" changeset="4"/>
+        </osm>
+        """
+
+        DataSet ds = getDataSet(doc)
+		Node n = ds.getPrimitiveById(1, OsmPrimitiveType.NODE)
+		assert n != null
+		assert n.uniqueId == 1
+		assert n.changesetId == 4
+	}
+
+	/**
+	 * An existing node with an invalid changeset id. That's a problem. An exception
+	 * is thrown.
+	 */
+	@Test
+	public void test_4() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="1" lat="0.0" lon="0.0" version="1" changeset="-1"/>
+        </osm>
+        """
+
+		final shouldFail = new GroovyTestCase().&shouldFail
+
+		shouldFail(IllegalDataException) {
+            DataSet ds = getDataSet(doc)
+		}
+	}
+	/**
+	 * An existing node with an invalid changeset id. That's a problem. An exception
+	 * is thrown.
+	 */
+	@Test
+	public void test_5() {
+		String doc = """\
+         <osm version="0.6">
+        <node id="1" lat="0.0" lon="0.0" version="1" changeset="0"/>
+        </osm>
+        """
+
+		final shouldFail = new GroovyTestCase().&shouldFail
+
+		shouldFail(IllegalDataException) {
+            DataSet ds = getDataSet(doc)
+		}
+	}
+	/**
+	 * An existing node with an invalid changeset id. That's a problem. An exception
+	 * is thrown.
+	 */
+	@Test
+	public void test_6() {
+		String doc = """\
+	         <osm version="0.6">
+	        <node id="1" lat="0.0" lon="0.0" version="1" changeset="abc"/>
+	        </osm>
+	        """
+
+		final shouldFail = new GroovyTestCase().&shouldFail
+
+		shouldFail(IllegalDataException) {
+            DataSet ds = getDataSet(doc)
+		}
+	}
 }
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
index 0502bf6..ee0310c 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
@@ -1,151 +1,151 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.remotecontrol;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-
-/**
- * Unit tests for Remote Control
- */
-public class RemoteControlTest {
-
-    private String httpBase;
-    private String httpsBase;
-
-    /**
-     * Starts Remote control before testing requests.
-     */
-    @Before
-    public void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-        RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.put(true);
-        try {
-            Files.deleteIfExists(Paths.get(
-                    RemoteControl.getRemoteControlDir()).resolve(RemoteControlHttpsServer.KEYSTORE_FILENAME));
-        } catch (IOException e) {
-            Main.error(e);
-        }
-
-        RemoteControl.start();
-        disableCertificateValidation();
-        httpBase = "http://127.0.0.1:"+Main.pref.getInteger("remote.control.port", 8111);
-        httpsBase = "https://127.0.0.1:"+Main.pref.getInteger("remote.control.https.port", 8112);
-    }
-
-    /**
-     * Disable all HTTPS validation mechanisms as described
-     * <a href="http://stackoverflow.com/a/2893932/2257172">here</a> and
-     * <a href="http://stackoverflow.com/a/19542614/2257172">here</a>
-     */
-    public void disableCertificateValidation() {
-        // Create a trust manager that does not validate certificate chains
-        TrustManager[] trustAllCerts = new TrustManager[] {
-            new X509TrustManager() {
-                public X509Certificate[] getAcceptedIssuers() {
-                    return null;
-                }
-                public void checkClientTrusted(X509Certificate[] certs, String authType) {
-                }
-                public void checkServerTrusted(X509Certificate[] certs, String authType) {
-                }
-            }
-        };
-
-        // Install the all-trusting trust manager
-        try {
-            SSLContext sc = SSLContext.getInstance("TLS");
-            sc.init(null, trustAllCerts, new SecureRandom());
-            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
-        } catch (GeneralSecurityException e) {
-            fail(e.getMessage());
-        }
-
-        // Create all-trusting host name verifier
-        HostnameVerifier allHostsValid = new HostnameVerifier() {
-            @Override
-            public boolean verify(String hostname, SSLSession session) {
-                return true;
-            }
-        };
-
-        // Install the all-trusting host verifier
-        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
-    }
-
-    /**
-     * Stops Remote control after testing requests.
-     */
-    @After
-    public void tearDown() {
-        RemoteControl.stop();
-    }
-
-    /**
-     * Tests that sending an HTTP request without command results in HTTP 400, with all available commands in error message.
-     * @throws IOException if an I/O error occurs
-     * @throws MalformedURLException if HTTP URL is invalid
-     */
-    @Test
-    public void testHttpListOfCommands() throws MalformedURLException, IOException {
-        testListOfCommands(httpBase);
-    }
-
-    /**
-     * Tests that sending an HTTPS request without command results in HTTP 400, with all available commands in error message.
-     * @throws IOException if an I/O error occurs
-     * @throws MalformedURLException if HTTPS URL is invalid
-     */
-    @Test
-    public void testHttpsListOfCommands() throws MalformedURLException, IOException {
-        testListOfCommands(httpsBase);
-    }
-
-    private void testListOfCommands(String url) throws MalformedURLException, IOException {
-        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
-        connection.connect();
-        assertEquals(connection.getResponseCode(), HttpURLConnection.HTTP_BAD_REQUEST);
-        try (InputStream is = connection.getErrorStream()) {
-            // TODO this code should be refactored somewhere in Utils as it is used in several JOSM classes
-            StringBuilder responseBody = new StringBuilder();
-            try (BufferedReader in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
-                String s;
-                while((s = in.readLine()) != null) {
-                    responseBody.append(s);
-                    responseBody.append("\n");
-                }
-            }
-            assert responseBody.toString().contains(RequestProcessor.getUsageAsHtml());
-        } catch (IllegalAccessException e) {
-            fail(e.getMessage());
-        } catch (InstantiationException e) {
-            fail(e.getMessage());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+
+/**
+ * Unit tests for Remote Control
+ */
+public class RemoteControlTest {
+
+    private String httpBase;
+    private String httpsBase;
+
+    /**
+     * Starts Remote control before testing requests.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+        RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.put(true);
+        try {
+            Files.deleteIfExists(Paths.get(
+                    RemoteControl.getRemoteControlDir()).resolve(RemoteControlHttpsServer.KEYSTORE_FILENAME));
+        } catch (IOException e) {
+            Main.error(e);
+        }
+
+        RemoteControl.start();
+        disableCertificateValidation();
+        httpBase = "http://127.0.0.1:"+Main.pref.getInteger("remote.control.port", 8111);
+        httpsBase = "https://127.0.0.1:"+Main.pref.getInteger("remote.control.https.port", 8112);
+    }
+
+    /**
+     * Disable all HTTPS validation mechanisms as described
+     * <a href="http://stackoverflow.com/a/2893932/2257172">here</a> and
+     * <a href="http://stackoverflow.com/a/19542614/2257172">here</a>
+     */
+    public void disableCertificateValidation() {
+        // Create a trust manager that does not validate certificate chains
+        TrustManager[] trustAllCerts = new TrustManager[] {
+            new X509TrustManager() {
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+                public void checkClientTrusted(X509Certificate[] certs, String authType) {
+                }
+                public void checkServerTrusted(X509Certificate[] certs, String authType) {
+                }
+            }
+        };
+
+        // Install the all-trusting trust manager
+        try {
+            SSLContext sc = SSLContext.getInstance("TLS");
+            sc.init(null, trustAllCerts, new SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+        } catch (GeneralSecurityException e) {
+            fail(e.getMessage());
+        }
+
+        // Create all-trusting host name verifier
+        HostnameVerifier allHostsValid = new HostnameVerifier() {
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+
+        // Install the all-trusting host verifier
+        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
+    }
+
+    /**
+     * Stops Remote control after testing requests.
+     */
+    @After
+    public void tearDown() {
+        RemoteControl.stop();
+    }
+
+    /**
+     * Tests that sending an HTTP request without command results in HTTP 400, with all available commands in error message.
+     * @throws IOException if an I/O error occurs
+     * @throws MalformedURLException if HTTP URL is invalid
+     */
+    @Test
+    public void testHttpListOfCommands() throws MalformedURLException, IOException {
+        testListOfCommands(httpBase);
+    }
+
+    /**
+     * Tests that sending an HTTPS request without command results in HTTP 400, with all available commands in error message.
+     * @throws IOException if an I/O error occurs
+     * @throws MalformedURLException if HTTPS URL is invalid
+     */
+    @Test
+    public void testHttpsListOfCommands() throws MalformedURLException, IOException {
+        testListOfCommands(httpsBase);
+    }
+
+    private void testListOfCommands(String url) throws MalformedURLException, IOException {
+        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+        connection.connect();
+        assertEquals(connection.getResponseCode(), HttpURLConnection.HTTP_BAD_REQUEST);
+        try (InputStream is = connection.getErrorStream()) {
+            // TODO this code should be refactored somewhere in Utils as it is used in several JOSM classes
+            StringBuilder responseBody = new StringBuilder();
+            try (BufferedReader in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
+                String s;
+                while((s = in.readLine()) != null) {
+                    responseBody.append(s);
+                    responseBody.append("\n");
+                }
+            }
+            assert responseBody.toString().contains(RequestProcessor.getUsageAsHtml());
+        } catch (IllegalAccessException e) {
+            fail(e.getMessage());
+        } catch (InstantiationException e) {
+            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 70c36b0..5440c0a 100644
--- a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
@@ -1,112 +1,112 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.session;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
-import org.openstreetmap.josm.io.IllegalDataException;
-
-/**
- * Unit tests for Session reading.
- */
-public class SessionReaderTest {
-
-    /**
-     * Setup tests.
-     */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    private static String getSessionDataDir() {
-        return TestUtils.getTestDataRoot() + "/sessions";
-    }
-
-    private List<Layer> testRead(String sessionFileName) throws IOException, IllegalDataException {
-        boolean zip = sessionFileName.endsWith(".joz");
-        File file = new File(getSessionDataDir()+"/"+sessionFileName);
-        SessionReader reader = new SessionReader();
-        reader.loadSession(file, zip, null);
-        return reader.getLayers();
-    }
-
-    /**
-     * Tests to read an empty .jos or .joz file.
-     * @throws IOException if any I/O error occurs
-     * @throws IllegalDataException is the test file is considered as invalid
-     */
-    @Test
-    public void testReadEmpty() throws IOException, IllegalDataException {
-        assertTrue(testRead("empty.jos").isEmpty());
-        assertTrue(testRead("empty.joz").isEmpty());
-    }
-
-    /**
-     * Tests to read a .jos or .joz file containing OSM data.
-     * @throws IOException if any I/O error occurs
-     * @throws IllegalDataException is the test file is considered as invalid
-     */
-    @Test
-    public void testReadOsm() throws IOException, IllegalDataException {
-        for (String file : new String[]{"osm.jos", "osm.joz"}) {
-            List<Layer> layers = testRead(file);
-            assertTrue(layers.size() == 1);
-            assertTrue(layers.get(0) instanceof OsmDataLayer);
-            OsmDataLayer osm = (OsmDataLayer) layers.get(0);
-            assertEquals(osm.getName(), "OSM layer name");
-        }
-    }
-
-    /**
-     * Tests to read a .jos or .joz file containing GPX data.
-     * @throws IOException if any I/O error occurs
-     * @throws IllegalDataException is the test file is considered as invalid
-     */
-    @Test
-    public void testReadGpx() throws IOException, IllegalDataException {
-        for (String file : new String[]{"gpx.jos", "gpx.joz", "nmea.jos"}) {
-            List<Layer> layers = testRead(file);
-            assertTrue(layers.size() == 1);
-            assertTrue(layers.get(0) instanceof GpxLayer);
-            GpxLayer gpx = (GpxLayer) layers.get(0);
-            assertEquals(gpx.getName(), "GPX layer name");
-        }
-    }
-
-    /**
-     * Tests to read a .joz file containing GPX and marker data.
-     * @throws IOException if any I/O error occurs
-     * @throws IllegalDataException is the test file is considered as invalid
-     */
-    @Test
-    public void testReadGpxAndMarker() throws IOException, IllegalDataException {
-        List<Layer> layers = testRead("gpx_markers.joz");
-        assertTrue(layers.size() == 2);
-        GpxLayer gpx = null;
-        MarkerLayer marker = null;
-        for (Layer layer : layers) {
-            if (layer instanceof GpxLayer) {
-                gpx = (GpxLayer) layer;
-            } else if (layer instanceof MarkerLayer) {
-                marker = (MarkerLayer) layer;
-            }
-        }
-        assertTrue(gpx != null);
-        assertTrue(marker != null);
-        assertEquals(gpx.getName(), "GPX layer name");
-        assertEquals(marker.getName(), "Marker layer name");
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.session;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
+import org.openstreetmap.josm.io.IllegalDataException;
+
+/**
+ * Unit tests for Session reading.
+ */
+public class SessionReaderTest {
+
+    /**
+     * Setup tests.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    private static String getSessionDataDir() {
+        return TestUtils.getTestDataRoot() + "/sessions";
+    }
+
+    private List<Layer> testRead(String sessionFileName) throws IOException, IllegalDataException {
+        boolean zip = sessionFileName.endsWith(".joz");
+        File file = new File(getSessionDataDir()+"/"+sessionFileName);
+        SessionReader reader = new SessionReader();
+        reader.loadSession(file, zip, null);
+        return reader.getLayers();
+    }
+
+    /**
+     * Tests to read an empty .jos or .joz file.
+     * @throws IOException if any I/O error occurs
+     * @throws IllegalDataException is the test file is considered as invalid
+     */
+    @Test
+    public void testReadEmpty() throws IOException, IllegalDataException {
+        assertTrue(testRead("empty.jos").isEmpty());
+        assertTrue(testRead("empty.joz").isEmpty());
+    }
+
+    /**
+     * Tests to read a .jos or .joz file containing OSM data.
+     * @throws IOException if any I/O error occurs
+     * @throws IllegalDataException is the test file is considered as invalid
+     */
+    @Test
+    public void testReadOsm() throws IOException, IllegalDataException {
+        for (String file : new String[]{"osm.jos", "osm.joz"}) {
+            List<Layer> layers = testRead(file);
+            assertTrue(layers.size() == 1);
+            assertTrue(layers.get(0) instanceof OsmDataLayer);
+            OsmDataLayer osm = (OsmDataLayer) layers.get(0);
+            assertEquals(osm.getName(), "OSM layer name");
+        }
+    }
+
+    /**
+     * Tests to read a .jos or .joz file containing GPX data.
+     * @throws IOException if any I/O error occurs
+     * @throws IllegalDataException is the test file is considered as invalid
+     */
+    @Test
+    public void testReadGpx() throws IOException, IllegalDataException {
+        for (String file : new String[]{"gpx.jos", "gpx.joz", "nmea.jos"}) {
+            List<Layer> layers = testRead(file);
+            assertTrue(layers.size() == 1);
+            assertTrue(layers.get(0) instanceof GpxLayer);
+            GpxLayer gpx = (GpxLayer) layers.get(0);
+            assertEquals(gpx.getName(), "GPX layer name");
+        }
+    }
+
+    /**
+     * Tests to read a .joz file containing GPX and marker data.
+     * @throws IOException if any I/O error occurs
+     * @throws IllegalDataException is the test file is considered as invalid
+     */
+    @Test
+    public void testReadGpxAndMarker() throws IOException, IllegalDataException {
+        List<Layer> layers = testRead("gpx_markers.joz");
+        assertTrue(layers.size() == 2);
+        GpxLayer gpx = null;
+        MarkerLayer marker = null;
+        for (Layer layer : layers) {
+            if (layer instanceof GpxLayer) {
+                gpx = (GpxLayer) layer;
+            } else if (layer instanceof MarkerLayer) {
+                marker = (MarkerLayer) layer;
+            }
+        }
+        assertTrue(gpx != null);
+        assertTrue(marker != null);
+        assertEquals(gpx.getName(), "GPX layer name");
+        assertEquals(marker.getName(), "Marker layer name");
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java b/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java
index e3d25de..5f48734 100644
--- a/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java
+++ b/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java
@@ -1,187 +1,187 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.io.session;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-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.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
-import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
-import org.openstreetmap.josm.tools.MultiMap;
-import org.openstreetmap.josm.tools.Pair;
-
-/**
- * Unit tests for Session writing.
- */
-public class SessionWriterTest {
-
-    private static class OsmHeadlessJosExporter extends OsmDataSessionExporter {
-        public OsmHeadlessJosExporter(OsmDataLayer layer) {
-            super(layer);
-        }
-        @Override
-        public boolean requiresZip() {
-            return false;
-        }
-    }
-
-    private static class OsmHeadlessJozExporter extends OsmDataSessionExporter {
-        public OsmHeadlessJozExporter(OsmDataLayer layer) {
-            super(layer);
-        }
-        @Override
-        public boolean requiresZip() {
-            return true;
-        }
-    }
-
-    private static class GpxHeadlessJosExporter extends GpxTracksSessionExporter {
-        public GpxHeadlessJosExporter(GpxLayer layer) {
-            super(layer);
-        }
-
-        @Override
-        public boolean requiresZip() {
-            return false;
-        }
-    }
-
-    private static class GpxHeadlessJozExporter extends GpxTracksSessionExporter {
-        public GpxHeadlessJozExporter(GpxLayer layer) {
-            super(layer);
-        }
-
-        @Override
-        public boolean requiresZip() {
-            return true;
-        }
-    }
-
-    /**
-     * Setup tests.
-     */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-        ProjectionPreference.setProjection();
-    }
-
-    private void testWrite(List<Layer> layers, final boolean zip) throws IOException {
-        Map<Layer, SessionLayerExporter> exporters = new HashMap<>();
-        if (zip) {
-            SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJozExporter.class);
-            SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJozExporter.class);
-        } else {
-            SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJosExporter.class);
-            SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJosExporter.class);
-        }
-        for (final Layer l : layers) {
-            exporters.put(l, SessionWriter.getSessionLayerExporter(l));
-        }
-        SessionWriter sw = new SessionWriter(layers, -1, exporters, new MultiMap<Layer, Layer>(), zip);
-        File file = new File(System.getProperty("java.io.tmpdir"), getClass().getName()+(zip?".joz":".jos"));
-        try {
-            sw.write(file);
-        } finally {
-            if (file.exists()) {
-                file.delete();
-            }
-        }
-    }
-
-    private OsmDataLayer createOsmLayer() {
-        OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OSM layer name", null);
-        layer.setAssociatedFile(new File("data.osm"));
-        return layer;
-    }
-
-    private GpxLayer createGpxLayer() {
-        GpxData data = new GpxData();
-        data.waypoints.add(new WayPoint(new LatLon(42.72665, -0.00747)));
-        data.waypoints.add(new WayPoint(new LatLon(42.72659, -0.00749)));
-        GpxLayer layer = new GpxLayer(data, "GPX layer name");
-        layer.setAssociatedFile(new File("data.gpx"));
-        return layer;
-    }
-
-    private MarkerLayer createMarkerLayer(GpxLayer gpx) {
-        return new MarkerLayer(gpx.data, "Marker layer name", gpx.getAssociatedFile(), gpx);
-    }
-
-    /**
-     * Tests to write an empty .jos file.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteEmptyJos() throws IOException {
-        testWrite(Collections.<Layer>emptyList(), false);
-    }
-
-    /**
-     * Tests to write an empty .joz file.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteEmptyJoz() throws IOException {
-        testWrite(Collections.<Layer>emptyList(), true);
-    }
-
-    /**
-     * Tests to write a .jos file containing OSM data.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteOsmJos() throws IOException {
-        testWrite(Collections.<Layer>singletonList(createOsmLayer()), false);
-    }
-
-    /**
-     * Tests to write a .joz file containing OSM data.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteOsmJoz() throws IOException {
-        testWrite(Collections.<Layer>singletonList(createOsmLayer()), true);
-    }
-
-    /**
-     * Tests to write a .jos file containing GPX data.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteGpxJos() throws IOException {
-        testWrite(Collections.<Layer>singletonList(createGpxLayer()), false);
-    }
-
-    /**
-     * Tests to write a .joz file containing GPX data.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteGpxJoz() throws IOException {
-        testWrite(Collections.<Layer>singletonList(createGpxLayer()), true);
-    }
-
-    /**
-     * Tests to write a .joz file containing GPX and marker data.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testWriteGpxAndMarkerJoz() throws IOException {
-        GpxLayer gpx = createGpxLayer();
-        testWrite(Pair.toArrayList(new Pair<Layer, Layer>(gpx, createMarkerLayer(gpx))), true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.session;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
+import org.openstreetmap.josm.tools.MultiMap;
+import org.openstreetmap.josm.tools.Pair;
+
+/**
+ * Unit tests for Session writing.
+ */
+public class SessionWriterTest {
+
+    private static class OsmHeadlessJosExporter extends OsmDataSessionExporter {
+        public OsmHeadlessJosExporter(OsmDataLayer layer) {
+            super(layer);
+        }
+        @Override
+        public boolean requiresZip() {
+            return false;
+        }
+    }
+
+    private static class OsmHeadlessJozExporter extends OsmDataSessionExporter {
+        public OsmHeadlessJozExporter(OsmDataLayer layer) {
+            super(layer);
+        }
+        @Override
+        public boolean requiresZip() {
+            return true;
+        }
+    }
+
+    private static class GpxHeadlessJosExporter extends GpxTracksSessionExporter {
+        public GpxHeadlessJosExporter(GpxLayer layer) {
+            super(layer);
+        }
+
+        @Override
+        public boolean requiresZip() {
+            return false;
+        }
+    }
+
+    private static class GpxHeadlessJozExporter extends GpxTracksSessionExporter {
+        public GpxHeadlessJozExporter(GpxLayer layer) {
+            super(layer);
+        }
+
+        @Override
+        public boolean requiresZip() {
+            return true;
+        }
+    }
+
+    /**
+     * Setup tests.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+        ProjectionPreference.setProjection();
+    }
+
+    private void testWrite(List<Layer> layers, final boolean zip) throws IOException {
+        Map<Layer, SessionLayerExporter> exporters = new HashMap<>();
+        if (zip) {
+            SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJozExporter.class);
+            SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJozExporter.class);
+        } else {
+            SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJosExporter.class);
+            SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJosExporter.class);
+        }
+        for (final Layer l : layers) {
+            exporters.put(l, SessionWriter.getSessionLayerExporter(l));
+        }
+        SessionWriter sw = new SessionWriter(layers, -1, exporters, new MultiMap<Layer, Layer>(), zip);
+        File file = new File(System.getProperty("java.io.tmpdir"), getClass().getName()+(zip?".joz":".jos"));
+        try {
+            sw.write(file);
+        } finally {
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+    }
+
+    private OsmDataLayer createOsmLayer() {
+        OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OSM layer name", null);
+        layer.setAssociatedFile(new File("data.osm"));
+        return layer;
+    }
+
+    private GpxLayer createGpxLayer() {
+        GpxData data = new GpxData();
+        data.waypoints.add(new WayPoint(new LatLon(42.72665, -0.00747)));
+        data.waypoints.add(new WayPoint(new LatLon(42.72659, -0.00749)));
+        GpxLayer layer = new GpxLayer(data, "GPX layer name");
+        layer.setAssociatedFile(new File("data.gpx"));
+        return layer;
+    }
+
+    private MarkerLayer createMarkerLayer(GpxLayer gpx) {
+        return new MarkerLayer(gpx.data, "Marker layer name", gpx.getAssociatedFile(), gpx);
+    }
+
+    /**
+     * Tests to write an empty .jos file.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteEmptyJos() throws IOException {
+        testWrite(Collections.<Layer>emptyList(), false);
+    }
+
+    /**
+     * Tests to write an empty .joz file.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteEmptyJoz() throws IOException {
+        testWrite(Collections.<Layer>emptyList(), true);
+    }
+
+    /**
+     * Tests to write a .jos file containing OSM data.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteOsmJos() throws IOException {
+        testWrite(Collections.<Layer>singletonList(createOsmLayer()), false);
+    }
+
+    /**
+     * Tests to write a .joz file containing OSM data.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteOsmJoz() throws IOException {
+        testWrite(Collections.<Layer>singletonList(createOsmLayer()), true);
+    }
+
+    /**
+     * Tests to write a .jos file containing GPX data.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteGpxJos() throws IOException {
+        testWrite(Collections.<Layer>singletonList(createGpxLayer()), false);
+    }
+
+    /**
+     * Tests to write a .joz file containing GPX data.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteGpxJoz() throws IOException {
+        testWrite(Collections.<Layer>singletonList(createGpxLayer()), true);
+    }
+
+    /**
+     * Tests to write a .joz file containing GPX and marker data.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testWriteGpxAndMarkerJoz() throws IOException {
+        GpxLayer gpx = createGpxLayer();
+        testWrite(Pair.toArrayList(new Pair<Layer, Layer>(gpx, createMarkerLayer(gpx))), true);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/BugReportExceptionHandlerTest.java b/test/unit/org/openstreetmap/josm/tools/BugReportExceptionHandlerTest.java
index c51ace5..a4ccb78 100644
--- a/test/unit/org/openstreetmap/josm/tools/BugReportExceptionHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/BugReportExceptionHandlerTest.java
@@ -1,57 +1,57 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.zip.GZIPInputStream;
-
-import javax.xml.bind.DatatypeConverter;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.ShowStatusReportAction;
-
-/**
- * Bug report unit tests.
- */
-public class BugReportExceptionHandlerTest {
-
-    /**
-     * Setup tests.
-     */
-    @Before
-    public void setUp() {
-        Main.commandLineArgs = new String[0];
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Test method for {@link org.openstreetmap.josm.tools.BugReportExceptionHandler#getBugReportUrl(java.lang.String)}.
-     * @throws IOException
-     */
-    @Test
-    public void testGetBugReportUrl() throws IOException {
-        String report = ShowStatusReportAction.getReportHeader();
-        String url = BugReportExceptionHandler.getBugReportUrl(report).toExternalForm();
-        String prefix = Main.getJOSMWebsite()+"/josmticket?gdata=";
-        assertTrue(url.startsWith(prefix));
-
-        String gdata = url.substring(prefix.length());
-        // JAXB only provides support for "base64" decoding while we encode url in "base64url", so switch encoding, only for test purpose
-        byte[] data = DatatypeConverter.parseBase64Binary(gdata.replace('-', '+').replace('_', '/'));
-        byte[] buff = new byte[8192];
-        try (GZIPInputStream is = new GZIPInputStream(new ByteArrayInputStream(data))) {
-            StringBuilder sb = new StringBuilder();
-            for (int n = is.read(buff); n > 0; n = is.read(buff)) {
-                sb.append(new String(buff, 0, n, StandardCharsets.UTF_8));
-            }
-            assertEquals(report, sb.toString());
-        }
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.zip.GZIPInputStream;
+
+import javax.xml.bind.DatatypeConverter;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ShowStatusReportAction;
+
+/**
+ * Bug report unit tests.
+ */
+public class BugReportExceptionHandlerTest {
+
+    /**
+     * Setup tests.
+     */
+    @Before
+    public void setUp() {
+        Main.commandLineArgs = new String[0];
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test method for {@link org.openstreetmap.josm.tools.BugReportExceptionHandler#getBugReportUrl(java.lang.String)}.
+     * @throws IOException
+     */
+    @Test
+    public void testGetBugReportUrl() throws IOException {
+        String report = ShowStatusReportAction.getReportHeader();
+        String url = BugReportExceptionHandler.getBugReportUrl(report).toExternalForm();
+        String prefix = Main.getJOSMWebsite()+"/josmticket?gdata=";
+        assertTrue(url.startsWith(prefix));
+
+        String gdata = url.substring(prefix.length());
+        // JAXB only provides support for "base64" decoding while we encode url in "base64url", so switch encoding, only for test purpose
+        byte[] data = DatatypeConverter.parseBase64Binary(gdata.replace('-', '+').replace('_', '/'));
+        byte[] buff = new byte[8192];
+        try (GZIPInputStream is = new GZIPInputStream(new ByteArrayInputStream(data))) {
+            StringBuilder sb = new StringBuilder();
+            for (int n = is.read(buff); n > 0; n = is.read(buff)) {
+                sb.append(new String(buff, 0, n, StandardCharsets.UTF_8));
+            }
+            assertEquals(report, sb.toString());
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index 0a742b4..50c652c 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -1,74 +1,75 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.File;
-import java.text.DecimalFormat;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.openstreetmap.josm.data.coor.LatLon;
-
-/**
- * EXIF metadata extraction test
- * @since 6209
- */
-public class ExifReaderTest {
-
-    private File sampleFile;
-    
-    /**
-     * Setup test
-     * @throws Exception
-     */
-    @Before
-    public void setUp() throws Exception {
-        sampleFile = new File("data_nodist/exif-direction-example.jpg");
-    }
-
-    /** 
-     * Test time extraction
-     * @throws ParseException 
-     */
-    @Test
-    public void testReadTime() throws ParseException {
-        Date date = ExifReader.readTime(sampleFile);
-        assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 17, 12, 05).getTime(), date);
-    }
-
-    /**
-     * Test orientation extraction
-     */
-    @Test
-    public void testReadOrientation() {
-        Integer orientation = ExifReader.readOrientation(sampleFile);
-        assertEquals(Integer.valueOf(1), orientation);
-    }
-    
-    /**
-     * Test coordinates extraction
-     */
-    @Test
-    public void testReadLatLon() {
-        LatLon latlon = ExifReader.readLatLon(sampleFile);
-        assertNotNull(latlon);
-        DecimalFormat f = new DecimalFormat("00.0");
-        assertEquals("51°46'"+f.format(43.0)+"\"", LatLon.dms(latlon.lat()));
-        assertEquals("8°21'"+f.format(56.3)+"\"", LatLon.dms(latlon.lon()));
-    }
-
-    /**
-     * Test coordinates extraction
-     */
-    @Test
-    public void testReadDirection() {
-        Double direction = ExifReader.readDirection(sampleFile);
-        assertEquals(new Double(46.5), direction);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * EXIF metadata extraction test
+ * @since 6209
+ */
+public class ExifReaderTest {
+
+    private File orientationSampleFile, directionSampleFile;
+    
+    /**
+     * Setup test
+     * @throws Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        directionSampleFile = new File("data_nodist/exif-example_direction.jpg");
+        orientationSampleFile = new File("data_nodist/exif-example_orientation=6.jpg");
+    }
+
+    /** 
+     * Test time extraction
+     * @throws ParseException 
+     */
+    @Test
+    public void testReadTime() throws ParseException {
+        Date date = ExifReader.readTime(directionSampleFile);
+        assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 17, 12, 05).getTime(), date);
+    }
+
+    /**
+     * Test orientation extraction
+     */
+    @Test
+    public void testReadOrientation() {
+        Integer orientation = ExifReader.readOrientation(orientationSampleFile);
+        assertEquals(Integer.valueOf(6), orientation);
+    }
+    
+    /**
+     * Test coordinates extraction
+     */
+    @Test
+    public void testReadLatLon() {
+        LatLon latlon = ExifReader.readLatLon(directionSampleFile);
+        assertNotNull(latlon);
+        DecimalFormat f = new DecimalFormat("00.0");
+        assertEquals("51°46'"+f.format(43.0)+"\"", LatLon.dms(latlon.lat()));
+        assertEquals("8°21'"+f.format(56.3)+"\"", LatLon.dms(latlon.lon()));
+    }
+
+    /**
+     * Test coordinates extraction
+     */
+    @Test
+    public void testReadDirection() {
+        Double direction = ExifReader.readDirection(directionSampleFile);
+        assertEquals(new Double(46.5), direction);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java b/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
index ed98a9b..a652c41 100644
--- a/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
@@ -1,41 +1,41 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.awt.Transparency;
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Test;
-import org.openstreetmap.josm.TestUtils;
-
-/**
- * Unit tests of {@link ImageProvider} class.
- */
-public class ImageProviderTest {
-
-    /**
-     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9984">#9984</a>
-     * @throws IOException if an error occurs during reading
-     */
-    @Test
-    public void testTicket9984() throws IOException {
-        File file = new File(TestUtils.getRegressionDataFile(9984, "tile.png"));
-        assertThat(ImageProvider.read(file, true, true).getTransparency(), is(Transparency.TRANSLUCENT));
-        assertThat(ImageProvider.read(file, false, true).getTransparency(), is(Transparency.TRANSLUCENT));
-        assertThat(ImageProvider.read(file, false, false).getTransparency(), is(Transparency.OPAQUE));
-        assertThat(ImageProvider.read(file, true, false).getTransparency(), is(Transparency.OPAQUE));
-    }
-
-    /**
-     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/10030">#10030</a>
-     * @throws IOException if an error occurs during reading
-     */
-    @Test
-    public void testTicket10030() throws IOException {
-        File file = new File(TestUtils.getRegressionDataFile(10030, "tile.jpg"));
-        ImageProvider.read(file, true, true);
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.awt.Transparency;
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
+
+/**
+ * Unit tests of {@link ImageProvider} class.
+ */
+public class ImageProviderTest {
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9984">#9984</a>
+     * @throws IOException if an error occurs during reading
+     */
+    @Test
+    public void testTicket9984() throws IOException {
+        File file = new File(TestUtils.getRegressionDataFile(9984, "tile.png"));
+        assertThat(ImageProvider.read(file, true, true).getTransparency(), is(Transparency.TRANSLUCENT));
+        assertThat(ImageProvider.read(file, false, true).getTransparency(), is(Transparency.TRANSLUCENT));
+        assertThat(ImageProvider.read(file, false, false).getTransparency(), is(Transparency.OPAQUE));
+        assertThat(ImageProvider.read(file, true, false).getTransparency(), is(Transparency.OPAQUE));
+    }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/10030">#10030</a>
+     * @throws IOException if an error occurs during reading
+     */
+    @Test
+    public void testTicket10030() throws IOException {
+        File file = new File(TestUtils.getRegressionDataFile(10030, "tile.jpg"));
+        ImageProvider.read(file, true, true);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
index b382d26..ce4c2f5 100644
--- a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
@@ -1,128 +1,128 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Arrays;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.openstreetmap.josm.Main;
-
-/**
- * Unit tests of {@link Utils} class.
- */
-public class UtilsTest {
-
-    /**
-     * Test of {@link Utils#strip} method.
-     */
-    @Test
-    public void testStrip() {
-        final String someWhite =
-            "\u00A0"+ // SPACE_SEPARATOR
-            "\u2007"+ // LINE_SEPARATOR
-            "\u202F"+ // PARAGRAPH_SEPARATOR
-            "\u0009"+ // HORIZONTAL TABULATION
-            "\n"    + // LINE FEED (U+000A, cannot be put as it in Java)
-            "\u000B"+ // VERTICAL TABULATION
-            "\u000C"+ // FORM FEED
-            "\r"    + // CARRIAGE RETURN (U+000D, cannot be put as it in Java)
-            "\u001C"+ // FILE SEPARATOR
-            "\u001D"+ // GROUP SEPARATOR
-            "\u001E"+ // RECORD SEPARATOR
-            "\u001F"+ // UNIT SEPARATOR
-            "\u2003"+ // EM SPACE
-            "\u2007"+ // FIGURE SPACE
-            "\u200B"+ // ZERO WIDTH SPACE
-            "\uFEFF"+ // ZERO WIDTH NO-BREAK SPACE
-            "\u3000"; // IDEOGRAPHIC SPACE
-        Assert.assertNull(Utils.strip(null));
-        Assert.assertEquals("", Utils.strip(""));
-        Assert.assertEquals("", Utils.strip(" "));
-        Assert.assertEquals("", Utils.strip("  "));
-        Assert.assertEquals("", Utils.strip("   "));
-        Assert.assertEquals("", Utils.strip(someWhite));
-        Assert.assertEquals("a", Utils.strip("a"));
-        Assert.assertEquals("ab", Utils.strip("ab"));
-        Assert.assertEquals("abc", Utils.strip("abc"));
-        Assert.assertEquals("a", Utils.strip(" a"));
-        Assert.assertEquals("ab", Utils.strip(" ab"));
-        Assert.assertEquals("abc", Utils.strip(" abc"));
-        Assert.assertEquals("a", Utils.strip("a "));
-        Assert.assertEquals("ab", Utils.strip("ab "));
-        Assert.assertEquals("abc", Utils.strip("abc "));
-        Assert.assertEquals("a", Utils.strip(someWhite+"a"+someWhite));
-        Assert.assertEquals("ab", Utils.strip(someWhite+"ab"+someWhite));
-        Assert.assertEquals("abc", Utils.strip(someWhite+"abc"+someWhite));
-    }
-
-    /**
-     * Test of {@link Utils#toHexString} method.
-     */
-    @Test
-    public void testToHexString(){
-        Assert.assertEquals("", Utils.toHexString(null));
-        Assert.assertEquals("", Utils.toHexString(new byte[0]));
-        Assert.assertEquals("01", Utils.toHexString(new byte[]{0x1}));
-        Assert.assertEquals("0102", Utils.toHexString(new byte[]{0x1,0x2}));
-        Assert.assertEquals("12", Utils.toHexString(new byte[]{0x12}));
-        Assert.assertEquals("127f", Utils.toHexString(new byte[]{0x12, 0x7f}));
-        Assert.assertEquals("fedc", Utils.toHexString(new byte[]{(byte) 0xfe, (byte) 0xdc}));
-    }
-
-    /**
-     * Test of {@link Utils#openURLReaderAndDecompress} method with Gzip compression.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testOpenUrlGzip() throws IOException {
-        Main.initApplicationPreferences();
-        try (BufferedReader x = Utils.openURLReaderAndDecompress(new URL("https://www.openstreetmap.org/trace/1613906/data"), true)) {
-            Assert.assertTrue(x.readLine().startsWith("<?xml version="));
-        }
-    }
-
-    /**
-     * Test of {@link Utils#openURLReaderAndDecompress} method with Bzip compression.
-     * @throws IOException if any I/O error occurs
-     */
-    @Test
-    public void testOpenUrlBzip() throws IOException {
-        Main.initApplicationPreferences();
-        try (BufferedReader x = Utils.openURLReaderAndDecompress(new URL("https://www.openstreetmap.org/trace/785544/data"), true)) {
-            Assert.assertTrue(x.readLine().startsWith("<?xml version="));
-        }
-    }
-
-    /**
-     * Test of {@link Utils#getPositionListString} method.
-     */
-    @Test
-    public void testPositionListString() {
-        assertThat(Utils.getPositionListString(Arrays.asList(1)), is("1"));
-        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3)), is("1-3"));
-        assertThat(Utils.getPositionListString(Arrays.asList(3, 1, 2)), is("1-3"));
-        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3, 6, 7, 8)), is("1-3,6-8"));
-        assertThat(Utils.getPositionListString(Arrays.asList(1, 5, 2, 6, 7)), is("1-2,5-7"));
-    }
-
-    /**
-     * Test of {@link Utils#getDurationString} method.
-     */
-    @Test
-    public void testDurationString() {
-        I18n.set("en");
-        assertThat(Utils.getDurationString(123), is("123 ms"));
-        assertThat(Utils.getDurationString(1234), is("1.2 s"));
-        assertThat(Utils.getDurationString(57 * 1000), is("57.0 s"));
-        assertThat(Utils.getDurationString(507 * 1000), is("8 min 27 s"));
-        assertThat(Utils.getDurationString((long) (8.4 * 60 * 60 * 1000)), is("8 h 24 min"));
-        assertThat(Utils.getDurationString((long) (1.5 * 24 * 60 * 60 * 1000)), is("1 day 12 h"));
-        assertThat(Utils.getDurationString((long) (8.5 * 24 * 60 * 60 * 1000)), is("8 days 12 h"));
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+
+/**
+ * Unit tests of {@link Utils} class.
+ */
+public class UtilsTest {
+
+    /**
+     * Test of {@link Utils#strip} method.
+     */
+    @Test
+    public void testStrip() {
+        final String someWhite =
+            "\u00A0"+ // SPACE_SEPARATOR
+            "\u2007"+ // LINE_SEPARATOR
+            "\u202F"+ // PARAGRAPH_SEPARATOR
+            "\u0009"+ // HORIZONTAL TABULATION
+            "\n"    + // LINE FEED (U+000A, cannot be put as it in Java)
+            "\u000B"+ // VERTICAL TABULATION
+            "\u000C"+ // FORM FEED
+            "\r"    + // CARRIAGE RETURN (U+000D, cannot be put as it in Java)
+            "\u001C"+ // FILE SEPARATOR
+            "\u001D"+ // GROUP SEPARATOR
+            "\u001E"+ // RECORD SEPARATOR
+            "\u001F"+ // UNIT SEPARATOR
+            "\u2003"+ // EM SPACE
+            "\u2007"+ // FIGURE SPACE
+            "\u200B"+ // ZERO WIDTH SPACE
+            "\uFEFF"+ // ZERO WIDTH NO-BREAK SPACE
+            "\u3000"; // IDEOGRAPHIC SPACE
+        Assert.assertNull(Utils.strip(null));
+        Assert.assertEquals("", Utils.strip(""));
+        Assert.assertEquals("", Utils.strip(" "));
+        Assert.assertEquals("", Utils.strip("  "));
+        Assert.assertEquals("", Utils.strip("   "));
+        Assert.assertEquals("", Utils.strip(someWhite));
+        Assert.assertEquals("a", Utils.strip("a"));
+        Assert.assertEquals("ab", Utils.strip("ab"));
+        Assert.assertEquals("abc", Utils.strip("abc"));
+        Assert.assertEquals("a", Utils.strip(" a"));
+        Assert.assertEquals("ab", Utils.strip(" ab"));
+        Assert.assertEquals("abc", Utils.strip(" abc"));
+        Assert.assertEquals("a", Utils.strip("a "));
+        Assert.assertEquals("ab", Utils.strip("ab "));
+        Assert.assertEquals("abc", Utils.strip("abc "));
+        Assert.assertEquals("a", Utils.strip(someWhite+"a"+someWhite));
+        Assert.assertEquals("ab", Utils.strip(someWhite+"ab"+someWhite));
+        Assert.assertEquals("abc", Utils.strip(someWhite+"abc"+someWhite));
+    }
+
+    /**
+     * Test of {@link Utils#toHexString} method.
+     */
+    @Test
+    public void testToHexString(){
+        Assert.assertEquals("", Utils.toHexString(null));
+        Assert.assertEquals("", Utils.toHexString(new byte[0]));
+        Assert.assertEquals("01", Utils.toHexString(new byte[]{0x1}));
+        Assert.assertEquals("0102", Utils.toHexString(new byte[]{0x1,0x2}));
+        Assert.assertEquals("12", Utils.toHexString(new byte[]{0x12}));
+        Assert.assertEquals("127f", Utils.toHexString(new byte[]{0x12, 0x7f}));
+        Assert.assertEquals("fedc", Utils.toHexString(new byte[]{(byte) 0xfe, (byte) 0xdc}));
+    }
+
+    /**
+     * Test of {@link Utils#openURLReaderAndDecompress} method with Gzip compression.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testOpenUrlGzip() throws IOException {
+        Main.initApplicationPreferences();
+        try (BufferedReader x = Utils.openURLReaderAndDecompress(new URL("https://www.openstreetmap.org/trace/1613906/data"), true)) {
+            Assert.assertTrue(x.readLine().startsWith("<?xml version="));
+        }
+    }
+
+    /**
+     * Test of {@link Utils#openURLReaderAndDecompress} method with Bzip compression.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testOpenUrlBzip() throws IOException {
+        Main.initApplicationPreferences();
+        try (BufferedReader x = Utils.openURLReaderAndDecompress(new URL("https://www.openstreetmap.org/trace/785544/data"), true)) {
+            Assert.assertTrue(x.readLine().startsWith("<?xml version="));
+        }
+    }
+
+    /**
+     * Test of {@link Utils#getPositionListString} method.
+     */
+    @Test
+    public void testPositionListString() {
+        assertThat(Utils.getPositionListString(Arrays.asList(1)), is("1"));
+        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3)), is("1-3"));
+        assertThat(Utils.getPositionListString(Arrays.asList(3, 1, 2)), is("1-3"));
+        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3, 6, 7, 8)), is("1-3,6-8"));
+        assertThat(Utils.getPositionListString(Arrays.asList(1, 5, 2, 6, 7)), is("1-2,5-7"));
+    }
+
+    /**
+     * Test of {@link Utils#getDurationString} method.
+     */
+    @Test
+    public void testDurationString() {
+        I18n.set("en");
+        assertThat(Utils.getDurationString(123), is("123 ms"));
+        assertThat(Utils.getDurationString(1234), is("1.2 s"));
+        assertThat(Utils.getDurationString(57 * 1000), is("57.0 s"));
+        assertThat(Utils.getDurationString(507 * 1000), is("8 min 27 s"));
+        assertThat(Utils.getDurationString((long) (8.4 * 60 * 60 * 1000)), is("8 h 24 min"));
+        assertThat(Utils.getDurationString((long) (1.5 * 24 * 60 * 60 * 1000)), is("1 day 12 h"));
+        assertThat(Utils.getDurationString((long) (8.5 * 24 * 60 * 60 * 1000)), is("8 days 12 h"));
+    }
+}

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