diff --git a/cmake/deploy-windows.cmake.in b/cmake/deploy-windows.cmake.in
index 326e3455..27b77b20 100644
--- a/cmake/deploy-windows.cmake.in
+++ b/cmake/deploy-windows.cmake.in
@@ -22,8 +22,12 @@ foreach(DEP_PKGS_FILE IN LISTS DEP_PKGS_FILES_LIST)
   endif()
 endforeach()
 
+message("Running windeployqt:")
 # Run Windeployqt to handle Qt libraries, including plugins
-execute_process(COMMAND ${WINDEPLOYQT} --compiler-runtime ${MERKAARTOR_BINARY})
+execute_process(COMMAND ${WINDEPLOYQT} --compiler-runtime ${MERKAARTOR_BINARY} RESULT_VARIABLE WINDEPLOYQT_RESULT)
+if ( NOT (${WINDEPLOYQT_RESULT} EQUAL "0") )
+    message(FATAL_ERROR "Windeployqt failed with result: ${WINDEPLOYQT_RESULT}.")
+endif()
 
 # Copy all required dlls into the package, skipping those residing in Windows installation
 execute_process(COMMAND ${CYGCHECK} ${MERKAARTOR_BINARY} OUTPUT_VARIABLE MERKAARTOR_DLL_DEPS OUTPUT_STRIP_TRAILING_WHITESPACE)
diff --git a/cmake/vcs-snapshot.cmake b/cmake/vcs-snapshot.cmake
index 8f0272cd..0e915f57 100644
--- a/cmake/vcs-snapshot.cmake
+++ b/cmake/vcs-snapshot.cmake
@@ -6,13 +6,13 @@ cmake_minimum_required(VERSION 3.12.0)
 # template was filled in, to 0 otherwise.
 
 # If this file is exported with git, we set the snapshot to 1 and define some values to the variables.
-if ("YES" STREQUAL "YES")
+if ("$Format:YES$" STREQUAL "YES")
   set(VCS_SNAPSHOT 1)
   set(VCS_BRANCH "SNAPSHOT")
   set(VCS_DIRTY 0)
-  string(SUBSTRING "6d14ea62eb06a9edbe293a1a7f30cdc067f0a252" 0 12 VCS_COMMIT)
+  string(SUBSTRING "$Format:%H$" 0 12 VCS_COMMIT)
   if (DEFINED VCS_FALLBACK_VERSION)
-    set(VCS_DESCRIBE "${VCS_FALLBACK_VERSION}-SNAPSHOT-99999-g6d14ea62e")
+    set(VCS_DESCRIBE "${VCS_FALLBACK_VERSION}-SNAPSHOT-99999-g$Format:%h$")
   else()
     message(FATAL_ERROR "Snapshot VCS information in use, but VCS_FALLBACK_VERSION not defined by root CMakeLists.txt.")
   endif()
@@ -22,7 +22,7 @@ if ("YES" STREQUAL "YES")
   # To process it, we split it by ", ", filter only elements starting with "tag:" and replace the "tag: " out.
   # The remaining variable VCS_TAGS is a CMAKE list of exactly the tags, and can be conveniently test if some tags are found on the current commit.
   # Note: this does not help us in generating something like git describe --tags, as I see no way of extracting the last ancestor tag.
-  set(VCS_REFS "HEAD -> master, tag: 0.19.0")
+  set(VCS_REFS "$Format:%D$")
   string(REPLACE ", " ";" VCS_TAGS ${VCS_REFS})
   list(FILTER VCS_TAGS INCLUDE REGEX "^tag: ")
   list(TRANSFORM VCS_TAGS REPLACE "^tag: " "")
diff --git a/plugins/plugins.cmake b/plugins/plugins.cmake
index 18d2d972..8bbcbd8f 100644
--- a/plugins/plugins.cmake
+++ b/plugins/plugins.cmake
@@ -25,7 +25,9 @@ function(MerkaartorAddPlugin)
         ${PROJECT_SOURCE_DIR}/src/common
     )
     target_link_libraries(${PLUGIN_NAME} Qt5::Svg Qt5::Network Qt5::Xml Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::PrintSupport Qt5::Widgets ${PKGCONFIG_DEPS_LIBRARIES} )
-    install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${PLUGINS_INSTALL_POSTFIX}/${PLUGIN_DESTINATION})
+    install(TARGETS ${PLUGIN_NAME}
+	    LIBRARY DESTINATION ${PLUGINS_INSTALL_POSTFIX}/${PLUGIN_DESTINATION}
+	    RUNTIME DESTINATION ${PLUGINS_INSTALL_POSTFIX}/${PLUGIN_DESTINATION})
 endfunction()
 
 add_definitions("-DPLUGINS_DIR=${CMAKE_INSTALL_PREFIX}/${PLUGINS_INSTALL_POSTFIX}")
diff --git a/src/ImportExport/ImportOSM.cpp b/src/ImportExport/ImportOSM.cpp
index 721f2d41..3caf958d 100644
--- a/src/ImportExport/ImportOSM.cpp
+++ b/src/ImportExport/ImportOSM.cpp
@@ -541,9 +541,9 @@ bool importOSM(QWidget* aParent, QIODevice& File, Document* theDocument, Layer*
         }
 
         if (EmptyFeature.size()) {
-            if (QMessageBox::warning(aParent,QApplication::translate("Downloader","Empty roads/relations detected"),
+            if (QMessageBox::warning(aParent,QApplication::translate("Downloader","Empty ways/relations detected"),
                     QApplication::translate("Downloader",
-                    "Empty roads/relations are probably errors.\n"
+                    "Empty ways/relations are probably errors.\n"
                     "Do you want to mark them for deletion?"),
                     QMessageBox::Ok | QMessageBox::Cancel,
                     QMessageBox::Cancel
diff --git a/src/Main.cpp b/src/Main.cpp
index d03bd498..3a136b69 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -214,7 +214,7 @@ int main(int argc, char** argv)
 
     /* Load plugins; this handles different OS habits. */
 #if defined(Q_OS_WIN32)
-    QDir pluginsDir = QDir(qApp->applicationDirPath() + "/" + STRINGIFY(PLUGINS_DIR));
+    QDir pluginsDir = QDir(qApp->applicationDirPath() + "/../lib/merkaartor/plugins");
 #elif defined(Q_OS_MAC)
     QDir pluginsDir = QDir(qApp->applicationDirPath());
     pluginsDir.cdUp();
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 9c8fe1e8..2944c670 100755
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -4188,6 +4188,9 @@ QStringList MainWindow::translationPaths() {
     paths << QCoreApplication::applicationDirPath() + "/translations";
 #if defined(Q_OS_MAC)
     paths << macOsTranslationsPath();
+#elif defined(Q_OS_WIN)
+    /* TODO: Almost TRANSDIR_MERKAARTOR, unfortunately the user can change the path in installer... */
+    paths << QCoreApplication::applicationDirPath() + "/../share/merkaartor/translations";
 #endif
     paths << QLibraryInfo::location(QLibraryInfo::TranslationsPath);
     return paths;
diff --git a/src/Sync/DirtyList.cpp b/src/Sync/DirtyList.cpp
index 4ffaeac6..f6a941a0 100644
--- a/src/Sync/DirtyList.cpp
+++ b/src/Sync/DirtyList.cpp
@@ -342,7 +342,7 @@ bool DirtyListDescriber::showChanges(QWidget* aParent)
 
 bool DirtyListDescriber::addRoad(Way* R)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD road %1").arg(R->id().numId) + userName(R), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD way %1").arg(R->id().numId) + userName(R), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(R->id()));
     ++glbAdded;
     ++glbWaysAdded;
@@ -351,7 +351,7 @@ bool DirtyListDescriber::addRoad(Way* R)
 
 bool DirtyListDescriber::addPoint(Node* Pt)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD node %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(Pt->id()));
     ++glbAdded;
     ++glbNodesAdded;
@@ -369,7 +369,7 @@ bool DirtyListDescriber::addRelation(Relation* R)
 
 bool DirtyListDescriber::updatePoint(Node* Pt)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE node %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(Pt->id()));
     ++glbUpdated;
     ++glbNodesUpdated;
@@ -387,7 +387,7 @@ bool DirtyListDescriber::updateRelation(Relation* R)
 
 bool DirtyListDescriber::updateRoad(Way* R)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE road %1").arg(R->id().numId) + userName(R), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE way %1").arg(R->id().numId) + userName(R), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(R->id()));
     ++glbUpdated;
     ++glbWaysUpdated;
@@ -396,7 +396,7 @@ bool DirtyListDescriber::updateRoad(Way* R)
 
 bool DirtyListDescriber::erasePoint(Node* Pt)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE node %1").arg(Pt->id().numId) + userName(Pt), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(Pt->id()));
     ++glbDeleted;
     ++glbNodesDeleted;
@@ -405,7 +405,7 @@ bool DirtyListDescriber::erasePoint(Node* Pt)
 
 bool DirtyListDescriber::eraseRoad(Way* R)
 {
-    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE road %1").arg(R->id().numId) + userName(R), theListWidget);
+    QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE way %1").arg(R->id().numId) + userName(R), theListWidget);
     it->setData(Qt::UserRole, QVariant::fromValue(R->id()));
     ++glbDeleted;
     ++glbWaysDeleted;
@@ -593,9 +593,9 @@ bool DirtyListExecutor::addRoad(Way *R)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("ADD road %1").arg(R->id().numId);
+    qDebug() << QString("ADD way %1").arg(R->id().numId);
 
-    Progress->setLabelText(tr("ADD road %1").arg(R->id().numId) + userName(R));
+    Progress->setLabelText(tr("ADD way %1").arg(R->id().numId) + userName(R));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     QString DataIn, DataOut;
@@ -627,9 +627,9 @@ bool DirtyListExecutor::addPoint(Node* Pt)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("ADD trackpoint %1").arg(Pt->id().numId);
+    qDebug() << QString("ADD node %1").arg(Pt->id().numId);
 
-    Progress->setLabelText(tr("ADD trackpoint %1").arg(Pt->id().numId) + userName(Pt));
+    Progress->setLabelText(tr("ADD node %1").arg(Pt->id().numId) + userName(Pt));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     QString DataIn, DataOut;
@@ -693,9 +693,9 @@ bool DirtyListExecutor::updateRoad(Way* R)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("UPDATE road %1").arg(R->id().numId);
+    qDebug() << QString("UPDATE way %1").arg(R->id().numId);
 
-    Progress->setLabelText(tr("UPDATE road %1").arg(R->id().numId) + userName(R));
+    Progress->setLabelText(tr("UPDATE way %1").arg(R->id().numId) + userName(R));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
     QString URL = theDownloader->getURLToUpdate("way",stripToOSMId(R->id()));
     QString DataIn, DataOut;
@@ -724,9 +724,9 @@ bool DirtyListExecutor::updatePoint(Node* Pt)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("UPDATE trackpoint %1").arg(Pt->id().numId);
+    qDebug() << QString("UPDATE node %1").arg(Pt->id().numId);
 
-    Progress->setLabelText(tr("UPDATE trackpoint %1").arg(Pt->id().numId) + userName(Pt));
+    Progress->setLabelText(tr("UPDATE node %1").arg(Pt->id().numId) + userName(Pt));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 //	QString URL("/api/0.3/node/%1");
 //	URL = URL.arg(stripToOSMId(Pt->id()));
@@ -757,9 +757,9 @@ bool DirtyListExecutor::erasePoint(Node *Pt)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("REMOVE trackpoint %1").arg(Pt->id().numId);
+    qDebug() << QString("REMOVE node %1").arg(Pt->id().numId);
 
-    Progress->setLabelText(tr("REMOVE trackpoint %1").arg(Pt->id().numId) + userName(Pt));
+    Progress->setLabelText(tr("REMOVE node %1").arg(Pt->id().numId) + userName(Pt));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 //	QString URL("/api/0.3/node/%1");
 //	URL = URL.arg(stripToOSMId(Pt->id()));
@@ -784,9 +784,9 @@ bool DirtyListExecutor::eraseRoad(Way *R)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("REMOVE road %1").arg(R->id().numId);
+    qDebug() << QString("REMOVE way %1").arg(R->id().numId);
 
-    Progress->setLabelText(tr("REMOVE road %1").arg(R->id().numId) + userName(R));
+    Progress->setLabelText(tr("REMOVE way %1").arg(R->id().numId) + userName(R));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 //	QString URL("/api/0.3/way/%1");
 //	URL = URL.arg(stripToOSMId(R->id()));
diff --git a/src/Sync/DirtyListExecutorOSC.cpp b/src/Sync/DirtyListExecutorOSC.cpp
index 5598d6c3..762f8aea 100644
--- a/src/Sync/DirtyListExecutorOSC.cpp
+++ b/src/Sync/DirtyListExecutorOSC.cpp
@@ -368,9 +368,9 @@ bool DirtyListExecutorOSC::addRoad(Way *F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("ADD road %1").arg(F->id().numId);
+    qDebug() << QString("ADD way %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("ADD road %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("ADD way %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscCreate(F);
@@ -383,9 +383,9 @@ bool DirtyListExecutorOSC::addPoint(Node* F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("ADD trackpoint %1").arg(F->id().numId);
+    qDebug() << QString("ADD node %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("ADD trackpoint %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("ADD node %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscCreate(F);
@@ -414,9 +414,9 @@ bool DirtyListExecutorOSC::updateRoad(Way* F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("UPDATE road %1").arg(F->id().numId);
+    qDebug() << QString("UPDATE way %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("UPDATE road %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("UPDATE way %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscModify(F);
@@ -428,9 +428,9 @@ bool DirtyListExecutorOSC::updatePoint(Node* F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("UPDATE trackpoint %1").arg(F->id().numId);
+    qDebug() << QString("UPDATE node %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("UPDATE trackpoint %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("UPDATE node %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscModify(F);
@@ -442,9 +442,9 @@ bool DirtyListExecutorOSC::erasePoint(Node *F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("REMOVE trackpoint %1").arg(F->id().numId);
+    qDebug() << QString("REMOVE node %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("REMOVE trackpoint %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("REMOVE node %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscDelete(F);
@@ -456,9 +456,9 @@ bool DirtyListExecutorOSC::eraseRoad(Way *F)
 {
     Progress->setValue(++Done);
 
-    qDebug() << QString("REMOVE road %1").arg(F->id().numId);
+    qDebug() << QString("REMOVE way %1").arg(F->id().numId);
 
-    Progress->setLabelText(tr("REMOVE road %1").arg(F->id().numId) + userName(F));
+    Progress->setLabelText(tr("REMOVE way %1").arg(F->id().numId) + userName(F));
     QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents);
 
     OscDelete(F);
diff --git a/src/common/Projection.h b/src/common/Projection.h
index e2a196de..3fa276b6 100644
--- a/src/common/Projection.h
+++ b/src/common/Projection.h
@@ -103,7 +103,7 @@ struct ProjDirs {
     /* The following are hardcoded paths, as if search paths are set, proj no longer searches the default. Can be safely removed with proj7.*/
     QString projDirMingwStd = QDir::toNativeSeparators("c:/msys64/mingw64/share/proj");       // Standard msys2 path
     QString projDirMingwTravis = QDir::toNativeSeparators("c:/tools/msys64/mingw64/share/proj"); // Travis-CI msys2 installation
-    QString projDirMingwGithub = QDir::toNativeSeparators("D:/a/_temp/msys/msys64/mingw64/share/proj"); // Github Actions msys2 installation
+    QString projDirMingwGithub = QDir::toNativeSeparators("D:/a/_temp/msys64/mingw64/share/proj"); // Github Actions msys2 installation
   public:
     const char* const dirs[5] = {
         projDirRelative.toUtf8().constData(),