[qgis] 01/01: New upstream version 2.18.14+dfsg

Bas Couwenberg sebastic at debian.org
Tue Oct 31 07:14:41 UTC 2017


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

sebastic pushed a commit to branch upstream
in repository qgis.

commit 7b6636ff00c95418cb317317d3e81866d110772f
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Oct 31 08:10:54 2017 +0100

    New upstream version 2.18.14+dfsg
---
 CMakeLists.txt                                     |   2 +-
 ChangeLog                                          | 605 +++++++++++++++++++++
 debian/changelog                                   |  10 +-
 debian/compat.in                                   |   2 +-
 debian/control.in                                  |  27 +-
 debian/mime/application/x-adobe-mif.desktop        |   8 -
 debian/mime/application/x-esri-crs.desktop         |   8 -
 debian/mime/application/x-esri-shape.desktop       |   8 -
 debian/mime/application/x-mapinfo-mif.desktop      |   9 -
 .../application/x-qgis-composer-template.desktop   |   8 -
 .../application/x-qgis-layer-definition.desktop    |   8 -
 .../mime/application/x-qgis-layer-settings.desktop |   8 -
 debian/mime/application/x-qgis-project.desktop     |   9 -
 debian/mime/application/x-raster-aig.desktop       |   8 -
 debian/mime/application/x-raster-ecw.desktop       |   8 -
 debian/mime/application/x-raster-mrsid.desktop     |   8 -
 debian/python-qgis.install.in                      |   4 +-
 debian/qgis-common.install                         |   1 -
 debian/qgis-providers.install.in                   |   4 +-
 debian/rules                                       |  11 +-
 doc/TRANSLATORS                                    |  76 +--
 i18n/qgis_de.ts                                    | 197 ++++---
 i18n/qgis_es.ts                                    | 515 ++++++++++--------
 python/core/geometry/qgsgeometry.sip               |   9 +
 python/core/qgsbrowsermodel.sip                    |   8 +-
 python/core/qgsvectordataprovider.sip              |  14 +-
 python/core/qgsvectorlayereditbuffer.sip           |  13 +
 python/gui/qgsmaptoolcapture.sip                   |   9 +
 python/gui/qgsvertexmarker.sip                     |  10 +
 .../plugins/db_manager/db_plugins/gpkg/plugin.py   |   2 +-
 .../db_manager/db_plugins/spatialite/plugin.py     |   6 +-
 python/plugins/processing/algs/gdal/gdalcalc.py    |   8 +-
 python/plugins/processing/algs/gdal/rasterize.py   |   3 +
 .../plugins/processing/algs/gdal/rasterize_over.py |   2 +
 .../algs/grass7/Grass7AlgorithmProvider.py         |   2 -
 .../processing/algs/grass7/description/nviz.txt    |   8 -
 .../algs/grass7/ext/v_build_polylines.py           |   2 +-
 .../processing/algs/grass7/ext/v_distance.py       |   2 +-
 .../plugins/processing/algs/grass7/ext/v_edit.py   |   2 +-
 .../processing/algs/grass7/ext/v_net_connect.py    |   2 +-
 .../processing/algs/grass7/ext/v_rast_stats.py     |   2 +-
 .../processing/algs/grass7/ext/v_vect_stats.py     |   2 +-
 .../processing/algs/grass7/ext/v_what_rast.py      |   2 +-
 .../processing/algs/grass7/ext/v_what_vect.py      |   2 +-
 python/plugins/processing/algs/grass7/nviz7.py     | 183 -------
 python/plugins/processing/algs/qgis/Clip.py        |   2 +-
 .../plugins/processing/algs/qgis/PointDistance.py  |  36 +-
 .../processing/algs/qgis/SelectByAttribute.py      |   1 +
 .../processing/algs/qgis/SelectByAttributeSum.py   |   2 +-
 .../processing/algs/qgis/SelectByExpression.py     |   1 +
 .../processing/algs/qgis/SelectByLocation.py       |   1 +
 .../processing/algs/qgis/ZonalStatistics.py        |   5 +-
 .../processing/algs/qgis/ui/FieldsMappingPanel.py  |   2 +-
 .../plugins/processing/algs/saga/SagaAlgorithm.py  |   9 +-
 .../processing/algs/saga/SagaNameDecorator.py      |   2 +-
 .../saga/description/AddGridValuestoPoints.txt     |   2 +-
 .../saga/description/AddGridValuestoShapes.txt     |   2 +-
 .../algs/saga/description/Distance(ViGrA).txt      |   5 -
 .../algs/saga/description/EdgeDetection(ViGrA).txt |   7 -
 .../algs/saga/description/FourierFilter(ViGrA).txt |   9 -
 .../description/FourierTransform(RealViGrA).txt    |   4 -
 .../saga/description/FourierTransform(ViGrA).txt   |   6 -
 .../description/FourierTransformInverse(ViGrA).txt |   6 -
 .../saga/description/K-MeansClusteringforGrids.txt |   2 +-
 .../description/MorphologicalFilter(ViGrA).txt     |   8 -
 .../MultipleRegressionAnalysis(GridGrids).txt      |  17 +-
 .../MultipleRegressionAnalysis(PointsGrids).txt    |  22 +-
 .../algs/saga/description/NaturalNeighbour.txt     |   2 +-
 .../saga/description/OrdinaryKriging(Global).txt   |   4 +-
 .../processing/algs/saga/description/Patching.txt  |   4 +-
 .../RandomForestPresencePrediction(ViGrA).txt      |  20 -
 .../description/RegressionAnalysis(PointsGrid).txt |  12 +-
 .../algs/saga/description/RiverGridGeneration.txt  |   6 +-
 .../algs/saga/description/Smoothing(ViGrA).txt     |   7 -
 .../saga/description/UniversalKriging(Global).txt  |   2 +-
 .../description/WatershedSegmentation(ViGrA).txt   |   7 -
 ...RegressionAnalysis(PointsandPredictorGrids).txt |   8 +-
 .../plugins/processing/gui/AlgorithmDialogBase.py  |  19 +-
 .../plugins/processing/gui/GetScriptsAndModels.py  |   3 -
 python/plugins/processing/gui/ParametersPanel.py   |  17 +-
 python/plugins/processing/tools/vector.py          |   4 +-
 src/app/qgisapp.cpp                                |  52 +-
 src/app/qgisapp.h                                  |   2 +
 src/app/qgsattributetabledialog.cpp                |  11 +-
 src/app/qgsbrowserdockwidget.cpp                   |  30 +-
 src/app/qgsbrowserdockwidget.h                     |   2 +
 src/app/qgsfieldcalculator.cpp                     |   7 +-
 src/app/qgsmaptooladdpart.cpp                      |   4 +
 src/app/qgsmaptooldeletepart.cpp                   |   6 +-
 src/app/qgsmaptooldeletering.cpp                   |   6 +-
 src/app/qgsmaptoolreshape.cpp                      |   2 +-
 src/app/qgsmaptoolsimplify.cpp                     |  21 +-
 src/auth/basic/qgsauthbasicmethod.cpp              |  19 +-
 src/auth/basic/qgsauthbasicmethod.h                |   5 +-
 src/auth/identcert/qgsauthidentcertmethod.cpp      |  24 +-
 src/auth/identcert/qgsauthidentcertmethod.h        |   5 +-
 src/auth/pkipaths/qgsauthpkipathsmethod.cpp        |  24 +-
 src/auth/pkipaths/qgsauthpkipathsmethod.h          |   6 +-
 src/auth/pkipkcs12/qgsauthpkcs12method.cpp         |  24 +-
 src/auth/pkipkcs12/qgsauthpkcs12method.h           |   5 +-
 src/core/dxf/qgsdxfexport.cpp                      |   9 +-
 src/core/geometry/qgsgeometry.cpp                  |  17 +-
 src/core/geometry/qgsgeometry.h                    |   9 +
 src/core/layertree/qgslayertreemodel.cpp           |   6 +
 src/core/qgsbrowsermodel.cpp                       |  19 +-
 src/core/qgsbrowsermodel.h                         |  17 +-
 src/core/qgsofflineediting.cpp                     |  97 ++--
 src/core/qgsofflineediting.h                       |   5 +
 src/core/qgsvectordataprovider.cpp                 |  27 +
 src/core/qgsvectordataprovider.h                   |  14 +-
 src/core/qgsvectorlayer.cpp                        |   4 +-
 src/core/qgsvectorlayereditbuffer.cpp              |  82 ++-
 src/core/qgsvectorlayereditbuffer.h                |  13 +
 src/core/qgsvectorlayereditutils.cpp               |  43 +-
 src/customwidgets/qgiscustomwidgets.cpp            |   6 +-
 src/customwidgets/qgsdockwidgetplugin.cpp          |   1 +
 src/gui/attributetable/qgsattributetablemodel.cpp  |   3 +-
 .../editorwidgets/qgsrelationreferencewidget.cpp   |  16 +
 src/gui/editorwidgets/qgsrelationreferencewidget.h |   4 +-
 src/gui/qgsmaptoolcapture.cpp                      |   7 +
 src/gui/qgsmaptoolcapture.h                        |   9 +
 src/gui/qgsrelationeditorwidget.cpp                |   1 +
 .../qgssinglebandpseudocolorrendererwidget.cpp     |   5 +
 .../ui/qgsgeometrycheckerresulttab.cpp             |   6 +-
 .../ui/qgsgeometrycheckersetuptab.cpp              |   6 +-
 src/providers/gdal/qgsgdaldataitems.cpp            |   6 +-
 src/providers/ogr/qgsogrfeatureiterator.cpp        |  33 +-
 src/providers/ogr/qgsogrprovider.cpp               |  70 ++-
 src/providers/postgres/qgspostgresconn.cpp         |  24 +-
 src/providers/postgres/qgspostgresconn.h           |  13 +-
 src/providers/postgres/qgspostgresprovider.cpp     |  15 +
 src/providers/wfs/qgswfsdataitems.cpp              |   6 +-
 src/providers/wms/qgstilecache.cpp                 |  16 +-
 src/providers/wms/qgswmscapabilities.h             |   4 +-
 tests/src/core/testqgstracer.cpp                   |   6 +-
 tests/src/gui/testqgsrelationreferencewidget.cpp   |  44 ++
 tests/src/python/test_provider_ogr.py              |  20 +-
 tests/src/python/test_provider_ogr_sqlite.py       |  16 +-
 tests/src/python/test_provider_postgres.py         |  16 +
 tests/src/python/test_qgsgeometry.py               |  11 +
 tests/src/python/test_qgsvectorlayereditbuffer.py  |  64 ++-
 .../qgis_server/wms_getfeatureinfo_filter.txt      |   1 +
 .../qgis_server/wms_getfeatureinfo_filter_or.txt   |   2 +
 .../wms_getfeatureinfo_filter_or_utf8.txt          |   2 +
 .../test_gdb.gdb/a00000001.TablesByName.atx        | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000001.gdbindexes   | Bin 0 -> 110 bytes
 tests/testdata/test_gdb.gdb/a00000001.gdbtable     | Bin 0 -> 345 bytes
 tests/testdata/test_gdb.gdb/a00000001.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a00000002.gdbtable     | Bin 0 -> 2055 bytes
 tests/testdata/test_gdb.gdb/a00000002.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a00000003.gdbindexes   | Bin 0 -> 42 bytes
 tests/testdata/test_gdb.gdb/a00000003.gdbtable     | Bin 0 -> 758 bytes
 tests/testdata/test_gdb.gdb/a00000003.gdbtablx     | Bin 0 -> 5152 bytes
 .../a00000004.CatItemsByPhysicalName.atx           | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000004.CatItemsByType.atx      | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000004.FDO_UUID.atx | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000004.gdbindexes   | Bin 0 -> 310 bytes
 tests/testdata/test_gdb.gdb/a00000004.gdbtable     | Bin 0 -> 12939 bytes
 tests/testdata/test_gdb.gdb/a00000004.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a00000004.spx          | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000005.CatItemTypesByName.atx  | Bin 0 -> 12310 bytes
 .../a00000005.CatItemTypesByParentTypeID.atx       | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000005.CatItemTypesByUUID.atx  | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000005.gdbindexes   | Bin 0 -> 296 bytes
 tests/testdata/test_gdb.gdb/a00000005.gdbtable     | Bin 0 -> 1803 bytes
 tests/testdata/test_gdb.gdb/a00000005.gdbtablx     | Bin 0 -> 5152 bytes
 .../a00000006.CatRelsByDestinationID.atx           | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000006.CatRelsByOriginID.atx   | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000006.CatRelsByType.atx       | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000006.FDO_UUID.atx | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000006.gdbindexes   | Bin 0 -> 318 bytes
 tests/testdata/test_gdb.gdb/a00000006.gdbtable     | Bin 0 -> 409 bytes
 tests/testdata/test_gdb.gdb/a00000006.gdbtablx     | Bin 0 -> 5152 bytes
 .../a00000007.CatRelTypesByBackwardLabel.atx       | Bin 0 -> 4118 bytes
 .../a00000007.CatRelTypesByDestItemTypeID.atx      | Bin 0 -> 4118 bytes
 .../a00000007.CatRelTypesByForwardLabel.atx        | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000007.CatRelTypesByName.atx   | Bin 0 -> 4118 bytes
 .../a00000007.CatRelTypesByOriginItemTypeID.atx    | Bin 0 -> 4118 bytes
 .../test_gdb.gdb/a00000007.CatRelTypesByUUID.atx   | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a00000007.gdbindexes   | Bin 0 -> 602 bytes
 tests/testdata/test_gdb.gdb/a00000007.gdbtable     | Bin 0 -> 2504 bytes
 tests/testdata/test_gdb.gdb/a00000007.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a00000009.gdbindexes   | Bin 0 -> 116 bytes
 tests/testdata/test_gdb.gdb/a00000009.gdbtable     | Bin 0 -> 833 bytes
 tests/testdata/test_gdb.gdb/a00000009.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a00000009.spx          | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a0000000a.gdbindexes   | Bin 0 -> 116 bytes
 tests/testdata/test_gdb.gdb/a0000000a.gdbtable     | Bin 0 -> 793 bytes
 tests/testdata/test_gdb.gdb/a0000000a.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a0000000a.spx          | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/a0000000b.gdbindexes   | Bin 0 -> 116 bytes
 tests/testdata/test_gdb.gdb/a0000000b.gdbtable     | Bin 0 -> 662 bytes
 tests/testdata/test_gdb.gdb/a0000000b.gdbtablx     | Bin 0 -> 5152 bytes
 tests/testdata/test_gdb.gdb/a0000000b.spx          | Bin 0 -> 4118 bytes
 tests/testdata/test_gdb.gdb/gdb                    | Bin 0 -> 4 bytes
 tests/testdata/test_gdb.gdb/timestamps             | Bin 0 -> 400 bytes
 196 files changed, 2090 insertions(+), 1063 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c6dfe97..e44104f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
 SET(CPACK_PACKAGE_VERSION_MINOR "18")
-SET(CPACK_PACKAGE_VERSION_PATCH "13")
+SET(CPACK_PACKAGE_VERSION_PATCH "14")
 SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
 SET(RELEASE_NAME "Las Palmas")
 IF (POLICY CMP0048) # in CMake 3.0.0+
diff --git a/ChangeLog b/ChangeLog
index 0b61e3f..e1bd428 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,608 @@
+Luigi Pirelli <luipir at gmail.com>	2017-10-24
+
+    reload only updated column
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-24
+
+    remove return and add else clause
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-24
+
+    Update Attr Table after field calculation: fixes #17312
+
+Merge: 2e87d32f38 6c6d837567
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-24
+
+    Merge pull request #5381 from pblottiere/bugfix_style_218
+
+    [bugfix] Fixes #17234 save/load styles from Postgres when a service file is used
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-16
+
+    Add tests
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-16
+
+    Fixes #17234 save/load styles from Postgres when a service file is used
+
+Even Rouault <even.rouault at spatialys.com>	2017-10-21
+
+    [Browser] With GDAL 2.x, fix invalid detection of OGR VRT by GDAL provider, and fix broken detection of OGR VRT (fixes #16806)
+
+Merge: 05dcb5374d 492967a83f
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-19
+
+    Merge pull request #5403 from boundlessgeo/issue_17187_backportFrom3
+
+    [bugfix] Attribute table model not updated when a feature is changed. fixes #17280 #17187
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-06-23
+
+    [bugfix] Attribute table model not updated when a feature is changed
+
+Merge: fe52c93b95 b70d9b50d6
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-19
+
+    Merge pull request #5350 from pblottiere/null_218
+
+    [bugfix] Properly update filter comboboxes of relation reference widget
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Add some tests
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Filter comboboxes are reset when the widget is initialised and foreign key is deleted
+
+Merge: 3dfe1b35ef 76d0d80289
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-17
+
+    Merge pull request #5389 from boundlessgeo/auth_fix_wms_from_browser_backport
+
+    [auth][bugfix][backported] Fix auth for WFS browser items
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-17
+
+    [auth][bugfix][backported] Fix auth for WFS browser items
+
+    Backported from master's PR 5387
+
+volaya <volayaf at gmail.com>	2017-10-16
+
+    [processing] added support for longlong type in output memory layers
+
+volaya <volayaf at gmail.com>	2017-10-16
+
+    [processing] fixed type name in refactor fields alg
+
+Merge: 364847fc8a d319e65e64
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-16
+
+    Merge pull request #5349 from pblottiere/bugfix-reshape-tool
+
+    [bugfix] Fixes #17118 Reshape tool with z support
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Fix travis build
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Clean reshape
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Add test
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-12
+
+    Update sip binding
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-10-11
+
+    [bugfix] Fixes #17118 Reshape tool with z support
+
+Werner Macho <werner.macho at gmail.com>	2017-10-13
+
+    [tr] translation update from Carlos
+
+Merge: 632192396f b6119165db
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-13
+
+    Merge pull request #5302 from boundlessgeo/issue_16803_DefaultIcon_to_avoid_segfault
+
+    set default legend raster icon when wms layer
+
+Merge: 5e097d832f 206965c72c
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-12
+
+    Merge pull request #5305 from boundlessgeo/issue_15498_waitRenederingEndToAvoidLock
+
+    for SQlite vectors wait rendering end to avoid file lock: fixes #15498
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-11
+
+    simplified stopRendering just before commitChanges
+
+Merge: 5231ef643d 79837b04f5
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-11
+
+    Merge pull request #5345 from boundlessgeo/auth_mutex_backport
+
+    Auth mutex backport
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-11
+
+    [auth] Change static members prefix from 'm' to 's' as per coding standards
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-06
+
+    [auth] Added mutex to protect cache for pkipkcs12 auth
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-06
+
+    [auth] Added mutex to protect cache for pkipaths auth
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-06
+
+    [auth] Added mutex to protect cache for identcert auth
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-06
+
+    [auth] Added mutex to protect cache for basic auth
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-06
+
+    [auth] Check for empty credentials instead of null
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-11
+
+    used independent QEventLoop instead of processEvents
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-11
+
+    more detailed comment about the scope of the fix
+
+Merge: da858ee249 5fcba063b5
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-11
+
+    Merge pull request #5290 from boundlessgeo/issue_16296_ddErrorInDbManager_2.18
+
+    [db_manager] d&d fix from spatialite and geopackage: fixes #16296
+
+Nyall Dawson <nyall.dawson at gmail.com>	2017-10-11
+
+    Fix dxf export when CRS is not canvas CRS and not limiting to canvas extent
+
+    (cherry-picked from 0b47ea8)
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-09
+
+    user std str replace instead of re module
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-09
+
+    correct recognition of GPKG during save commit
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-09
+
+    aligend to use QLatin1String to have a better portability to qgis3
+
+Matthias Kuhn <matthias at opengis.ch>	2017-10-08
+
+    Add ConvertToSubClass code to vertexmarker
+
+Larry Shaffer <lshaffer at boundlessgeo.com>	2017-10-05
+
+    Crash when multiple .zips are loaded via qgisapp function (fix #17184)
+
+    Note: not just QObject::deleteLater(); see QgsDataItem::deleteLater()
+
+Merge: e8628fb5f9 6b7cc068b1
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-06
+
+    Merge pull request #5313 from NaturalGIS/grass7_more_output_fixes
+
+    [processing] fix output command for some GRASS 7 tools
+
+Merge: 6ed0d2705d 54031ea64d
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-06
+
+    Merge pull request #5312 from alexbruy/distance-matrix
+
+    [processing] fix Standard (N x T) distance matrix (ref #17150)
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-10-06
+
+    fix output command for some GRASS7 tool
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-06
+
+    [processing] fix Standard (N x T) distance matrix (ref #17150)
+
+Matthias Kuhn <matthias at opengis.ch>	2017-10-06
+
+    [processing] Avoid python error after script execution
+
+Mario Baranzini <mario at opengis.ch>	2017-10-06
+
+    Fix QgsDockWidget custom widget
+
+Matthias Kuhn <matthias at opengis.ch>	2017-10-06
+
+    German translation fix
+
+    Fix #17225
+
+Matthias Kuhn <matthias at opengis.ch>	2017-10-05
+
+    [processing] Fix crash when browsing Get scripts and models
+
+    Fix #17165
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-05
+
+    in case SQlite vectors wait end of rendering to avoid file lock: fixes #15498
+
+Merge: 9a8c07ea0c 74728e8e07
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-05
+
+    Merge pull request #5282 from NaturalGIS/fix_grass7_v_rast_stats
+
+    [processing] fix GRASS7 v.rast.stats module
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-05
+
+    set default legend raster icon when wms layer to avoid crash
+
+Merge: f14502e441 b09fb37d0d
+Alessandro Pasotti <elpaso at itopen.it>	2017-10-04
+
+    Merge pull request #5296 from boundlessgeo/bugfix_16427_backport
+
+    [bugfix][backport] Do not cache invalid WM(T)S responses
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-10-03
+
+    [bugfix] Do not cache invalid WM(T)S responses
+
+    The problem here was that in case of http->https redirect
+    from a misconfigured server (that advertizes http and then
+    redirects all request to https) all http redirect requests
+    were cached, making all subsequent requests to the same
+    url hit the 301 Moved Permanently reponse page intead of
+    the redirected content.
+
+    Fixes #16427 WMTS rendering problems in 2.18 and Master
+
+    cherry-picked from d102404b5e6796727c0ae0c983cf016ab33ff27a
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-04
+
+    [processing] update mask computation code (fix #17161)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-03
+
+    [processing] refresh all layer selectors when layer added/removed (fix #17210)
+
+Luigi Pirelli <luipir at gmail.com>	2017-10-03
+
+    fixed mimeUri x Spatialite and Geopackage. fixes #16296
+
+Merge: 1facaefa96 fbe1736ac2
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-02
+
+    Merge pull request #5280 from NaturalGIS/saga_remove_imagery_vigra
+
+    [processing] remove SAGA imagery_vigra tools
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-10-02
+
+    fix GRASS7 v.rast.stats module
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-10-02
+
+    remove SAGA imagery_vigra tools
+
+Matthias Kuhn <matthias at opengis.ch>	2017-10-02
+
+    Avoid crashes with relation reference widget
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-02
+
+    follow up cef2f89f45
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-02
+
+    [processing] nviz is not available in GRASS 7 (fix #17145)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-10-02
+
+    [processing] remove "Select by..." algorithms from modeler (fix #17211)
+
+Werner Macho <werner.macho at gmail.com>	2017-10-01
+
+    [tr] updated spanish translation from carlos
+
+Merge: 15ed0718f3 6698c07b32
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-29
+
+    Merge pull request #5267 from NaturalGIS/more_saga_fixes
+
+    [processing] more SAGA tools fixes
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-28
+
+    german translation update
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-09-28
+
+    more SAGA tools fixes
+
+Merge: 7de9078f2f 2116a60b32
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    Merge pull request #5265 from alexbruy/fix-rasterize
+
+    [processing] fix Python error in rasterize algorithms
+
+Merge: 5e101aa05b eb9f44d44a
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    Merge pull request #5264 from NaturalGIS/fix_saga_several_tools
+
+    [procesing] fix few SAGA modules
+
+Merge: 26c61eb906 c421ae7ebf
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    Merge branch 'fix_saga_paramater' into release-2_18
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    fix indentation
+
+Merge: 26c61eb906 8025b8d49d
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    Merge branch 'fix_saga_paramater' of https://github.com/NaturalGIS/naturalgis_qgis into fix_saga_paramater
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-28
+
+    [processing] prevent Python error if input layer is not set (fix #16061)
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-09-28
+
+    fix few SAGA modules
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2017-09-28
+
+    [custom widgets] fix missing file widget
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2017-09-28
+
+    [custom widget] fix missing external resource widget
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-27
+
+    debian package: handle grass RC abis
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-27
+
+    debian packaging: depend on grass abi
+
+    (cherry picked from commit a7d1a66e5dd0dccf75d276890fd969e6c07519c9)
+
+Merge: 03a444ca45 278a88ce1c
+Larry Shaffer <dakcarto at users.noreply.github.com>	2017-09-27
+
+    Merge pull request #5223 from boundlessgeo/geom_compatibility_check_release-2_18-fix15741
+
+    On behalf of Giovanni: Geom compatibility check release 2.18 fixes #15741 #16927
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-27
+
+    [processing] improve loading help from local files (refs #17191)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-27
+
+    [processing] correctly raise exception (fix #17148)
+
+Merge: ce11ebb48b 50b663ead4
+Alessandro Pasotti <elpaso at itopen.it>	2017-09-26
+
+    Merge pull request #5260 from boundlessgeo/bugfix_16794_release_2_18
+
+    [bugfix] SingleBandPseudoColor crashes when min or max is NaN
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-09-26
+
+    [bugfix] SingleBandPseudoColor crashes when min or max is NaN
+
+    .. in styling dock
+
+    Fixes #16794
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-26
+
+    typo
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-26
+
+    updated doxigen directives
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-26
+
+    explicit 0 value in case add Z or M
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-26
+
+    more explicit documentation
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-22
+
+    fixed misleading error return code in addPart
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-22
+
+    remove unuseful message managed by pushMessage from provider
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-22
+
+    notify adaptGeometry error via pushMessage
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    better doxy description and spelling
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    Added level to message log
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    removed unuseful use of "this"
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    refrased messagelog title
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    better doxigen description
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-21
+
+    mispelling doc and explicit geometry name
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-20
+
+    added sip binding for the new adaptedGeometry protected method
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-19
+
+    cleaning + more comments
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-19
+
+    added adaptGeometry method to avoid code redundance + removed control in commitChanges
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-19
+
+    remove M if provider does not have + relative test
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-19
+
+    added test to avoid convertion from multy to single
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-18
+
+    added more unit test
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-14
+
+    flat geom (remove Z) if provider is 2D and geom is 3D + test
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-14
+
+    manage addFeatures fails (mainly due to geom compatibility check)
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-13
+
+    manage new geom compatibility check when changeGeometry
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-13
+
+    adapted test to addFeature new check geometry
+
+Luigi Pirelli <luipir at gmail.com>	2017-09-13
+
+    return geom compatibility check in addFeature and changeGeometry
+
+Merge: b2b494dd87 2c3cbcf200
+Sandro Mani <manisandro at gmail.com>	2017-09-25
+
+    Merge pull request #5251 from manisandro/orig_ocg_fid_218
+
+    [2.18][OGR] orig_ogc_fid followups
+
+Sandro Mani <manisandro at gmail.com>	2017-09-25
+
+    Update server tests for OGR orig_ogc_fid changes
+
+Sandro Mani <manisandro at gmail.com>	2017-09-25
+
+    [OGR] Use a ORIG_OGC_FID constant instead of hard-coding orig_ogc_fid
+
+Sandro Mani <manisandro at gmail.com>	2017-09-25
+
+    [OGR] Ensure orig_ogc_fid is never set as ignored field
+
+Sandro Mani <manisandro at gmail.com>	2017-09-25
+
+    [OGR] Followup: Add orig_ogc_fid as last field to avoid changing field order
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-09-25
+
+    [processing] fix wrong variable name
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-09-25
+
+    fix SAGA parameter that fixes modules with ParameterMultipleInput
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-23
+
+    fix build on trusty & xenial
+
+Merge: da22be6b96 a51ef7d068
+Sandro Mani <manisandro at gmail.com>	2017-09-21
+
+    Merge pull request #5225 from manisandro/ogr_gdb_subset218
+
+    [OGR] Add workaround for OGRSQL not recognizing the column name returned by OGR_L_GetFIDColumn
+
+Sandro Mani <manisandro at gmail.com>	2017-09-21
+
+    [OGR] Add orig_ogc_fid as last field to avoid changing field order
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-21
+
+    debian packaging: add ubuntu artful
+
+Sandro Mani <manisandro at gmail.com>	2017-09-20
+
+    [OGR] Add workaround for OGRSQL not recognizing the column name returned by OGR_L_GetFIDColumn
+
+Merge: c81adf8ff0 f8b2b13875
+Alessandro Pasotti <elpaso at itopen.it>	2017-09-20
+
+    Merge pull request #5219 from boundlessgeo/browser_shared_model_backport
+
+    [bugfix][backport] Browser shared model
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-09-20
+
+    Added optional argument to keep legacy API and behavior
+
+Alessandro Pasotti <apasotti at boundlessgeo.com>	2017-09-19
+
+    [bugfix][backport] Browser shared model
+
+    Backport of master PR 5164
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-18
+
+    dxf export: fix layer assignment (fixes #17126; followup 6292c6ae1)
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-18
+
+    debian packaging: drop mimelnk files for KDE3
+
+Juergen E. Fischer <jef at norbit.de>	2017-09-15
+
+    Release of 2.18.13
+
 Merge: c10c6aeb34 b8c6295f42
 Alexander Bruy <alexander.bruy at gmail.com>	2017-09-15
 
diff --git a/debian/changelog b/debian/changelog
index cb75902..7ffd657 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.18.13) UNRELEASED; urgency=medium
+qgis (2.18.14) UNRELEASED; urgency=medium
+
+  * Release of 2.18.14
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 27 Oct 2017 14:00:21 +0200
+
+qgis (2.18.13) unstable; urgency=medium
 
   * Release of 2.18.13
 
- -- Jürgen E. Fischer <jef at norbit.de>  Fri, 15 Sep 2017 15:08:52 +0200
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 27 Oct 2017 14:00:21 +0200
 
 qgis (2.18.12) unstable; urgency=medium
 
diff --git a/debian/compat.in b/debian/compat.in
index a4bd164..1b5bad5 100644
--- a/debian/compat.in
+++ b/debian/compat.in
@@ -1,2 +1,2 @@
-#stretch sid jessie trusty xenial yakkety zesty#9
+#stretch sid jessie trusty xenial yakkety zesty artful#9
 #jessie#8
diff --git a/debian/control.in b/debian/control.in
index 899264f..b5d1534 100644
--- a/debian/control.in
+++ b/debian/control.in
@@ -15,8 +15,8 @@ Build-Depends:
  gdal-bin,
  python-gdal,
  libgeos-dev (>= 3.0.0),
-#    jessie         trusty                     # libgsl0-dev,
-#sid        stretch        xenial yakkety zesty# libgsl-dev,
+#    jessie         trusty                            # libgsl0-dev,
+#sid        stretch        xenial yakkety zesty artful# libgsl-dev,
  libpq-dev,
  libproj-dev,
  libqt4-dev (>= 4.7.0),
@@ -24,8 +24,8 @@ Build-Depends:
  libqca2-dev,
  libqca2-plugin-ossl,
  libqtwebkit-dev,
-#    jessie stretch                            # libqwt-dev,
-#sid                trusty xenial yakkety zesty# libqwt5-qt4-dev,
+#    jessie stretch                                   # libqwt-dev,
+#sid                trusty xenial yakkety zesty artful# libqwt5-qt4-dev,
  libqjson-dev,
  libspatialite-dev,
  libsqlite3-dev,
@@ -38,8 +38,8 @@ Build-Depends:
  python-qt4-sql,
  python-yaml, python-mock,
  python-all (>= 2.6.6-3~), python-all-dev (>= 2.6.6-3~), python-pyspatialite,
-#sid        stretch        xenial yakkety zesty# python-future,
-#sid jessie stretch        xenial yakkety zesty# pyqt4.qsci-dev, python-nose2,
+#sid        stretch        xenial yakkety zesty artful# python-future,
+#sid jessie stretch        xenial yakkety zesty artful# pyqt4.qsci-dev, python-nose2,
  python-sip (>= 4.5.0),
  python-sip-dev (>= 4.5.0),
  libosgearth-dev,
@@ -55,11 +55,11 @@ Build-Depends:
  qt4-dev-tools,
  libqt4-sql-sqlite, python-psycopg2, ca-certificates
 Build-Conflicts: libqgis-dev, qgis-dev
-#sid stretch xenial yakkety zesty#Standards-Version: 3.9.7
+#sid stretch xenial yakkety zesty artful#Standards-Version: 3.9.7
 #jessie#Standards-Version: 3.9.6
 #trusty#Standards-Version: 3.8.4
 #sid stretch jessie#X-Python-Version: >= 2.7, << 2.8
-#trusty xenial yakkety zesty#XS-Python-Version: current
+#trusty xenial yakkety zesty artful#XS-Python-Version: current
 Vcs-Browser: https://github.com/qgis/QGIS/
 Vcs-Git: https://github.com/qgis/QGIS.git
 Homepage: http://qgis.org/
@@ -234,8 +234,8 @@ Depends:
  libexpat1-dev,
  libgdal-dev (>= 1.10.1-0~),
  libgeos-dev (>= 3.0.0),
-#    jessie         trusty                     # libgsl0-dev,
-#sid        stretch        xenial yakkety zesty# libgsl-dev,
+#    jessie         trusty                            # libgsl0-dev,
+#sid        stretch        xenial yakkety zesty artful# libgsl-dev,
  libpq-dev,
  libproj-dev,
  libqgis-app{QGIS_ABI} (= ${binary:Version}),
@@ -304,7 +304,8 @@ Depends:
  qgis-provider-grass (= ${binary:Version}),
  ${shlibs:Depends},
  ${misc:Depends},
- grass-core
+ grass-core,
+ grass{GRASSABI}
 Replaces: qgis-provider-grass (<< 1:2.11.0+git20151002)
 Conflicts: qgis-provider-grass (<< 1:2.11.0+git20151002)
 Description: GRASS plugin for QGIS
@@ -371,8 +372,8 @@ Depends:
  python-pyproj,
  python-six,
  python-pyspatialite,
-#sid stretch               xenial yakkety zesty# python-future,
-#sid stretch jessie        xenial yakkety zesty# python-markupsafe, python-dateutil, python-yaml, python-owslib,
+#sid stretch               xenial yakkety zesty artful# python-future,
+#sid stretch jessie        xenial yakkety zesty artful# python-markupsafe, python-dateutil, python-yaml, python-owslib,
  libqgispython{QGIS_ABI},
  ${shlibs:Depends},
  ${python:Depends},
diff --git a/debian/mime/application/x-adobe-mif.desktop b/debian/mime/application/x-adobe-mif.desktop
deleted file mode 100644
index e6a5576..0000000
--- a/debian/mime/application/x-adobe-mif.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-adobe-mif
-Hidden=false
-Comment=Adobe FrameMaker MIF file
-Patterns=*.mif;
-X-KDE-PatternsAccuracy=51
-X-KDE-IsAlso=application/x-mif
diff --git a/debian/mime/application/x-esri-crs.desktop b/debian/mime/application/x-esri-crs.desktop
deleted file mode 100644
index 7c8778d..0000000
--- a/debian/mime/application/x-esri-crs.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-esri-crs
-Hidden=false
-Comment=ESRI coordinate reference system
-Comment[de]=ESRI-Koordinatenbezugssystem
-Icon=qgis-mime
-Patterns=*.prj;
diff --git a/debian/mime/application/x-esri-shape.desktop b/debian/mime/application/x-esri-shape.desktop
deleted file mode 100644
index 9888eeb..0000000
--- a/debian/mime/application/x-esri-shape.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-esri-shape
-Hidden=false
-Comment=ESRI shape file
-Comment[de]=ESRI-Shapedatei
-Icon=qgis-mime
-Patterns=*.shp;*.shx;
diff --git a/debian/mime/application/x-mapinfo-mif.desktop b/debian/mime/application/x-mapinfo-mif.desktop
deleted file mode 100644
index 96d824d..0000000
--- a/debian/mime/application/x-mapinfo-mif.desktop
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-mapinfo-mif
-Hidden=false
-Comment=MapInfo file
-Comment[de]=MapInfo-Datei
-Patterns=*.mif;
-Icon=qgis-mime
-X-KDE-PatternsAccuracy=60
diff --git a/debian/mime/application/x-qgis-composer-template.desktop b/debian/mime/application/x-qgis-composer-template.desktop
deleted file mode 100644
index 4729983..0000000
--- a/debian/mime/application/x-qgis-composer-template.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-qgis-composer-template
-Hidden=false
-Comment=QGIS composer template
-Icon=qgis-qpt-mime
-Patterns=*.qpt;
-Name[en_US]=x-qgis-composer-template.desktop
diff --git a/debian/mime/application/x-qgis-layer-definition.desktop b/debian/mime/application/x-qgis-layer-definition.desktop
deleted file mode 100644
index bb092ca..0000000
--- a/debian/mime/application/x-qgis-layer-definition.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-qgis-layer-definition
-Hidden=false
-Comment=QGIS layer definition
-Icon=qgis-qlr-mime
-Patterns=*.qlr;
-Name[en_US]=x-qgis-layer-definition.desktop
diff --git a/debian/mime/application/x-qgis-layer-settings.desktop b/debian/mime/application/x-qgis-layer-settings.desktop
deleted file mode 100644
index 036ee72..0000000
--- a/debian/mime/application/x-qgis-layer-settings.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-qgis-layer-settings
-Hidden=false
-Comment=QGIS layer settings
-Comment[de]=QGIS Layer Einstellungen
-Icon=qgis-qml-mime
-Patterns=*.qml;
diff --git a/debian/mime/application/x-qgis-project.desktop b/debian/mime/application/x-qgis-project.desktop
deleted file mode 100644
index 77f486d..0000000
--- a/debian/mime/application/x-qgis-project.desktop
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-qgis-project
-Hidden=false
-Comment=QGIS Project
-Comment[de]=QGIS-Projekt
-Patterns=*.qgs;
-Icon=qgis-qgs-mime
-X-KDE-IsAlso=application/x-qgis
diff --git a/debian/mime/application/x-raster-aig.desktop b/debian/mime/application/x-raster-aig.desktop
deleted file mode 100644
index 888f55c..0000000
--- a/debian/mime/application/x-raster-aig.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-raster-aig
-Hidden=false
-Comment=AIG raster data
-Comment[de]=AIG-Rasterdaten
-Icon=qgis-mime
-Patterns=*.aig;
diff --git a/debian/mime/application/x-raster-ecw.desktop b/debian/mime/application/x-raster-ecw.desktop
deleted file mode 100644
index 9bea266..0000000
--- a/debian/mime/application/x-raster-ecw.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-raster-ecw
-Hidden=false
-Comment=ECW raster data
-Comment[de]=ECW-Rasterdaten
-Icon=qgis-mime
-Patterns=*.ecw;
diff --git a/debian/mime/application/x-raster-mrsid.desktop b/debian/mime/application/x-raster-mrsid.desktop
deleted file mode 100644
index 32a2afb..0000000
--- a/debian/mime/application/x-raster-mrsid.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-raster-mrsid
-Hidden=false
-Comment=MrSID raster data
-Comment[de]=MrSID-Rasterdaten
-Icon=qgis-mime
-Patterns=*.sid;
diff --git a/debian/python-qgis.install.in b/debian/python-qgis.install.in
index b5cb19d..54b9c8e 100644
--- a/debian/python-qgis.install.in
+++ b/debian/python-qgis.install.in
@@ -7,5 +7,5 @@ usr/lib/python*/*-packages/qgis/networkanalysis/*
 usr/lib/python*/*-packages/qgis/PyQt/*
 usr/lib/python*/*-packages/qgis/server/*
 usr/lib/python*/*-packages/qgis/testing/*
-#sid stretch yakkety zesty#usr/lib/python*/*-packages/PyQt4/*.so
-#sid stretch yakkety zesty#usr/lib/python*/*-packages/PyQt4/uic/widget-plugins/qtwebkit.py
+#sid stretch yakkety zesty artful#usr/lib/python*/*-packages/PyQt4/*.so
+#sid stretch yakkety zesty artful#usr/lib/python*/*-packages/PyQt4/uic/widget-plugins/qtwebkit.py
diff --git a/debian/qgis-common.install b/debian/qgis-common.install
index db7f340..f724bf9 100644
--- a/debian/qgis-common.install
+++ b/debian/qgis-common.install
@@ -19,5 +19,4 @@ usr/share/qgis/resources/spatialite.db
 usr/share/qgis/resources/themes/*
 usr/share/pixmaps/
 usr/share/mime/packages/
-usr/share/mimelnk/
 usr/share/icons/hicolor/
diff --git a/debian/qgis-providers.install.in b/debian/qgis-providers.install.in
index b0b683a..3877c1f 100644
--- a/debian/qgis-providers.install.in
+++ b/debian/qgis-providers.install.in
@@ -17,6 +17,6 @@ usr/lib/qgis/plugins/libvirtuallayerprovider.so
 usr/lib/qgis/plugins/libwcsprovider.so
 usr/lib/qgis/plugins/libwfsprovider.so
 usr/lib/qgis/plugins/libwmsprovider.so
-#sid stretch jessie trusty xenial yakkety zesty#usr/lib/qgis/plugins/libarcgismapserverprovider.so
-#sid stretch jessie trusty xenial yakkety zesty#usr/lib/qgis/plugins/libarcgisfeatureserverprovider.so
+#sid stretch jessie trusty xenial yakkety zesty artful#usr/lib/qgis/plugins/libarcgismapserverprovider.so
+#sid stretch jessie trusty xenial yakkety zesty artful#usr/lib/qgis/plugins/libarcgisfeatureserverprovider.so
 {QT_PLUGIN_DIR}/sqldrivers/libqsqlspatialite.so
diff --git a/debian/rules b/debian/rules
index 9b6c37c..f952372 100755
--- a/debian/rules
+++ b/debian/rules
@@ -34,7 +34,7 @@ ifneq (,$(findstring -oracle,$(DISTRIBUTION)))
 	WITH_ORACLE=1
 endif
 
-ifneq ($(DISTRIBUTION),$(findstring $(DISTRIBUTION),"jessie stretch trusty xenial yakkety zesty"))
+ifneq ($(DISTRIBUTION),$(findstring $(DISTRIBUTION),"jessie stretch trusty xenial yakkety zesty artful"))
 	DISTRIBUTION := sid
 endif
 
@@ -52,6 +52,7 @@ QGIS_PATCH=$(shell sed -ne 's/SET(CPACK_PACKAGE_VERSION_PATCH "\([0-9]*\)")/\1/p
 QGIS_ABI=$(QGIS_MAJOR).$(QGIS_MINOR).$(QGIS_PATCH)
 GRASS=grass$(subst .,,$(shell pkg-config --modversion grass|cut -d. -f1,2))
 GRASSVER=$(subst .,,$(shell pkg-config --modversion grass|cut -d. -f1))
+GRASSABI=$(subst .,,$(shell pkg-config --modversion grass|cut -d. -f1,2,3|sed -e 's/RC/-/'))
 
 WITH_GLOBE=$(shell dpkg --compare-versions "$$(dpkg-query -W --showformat='$${Version}' libosgearth-dev)" ge 2.7 && dpkg --compare-versions "$$(dpkg-query -W --showformat='$${Version}' libosgearth-dev)" lt 2.8 && echo 1)
 
@@ -135,7 +136,7 @@ ifneq (,$(findstring $(DISTRIBUTION),"sid stretch"))
 	CMAKE_OPTS += -DPOSTGRES_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libpq.so
 endif
 
-ifneq (,$(findstring $(DISTRIBUTION),"sid stretch yakkety zesty"))
+ifneq (,$(findstring $(DISTRIBUTION),"sid stretch yakkety zesty artful"))
 	CMAKE_OPTS += -DWITH_INTERNAL_WEBKIT_BINDINGS=TRUE
 endif
 
@@ -143,7 +144,7 @@ ifneq (,$(findstring $(DISTRIBUTION),"sid"))
 	CMAKE_OPTS += -DGEOS_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libgeos_c.so
 endif
 
-ifneq (,$(findstring $(DISTRIBUTION),"jessie stretch trusty xenial yakkety zesty sid"))
+ifneq (,$(findstring $(DISTRIBUTION),"jessie stretch trusty xenial yakkety zesty artful sid"))
 	CMAKE_OPTS += -DPYTHON_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libpython2.7.so
 endif
 
@@ -239,6 +240,7 @@ $(2): $(1)
 		-e "s/\{QGIS_ABI\}/$(QGIS_ABI)/g" \
 		-e "s/\{GRASS\}/$(GRASS)/g" \
 		-e "s/\{GRASSVER\}/$(GRASSVER)/g" \
+		-e "s/\{GRASSABI\}/$(GRASSABI)/g" \
 		-e "s/\{GRASSVER_QGISABI\}/$(GRASSVER)-$(QGIS_ABI)/g" \
 		$$^ >$$@
 
@@ -360,9 +362,6 @@ override_dh_auto_install:
 	install -o root -g root -d $(CURDIR)/debian/tmp/usr/share/mime/packages
 	install -o root -g root -m 644 $(CURDIR)/debian/qgis.xml $(CURDIR)/debian/tmp/usr/share/mime/packages
 
-	install -o root -g root -d $(CURDIR)/debian/tmp/usr/share/mimelnk/application
-	install -o root -g root -m 644 $(CURDIR)/debian/mime/application/* $(CURDIR)/debian/tmp/usr/share/mimelnk/application
-
 	# qgis binaries
 	install -o root -g root -m 755 -d $(CURDIR)/debian/qgis/usr/bin
 	install -o root -g root -m 755 $(CURDIR)/debian/tmp/usr/bin/qgis $(CURDIR)/debian/qgis/usr/bin/qgis.bin
diff --git a/doc/TRANSLATORS b/doc/TRANSLATORS
index 268700e..8c97172 100644
--- a/doc/TRANSLATORS
+++ b/doc/TRANSLATORS
@@ -1,40 +1,40 @@
 <style>table {font-size:80%;}th {text-align:left; }.bartodo{ background-color:red;width:100px;height:20px;}.bardone{ background-color:green;width:80px;height:20px;font-size:80%;text-align:center;padding-top:4px;height:16px;color:white;}</style><table><tr><th colspan="2" style="width:250px;">Language</th><th>Finished %</th><th>Translators</th></tr>
 
-<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:18331 unfinished:4 untranslated:20" class="bartodo"><div class="bardone" style="width:99px">99.9</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
-<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:17813 unfinished:215 untranslated:327" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Victor Axbom, Lars Luthman, Magnus Homann, Klas Karlsson, Isabelle J Wigren, Daniel Rosander, Anders Ekwall, Magnus Nilsson, Jonas Svensson, Christian Brinkenberg</td></tr>
-<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:17813 unfinished:211 untranslated:331" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
-<tr><td><img src="qrc:/images/flags/gl.png"></td><td>Galician</td><td><div title="finished:17812 unfinished:208 untranslated:335" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Xan Vieiro</td></tr>
-<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:17808 unfinished:215 untranslated:332" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk, Diethard Jansen, Willem Hoffmans, Dick Groskamp</td></tr>
-<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:17813 unfinished:201 untranslated:341" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Sorin Călinică, Tudor Bărăscu, Georgiana Ioanovici, Alex Bădescu, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
-<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:17813 unfinished:199 untranslated:343" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Sidney Schaberle Goveia, Arthur Nanni, Marcelo Soares Souza, Narcélio de Sá Pereira Filho, Leônidas Descovi Filho, Felipe Sodré Barros </td></tr>
-<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:17789 unfinished:207 untranslated:359" class="bartodo"><div class="bardone" style="width:97px">97.5</div></div></td><td>Arnaud Morvan, Augustin Roche, DelazJ, Didier Vanden Berghe, Dofabien, etrimaille, Jean-Roc Morreale, Jérémy Garniaux, Loïc Buscoz, Lsam, Marc-André Saia, Marie Silvestre, Mathieu Bossaert, Mathieu Lattes, Mayeul Kauffmann, Médéric Ribreux, Mehdi Semchaoui, Michael Douchin, Nicolas  [...]
-<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:17668 unfinished:217 untranslated:470" class="bartodo"><div class="bardone" style="width:96px">96.8</div></div></td><td>Almir Karabegovic</td></tr>
-<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:17509 unfinished:170 untranslated:676" class="bartodo"><div class="bardone" style="width:95px">95.9</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
-<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:17370 unfinished:138 untranslated:847" class="bartodo"><div class="bardone" style="width:95px">95.0</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
-<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:17130 unfinished:214 untranslated:1011" class="bartodo"><div class="bardone" style="width:93px">93.9</div></div></td><td>BABA Yoshihiko, Yoichi Kayama, Minoru Akagi, Takayuki Nuimura, Takayuki Mizutani, Norihiro Yamate</td></tr>
-<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:16386 unfinished:149 untranslated:1820" class="bartodo"><div class="bardone" style="width:89px">89.7</div></div></td><td>Zoltan Siki</td></tr>
-<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:16229 unfinished:101 untranslated:2025" class="bartodo"><div class="bardone" style="width:88px">88.7</div></div></td><td>Phùng Văn Doanh, Bùi Hữu Mạnh, Nguyễn Văn Thanh, Nguyễn Hữu Phúc, Cao Minh Tu</td></tr>
-<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:15943 unfinished:108 untranslated:2304" class="bartodo"><div class="bardone" style="width:87px">87.2</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
-<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:15358 unfinished:97 untranslated:2900" class="bartodo"><div class="bardone" style="width:83px">83.9</div></div></td><td>Giovanni Manghi, Joana Simões, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva, Ricardo Sena, Leandro Infantini, João Gaspar</td></tr>
-<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:15314 unfinished:160 untranslated:2881" class="bartodo"><div class="bardone" style="width:83px">83.9</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
-<tr><td><img src="qrc:/images/flags/pl.png"></td><td>Polish</td><td><div title="finished:14688 unfinished:100 untranslated:3567" class="bartodo"><div class="bardone" style="width:80px">80.3</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok, Michał Kułach, Ewelina Krawczak, Michał Smoczyk, Jakub Bobrowski</td></tr>
-<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Norwegian Bokmal</td><td><div title="finished:14525 unfinished:139 untranslated:3691" class="bartodo"><div class="bardone" style="width:79px">79.5</div></div></td><td>James Stott, Maléne Peterson</td></tr>
-<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:14493 unfinished:137 untranslated:3725" class="bartodo"><div class="bardone" style="width:79px">79.3</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
-<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese traditional</td><td><div title="finished:13975 unfinished:163 untranslated:4217" class="bartodo"><div class="bardone" style="width:76px">76.6</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
-<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:13878 unfinished:353 untranslated:4124" class="bartodo"><div class="bardone" style="width:76px">76.6</div></div></td><td>Kari Mikkonen, Matti Mäntynen</td></tr>
-<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:13964 unfinished:149 untranslated:4242" class="bartodo"><div class="bardone" style="width:76px">76.5</div></div></td><td>Roberto Angeletti, Michele Beneventi, Marco Braida, Stefano Campus, Luca Casagrande, Paolo Cavallini, Giuliano Curti, Luca Delucchi, Alessandro Fanna, Michele Ferretti, Matteo Ghetta, Anne Gishla, Maurizio Napolitano, Flavio Rigolon</td></tr>
-<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:13131 unfinished:168 untranslated:5056" class="bartodo"><div class="bardone" style="width:71px">72.0</div></div></td><td>Veiko Viil</td></tr>
-<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:12806 unfinished:148 untranslated:5401" class="bartodo"><div class="bardone" style="width:70px">70.2</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
-<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:12436 unfinished:194 untranslated:5725" class="bartodo"><div class="bardone" style="width:68px">68.3</div></div></td><td>Harish Kumar Solanki</td></tr>
-<tr><td><img src="qrc:/images/flags/bg.png"></td><td>Bulgarian</td><td><div title="finished:12336 unfinished:167 untranslated:5852" class="bartodo"><div class="bardone" style="width:67px">67.7</div></div></td><td>Захари Савов, Jordan Tzvetkov</td></tr>
-<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:11729 unfinished:185 untranslated:6441" class="bartodo"><div class="bardone" style="width:64px">64.4</div></div></td><td>OSGeo Korean Chapter</td></tr>
-<tr><td><img src="qrc:/images/flags/lt.png"></td><td>Lithuanian</td><td><div title="finished:11285 unfinished:199 untranslated:6871" class="bartodo"><div class="bardone" style="width:62px">62.0</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
-<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:10787 unfinished:159 untranslated:7409" class="bartodo"><div class="bardone" style="width:59px">59.2</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
-<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10696 unfinished:330 untranslated:7329" class="bartodo"><div class="bardone" style="width:59px">59.2</div></div></td><td>Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa</td></tr>
-<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:10702 unfinished:126 untranslated:7527" class="bartodo"><div class="bardone" style="width:58px">58.6</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
-<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9492 unfinished:188 untranslated:8675" class="bartodo"><div class="bardone" style="width:52px">52.2</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
-<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9317 unfinished:189 untranslated:8849" class="bartodo"><div class="bardone" style="width:51px">51.3</div></div></td><td>Khoem Sokhem</td></tr>
-<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:9278 unfinished:188 untranslated:8889" class="bartodo"><div class="bardone" style="width:51px">51.1</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
-<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:9151 unfinished:273 untranslated:8931" class="bartodo"><div class="bardone" style="width:50px">50.6</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
-<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:7745 unfinished:868 untranslated:9742" class="bartodo"><div class="bardone" style="width:44px">44.6</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
-<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7277 unfinished:193 untranslated:10885" class="bartodo"><div class="bardone" style="width:40px">40.2</div></div></td><td>Zoran Jankovic</td></tr></table>
+<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:18366 unfinished:0 untranslated:0" class="bartodo"><div class="bardone" style="width:100px">100.0</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
+<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:17813 unfinished:218 untranslated:335" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Victor Axbom, Lars Luthman, Magnus Homann, Klas Karlsson, Isabelle J Wigren, Daniel Rosander, Anders Ekwall, Magnus Nilsson, Jonas Svensson, Christian Brinkenberg</td></tr>
+<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:17813 unfinished:214 untranslated:339" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
+<tr><td><img src="qrc:/images/flags/gl.png"></td><td>Galician</td><td><div title="finished:17812 unfinished:211 untranslated:343" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Xan Vieiro</td></tr>
+<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:17808 unfinished:218 untranslated:340" class="bartodo"><div class="bardone" style="width:97px">97.6</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk, Diethard Jansen, Willem Hoffmans, Dick Groskamp</td></tr>
+<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:17813 unfinished:204 untranslated:349" class="bartodo"><div class="bardone" style="width:97px">97.5</div></div></td><td>Sorin Călinică, Tudor Bărăscu, Georgiana Ioanovici, Alex Bădescu, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
+<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:17813 unfinished:202 untranslated:351" class="bartodo"><div class="bardone" style="width:97px">97.5</div></div></td><td>Sidney Schaberle Goveia, Arthur Nanni, Marcelo Soares Souza, Narcélio de Sá Pereira Filho, Leônidas Descovi Filho, Felipe Sodré Barros </td></tr>
+<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:17789 unfinished:210 untranslated:367" class="bartodo"><div class="bardone" style="width:97px">97.4</div></div></td><td>Arnaud Morvan, Augustin Roche, DelazJ, Didier Vanden Berghe, Dofabien, etrimaille, Jean-Roc Morreale, Jérémy Garniaux, Loïc Buscoz, Lsam, Marc-André Saia, Marie Silvestre, Mathieu Bossaert, Mathieu Lattes, Mayeul Kauffmann, Médéric Ribreux, Mehdi Semchaoui, Michael Douchin, Nicolas  [...]
+<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:17668 unfinished:220 untranslated:478" class="bartodo"><div class="bardone" style="width:96px">96.8</div></div></td><td>Almir Karabegovic</td></tr>
+<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:17509 unfinished:173 untranslated:684" class="bartodo"><div class="bardone" style="width:95px">95.8</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
+<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:17370 unfinished:141 untranslated:855" class="bartodo"><div class="bardone" style="width:94px">95.0</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
+<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:17130 unfinished:217 untranslated:1019" class="bartodo"><div class="bardone" style="width:93px">93.9</div></div></td><td>BABA Yoshihiko, Yoichi Kayama, Minoru Akagi, Takayuki Nuimura, Takayuki Mizutani, Norihiro Yamate</td></tr>
+<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:16386 unfinished:152 untranslated:1828" class="bartodo"><div class="bardone" style="width:89px">89.6</div></div></td><td>Zoltan Siki</td></tr>
+<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:16229 unfinished:104 untranslated:2033" class="bartodo"><div class="bardone" style="width:88px">88.6</div></div></td><td>Phùng Văn Doanh, Bùi Hữu Mạnh, Nguyễn Văn Thanh, Nguyễn Hữu Phúc, Cao Minh Tu</td></tr>
+<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:15943 unfinished:111 untranslated:2312" class="bartodo"><div class="bardone" style="width:87px">87.1</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
+<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:15358 unfinished:99 untranslated:2909" class="bartodo"><div class="bardone" style="width:83px">83.9</div></div></td><td>Giovanni Manghi, Joana Simões, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva, Ricardo Sena, Leandro Infantini, João Gaspar</td></tr>
+<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:15314 unfinished:163 untranslated:2889" class="bartodo"><div class="bardone" style="width:83px">83.8</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
+<tr><td><img src="qrc:/images/flags/pl.png"></td><td>Polish</td><td><div title="finished:14688 unfinished:103 untranslated:3575" class="bartodo"><div class="bardone" style="width:80px">80.3</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok, Michał Kułach, Ewelina Krawczak, Michał Smoczyk, Jakub Bobrowski</td></tr>
+<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Norwegian Bokmal</td><td><div title="finished:14525 unfinished:142 untranslated:3699" class="bartodo"><div class="bardone" style="width:79px">79.5</div></div></td><td>James Stott, Maléne Peterson</td></tr>
+<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:14493 unfinished:140 untranslated:3733" class="bartodo"><div class="bardone" style="width:79px">79.3</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
+<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese traditional</td><td><div title="finished:13975 unfinished:166 untranslated:4225" class="bartodo"><div class="bardone" style="width:76px">76.5</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
+<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:13878 unfinished:356 untranslated:4132" class="bartodo"><div class="bardone" style="width:76px">76.5</div></div></td><td>Kari Mikkonen, Matti Mäntynen</td></tr>
+<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:13964 unfinished:151 untranslated:4251" class="bartodo"><div class="bardone" style="width:76px">76.4</div></div></td><td>Roberto Angeletti, Michele Beneventi, Marco Braida, Stefano Campus, Luca Casagrande, Paolo Cavallini, Giuliano Curti, Luca Delucchi, Alessandro Fanna, Michele Ferretti, Matteo Ghetta, Anne Gishla, Maurizio Napolitano, Flavio Rigolon</td></tr>
+<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:13131 unfinished:171 untranslated:5064" class="bartodo"><div class="bardone" style="width:71px">72.0</div></div></td><td>Veiko Viil</td></tr>
+<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:12806 unfinished:151 untranslated:5409" class="bartodo"><div class="bardone" style="width:70px">70.1</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
+<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:12436 unfinished:197 untranslated:5733" class="bartodo"><div class="bardone" style="width:68px">68.2</div></div></td><td>Harish Kumar Solanki</td></tr>
+<tr><td><img src="qrc:/images/flags/bg.png"></td><td>Bulgarian</td><td><div title="finished:12336 unfinished:169 untranslated:5861" class="bartodo"><div class="bardone" style="width:67px">67.6</div></div></td><td>Захари Савов, Jordan Tzvetkov</td></tr>
+<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:11729 unfinished:187 untranslated:6450" class="bartodo"><div class="bardone" style="width:64px">64.4</div></div></td><td>OSGeo Korean Chapter</td></tr>
+<tr><td><img src="qrc:/images/flags/lt.png"></td><td>Lithuanian</td><td><div title="finished:11285 unfinished:201 untranslated:6880" class="bartodo"><div class="bardone" style="width:61px">62.0</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
+<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:10787 unfinished:162 untranslated:7417" class="bartodo"><div class="bardone" style="width:59px">59.2</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
+<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10696 unfinished:331 untranslated:7339" class="bartodo"><div class="bardone" style="width:59px">59.1</div></div></td><td>Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa</td></tr>
+<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:10702 unfinished:129 untranslated:7535" class="bartodo"><div class="bardone" style="width:58px">58.6</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
+<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9492 unfinished:190 untranslated:8684" class="bartodo"><div class="bardone" style="width:52px">52.2</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
+<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9317 unfinished:191 untranslated:8858" class="bartodo"><div class="bardone" style="width:51px">51.2</div></div></td><td>Khoem Sokhem</td></tr>
+<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:9278 unfinished:190 untranslated:8898" class="bartodo"><div class="bardone" style="width:51px">51.0</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
+<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:9151 unfinished:276 untranslated:8939" class="bartodo"><div class="bardone" style="width:50px">50.6</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
+<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:7745 unfinished:871 untranslated:9750" class="bartodo"><div class="bardone" style="width:44px">44.5</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
+<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7277 unfinished:195 untranslated:10894" class="bartodo"><div class="bardone" style="width:40px">40.2</div></div></td><td>Zoran Jankovic</td></tr></table>
diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts
index 0af6782..6b3a545 100644
--- a/i18n/qgis_de.ts
+++ b/i18n/qgis_de.ts
@@ -4864,6 +4864,29 @@ Objektgeometriefehler: Eine oder mehrere Ausgabeobjekte mit ungültiger Geometri
     </message>
 </context>
 <context>
+    <name>ExtractByExpression</name>
+    <message>
+        <source>Extract by expression</source>
+        <translation>Nach Ausdruck extrahieren</translation>
+    </message>
+    <message>
+        <source>Vector selection tools</source>
+        <translation>Vektorauswahlwerkzeuge</translation>
+    </message>
+    <message>
+        <source>Input Layer</source>
+        <translation>Eingabelayer</translation>
+    </message>
+    <message>
+        <source>Expression</source>
+        <translation>Ausdruck</translation>
+    </message>
+    <message>
+        <source>Extracted (expression)</source>
+        <translation>Extrahiert (Ausdruck)</translation>
+    </message>
+</context>
+<context>
     <name>ExtractByLocation</name>
     <message>
         <source>Layer to select from</source>
@@ -7362,11 +7385,11 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Performs contextual image classification using sequential maximum a posteriori (SMAP) estimation.</source>
-        <translation>Führt eine kontextbezogene Bildklassifizierung mittels sequentieller Maximum-Aposterori-Schätzung (SMAP) durch</translation>
+        <translation>Führt eine kontextbezogene Bildklassifizierung mittels sequentieller Maximum-Aposterori-Schätzung (SMAP) durch.</translation>
     </message>
     <message>
         <source>Generates spectral signatures for land cover types in an image using a clustering algorithm.</source>
-        <translation>Generiert Spektralsignaturen für Bodenbedeckungstypen in eimem Bild mittels Häufungsalgorithmus</translation>
+        <translation>Generiert Spektralsignaturen für Bodenbedeckungstypen in eimem Bild mittels Häufungsalgorithmus.</translation>
     </message>
     <message>
         <source>i.eb.hsebal01.coords - Computes sensible heat flux iteration SEBAL 01. Inline coordinates</source>
@@ -7378,7 +7401,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes biomass growth, precursor of crop yield calculation.</source>
-        <translation>Berechnet Biomassenzuwachs, Vorläufer von Feldfruchtberechnungen</translation>
+        <translation>Berechnet Biomassenzuwachs, Vorläufer von Feldfruchtberechnungen.</translation>
     </message>
     <message>
         <source>Rectifies an image by computing a coordinate transformation for each pixel in the image based on the control points. </source>
@@ -7422,7 +7445,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>r.mask.rast - Creates a MASK for limiting raster operation.</source>
-        <translation>r.mask.rast - Maske (MASK) erzeugen, um Rasteroperationen zu begrenzen</translation>
+        <translation>r.mask.rast - Maske (MASK) erzeugen, um Rasteroperationen zu begrenzen.</translation>
     </message>
     <message>
         <source>i.topo.coor.ill - Creates illumination model for topographic correction of reflectance.</source>
@@ -7430,7 +7453,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Calculates dominance's diversity index on a raster map</source>
-        <translation>Berechnet Dominanzdiversitätsindex einer Rasterkarte.</translation>
+        <translation>Berechnet Dominanzdiversitätsindex einer Rasterkarte</translation>
     </message>
     <message>
         <source>r.walk.points - Creates a raster map showing the anisotropic cumulative cost of moving between different geographic locations on an input raster map whose cell category values represent cost from point vector layers.</source>
@@ -7506,7 +7529,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>r.li.simpson.ascii - Calculates Simpson's diversity index on a raster map</source>
-        <translation>Berechnet Simpsons-Diversitäts-Index einer Rasterkarte.</translation>
+        <translation>r.li.simpson.ascii - Berechnet Simpsons-Diversitäts-Index einer Rasterkarte</translation>
     </message>
     <message>
         <source>r.stats.quantile.out - Compute category quantiles using two passes and output statistics</source>
@@ -7518,7 +7541,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Calculates mean pixel attribute index on a raster map</source>
-        <translation>Berechnet den Mittelwert der Attribute (Rasterwerte) -Index einer Rasterkarte.</translation>
+        <translation>Berechnet den Mittelwert der Attribute (Rasterwerte) -Index einer Rasterkarte</translation>
     </message>
     <message>
         <source>Calculates multiple linear regression from raster maps.</source>
@@ -7538,7 +7561,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Calculates Shannon's diversity index on a raster map</source>
-        <translation>Berechnet Shannons-Diversitäts-Index einer Rasterkarte.</translation>
+        <translation>Berechnet Shannons-Diversitäts-Index einer Rasterkarte</translation>
     </message>
     <message>
         <source>r.li.edgedensity.ascii - Calculates edge density index on a raster map, using a 4 neighbour algorithm</source>
@@ -7554,15 +7577,15 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>r.li.shannon.ascii - Calculates Shannon's diversity index on a raster map</source>
-        <translation>Berechnet Shannons-Diversitäts-Index einer Rasterkarte.</translation>
+        <translation>r.li.shannon.ascii - Berechnet Shannons-Diversitäts-Index einer Rasterkarte</translation>
     </message>
     <message>
         <source>Calculates patch density index on a raster map, using a 4 neighbour algorithm</source>
-        <translation>Berechnet Patch-Anzahl-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus.</translation>
+        <translation>Berechnet Patch-Anzahl-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus</translation>
     </message>
     <message>
         <source>Calculates mean patch size index on a raster map, using a 4 neighbour algorithm</source>
-        <translation>Berechnet mitteleren Patch-Größen-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus.</translation>
+        <translation>Berechnet mitteleren Patch-Größen-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus</translation>
     </message>
     <message>
         <source>Calculates standard deviation of patch area a raster map</source>
@@ -7582,7 +7605,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Creates/modifies the color table associated with a raster map.</source>
-        <translation>Erzeugt/Ändert die einer Rasterkarte zugeordnete Farbtabelle </translation>
+        <translation>Erzeugt/ändert die einer Rasterkarte zugeordnete Farbtabelle.</translation>
     </message>
     <message>
         <source>r.li.padcv.ascii - Calculates coefficient of variation of patch area on a raster map</source>
@@ -7598,7 +7621,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>r.li.mps.ascii - Calculates mean patch size index on a raster map, using a 4 neighbour algorithm</source>
-        <translation>r.li.mps.ascii - Berechnet mitteleren Patch-Größen-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus.</translation>
+        <translation>r.li.mps.ascii - Berechnet mitteleren Patch-Größen-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus</translation>
     </message>
     <message>
         <source>Generates random surface(s) with spatial dependence.</source>
@@ -7646,7 +7669,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Calculates coefficient of variation of patch area on a raster map</source>
-        <translation>Variationskoeffizienten eines Patchbereiches einer Rasterkarte berechnen.</translation>
+        <translation>Variationskoeffizienten eines Patchbereiches einer Rasterkarte berechnen</translation>
     </message>
     <message>
         <source>Generates rate of spread raster maps.</source>
@@ -7654,7 +7677,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Calculates Simpson's diversity index on a raster map</source>
-        <translation>Berechnet Simpsons-Diversitäts-Index einer Rasterkarte.</translation>
+        <translation>Berechnet Simpsons-Diversitäts-Index einer Rasterkarte</translation>
     </message>
     <message>
         <source>Makes each output cell value an accumulation function of the values assigned to the corresponding cells in the input raster map layers.</source>
@@ -7714,7 +7737,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Locates the closest points between objects in two raster maps.</source>
-        <translation>Nächste Punkte zwischen Objekten in zwei Rasterkasten bestimmen</translation>
+        <translation>Nächste Punkte zwischen Objekten in zwei Rasterkasten bestimmen.</translation>
     </message>
     <message>
         <source>r.li.padsd.ascii - Calculates standard deviation of patch area a raster map</source>
@@ -7730,11 +7753,11 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>r.li.patchdensity.ascii - Calculates patch density index on a raster map, using a 4 neighbour algorithm</source>
-        <translation>r.li.patchdensity.ascii - Berechnet Patch-Anzahl-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus.</translation>
+        <translation>r.li.patchdensity.ascii - Berechnet Patch-Anzahl-Index einer Rasterkarte, unter Verwendung eines 4-Nachbarn-Algorithmus</translation>
     </message>
     <message>
         <source>Numerical calculation program for transient, confined and unconfined solute transport in two dimensions</source>
-        <translation>Numerisches Berechnungsprogramm für transienten, beschränkten und unbeschränkte Grundwasserfluß in zwei Dimensionen.</translation>
+        <translation>Numerisches Berechnungsprogramm für transienten, beschränkten und unbeschränkte Grundwasserfluß in zwei Dimensionen</translation>
     </message>
     <message>
         <source>Creates a latitude/longitude raster map.</source>
@@ -7742,7 +7765,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Simulates TOPMODEL which is a physically based hydrologic model.</source>
-        <translation>Simuliert TOPMODEL (physikbasiertes hydrologisches Modell)</translation>
+        <translation>Simuliert TOPMODEL (physikbasiertes hydrologisches Modell).</translation>
     </message>
     <message>
         <source>Simulates elliptically anisotropic spread.</source>
@@ -7750,7 +7773,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Drapes a color raster over an shaded relief or aspect map. </source>
-        <translation>Drapiert eine Rasterkarte mit Farbwerten über Schummerungs- oder Expositionskarte</translation>
+        <translation>Drapiert eine Rasterkarte mit Farbwerten über Schummerungs- oder Expositionskarte. </translation>
     </message>
     <message>
         <source>Exports GRASS vector map layers to DXF file format.</source>
@@ -7958,7 +7981,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes the shortest path between all pairs of nodes in the network</source>
-        <translation>Berechnet die kürzesten Pfad zwischen allen Knotenpaaren eines Netzwerkes.</translation>
+        <translation>Berechnet die kürzesten Pfad zwischen allen Knotenpaaren eines Netzwerkes</translation>
     </message>
     <message>
         <source>Computes vertex connectivity between two sets of nodes in the network.</source>
@@ -7974,7 +7997,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Performs visibility graph construction.</source>
-        <translation>Erstellt Sichtbarkeitsgraphen</translation>
+        <translation>Erstellt Sichtbarkeitsgraphen.</translation>
     </message>
     <message>
         <source>Calculate error matrix and kappa parameter for accuracy assessment of classification result.</source>
@@ -8070,7 +8093,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Sets color rules based on stddev from a raster map's mean value.</source>
-        <translation>Setzt Farbregeln basierend auf Standardabweichung des Mittelwerts eines Raster</translation>
+        <translation>Setzt Farbregeln basierend auf Standardabweichung des Mittelwerts eines Raster.</translation>
     </message>
     <message>
         <source>Generate images with textural features from a raster map.</source>
@@ -8194,7 +8217,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Import ASCII x,y[,z] coordinates as a series of lines.</source>
-        <translation>ASCII-x,y[,z]-Koordinaten als Linienreihe importieren</translation>
+        <translation>ASCII-x,y[,z]-Koordinaten als Linienreihe importieren.</translation>
     </message>
     <message>
         <source>Creates points/segments from input lines, linear reference system and positions read from stdin or a file.</source>
@@ -8214,7 +8237,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Change the type of geometry elements.</source>
-        <translation>Typ der Geometrieelemente ändern</translation>
+        <translation>Typ der Geometrieelemente ändern.</translation>
     </message>
     <message>
         <source>Finds line id and real km+offset for given points in vector map using linear reference system. </source>
@@ -8222,7 +8245,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>v.in.ascii.points - Creates a vector map from an ASCII points file.</source>
-        <translation>v.in.ascii.points - Erzeugt eine Vektorkarte aus ASCII-Punktdatei</translation>
+        <translation>v.in.ascii.points - Erzeugt eine Vektorkarte aus ASCII-Punktdatei.</translation>
     </message>
     <message>
         <source>Imports Mapgen or Matlab-ASCII vector maps into GRASS.</source>
@@ -8250,7 +8273,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Extrudes flat vector object to 3D with defined height.</source>
-        <translation>Flaches Vektorobjekt mit definierter Höhe in 3D extrudieren</translation>
+        <translation>Flaches Vektorobjekt mit definierter Höhe in 3D extrudieren.</translation>
     </message>
     <message>
         <source>v.in.ascii.standard - Creates a vector map from an ASCII vector file. </source>
@@ -8282,7 +8305,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Uploads vector values at positions of vector points to the table.</source>
-        <translation>Lade Vektorwerte an den Positionen von Vektorpunkten in die Tabelle</translation>
+        <translation>Lade Vektorwerte an den Positionen von Vektorpunkten in die Tabelle.</translation>
     </message>
     <message>
         <source>Selects vector objects from a vector layer a new layer containing only the selected objects.</source>
@@ -8354,7 +8377,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes the maximum flow between two sets of nodes in the network.</source>
-        <translation>Berechnet den maximalen Fluß zwischen zwei Knotenmengen im Netzwerk</translation>
+        <translation>Berechnet den maximalen Fluß zwischen zwei Knotenmengen im Netzwerk.</translation>
     </message>
     <message>
         <source>v.net.nodes - Creates points for each network arcs</source>
@@ -8370,11 +8393,11 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes bridges in the network.</source>
-        <translation>Berechnet Brücken im Netzwerk</translation>
+        <translation>Berechnet Brücken im Netzwerk.</translation>
     </message>
     <message>
         <source>Splits network by cost isolines.</source>
-        <translation>Schnitt durch Netzwerk entlang veranschlagten Isolinien</translation>
+        <translation>Schnitt durch Netzwerk entlang veranschlagten Isolinien.</translation>
     </message>
     <message>
         <source>Output basic information about a raster layer.</source>
@@ -8390,7 +8413,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes shortest distance via the network between the given sets of features.</source>
-        <translation>Berechnet die kürzesten Abstand zwischen zwei gegebenen Objektmengen im Netzwerk</translation>
+        <translation>Berechnet die kürzesten Abstand zwischen zwei gegebenen Objektmengen im Netzwerk.</translation>
     </message>
     <message>
         <source>v.net.arcs - Creates arcs from a file of points</source>
@@ -8402,7 +8425,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Computes strongly and weakly connected components in the network.</source>
-        <translation>Berechnet stark und schwach verbundene Komponenten eines Netzwerks</translation>
+        <translation>Berechnet stark und schwach verbundene Komponenten eines Netzwerks.</translation>
     </message>
     <message>
         <source>v.net.articulation - Computes articulation points in the network</source>
@@ -8446,7 +8469,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>Manages NULL-values of given raster map.</source>
-        <translation>NULL-Werte eine gegebenen Rasterkarte behandeln</translation>
+        <translation>NULL-Werte eine gegebenen Rasterkarte behandeln.</translation>
     </message>
     <message>
         <source>Makes each cell category value a function of the category values assigned to the cells around it</source>
@@ -8458,7 +8481,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>v.what.rast.points - Uploads raster values at positions of vector points to the table.</source>
-        <translation>v.what.rast.points - Läd Rasterwerte an gegebenen Position von Vektorpunkten in eine Tabelle</translation>
+        <translation>v.what.rast.points - Läd Rasterwerte an gegebenen Position von Vektorpunkten in eine Tabelle.</translation>
     </message>
     <message>
         <source>Generates a raster layer of distance to features in input layer.</source>
@@ -8490,7 +8513,7 @@ Bitte vor der Ausführung von GRASS-Algorithmen konfigurieren.</translation>
     </message>
     <message>
         <source>v.what.rast.centroids - Uploads raster values at positions of vector centroids to the table.</source>
-        <translation>v.what.rast.centroids - Lade Rasterwerte an den Position von Vektorzentroiden in die Tabelle</translation>
+        <translation>v.what.rast.centroids - Lade Rasterwerte an den Position von Vektorzentroiden in die Tabelle.</translation>
     </message>
     <message>
         <source>Creates a raster layer and vector point map containing randomly located points.</source>
@@ -11353,7 +11376,7 @@ Strg (Cmd) erhöht um 15 Grad.</translation>
     </message>
     <message>
         <source>Add Arc&GIS MapServer Layer...</source>
-        <translation>ArcGIS-MapServer-Layer hinzufügen...</translation>
+        <translation>Arc&GIS-MapServer-Layer hinzufügen...</translation>
     </message>
     <message>
         <source>Add ArcGIS MapServer Layer</source>
@@ -15301,7 +15324,7 @@ Fehler(%2): %3</translation>
     </message>
     <message>
         <source>Cannot convert '%1' to color</source>
-        <translation>Kann '%1:%2:%3:%4:%5' nicht in Farbe umwandeln</translation>
+        <translation>Kann '%1' nicht in Farbe umwandeln</translation>
     </message>
     <message>
         <source>Unknown color component '%1'</source>
@@ -18139,7 +18162,7 @@ Soll das Schema inkl. dieser Objekte wirklich gelöscht werden?</translation>
     </message>
     <message>
         <source>Authority Issuer Serial Number Mismatch</source>
-        <translation>Seriennummer des Autoritätsausstellers paßt nicht.</translation>
+        <translation>Seriennummer des Autoritätsausstellers paßt nicht</translation>
     </message>
     <message>
         <source>No Peer Certificate</source>
@@ -18211,7 +18234,7 @@ Soll das Schema inkl. dieser Objekte wirklich gelöscht werden?</translation>
     </message>
     <message>
         <source>DISABLED. Resources authenticating via the system can not be accessed</source>
-        <translation>DEAKTIVIERT. Über das System autorisierte Resourcen sind nicht zugreifbar.</translation>
+        <translation>DEAKTIVIERT. Über das System autorisierte Resourcen sind nicht zugreifbar</translation>
     </message>
     <message>
         <source>Master password already set</source>
@@ -18437,7 +18460,7 @@ Nur verfügbar wenn der Layer klassifiziert dargestellt wird.</translation>
     </message>
     <message>
         <source>This use of unary operator not implemented yet</source>
-        <translation>Diese Verwendung eines unären Operators ist noch nicht implementiert.</translation>
+        <translation>Diese Verwendung eines unären Operators ist noch nicht implementiert</translation>
     </message>
     <message>
         <source>Unary operator %1 not implemented yet</source>
@@ -18505,11 +18528,11 @@ Nur verfügbar wenn der Layer klassifiziert dargestellt wird.</translation>
     </message>
     <message>
         <source>%1: Argument %2 must be numeric literal</source>
-        <translation>%1: Argument %1 muss eine Zahl sein</translation>
+        <translation>%1: Argument %2 muss eine Zahl sein</translation>
     </message>
     <message>
         <source>%1 Argument %2 must be numeric literal</source>
-        <translation>%1 Argument %1 muß nummerisch sein</translation>
+        <translation>%1 Argument %2 muß nummerisch sein</translation>
     </message>
     <message>
         <source>Function %1 should have 1 argument</source>
@@ -18842,7 +18865,7 @@ Fehler: %2</translation>
     </message>
     <message>
         <source>Could not add header record %1 [%2]</source>
-        <translation>Konnte Kopfdatensatz %1 nicht hinzufügen %1 [%2]</translation>
+        <translation>Konnte Kopfdatensatz %1 nicht hinzufügen [%2]</translation>
     </message>
     <message>
         <source>dotted linetypes - dot ignored</source>
@@ -19497,7 +19520,7 @@ Bitte nehmen Sie Kontakt zu den Entwicklern auf.</translation>
     </message>
     <message>
         <source>Cannot create new layer.</source>
-        <translation>Kann  neuen Layer nicht erzeugen</translation>
+        <translation>Kann  neuen Layer nicht erzeugen.</translation>
     </message>
     <message>
         <source>Cannot copy style</source>
@@ -20499,6 +20522,10 @@ Aktuelles letztes Änderungsdateum ist: %2</translation>
         <source>http://qgis.org/en/site/about/sponsorship.html</source>
         <translation>http://qgis.org/de/site/about/sponsorship.html</translation>
     </message>
+    <message>
+        <source>Merge features</source>
+        <translation>Objekte verschmelzen</translation>
+    </message>
 </context>
 <context>
     <name>QgisAppInterface</name>
@@ -22595,7 +22622,7 @@ Ausdruckfehler:
     </message>
     <message>
         <source>Serial #</source>
-        <translation>Seriennr.</translation>
+        <translation>Seriennr. #</translation>
     </message>
     <message>
         <source>Expiry Date</source>
@@ -22901,7 +22928,7 @@ Operation kann nicht zurückgenommen werden!</translation>
     </message>
     <message>
         <source>Serial #</source>
-        <translation>Seriennr.</translation>
+        <translation>Seriennr. #</translation>
     </message>
     <message>
         <source>Not valid before</source>
@@ -23310,7 +23337,7 @@ Operation kann nicht zurückgenommen werden!</translation>
     </message>
     <message>
         <source>Serial #</source>
-        <translation>Seriennr.</translation>
+        <translation>Seriennr. #</translation>
     </message>
     <message>
         <source>Expiry Date</source>
@@ -24242,7 +24269,7 @@ Operation kann nicht zurückgenommen werden!</translation>
     </message>
     <message>
         <source>Serial #</source>
-        <translation>Seriennr. </translation>
+        <translation>Seriennr. #</translation>
     </message>
     <message>
         <source>Expiry Date</source>
@@ -35773,7 +35800,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a specific component from a color string, eg the red component or alpha component.</source>
-        <translation>Gibt eine bestimmte Komponente einer Farbzeichnekette zurück, z.B. rote oder Alpha-Komponente</translation>
+        <translation>Gibt eine bestimmte Komponente einer Farbzeichnekette zurück, z.B. rote oder Alpha-Komponente.</translation>
     </message>
     <message>
         <source>color_part</source>
@@ -37030,7 +37057,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Creates a line geometry from a series of point geometries.</source>
-        <translation>Erzeugt eine Liniengeometrie aus  einer Reihe von Punktgeometrien</translation>
+        <translation>Erzeugt eine Liniengeometrie aus  einer Reihe von Punktgeometrien.</translation>
     </message>
     <message>
         <source>make_line</source>
@@ -37054,7 +37081,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Creates a point geometry from an x and y (and optional z and m) value.</source>
-        <translation>Erzeugt eine Punktgeometrie aus einem X- und Y-Wert und ggf. Z- und M-Wert)</translation>
+        <translation>Erzeugt eine Punktgeometrie aus einem X- und Y-Wert und ggf. Z- und M-Wert).</translation>
     </message>
     <message>
         <source>make_point</source>
@@ -37298,7 +37325,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Returns the all aggregated strings from a field or expression joined by a delimiter.</source>
-        <translation>Liefert alle durch ein Trennzeichen verbundene aggregierten Zeichenketten eines Felds oder Ausdruck</translation>
+        <translation>Liefert alle durch ein Trennzeichen verbundene aggregierten Zeichenketten eines Felds oder Ausdruck.</translation>
     </message>
     <message>
         <source>concatenate</source>
@@ -37394,7 +37421,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Returns the calculated inter quartile range from a field or expression.</source>
-        <translation>Liefert den berechneten Interquartilebereich eines Felds oder Ausdrucks</translation>
+        <translation>Liefert den berechneten Interquartilebereich eines Felds oder Ausdrucks.</translation>
     </message>
     <message>
         <source>iqr</source>
@@ -37570,7 +37597,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>closed line geometry for polygon's outer ring</source>
-        <translation>Geschlossene Liniengeometrie des äußeren Rings des Polygons.</translation>
+        <translation>Geschlossene Liniengeometrie des äußeren Rings des Polygons</translation>
     </message>
     <message>
         <source>optional closed line geometry for inner ring</source>
@@ -37610,7 +37637,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Returns the maximum length of strings from a field or expression.</source>
-        <translation>Liefert die maximale Zeichenkettenlängen eines Felds oder Ausdrucks</translation>
+        <translation>Liefert die maximale Zeichenkettenlängen eines Felds oder Ausdrucks.</translation>
     </message>
     <message>
         <source>max_length</source>
@@ -37654,7 +37681,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Returns the aggregate median value from a field or expression.</source>
-        <translation>Liefert den aggegierten Medianwert aus einem Feld oder Ausdruck</translation>
+        <translation>Liefert den aggregierten Medianwert aus einem Feld oder Ausdruck.</translation>
     </message>
     <message>
         <source>median</source>
@@ -38634,7 +38661,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Reverses the direction of a line string by reversing the order of its vertices.</source>
-        <translation>Kehrt die Richtung einer Linien durch die Umkehrung der Stützpunktreihenfolge um</translation>
+        <translation>Kehrt die Richtung einer Linien durch die Umkehrung der Stützpunktreihenfolge um.</translation>
     </message>
     <message>
         <source>reverse</source>
@@ -38862,7 +38889,7 @@ valign="top"><td>dddd</td><td>der lange lokale Wo
     </message>
     <message>
         <source>Sets a specific color component for a color string, eg the red component or alpha component.</source>
-        <translation>Setzt eine bestimmte Komponente einer Farbzeichenkette, z.B. rote oder Alpha-Komponente</translation>
+        <translation>Setzt eine bestimmte Komponente einer Farbzeichenkette, z.B. rote oder Alpha-Komponente.</translation>
     </message>
     <message>
         <source>set_color_part</source>
@@ -40527,6 +40554,11 @@ Name des Skripts ändern und speichern, um QGIS das automatische Laden beim Star
         <translation>
 Der Ausdruck ist ungültig (siehe (mehr Information) für Näheres)</translation>
     </message>
+    <message>
+        <source>Can not change geometry for feature: %1</source>
+        <comment>Field calculator</comment>
+        <translation>Kann Geometrie des Objekts nicht ändern: %1</translation>
+    </message>
 </context>
 <context>
     <name>QgsFieldCalculatorBase</name>
@@ -42749,6 +42781,14 @@ Bitte wählen Sie eine gültige Datei.</translation>
         <source><b>Building spatial index...</b></source>
         <translation><b>Räumlicher Index wird aufgebaut...</b></translation>
     </message>
+    <message>
+        <source>Populate output Layer</source>
+        <translation>Ausgabelayer füllen</translation>
+    </message>
+    <message>
+        <source>Can not add features to output layer: %1.</source>
+        <translation>Konnte Objekte nicht zum Ausgabelayer hinzufügen: %1.</translation>
+    </message>
 </context>
 <context>
     <name>QgsGeometryContainedCheck</name>
@@ -48069,7 +48109,7 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.</
     </message>
     <message>
         <source>Labels are placed in an equal radius circle around point features.</source>
-        <translation>Beschriftungen werden auf einem Kreis um das Punktobjekt plaziert</translation>
+        <translation>Beschriftungen werden auf einem Kreis um das Punktobjekt plaziert.</translation>
     </message>
     <message>
         <source>Labels are placed at a fixed offset from the point.</source>
@@ -49383,6 +49423,10 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.</
         <source>Selected geometry could not be found</source>
         <translation>Die gewählte Geometrie wurde nicht gefunden</translation>
     </message>
+    <message>
+        <source>Update geometry error</source>
+        <translation>Geometrieaktualisierungsfehler</translation>
+    </message>
 </context>
 <context>
     <name>QgsMapToolAddRing</name>
@@ -52400,6 +52444,10 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein
         <source>Will drop Z and M values from layer %1 in offline copy.</source>
         <translation>In der Offline-Kopie werden Z- und M-Werte des Layers %1 weggelassen.</translation>
     </message>
+    <message>
+        <source>Syncronization failed</source>
+        <translation>Synchronisation gescheitert</translation>
+    </message>
 </context>
 <context>
     <name>QgsOfflineEditingPlugin</name>
@@ -53211,7 +53259,7 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein
     </message>
     <message>
         <source>The text you entered is not a valid scale.</source>
-        <translation>Der eingegebene Text ist kein gültiger Maßstab</translation>
+        <translation>Der eingegebene Text ist kein gültiger Maßstab.</translation>
     </message>
     <message>
         <source>Off</source>
@@ -53954,11 +54002,11 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein
     </message>
     <message>
         <source>Automatically enable 'on the fly' reprojection if layers ha&ve different CRS</source>
-        <translation>Spontanreprojektion (SRP) automatisch aktivieren, wenn die Layer unterschiedliche KBS haben</translation>
+        <translation>Spontanreprojektion (SRP) automatisch akti&vieren, wenn die Layer unterschiedliche KBS haben</translation>
     </message>
     <message>
         <source>O&verride system locale</source>
-        <translation>System-Locale überschreiben</translation>
+        <translation>System-Locale überschreiben (&v)</translation>
     </message>
     <message>
         <source><b>Note:</b> Enabling / changing override on local requires an application restart</source>
@@ -53974,7 +54022,7 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein
     </message>
     <message>
         <source>Use pro&xy for web access</source>
-        <translation>Proxy für Webzugriff benutzen</translation>
+        <translation>Proxy für Webzugriff benutzen (&x)</translation>
     </message>
     <message>
         <source>Remove selected URL</source>
@@ -54102,7 +54150,7 @@ Immer Netzwerk: immer aus dem Netzwerk laden und nicht prüfen, ob im Cache ein
     </message>
     <message>
         <source>Search radius for identifying features and displaying map tips</source>
-        <translation>Suchradius für die Objektidentifikation und zur Maptippanzeige</translation>
+        <translation>Suchradius für die Objektidentifikation und zur Anzeige von Kartenhinweisen</translation>
     </message>
     <message>
         <source>Measure tool</source>
@@ -57976,7 +58024,7 @@ Fortfahren?</translation>
     </message>
     <message>
         <source>The text you entered is not a valid scale.</source>
-        <translation>Der eingegebene Text ist kein gültiger Maßstab</translation>
+        <translation>Der eingegebene Text ist kein gültiger Maßstab.</translation>
     </message>
 </context>
 <context>
@@ -58421,7 +58469,7 @@ Fortfahren?</translation>
     </message>
     <message>
         <source>A name used to identify the root layer. The short name is a text string used for machine-to-machine communication.</source>
-        <translation>Name zur Identifikation des Wurzellayers. Der Kurzname ist eine Zeichenkette, die für die Kommunikation zwischen Maschinen verwendet wird</translation>
+        <translation>Name zur Identifikation des Wurzellayers. Der Kurzname ist eine Zeichenkette, die für die Kommunikation zwischen Maschinen verwendet wird.</translation>
     </message>
     <message>
         <source>GetFeatureInfo geometry precision (decimal places)</source>
@@ -58445,7 +58493,7 @@ Fortfahren?</translation>
     </message>
     <message>
         <source>Last revision date</source>
-        <translation>Letztes Bearbeitungsdatum:</translation>
+        <translation>Letztes Bearbeitungsdatum</translation>
     </message>
     <message>
         <source>Scenario 1 - INSPIRE related fields using referenced external service metadata</source>
@@ -60056,7 +60104,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>A name used to identify the layer. The short name is a text string used for machine-to-machine communication.</source>
-        <translation>Name zur Identifikation des Layers. Der Kurzname ist eine Zeichenkette, die für die Kommunikation zwischen Maschinen verwendet wird</translation>
+        <translation>Name zur Identifikation des Layers. Der Kurzname ist eine Zeichenkette, die für die Kommunikation zwischen Maschinen verwendet wird.</translation>
     </message>
     <message>
         <source>Embedded widgets in legend</source>
@@ -65439,6 +65487,11 @@ Fehler war:%2</translation>
         <source>Curved Geometries</source>
         <translation>Kurvengeometrien</translation>
     </message>
+    <message>
+        <source>Geometry type %1 not compatible with provider type %2.</source>
+        <comment>not compatible geometry</comment>
+        <translation>Geometrietyp %1 ist nicht kompatibel mit dem Datenanbietertyp %2.</translation>
+    </message>
 </context>
 <context>
     <name>QgsVectorFieldSymbolLayerWidget</name>
@@ -65844,7 +65897,7 @@ Datenanbieterfehler:</translation>
     <message numerus="yes">
         <source>ERROR: %n feature(s) not added - geometry type is not compatible with the current layer.</source>
         <comment>not added features count</comment>
-        <translation>
+        <translation type="obsolete">
             <numerusform>FEHLER: Ein Objekt nicht hinzugefügt - Geometrietyp paßt nicht zum aktuellen Layer.</numerusform>
             <numerusform>FEHLER: %n Objekte nicht hinzugefügt - Geometrietyp paßt nicht zum aktuellen Layer.</numerusform>
         </translation>
@@ -66025,7 +66078,7 @@ Datenanbieterfehler:</translation>
     </message>
     <message>
         <source>Map tip display text</source>
-        <translation>Map-Tippanzeigetext</translation>
+        <translation>Text für Kartenhinweise</translation>
     </message>
     <message>
         <source>Memory cache</source>
@@ -66364,7 +66417,7 @@ Datenanbieterfehler:</translation>
     </message>
     <message>
         <source>The file already exists</source>
-        <translation>Die Datei ist bereits vorhanden.</translation>
+        <translation>Die Datei ist bereits vorhanden</translation>
     </message>
     <message>
         <source>Do you want to overwrite the existing file?</source>
diff --git a/i18n/qgis_es.ts b/i18n/qgis_es.ts
index 9328348..9ce6d20 100644
--- a/i18n/qgis_es.ts
+++ b/i18n/qgis_es.ts
@@ -10500,7 +10500,7 @@ Por favor, configúrela antes de ejecutar algoritmos de GRASS.</translation>
     <message>
         <location filename="../python/plugins/processing/processing-i18n.cpp" line="455"/>
         <source>Fills no-data areas in raster maps using spline interpolation.</source>
-        <translation type="unfinished"></translation>
+        <translation>Rellena áreas sin datos de mapas ráster usando interpolación spline.</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/processing-i18n.cpp" line="464"/>
@@ -13362,12 +13362,12 @@ Por favor, configúrela antes de ejecutar algoritmos de LAStools.</translation>
     <message>
         <location filename="../src/ui/qgisapp.ui" line="2440"/>
         <source>Add Circular String</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir cadena circular</translation>
     </message>
     <message>
         <location filename="../src/ui/qgisapp.ui" line="2455"/>
         <source>Add Circular String by Radius</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir cadena circular por radio</translation>
     </message>
     <message>
         <location filename="../src/ui/qgisapp.ui" line="2487"/>
@@ -23125,7 +23125,7 @@ Operation can NOT be undone!
     <message>
         <location filename="../src/core/qgsproject.cpp" line="92"/>
         <source>Entry token invalid : '%1'. The token will not be saved to file.</source>
-        <translation type="unfinished"></translation>
+        <translation>Delimitador de entrada no válido: '%1'. El delimitador no se guardará en el archivo.</translation>
     </message>
     <message>
         <location filename="../src/gui/editorwidgets/qgshiddenwidgetfactory.cpp" line="33"/>
@@ -42178,12 +42178,12 @@ Error del analizador:
     <message>
         <location filename="../src/gui/attributetable/qgsdualview.cpp" line="594"/>
         <source>Defined sort order in attribute table</source>
-        <translation type="unfinished"></translation>
+        <translation>Criterio de ordenación definido en tabla de atributos</translation>
     </message>
     <message>
         <location filename="../src/gui/attributetable/qgsdualview.cpp" line="613"/>
         <source>Sort ascending</source>
-        <translation type="unfinished"></translation>
+        <translation>Ordenar ascendente</translation>
     </message>
     <message>
         <location filename="../src/gui/attributetable/qgsdualview.cpp" line="732"/>
@@ -43170,7 +43170,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>CASE</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>This group contains functions for manipulating colors</source>
@@ -43550,7 +43550,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns the area of a geometry polygon object. Calculations are always planimetric in the Spatial Reference System (SRS) of this geometry, and the units of the returned area will match the units for the SRS. This differs from the calculations performed by the $area function, which will perform ellipsoidal calculations based on the project's ellipsoid and area unit settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve el área de un objeto de geometría de tipo polígono. Los cálculos siempre son planimétricos en el Sistema de Rerefencia Espacial (SRE) de esta geometría y las unidades del área devuelta coincidirán con las unidades del SRE. Esto difiere de los cálculos hechos por la función $area, que hará cálculos elipsoidales basados en el elipsoide del proyecto y la configuración de las unidades de superficie.</translation>
     </message>
     <message>
         <source>area</source>
@@ -43662,7 +43662,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>degrees( azimuth( make_point(25, 45), make_point(75, 100) ) )</source>
-        <translation type="unfinished">degrees( azimuth( make_point(75, 100), make_point(25,45) ) ) {25, 45)?} {75, 100)?}</translation>
+        <translation>degrees( azimuth( make_point(25, 45), make_point(75, 100) ) )</translation>
     </message>
     <message>
         <source>42.273689</source>
@@ -44242,7 +44242,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>a integer number corresponding to the darkening factor:<ul><li>if the factor is greater than 100, this functions returns a darker color (for e.g., setting factor to 300 returns a color that has one-third the brightness);</li><li>if the factor is less than 100, the return color is lighter, but using the lighter() function for this purpose is recommended;</li><li>if the factor is 0 or negative, the return value is unspecified.</li>& [...]
-        <translation type="unfinished"></translation>
+        <translation>un número entero que corresponde al factor de oscurecimiento:<ul><li>Si el factor es mayor de 100, esta función devuelve un color más oscuro (por ej., establecer el factor a 300 devuelve un color que tiene un tercio de brillo);</li><li>Si el factor es menor que 100, el color devuelto es más claro, pero se recomienda usar la función lighter() para este propósito;</li><li>Si el factor es 0 o negativo, el valor devuelto es inespecífic [...]
     </message>
     <message>
         <source>darker('200,10,30',300)</source>
@@ -44418,11 +44418,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Evaluates an expression which is passed in a string. Useful to expand dynamic parameters passed as context variables or fields.</source>
-        <translation type="unfinished"></translation>
+        <translation>Evalúa una expresión que es pasada en una cadena. Útil para expandir parámetros dinámicos pasados como variables de contexto o campos.</translation>
     </message>
     <message>
         <source>eval</source>
-        <translation type="unfinished"></translation>
+        <translation>eval</translation>
     </message>
     <message>
         <source>an expression string</source>
@@ -44466,7 +44466,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a line string representing the exterior ring of a polygon geometry. If the geometry is not a polygon then the result will be null.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve una cadena de línea que representa el anillo exterior de una geometría de tipo polígono. Si la geometría no es un polígono entonces el resultado será nulo.</translation>
     </message>
     <message>
         <source>exterior_ring</source>
@@ -44474,7 +44474,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>a polygon geometry</source>
-        <translation type="unfinished"></translation>
+        <translation>una geometría de polígono</translation>
     </message>
     <message>
         <source>geom_to_wkt(exterior_ring(geom_from_wkt('POLYGON((-1 -1, 4 0, 4 2, 0 2, -1 -1),( 0.1 0.1, 0.1 0.2, 0.2 0.2, 0.2, 0.1, 0.1 0.1))')))</source>
@@ -44706,7 +44706,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a specific geometry from a geometry collection, or null if the input geometry is not a collection.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve una geometría específica a partir de una colección de geometrías o nulo si la geometría de entrada no es una colección.</translation>
     </message>
     <message>
         <source>geometry_n</source>
@@ -44714,11 +44714,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>geometry collection</source>
-        <translation type="unfinished"></translation>
+        <translation>colección de geometrías</translation>
     </message>
     <message>
         <source>index of geometry to return, where 1 is the first geometry in the collection</source>
-        <translation type="unfinished"></translation>
+        <translation>índice de la geometría a devolver, donde 1 es la primera geometría de la colección</translation>
     </message>
     <message>
         <source>geom_to_wkt(geometry_n(geom_from_wkt('GEOMETRYCOLLECTION(POINT(0 1), POINT(0 0), POINT(1 0), POINT(1 1))'),3))</source>
@@ -44726,7 +44726,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>'Point (1 0)'</source>
-        <translation type="unfinished">'Point (4 0)' {1 0)?}</translation>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Returns the first feature of a layer matching a given attribute value.</source>
@@ -44858,7 +44858,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a specific interior ring from a polygon geometry, or null if the geometry is not a polygon.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve un anillo interior específico de una geometría de tipo polígono o nulo si la geometría no es un polígono.</translation>
     </message>
     <message>
         <source>interior_ring_n</source>
@@ -44866,11 +44866,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>polygon geometry</source>
-        <translation type="unfinished"></translation>
+        <translation>geometría de tipo polígono</translation>
     </message>
     <message>
         <source>index of interior to return, where 1 is the first interior ring</source>
-        <translation type="unfinished"></translation>
+        <translation>índice del interior a devolver, donde 1 es el primer anillo interior</translation>
     </message>
     <message>
         <source>geom_to_wkt(interior_ring_n(geom_from_wkt('POLYGON((-1 -1, 4 0, 4 2, 0 2, -1 -1),(-0.1 -0.1, 0.4 0, 0.4 0.2, 0 0.2, -0.1 -0.1),(-1 -1, 4 0, 4 2, 0 2, -1 -1))'),1))</source>
@@ -44930,7 +44930,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns true if a line string is closed (start and end points are coincident), or false if a line string is not closed. If the geometry is not a line string then the result will be null.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve verdadero si una cadena de línea está cerrada (los puntos de inicio y final coinciden) o falso si la cadena de línea no está cerrada. Si la geometría no es una cadena de línea entonces el resultado será nulo.</translation>
     </message>
     <message>
         <source>is_closed</source>
@@ -45034,7 +45034,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Calculate the length of a geometry line object. Calculations are always planimetric in the Spatial Reference System (SRS) of this geometry, and the units of the returned length will match the units for the SRS. This differs from the calculations performed by the $length function, which will perform ellipsoidal calculations based on the project's ellipsoid and distance unit settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Calcula la longitud de un objeto de geometría lineal. Los cálculos siempre son planimétricos en el Sistema de Rerefencia Espacial (SRE) de esta geometría y las unidades de la longitud devuelta coincidirán con las unidades del SRE. Esto difiere de los cálculos hechos por la función $lenght, que hará cálculos elipsoidales basados en el elipsoide del proyecto y la configuración de las unidades de longitud.</translation>
     </message>
     <message>
         <source>line geometry object</source>
@@ -45070,15 +45070,15 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a lighter (or darker) color string</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve una cadena de color más clara (o más oscura)</translation>
     </message>
     <message>
         <source>lighter</source>
-        <translation type="unfinished"></translation>
+        <translation>más claro</translation>
     </message>
     <message>
         <source>a integer number corresponding to the lightening factor:<ul><li>if the factor is greater than 100, this functions returns a lighter color (for e.g., setting factor to 150 returns a color that is 50% brighter);</li><li>if the factor is less than 100, the return color is darker, but using the darker() function for this purpose is recommended;</li><li>if the factor is 0 or negative, the return value is unspecified.</li></ul></source>
-        <translation type="unfinished"></translation>
+        <translation>un número entero que corresponde al factor de aclarado:<ul><li>Si el factor es mayor de 100, esta función devuelve un color más claro (por ej., establecer el factor a 150 devuelve un color que es un 50% más brillante);</li><li>Si el factor es menor que 100, el color devuelto es más oscuro, pero se recomienda usar la función darker() para este propósito;</li><li>Si el factor es 0 o negativo, el valor devuelto es inespecífico.</li [...]
     </message>
     <message>
         <source>lighter('200,10,30',200)</source>
@@ -45086,7 +45086,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>'255,158,168,255'</source>
-        <translation type="unfinished">'2.12' {255,158,168,255'?}</translation>
+        <translation>'255,158,168,255'</translation>
     </message>
     <message>
         <source>Returns the natural logarithm of a value.</source>
@@ -45222,7 +45222,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns the m value of a point geometry.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve el valor m de una geometría de punto.</translation>
     </message>
     <message>
         <source>m</source>
@@ -45234,7 +45234,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Creates a line geometry from a series of point geometries.</source>
-        <translation type="unfinished"></translation>
+        <translation>Crea una geometría de línea a partir de una serie de geometrías de puntos.</translation>
     </message>
     <message>
         <source>make_line</source>
@@ -45258,7 +45258,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Creates a point geometry from an x and y (and optional z and m) value.</source>
-        <translation type="unfinished"></translation>
+        <translation>Crea una geometría de punto a partir de unos valores de X e Y (y opcionalmente Z).</translation>
     </message>
     <message>
         <source>make_point</source>
@@ -45282,7 +45282,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns the current scale denominator of the map canvas.<br><br>Note: This function is only available in some contexts and will be 0 otherwise.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve el denominador de la escala actual de la vista del mapa.<br><br>Nota: esta función solo está disponible en algunos contextos y en otros casos será 0.</translation>
     </message>
     <message>
         <source>majority</source>
@@ -45306,7 +45306,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>geom_to_wkt(make_point(2,4,6))</source>
-        <translation type="unfinished">geom_to_wkt(make_point(2,4)) {2,4,6)?}</translation>
+        <translation>geom_to_wkt(make_point(2,4,6))</translation>
     </message>
     <message>
         <source>'PointZ (2 4 6)'</source>
@@ -45314,7 +45314,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>geom_to_wkt(make_point(2,4,6,8))</source>
-        <translation type="unfinished">geom_to_wkt(make_point(2,4)) {2,4,6,8)?}</translation>
+        <translation>geom_to_wkt(make_point(2,4,6,8))</translation>
     </message>
     <message>
         <source>'PointZM (2 4 6 8)'</source>
@@ -45970,7 +45970,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns the perimeter of a geometry polygon object. Calculations are always planimetric in the Spatial Reference System (SRS) of this geometry, and the units of the returned perimeter will match the units for the SRS. This differs from the calculations performed by the $perimeter function, which will perform ellipsoidal calculations based on the project's ellipsoid and distance unit settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve el perímetro de un objeto de geometría de tipo polígono. Los cálculos siempre son planimétricos en el Sistema de Rerefencia Espacial (SRE) de esta geometría y las unidades del perímetro devuelto coincidirán con las unidades del SRE. Esto difiere de los cálculos hechos por la función $perimeter, que hará cálculos elipsoidales basados en el elipsoide del proyecto y la configuración de las unidades de distancia.</translation>
     </message>
     <message>
         <source>perimeter</source>
@@ -46582,7 +46582,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns the shortest line joining geometry 1 to geometry 2. The resultant line will start at geometry 1 and end at geometry 2.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve la línea más corta que une la geometría 1 con la geometría 2. La línea resultante empezará en la geometría 1 y terminará en la geometría 2.</translation>
     </message>
     <message>
         <source>shortest_line</source>
@@ -46590,11 +46590,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>geometry to find shortest line from</source>
-        <translation type="unfinished"></translation>
+        <translation>geometría desde la que encontrar la línea más corta</translation>
     </message>
     <message>
         <source>geometry to find shortest line to</source>
-        <translation type="unfinished"></translation>
+        <translation>geometría hasta la que encontrar la línea más corta</translation>
     </message>
     <message>
         <source>geom_to_wkt(shortest_line(geom_from_wkt('LINESTRING (20 80, 98 190, 110 180, 50 75 )'),geom_from_wkt('POINT(100 100)')))</source>
@@ -46674,7 +46674,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Return the first matching position of a substring within another string, or 0 if the substring is not found.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve la primera posición coincidente de una subcadena dentro de otra cadena o 0 si no se encuentra la subcadena.</translation>
     </message>
     <message>
         <source>strpos</source>
@@ -46958,7 +46958,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Returns a translated version of a geometry. Calculations are in the Spatial Reference System of this geometry.</source>
-        <translation type="unfinished"></translation>
+        <translation>Devuelve una versión convertida de una geometría. Los cálculos se hacen en el Sistema de Referencia Espacial de la geometría.</translation>
     </message>
     <message>
         <source>translate</source>
@@ -46978,7 +46978,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>a geometry of the same type like the original one</source>
-        <translation type="unfinished"></translation>
+        <translation>una geometría del mismo tipo que la original</translation>
     </message>
     <message>
         <source>Removes all leading and trailing whitespace (spaces, tabs, etc) from a string.</source>
@@ -47143,7 +47143,7 @@ de Qt. Cada UUID tiene 38 caracteres de longitud.</translation>
     </message>
     <message>
         <source>'UNIVERSITY OF<br>QGIS'</source>
-        <translation type="unfinished"></translation>
+        <translation>'UNIVERSIDAD DE<br>QGIS'</translation>
     </message>
     <message>
         <source>wordwrap('UNIVERSITY OF QGIS',-3)</source>
@@ -47151,7 +47151,7 @@ de Qt. Cada UUID tiene 38 caracteres de longitud.</translation>
     </message>
     <message>
         <source>'UNIVERSITY<br>OF QGIS'</source>
-        <translation type="unfinished"></translation>
+        <translation>'UNIVERSIDAD<br>DE QGIS'</translation>
     </message>
     <message>
         <source>Returns the x coordinate of a point geometry, or the x-coordinate of the centroid for a non-point geometry.</source>
@@ -52988,17 +52988,17 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="../src/plugins/globe/qgsglobevectorlayerproperties.cpp" line="56"/>
         <source>Sample the terrain under the point, and set the feature's Z to the terrain height, ignoring the feature's original Z value</source>
-        <translation type="unfinished"></translation>
+        <translation>Muestrear el terreno bajo el punto y establecer la Z del objeto a la altura del terreno, ignorando el valor Z original del objeto</translation>
     </message>
     <message>
         <location filename="../src/plugins/globe/qgsglobevectorlayerproperties.cpp" line="57"/>
         <source>Sample the terrain under the point, and add the terrain height to the feature's original Z value</source>
-        <translation type="unfinished"></translation>
+        <translation>Muestrear el terreno bajo el punto y añadir la altura del terreno al valor Z original del objeto</translation>
     </message>
     <message>
         <location filename="../src/plugins/globe/qgsglobevectorlayerproperties.cpp" line="58"/>
         <source>The feature's Z value describes its height above "height zero", which is typically the ellipsoid or MSL</source>
-        <translation type="unfinished"></translation>
+        <translation>El valor Z del objeto describe su altura sobre la "altura cero", que es típicamente el elipsoide o MSL</translation>
     </message>
     <message>
         <location filename="../src/plugins/globe/qgsglobevectorlayerproperties.cpp" line="61"/>
@@ -53078,12 +53078,12 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="../src/plugins/globe/qgsglobewidget.cpp" line="45"/>
         <source>Sync extent</source>
-        <translation type="unfinished"></translation>
+        <translation>Sincronizar extensión</translation>
     </message>
     <message>
         <location filename="../src/plugins/globe/qgsglobewidget.cpp" line="52"/>
         <source>Reload scene</source>
-        <translation type="unfinished"></translation>
+        <translation>Recargar escena</translation>
     </message>
     <message>
         <location filename="../src/plugins/globe/qgsglobewidget.cpp" line="59"/>
@@ -58555,9 +58555,9 @@ Puede haber un problema en su conexión a la red o en el servidor WMS.</numerusf
         <location filename="../src/app/qgsrulebasedlabelingwidget.cpp" line="687"/>
         <source>Filter returned %n feature(s)</source>
         <comment>number of filtered features</comment>
-        <translation type="unfinished">
-            <numerusform>Filter returned %n feature(s)</numerusform>
-            <numerusform>Filter returned %n feature(s)</numerusform>
+        <translation>
+            <numerusform>El filtro devolvió un objeto</numerusform>
+            <numerusform>El filtro devolvió %n objetos</numerusform>
         </translation>
     </message>
 </context>
@@ -59043,12 +59043,12 @@ Puede haber un problema en su conexión a la red o en el servidor WMS.</numerusf
     <message>
         <location filename="../src/gui/qgsmapcanvastracer.cpp" line="84"/>
         <source>Tracing may not work correctly. Please check topology of the input layers.</source>
-        <translation type="unfinished"></translation>
+        <translation>Es posible que el trazado no funcione correctamente. Por favor, compruebe la topología de las capas de entrada.</translation>
     </message>
     <message>
         <location filename="../src/gui/qgsmapcanvastracer.cpp" line="90"/>
         <source>Tracing</source>
-        <translation type="unfinished"></translation>
+        <translation>Trazado</translation>
     </message>
 </context>
 <context>
@@ -64120,7 +64120,7 @@ Siempre red: siempre cargar desde la red y no chequear si el caché tiene una en
     <message>
         <location filename="../src/app/qgsoptions.cpp" line="615"/>
         <source>Visvalingam</source>
-        <translation type="unfinished"></translation>
+        <translation>Visvalingam</translation>
     </message>
     <message>
         <location filename="../src/app/qgsoptions.cpp" line="634"/>
@@ -65155,7 +65155,7 @@ Siempre red: siempre cargar desde la red y no chequear si el caché tiene una en
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="2924"/>
         <source>Open layer styling dock</source>
-        <translation type="unfinished"></translation>
+        <translation>Abrir panel de estilo de capas</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="3172"/>
@@ -65270,7 +65270,7 @@ Siempre red: siempre cargar desde la red y no chequear si el caché tiene una en
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="4939"/>
         <source>Max retry in case of tile or feature request errors</source>
-        <translation type="unfinished"></translation>
+        <translation>Intentos máximos en caso de error de solicitud de tesela u objeto</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="5029"/>
@@ -65280,12 +65280,12 @@ Siempre red: siempre cargar desde la red y no chequear si el caché tiene una en
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="5177"/>
         <source>Remove selected URL</source>
-        <translation type="unfinished"></translation>
+        <translation>Eliminar la URL seleccionada</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="5191"/>
         <source>Add URL to exclude</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir URL a excluir</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoptionsbase.ui" line="5255"/>
@@ -65955,7 +65955,7 @@ Faltan algunos objetos de la plantilla de la IU:</translation>
     <message>
         <location filename="../src/providers/oracle/qgsoracleconn.cpp" line="129"/>
         <source>Could not switch to workspace %1 [%2]</source>
-        <translation type="unfinished"></translation>
+        <translation>No se pudo cambiar al entorno de trabajo %1 [%2]</translation>
     </message>
     <message>
         <location filename="../src/providers/oracle/qgsoracleconn.cpp" line="198"/>
@@ -66237,12 +66237,12 @@ error: %2</translation>
     <message>
         <location filename="../src/ui/qgsoraclenewconnectionbase.ui" line="248"/>
         <source>Workspace</source>
-        <translation type="unfinished"></translation>
+        <translation>Entorno de trabajo</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoraclenewconnectionbase.ui" line="264"/>
         <source>Include additional geometry attributes</source>
-        <translation type="unfinished"></translation>
+        <translation>Incluir atributos de geometría adicionales</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsoraclenewconnectionbase.ui" line="114"/>
@@ -66672,7 +66672,7 @@ SQL: %2</translation>
     <message>
         <location filename="../src/providers/oracle/qgsoracleprovider.cpp" line="1642"/>
         <source>Invalid attribute index: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Índice de atributo no válido: %1</translation>
     </message>
     <message>
         <location filename="../src/providers/oracle/qgsoracleprovider.cpp" line="1648"/>
@@ -66682,12 +66682,12 @@ SQL: %2</translation>
     <message>
         <location filename="../src/providers/oracle/qgsoracleprovider.cpp" line="1677"/>
         <source>Renaming column %1 to %2 failed</source>
-        <translation type="unfinished"></translation>
+        <translation>Falló el cambio de nombre de la columna %1 a %2</translation>
     </message>
     <message>
         <location filename="../src/providers/oracle/qgsoracleprovider.cpp" line="1691"/>
         <source>Oracle error while renaming attributes: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Error de Oracle al cambiar el nombre de los atributos: %1</translation>
     </message>
     <message>
         <location filename="../src/providers/oracle/qgsoracleprovider.cpp" line="1807"/>
@@ -67175,12 +67175,12 @@ Error: %2</translation>
     <message>
         <location filename="../src/gui/qgsorderbydialog.cpp" line="123"/>
         <source>NULLs last</source>
-        <translation type="unfinished"></translation>
+        <translation>NULOS al final</translation>
     </message>
     <message>
         <location filename="../src/gui/qgsorderbydialog.cpp" line="124"/>
         <source>NULLs first</source>
-        <translation type="unfinished"></translation>
+        <translation>NULOS primero</translation>
     </message>
 </context>
 <context>
@@ -67188,12 +67188,12 @@ Error: %2</translation>
     <message>
         <location filename="../src/gui/attributetable/qgsorganizetablecolumnsdialog.cpp" line="64"/>
         <source>[Action Widget]</source>
-        <translation type="unfinished"></translation>
+        <translation>[Control de acción]</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsorganizetablecolumnsdialog.ui" line="14"/>
         <source>Organize table columns</source>
-        <translation type="unfinished"></translation>
+        <translation>Organizar columnas de la tabla</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsorganizetablecolumnsdialog.ui" line="30"/>
@@ -67203,7 +67203,7 @@ Error: %2</translation>
     <message>
         <location filename="../src/ui/qgsorganizetablecolumnsdialog.ui" line="47"/>
         <source>Unselect all</source>
-        <translation type="unfinished"></translation>
+        <translation>Deseleccionar todo</translation>
     </message>
 </context>
 <context>
@@ -67650,12 +67650,12 @@ Error: %2</translation>
     <message>
         <location filename="../src/providers/postgres/qgspgnewconnection.cpp" line="39"/>
         <source>verify-ca</source>
-        <translation type="unfinished"></translation>
+        <translation>verificar-ca</translation>
     </message>
     <message>
         <location filename="../src/providers/postgres/qgspgnewconnection.cpp" line="40"/>
         <source>verify-full</source>
-        <translation type="unfinished"></translation>
+        <translation>verificar-completo</translation>
     </message>
     <message>
         <location filename="../src/providers/postgres/qgspgnewconnection.cpp" line="43"/>
@@ -68735,12 +68735,12 @@ Es necesario reiniciar QGIS para recargarlo.</translation>
     <message>
         <location filename="../src/app/pluginmanager/qgspluginmanager.cpp" line="778"/>
         <source>This plugin is trusted</source>
-        <translation type="unfinished"></translation>
+        <translation>Este complemento es de confianza</translation>
     </message>
     <message>
         <location filename="../src/app/pluginmanager/qgspluginmanager.cpp" line="813"/>
         <source>Average rating %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Valoración media %1</translation>
     </message>
     <message>
         <location filename="../src/app/pluginmanager/qgspluginmanager.cpp" line="842"/>
@@ -68755,7 +68755,7 @@ Es necesario reiniciar QGIS para recargarlo.</translation>
     <message>
         <location filename="../src/app/pluginmanager/qgspluginmanager.cpp" line="857"/>
         <source>bug_tracker</source>
-        <translation type="unfinished"></translation>
+        <translation>seguimiento_de_errores</translation>
     </message>
     <message>
         <location filename="../src/app/pluginmanager/qgspluginmanager.cpp" line="861"/>
@@ -68995,17 +68995,17 @@ Es necesario reiniciar QGIS para recargarlo.</translation>
     <message>
         <location filename="../src/ui/qgspluginmanagerbase.ui" line="420"/>
         <source>Vote!</source>
-        <translation type="unfinished"></translation>
+        <translation>¡Vote!</translation>
     </message>
     <message>
         <location filename="../src/ui/qgspluginmanagerbase.ui" line="427"/>
         <source>Your Vote</source>
-        <translation type="unfinished"></translation>
+        <translation>Su voto</translation>
     </message>
     <message>
         <location filename="../src/ui/qgspluginmanagerbase.ui" line="434"/>
         <source>Current vote</source>
-        <translation type="unfinished"></translation>
+        <translation>Voto actual</translation>
     </message>
     <message>
         <location filename="../src/ui/qgspluginmanagerbase.ui" line="454"/>
@@ -69429,7 +69429,7 @@ El mensaje de error de la base de datos fue:
     <message>
         <location filename="../src/providers/postgres/qgspostgresconn.cpp" line="838"/>
         <source>No PostGIS support in the database.</source>
-        <translation type="unfinished"></translation>
+        <translation>Sin soporte para PostGIS en la base de datos.</translation>
     </message>
     <message>
         <location filename="../src/providers/postgres/qgspostgresconn.cpp" line="853"/>
@@ -69789,7 +69789,7 @@ SQL: %2</translation>
     <message>
         <location filename="../src/providers/postgres/qgspostgresprovider.cpp" line="2315"/>
         <source>Invalid attribute index: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Índice de atributo no válido: %1</translation>
     </message>
     <message>
         <location filename="../src/providers/postgres/qgspostgresprovider.cpp" line="2321"/>
@@ -69799,7 +69799,7 @@ SQL: %2</translation>
     <message>
         <location filename="../src/providers/postgres/qgspostgresprovider.cpp" line="2350"/>
         <source>PostGIS error while renaming attributes: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Error de PostGIS al cambiar el nombre de los atributos: %1</translation>
     </message>
     <message>
         <location filename="../src/providers/postgres/qgspostgresprovider.cpp" line="2462"/>
@@ -70593,7 +70593,7 @@ Proceed?</source>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2495"/>
         <source>When enabled, layers from the same database connection will be put into a transaction group. Their edit state will be synchronized and changes to these layers will be sent to the provider immediately. Only supported on postgres provider.</source>
-        <translation type="unfinished"></translation>
+        <translation>Cuando está habilitado, las capas de la misma conexión a la base de datos se pondrán en un grupo de transacción. Su estado de edición se sincronizará y los cambios a estas capas se enviarán el proveedor de forma inmediata. Solo soportado en el proveedor de PostGres.</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2498"/>
@@ -70603,12 +70603,12 @@ Proceed?</source>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2505"/>
         <source>When enabled, default values will be evaluated as early as possible. This will fill default values in the add feature form already and not only create them on commit. Only supported for postgres provider.</source>
-        <translation type="unfinished"></translation>
+        <translation>Cuando está habilitado, los valores predeterminados se evaluarán tan pronto como sea posible. Esto ya rellenará los valores predeterminados en el formulario para añadir objetos y no solo los creará al acometer. Solo soportado para proveedor PostGres.</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2508"/>
         <source>Evaluate default values on provider side</source>
-        <translation type="unfinished"></translation>
+        <translation>Evaluar valores predeterminados de lado del proveedor</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2519"/>
@@ -70933,7 +70933,7 @@ Proceed?</source>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="775"/>
         <source>Enable 'on the fly' CRS transformation (OTF)</source>
-        <translation type="unfinished"></translation>
+        <translation>Habilitar transformación del SRC 'al vuelo' (OTF)</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="865"/>
@@ -71055,22 +71055,22 @@ Proceed?</source>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2146"/>
         <source>application/vnd.iso.19139+xml</source>
-        <translation type="unfinished"></translation>
+        <translation>application/vnd.iso.19139+xml</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2151"/>
         <source>application/vnd.ogc.csw.GetRecordByIdResponse_xml</source>
-        <translation type="unfinished"></translation>
+        <translation>application/vnd.ogc.csw.GetRecordByIdResponse_xml</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2156"/>
         <source>application/vnd.ogc.csw_xml</source>
-        <translation type="unfinished"></translation>
+        <translation>application/vnd.ogc.csw_xml</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2164"/>
         <source>URL mime/type</source>
-        <translation type="unfinished"></translation>
+        <translation>Mime/tipo de URL</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsprojectpropertiesbase.ui" line="2186"/>
@@ -73072,7 +73072,11 @@ Pulse el botón de ayuda para obtener opciones de creación válidas para este f
 p, li { white-space: pre-wrap; }
 </style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;">
 <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:11pt;"><br /></span></p></body></html></source>
-        <translation type="unfinished"></translation>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:11pt;"><br /></span></p></body></html></translation>
     </message>
     <message>
         <location filename="../src/ui/qgsrasterlayerpropertiesbase.ui" line="1795"/>
@@ -73088,7 +73092,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="../src/ui/qgsrasterlayerpropertiesbase.ui" line="2137"/>
         <source>Embedded widgets in legend</source>
-        <translation type="unfinished"></translation>
+        <translation>Controles incrustados en la leyenda</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsrasterlayerpropertiesbase.ui" line="1358"/>
@@ -74704,7 +74708,7 @@ desviación estándar ×</translation>
     <message>
         <location filename="../src/ui/qgsrendererrasterpropswidgetbase.ui" line="407"/>
         <source>Oversampling</source>
-        <translation type="unfinished">Sobremuestreo</translation>
+        <translation>Sobremuestreo</translation>
     </message>
 </context>
 <context>
@@ -74782,9 +74786,9 @@ desviación estándar ×</translation>
         <location filename="../src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp" line="780"/>
         <source>Filter returned %n feature(s)</source>
         <comment>number of filtered features</comment>
-        <translation type="unfinished">
-            <numerusform>Filter returned %n feature(s)</numerusform>
-            <numerusform>Filter returned %n feature(s)</numerusform>
+        <translation>
+            <numerusform>El filtro devolvió un objeto</numerusform>
+            <numerusform>El filtro devolvió %n objetos</numerusform>
         </translation>
     </message>
 </context>
@@ -75147,12 +75151,12 @@ desviación estándar ×</translation>
     <message>
         <location filename="../src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp" line="259"/>
         <source>Add categories to rules</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir categorías a reglas</translation>
     </message>
     <message>
         <location filename="../src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp" line="269"/>
         <source>Add ranges to rules</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir intervalos a reglas</translation>
     </message>
     <message>
         <location filename="../src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp" line="285"/>
@@ -75361,7 +75365,7 @@ desviación estándar ×</translation>
     <message>
         <location filename="../src/gui/qgssqlcomposerdialog.cpp" line="217"/>
         <source>An error occurred during evaluation of the SQL statement</source>
-        <translation type="unfinished"></translation>
+        <translation>Ocurrió un error al evaluar la sentencia SQL</translation>
     </message>
     <message>
         <location filename="../src/gui/qgssqlcomposerdialog.cpp" line="218"/>
@@ -75371,14 +75375,16 @@ desviación estándar ×</translation>
     <message>
         <location filename="../src/gui/qgssqlcomposerdialog.cpp" line="223"/>
         <source>SQL warning</source>
-        <translation type="unfinished"></translation>
+        <translation>Advertencia de SQL</translation>
     </message>
     <message>
         <location filename="../src/gui/qgssqlcomposerdialog.cpp" line="780"/>
         <source>This is the SQL query editor. The SQL statement can select data from several tables, 
 but it must compulsory include the main typename%1 in the selected tables, 
 and only the geometry column of the main typename can be used as the geometry column of the resulting layer.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este es el editor de consultas SQL. La sentencia SQL puede seleccionar datos de
+varias tablas, pero debe incluir de forma obligatoria el typename%1 principal en las
+tablas seleccionadas y solo se puede usar como columna de geometría de la capa resultante la columna de geometría del typename principal.</translation>
     </message>
 </context>
 <context>
@@ -75423,7 +75429,7 @@ and only the geometry column of the main typename can be used as the geometry co
     <message>
         <location filename="../src/ui/qgssqlcomposerdialogbase.ui" line="128"/>
         <source>ON condition</source>
-        <translation type="unfinished"></translation>
+        <translation>Condición EN</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssqlcomposerdialogbase.ui" line="177"/>
@@ -75496,7 +75502,7 @@ and only the geometry column of the main typename can be used as the geometry co
     <message>
         <location filename="../src/core/qgssqlstatement.cpp" line="240"/>
         <source>Table %1 is referenced by column %2, but not selected in FROM / JOIN.</source>
-        <translation type="unfinished"></translation>
+        <translation>La tabla %1 está referida por la columna %2, pero no está seleccionada en FROM / JOIN.</translation>
     </message>
     <message>
         <location filename="../src/core/qgssqlstatement.cpp" line="461"/>
@@ -75608,7 +75614,7 @@ and only the geometry column of the main typename can be used as the geometry co
     <message>
         <location filename="../src/gui/qgsscalerangewidget.cpp" line="28"/>
         <source>Minimum (exclusive)</source>
-        <translation type="unfinished"></translation>
+        <translation>Mínimo (exclusivo)</translation>
     </message>
     <message>
         <location filename="../src/gui/qgsscalerangewidget.cpp" line="31"/>
@@ -75618,7 +75624,7 @@ and only the geometry column of the main typename can be used as the geometry co
     <message>
         <location filename="../src/gui/qgsscalerangewidget.cpp" line="33"/>
         <source>Maximum (inclusive)</source>
-        <translation type="unfinished"></translation>
+        <translation>Máximo (inclusivo)</translation>
     </message>
     <message>
         <location filename="../src/gui/qgsscalerangewidget.cpp" line="36"/>
@@ -75818,7 +75824,7 @@ and only the geometry column of the main typename can be used as the geometry co
     <message>
         <location filename="../src/app/qgsselectbyformdialog.cpp" line="43"/>
         <source>Select features by value</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar objetos por valor</translation>
     </message>
 </context>
 <context>
@@ -76145,22 +76151,22 @@ contraste</translation>
     <message>
         <location filename="../src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp" line="862"/>
         <source>Value <=</source>
-        <translation type="unfinished"></translation>
+        <translation>Valor <=</translation>
     </message>
     <message>
         <location filename="../src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp" line="863"/>
         <source>Maximum value for class</source>
-        <translation type="unfinished"></translation>
+        <translation>Valor máximo para clase</translation>
     </message>
     <message>
         <location filename="../src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp" line="866"/>
         <source>Value =</source>
-        <translation type="unfinished"></translation>
+        <translation>Valor =</translation>
     </message>
     <message>
         <location filename="../src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp" line="867"/>
         <source>Value for color</source>
-        <translation type="unfinished"></translation>
+        <translation>Valor para color</translation>
     </message>
 </context>
 <context>
@@ -76209,7 +76215,7 @@ origin:</source>
     <message>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="212"/>
         <source>Clip out of range values</source>
-        <translation type="unfinished"></translation>
+        <translation>Corte fuera de valores del intervalo</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="300"/>
@@ -76220,7 +76226,8 @@ origin:</source>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="325"/>
         <source>Label unit
 suffix</source>
-        <translation type="unfinished"></translation>
+        <translation>Unidad de etiqueta
+sufijo</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="53"/>
@@ -76241,7 +76248,7 @@ suffix</source>
     <message>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="318"/>
         <source>Unit suffix</source>
-        <translation type="unfinished"></translation>
+        <translation>Sufijo de unidad</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui" line="37"/>
@@ -76518,7 +76525,7 @@ suffix</source>
     <message>
         <location filename="../src/ui/qgssnappingdialogbase.ui" line="41"/>
         <source>All visible layers</source>
-        <translation type="unfinished"></translation>
+        <translation>Todas las capas visibles</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssnappingdialogbase.ui" line="196"/>
@@ -76627,12 +76634,12 @@ suffix</source>
         <location filename="../src/ui/qgssourceselectdialogbase.ui" line="124"/>
         <location filename="../src/ui/qgssourceselectdialogbase.ui" line="127"/>
         <source>Display WFS FeatureTypes containing this word in the title, name or abstract</source>
-        <translation type="unfinished">Mostrar WFS FeatureTypes que contengan esta palabra en el título, nombre o resumen</translation>
+        <translation>Mostrar WFS FeatureTypes que contengan esta palabra en el título, nombre o resumen</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssourceselectdialogbase.ui" line="155"/>
         <source>Use title for layer name</source>
-        <translation type="unfinished">Usar título para el nombre de la capa</translation>
+        <translation>Usar título para el nombre de la capa</translation>
     </message>
     <message>
         <location filename="../src/ui/qgssourceselectdialogbase.ui" line="162"/>
@@ -76665,7 +76672,7 @@ suffix</source>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="64"/>
         <source>&Build query</source>
-        <translation type="unfinished">&Construir consulta</translation>
+        <translation>&Construir consulta</translation>
     </message>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="225"/>
@@ -76675,7 +76682,7 @@ suffix</source>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="237"/>
         <source>Modify %1 connection</source>
-        <translation type="unfinished"></translation>
+        <translation>Modificar conexión %1</translation>
     </message>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="248"/>
@@ -76695,7 +76702,7 @@ suffix</source>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="295"/>
         <source>The query returned no layers.</source>
-        <translation type="unfinished"></translation>
+        <translation>La consulta no devolvió ninguna capa.</translation>
     </message>
     <message>
         <location filename="../src/gui/qgssourceselectdialog.cpp" line="424"/>
@@ -76892,7 +76899,7 @@ SQL: %1</translation>
     <message>
         <location filename="../src/providers/spatialite/qgsspatialitesourceselect.cpp" line="51"/>
         <source>Add SpatiaLite Layer(s)</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir capa(s) SpatialLite</translation>
     </message>
     <message>
         <location filename="../src/providers/spatialite/qgsspatialitesourceselect.cpp" line="56"/>
@@ -77557,7 +77564,11 @@ del resultado</translation>
 p, li { white-space: pre-wrap; }
 </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
 <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></source>
-        <translation type="unfinished"></translation>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
     </message>
 </context>
 <context>
@@ -77695,7 +77706,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="../src/app/qgsstatusbarscalewidget.cpp" line="54"/>
         <source>Lock the scale to use magnifier to zoom in or out.</source>
-        <translation type="unfinished"></translation>
+        <translation>Bloquear la escala para usar la lupa para acercar o alejar el zoom.</translation>
     </message>
 </context>
 <context>
@@ -78881,7 +78892,7 @@ Hubo un problema con su base de datos de símbolos.</translation>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="146"/>
         <source>Sometimes you have a very large dataset which takes ages to draw. If you are going to be performing several actions (e.g. modifying symbology options) and wish to temporarily disable map rendering while you do so, you can uncheck the 'Render' checkbox in the bottom right of the status bar. Don't forget to check it on again when you are ready to have the map draw itself again!</source>
-        <translation type="unfinished"></translation>
+        <translation>A veces se tiene un conjunto de datos muy grande que lleva horas dibujar. Si va a realizar varias acciones (ej.: modificar opcones de simbología) y quiere desactivar temporalmente el renderizado del mapa mientras lo hace, puede desmarcar la casilla "Representar" abajo a la derecha de la barra de estado. ¡No olvide volver a marcarla cuando quiera que se vuelva a dibujar el mapa!</translation>
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="194"/>
@@ -78906,12 +78917,12 @@ Hubo un problema con su base de datos de símbolos.</translation>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="210"/>
         <source>Right click with the identify tool to show a context menu from which you can choose the layer in which to identify a feature. A sub-menu will list features identified and a third sub-menu will show the action link setup for the layer. If one of this sub-menu doesn't contain any information, the next sub-menu will appear instead. For example, if you have just one layer, and click somewhere with several features, the first menu will list the features instead of layer l [...]
-        <translation type="unfinished"></translation>
+        <translation>Clic derecho con la herramienta de identificación para mostrar un menú contextual en el que puede elegir la capa en la que identificar un objeto espacial. Un submenú listará los objetos identificados y un tercer submenú mostrará la configuración de enlace a acciones de la capa. Si alguno de estos submenús no contiene información aparecerá el siguiente submenú en su lugar. Por ejemplo, si solo tiene una capa y hace clic en algún lugar con varios objetos espaciales, el [...]
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="220"/>
         <source>Use VRT files</source>
-        <translation type="unfinished"></translation>
+        <translation>Usar archivos VRT</translation>
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="221"/>
@@ -78971,17 +78982,17 @@ Hubo un problema con su base de datos de símbolos.</translation>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="42"/>
         <source>If you write a scientific paper or any other article that refers to QGIS we would love to include your work in the <a href="https://qgis.org/en/site/about/case_studies/index.html">case studies section</a> of the QGIS home page.</source>
-        <translation type="unfinished"></translation>
+        <translation>Si escribe un artículo científico o cualquier otro tipo de artículo que mencione a QGIS nos gustaría incluir su trabajo en la <a href="https://qgis.org/en/site/about/case_studies/index.html">sección estudio de casos</a> de la página web de QGIS.</translation>
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="49"/>
         <source>Would you like to see QGIS in your native language? We are looking for more translators and would appreciate your help! The translation process is fairly straight forward - instructions are available in the QGIS wiki <a href="https://qgis.org/en/site/getinvolved/translate.html#howto-translate-gui">translator's page.</a></source>
-        <translation type="unfinished"></translation>
+        <translation>¿Quiere ver QGIS en su lengua nativa? Buscamos más traductores y apreciaríamos su ayuda. El proceso de traducción es bastante directo - las instrucciones están disponibles en la <a href="https://qgis.org/en/site/getinvolved/translate.html#howto-translate-gui">página de traductores</a> de la wiki de QGIS.</translation>
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="58"/>
         <source>If you need help using QGIS there is a 'users' mailing list where users help each other with issues related to using QGIS. We also have a 'developers' mailing list for those wanting help and discuss things relating to the QGIS code base. Details on different means to get help are described in the <a href="https://qgis.org/en/site/forusers/support.html#mailing-lists">community section</a> of the QGIS home page.</source>
-        <translation type="unfinished"></translation>
+        <translation>Si necesita ayuda al usar QGIS tenemos una lista de correo de 'usuarios' en la que los usuarios se ayudan con asuntos relacionados con el uso de QGIS. También tenemos una lista de correo de 'desarrolladores' para aquellos que quieran ayudar y debatir cosas relacionadas con el código base de QGIS. En la <a href="https://qgis.org/en/site/forusers/support.html#mailing-lists">sección de la comunidad</a> de la página web de QGIS s [...]
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="86"/>
@@ -79001,7 +79012,7 @@ Hubo un problema con su base de datos de símbolos.</translation>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="195"/>
         <source>Action in a layer allows user to trigger action when clicking on a geometry with 'Run Feature Action' tools.For example, you can open a HTML page using the field value of the geometry as a parameter. Look at the <a href="https://docs.qgis.org/latest/en/docs/user_manual/working_with_vector/vector_properties.html?#actions-menu">documentation</a>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Las acciones en una capa permiten al usuario desencadenar una acción al hacer clic en una geometría con las herramientas 'Ejecutar acción de objeto'. Por ejemplo, puede abrir una página HTML usando el valor del campo de la geometría como parámetro. Mire la <a href="https://docs.qgis.org/latest/en/docs/user_manual/working_with_vector/vector_properties.html?#actions-menu">documentación</a>.</translation>
     </message>
     <message>
         <location filename="../src/app/qgstipfactory.cpp" line="156"/>
@@ -79378,7 +79389,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="../src/core/qgsunittypes.cpp" line="895"/>
         <source>gon</source>
-        <translation type="unfinished"></translation>
+        <translation>gon</translation>
     </message>
     <message>
         <location filename="../src/core/qgsunittypes.cpp" line="897"/>
@@ -79691,7 +79702,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/core/qgsvectordataprovider.cpp" line="200"/>
         <source>Rename Attributes</source>
-        <translation type="unfinished"></translation>
+        <translation>Cambiar nombre de atributos</translation>
     </message>
     <message>
         <location filename="../src/core/qgsvectordataprovider.cpp" line="207"/>
@@ -79701,7 +79712,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/core/qgsvectordataprovider.cpp" line="213"/>
         <source>Create Attribute Indexes</source>
-        <translation type="unfinished"></translation>
+        <translation>Crear índices de atributos</translation>
     </message>
     <message>
         <location filename="../src/core/qgsvectordataprovider.cpp" line="219"/>
@@ -79736,7 +79747,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/core/qgsvectordataprovider.cpp" line="255"/>
         <source>Curved Geometries</source>
-        <translation type="unfinished"></translation>
+        <translation>Geometrías curvadas</translation>
     </message>
 </context>
 <context>
@@ -80088,8 +80099,8 @@ El error fue: %2</translation>
         <location filename="../src/core/qgsvectorlayereditbuffer.cpp" line="390"/>
         <source>SUCCESS: %n attribute(s) renamed.</source>
         <comment>renamed attributes count</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>ÉXITO: nombre de %n atributo(s) cambiado.</numerusform>
             <numerusform></numerusform>
         </translation>
     </message>
@@ -80097,8 +80108,8 @@ El error fue: %2</translation>
         <location filename="../src/core/qgsvectorlayereditbuffer.cpp" line="399"/>
         <source>ERROR: %n attribute(s) not renamed</source>
         <comment>not renamed attributes count</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>ERROR: nombre de %n atributo(s) no cambiado.</numerusform>
             <numerusform></numerusform>
         </translation>
     </message>
@@ -80293,7 +80304,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/app/qgsvectorlayerproperties.cpp" line="468"/>
         <source>Visvalingam</source>
-        <translation type="unfinished"></translation>
+        <translation>Visvalingam</translation>
     </message>
     <message>
         <location filename="../src/app/qgsvectorlayerproperties.cpp" line="756"/>
@@ -80581,7 +80592,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/ui/qgsvectorlayerpropertiesbase.ui" line="1872"/>
         <source>Embedded widgets in legend</source>
-        <translation type="unfinished"></translation>
+        <translation>Controles incrustados en la leyenda</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayerpropertiesbase.ui" line="110"/>
@@ -80854,7 +80865,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/app/ogr/qgsvectorlayersaveasdialog.cpp" line="87"/>
         <source>Automatic</source>
-        <translation type="unfinished"></translation>
+        <translation>Automático</translation>
     </message>
     <message>
         <location filename="../src/app/ogr/qgsvectorlayersaveasdialog.cpp" line="92"/>
@@ -80897,12 +80908,12 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/app/ogr/qgsvectorlayersaveasdialog.cpp" line="263"/>
         <source>Replace with displayed values</source>
-        <translation type="unfinished"></translation>
+        <translation>Reemplazar con los valores mostrados</translation>
     </message>
     <message>
         <location filename="../src/app/ogr/qgsvectorlayersaveasdialog.cpp" line="294"/>
         <source>Use %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Usar %1</translation>
     </message>
     <message>
         <location filename="../src/app/ogr/qgsvectorlayersaveasdialog.cpp" line="495"/>
@@ -80940,12 +80951,12 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="125"/>
         <source>Select fields to export and their export options</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccione campos a exportar y sus opciones de exportación</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="180"/>
         <source>Replace all selected raw field values by displayed values</source>
-        <translation type="unfinished"></translation>
+        <translation>Sustituir todos los valores de campo en bruto seleccionados por los valores mostrados</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="202"/>
@@ -80960,17 +80971,17 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="246"/>
         <source>Geometry type</source>
-        <translation type="unfinished">Tipo de geometría</translation>
+        <translation>Tipo de geometría</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="258"/>
         <source>Force multi-type</source>
-        <translation type="unfinished"></translation>
+        <translation>Forzar multi tipo</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="265"/>
         <source>Include z-dimension</source>
-        <translation type="unfinished"></translation>
+        <translation>Incluir dimensión Z</translation>
     </message>
     <message>
         <location filename="../src/ui/qgsvectorlayersaveasdialogbase.ui" line="278"/>
@@ -81095,7 +81106,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/app/qgsversioninfo.cpp" line="81"/>
         <source>The host name %1 could not be resolved. Check your DNS settings or contact your system administrator.</source>
-        <translation type="unfinished"></translation>
+        <translation>No se pudo resolver el nombre del servidor %1. Compruebe su configuración DNS o póngase en contactro con el administrador de su equipo.</translation>
     </message>
 </context>
 <context>
@@ -81104,12 +81115,12 @@ El error fue: %2</translation>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselect.cpp" line="236"/>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselect.cpp" line="240"/>
         <source>Virtual layer test</source>
-        <translation type="unfinished"></translation>
+        <translation>Test de capa virtual</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselect.cpp" line="236"/>
         <source>No error</source>
-        <translation type="unfinished"></translation>
+        <translation>Ningún error</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselect.cpp" line="321"/>
@@ -81119,7 +81130,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselect.cpp" line="321"/>
         <source>A virtual layer of this name already exists, would you like to overwrite it?</source>
-        <translation type="unfinished"></translation>
+        <translation>Ya existe una capa virtual con este nombre, ¿quiere sobreescribirla?</translation>
     </message>
 </context>
 <context>
@@ -81127,7 +81138,7 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="14"/>
         <source>Create a virtual layer</source>
-        <translation type="unfinished"></translation>
+        <translation>Crear una capa virtual</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="22"/>
@@ -81137,18 +81148,19 @@ El error fue: %2</translation>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="51"/>
         <source>Embedded layers</source>
-        <translation type="unfinished"></translation>
+        <translation>Capas empotradas</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="60"/>
         <source>Embedded layers can be added to have SQL queries with layers that are independent from layers loaded by the current QGIS project.
 In particular, saving a virtual layer with embedded layers to a QLR file can be done to reuse its definition in another project.</source>
-        <translation type="unfinished"></translation>
+        <translation>Se pueden añadir capas empotradas para tener consultas SQL con capas que son independientes de las capas cargadas en el proyecto actual de QGIS.
+En particular, se puede guardar una capa virtual con capas empotradas en un archivo QLR para reutilizar su definicion en otro proyecto.</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="77"/>
         <source>Local name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nombre local</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="82"/>
@@ -81168,7 +81180,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="102"/>
         <source>Add a new embedded layer</source>
-        <translation type="unfinished"></translation>
+        <translation>Añadir una nueva capa empotrada</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="105"/>
@@ -81178,7 +81190,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="115"/>
         <source>Import layer definition from loaded layers of the current project</source>
-        <translation type="unfinished"></translation>
+        <translation>Importar definición de la capa de las capas cargadas en el proyecto actual</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="118"/>
@@ -81188,7 +81200,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="128"/>
         <source>Remove the selected embedded layer</source>
-        <translation type="unfinished"></translation>
+        <translation>Eliminar la capa empotrada seleccionada</translation>
     </message>
     <message>
         <location filename="../src/providers/virtual/qgsvirtuallayersourceselectbase.ui" line="131"/>
@@ -81494,37 +81506,37 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="290"/>
         <source>Syntax error.</source>
-        <translation type="unfinished"></translation>
+        <translation>Error de sintaxis.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="292"/>
         <source>Missing content at end of string.</source>
-        <translation type="unfinished"></translation>
+        <translation>Falta contenido al final de la cadena.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="294"/>
         <source>%1 is unexpected.</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 es inesperado.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="296"/>
         <source>%1 is expected instead.</source>
-        <translation type="unfinished"></translation>
+        <translation>Se espera %1 en su lugar.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="301"/>
         <source>%1 or %2</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 o %2</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="302"/>
         <source>comma</source>
-        <translation type="unfinished"></translation>
+        <translation>coma</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="303"/>
         <source>an identifier</source>
-        <translation type="unfinished"></translation>
+        <translation>un identificador</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="304"/>
@@ -81542,7 +81554,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="344"/>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="379"/>
         <source>Typename '%1' is unknown</source>
-        <translation type="unfinished"></translation>
+        <translation>El typename '%1' es desconocido</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="403"/>
@@ -81581,7 +81593,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="589"/>
         <source>The geometry field of a typename that is not the main typename is ignored in the selected fields</source>
-        <translation type="unfinished"></translation>
+        <translation>El campo de geometría de un typename que no es el typename principal es ignorado en los campos seleccionados</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="1129"/>
@@ -81621,7 +81633,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="1505"/>
         <source>Could not find typename %1 in capabilities for url %2</source>
-        <translation type="unfinished"></translation>
+        <translation>No se pudo encontrar el typename %1 en las capacidades de la URL %2</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsprovider.cpp" line="1540"/>
@@ -81742,7 +81754,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="951"/>
         <source>Layer extent reported by the server is not correct. You may need to zoom again on layer while features are being downloaded</source>
-        <translation type="unfinished"></translation>
+        <translation>La extensión de la capa informada por el servidor no es correcta. Puede ser necesario hacer zoom de nuevo sobre la capa mientras se descargan los objetos.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="988"/>
@@ -81752,7 +81764,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="1016"/>
         <source>Layer extent reported by the server is not correct. You may need to zoom on layer and then zoom out to see all features</source>
-        <translation type="unfinished"></translation>
+        <translation>La extensión de la capa informada por el servidor no es correcta. Puede ser necesario hacer zoom sobre la capa y luego alejar el zoom para ver todos los objetos.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="1065"/>
@@ -81762,12 +81774,12 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="1067"/>
         <source>Zoom in to fetch all data.</source>
-        <translation type="unfinished"></translation>
+        <translation>Acercar zoom para recuperar todos los datos.</translation>
     </message>
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="1069"/>
         <source>You may want to check the 'Only request features overlapping the view extent' option to be able to zoom in to fetch all data.</source>
-        <translation type="unfinished"></translation>
+        <translation>Puede que quiera marcar la opción 'Solicitar solo objetos que solapen con la extensión de la vista' para poder acercar el zoom para recuperar todos los datos.</translation>
     </message>
 </context>
 <context>
@@ -81775,7 +81787,7 @@ In particular, saving a virtual layer with embedded layers to a QLR file can be
     <message>
         <location filename="../src/providers/wfs/qgswfsshareddata.cpp" line="1319"/>
         <source>Download of feature failed: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Falló la descarga de objetos: %1</translation>
     </message>
 </context>
 <context>
@@ -85218,7 +85230,7 @@ Por favor, configúrela antes de ejecutar scripts de R.</translation>
     <message>
         <location filename="../src/plugins/roadgraph/roadgraphplugin.cpp" line="105"/>
         <source>Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Configuració...</translation>
     </message>
     <message>
         <location filename="../src/plugins/roadgraph/roadgraphplugin.cpp" line="109"/>
@@ -90866,7 +90878,7 @@ Problema con la línea %d</translation>
     <message>
         <location filename="../src/plugins/topology/checkDock.ui" line="14"/>
         <source>Topology Checker Panel</source>
-        <translation type="unfinished"></translation>
+        <translation>Panel de comprobación de topología</translation>
     </message>
     <message>
         <location filename="../src/plugins/topology/checkDock.ui" line="56"/>
@@ -91463,7 +91475,68 @@ The vector layer needs to be in editing mode, before you can click on the <la
 When you toggle to edition the layer, a new row of functions appears in the attribute table: the <label>Field Calculator Bar</label>. This allows quick editing values of existing fields by performing calculations on basis of existing attribute values or defined functions button in the attribute table, e.g. to calculate length or area of geometry features.<br>
 To edit values, select the field to modify with the filter button on the left and fill the text box with the new value or an expression to calculate new value. Then, press <label>Update all</label> button to update all the rows of the attribute table or <label>Update selected</label> button if some features are selected or a filter is applied on the attribute table display. You can also use the <label>Expression builder</label> button to calculate the  [...]
 </source>
-        <translation type="unfinished"></translation>
+        <translation><h3>Tabla de atributos</h3>
+La tabla de atributos muestra los objetos espaciales de la capa seleccionada. Cada fila de la tabla representa un objeto espacial con sus atributos mostrados en varias columnas. Se pueden buscar, seleccionar, mover o incluso editar los objetos espaciales de la tabla. Por omisión la tabla de atributos es una ventana separada. Si la ha abierto y no la puede ver, probablemente está oculta tras la ventana principal de QGIS. También la puede hacer una ventana adosable, marcando <label>A [...]
+
+El número de objetos espaciales totales, filtrados y seleccionados de la capa se muestra en la cabecera de la tabla.<p>
+Abajo a la derecha del diálogo puede elegir si mostrar los objetos espaciales en un formulario o en una tabla.<p>
+<p>
+<a href="#Selecting">Seleccionar</a><br/>
+<a href="#Sorting">Ordenar</a><br/>
+<a href="#Filtering">Filtrar</a><br/>
+<a href="#Editing">Editar</a><br/>
+<a href="#FieldCalc">Calculadora de campos</a><br/>
+<a href="#FieldCalcBar">Barra de la calculadora de campos</a><br/>
+
+<a name="Selecting">
+<h4>Seleccionar</h4>
+</a>
+Se pueden seleccionar filas haciendo clic en el número de fila en la parte izquierda de la fila. Se pueden seleccionar filas correlativas manteniendo pulsado el botón del ratón y moviendo el ratón hasta el otro extremo de la selección. Se pueden seleccionar múltiples filas no contiguas manteniendo pulsada la tecla <label>Ctrl</label>.<br>
+Se puede hacer una selección continua manteniendo pulsada la tecla <label>Mayúsculas</label> y pulsando en la cabecera de varias filas en la parte izquierda de las filas. Se seleccionarán todas las filas entre la posición actual del cursor y la fila pulsada.<br>
+Se pueden invertir las filas seleccionadas usando el botón <label>Invertir selección</label> de la parte superior de la ventana.
+
+<a name="Sorting">
+<h4>Ordenar</h4>
+</a>
+Cada columna se puede ordenar haciendo clic en su cabecera. Una pequeña flecha indica el sentido del orden (indicando hacia abajo significa valores descendentes de arriba a abajo, apuntando hacia arriba indica valores ascendentes de arriba a abajo).<br>.
+
+<a name="Filtering">
+<h4>Filtrar</h4>
+</a>
+Para navegar sólo por parte de sus datos, puede usar el botón filtrar de abajo a la izquierda. Hay disponibles las siguientes opciones:
+<h5>Mostrar todos los objetos espaciales</h5>
+Muestra todos los objetos espaciales de la capa.
+<h5>Mostrar objetos espaciales seleccionados</h5>
+Muestra todos los objetos espaciales que estén seleccionados actualmente.
+<h5>Mostrar objetos espaciales visibles en el mapa</h5>
+Muestra todos los objetos espaciales que sean visibles actualmente en la vista del mapa, teniendo en cuenta la extesión visible y la visibilidad basada en la escala.
+<h5>Mostrar objetos espaciales editados y nuevos</h5>
+Muestra sólo los objetos espaciales editados y nuevos. En este modo, se muestran los objetos espaciales con cambios sin guardar. y es por tanto un buen filtro para revisar cambios antes de guardarlos. Tenga en cuenta que los objetos espaciales borrados no se muestran en este modo.
+<h5>Filtro de columna</h5>
+Un filtro sencillo, que le permite filtrar por un atributo. Si el atributo contiene texto, también busca subcadenas. Por tanto, busca <b>mano</b> también mostrará los registros que contengan <b>humano</b>. Después de cambiar el texto del filtro, pulse <label>Intro</label> o haga clid en <label>Aplicar</label>. También puede conmutar la casilla <label>Sensible a mayúsculas</label>, de forma que su filtro también encuentre <b&g [...]
+<h5>Filtro avanzado</h5>
+Para búsquedas más complejsa, este modo ofrece un potente constructor de expresiones, que es similar a una cláusula WHERE de SQL. Por favor, consulte la ayuda incluida en el constructor de consultas para detalles sobre la sintaxis.
+
+<a name="Editing">
+<h4>Editar</h4>
+</a>
+Para editar valores primero tiene que pasar la capa al modo edición. Para ello haga clic en el botón <label>Conmutar modo edición</label> (lápiz) o teclee <label>Ctrl + E</label>. Después haga doble clic en el valor que quiera editar o sitúe el cursor en él y use la tecla <label>Espacio</label>. Puede personalizar los controles usados para la edición de campos en <label>Propiedades de capas vectoriales > Campos</label> <br>
+También puede editar el valor de un campo para muchas filas a la vez. Es necesario seleccionar las filas que quiera ediar y luego usar la <label>Calculadora de campos</label> o la <label>Barra de la calculadora de campos</label>. Si no hay ninguna fila seleccionada, la edición se aplicará a todos los objetos espaciales. 
+
+<a name="FieldCalc">
+<h4>Calculadora de campos</h4>
+</a>
+El botón <label>Calculadora de campos</label> de la tabla de atributos permite realizar cálculos basados en valores de atributos existentes o en funciones definidas, ej. para calcular longitud o área de objetos espaciales.<br>
+Los resultados se pueden escribir en una nueva columna de atributos o se puede usar para actualizar valores de una columna existente.<br>
+Tiene que poner la capa vectorial en modo editable antes de pulsar en el icono <label>Calculadora de campos</label> para abrir el diálogo.
+
+<a name="FieldCalcBar">
+<h4>Barra de la calculadora de campos</h4>
+</a>
+Cuando activa la edición de una capa aparece una nueva fila de funciones en la tabla de atributos: la <label>Barra de la calculadora de campos</label>. Esto permite editar rápidamente valores de campos existentes realizando cálculos basados en valores de atributos existentes o el botón de funciones definidas de la tabla de atributos, por ejemplo, calcular la longitud o área de objetos espaciales.<br>
+Para editar valores, seleccione el campo a modificar con el botón de filtrado de la izquierda y rellene el cuadro de texto con el nuevo valor o una expresión para calcular el nuevo valor. Pulse enconces el botón <label>Actualizar todo</label> para actualizar todas las filas de la tabla de atributos o el botón <label>Actualizar seleccionado</label> si hay objetos espaciales seleccionados o se aplica un filtro en la vista de la tabla de atributos. También puede usar [...]
+
+</translation>
     </message>
     <message>
         <source><h3>Spatial Bookmarks</h3>
@@ -94076,7 +94149,7 @@ Para ayuda enviar un correo a scala at itc.cnr.it
     <message>
         <location filename="../src/plugins/evis/evis.cpp" line="115"/>
         <source>Open an Event Browser and display the selected feature</source>
-        <translation type="unfinished"></translation>
+        <translation>Abrir un Explorador de eventos y mostrar el objeto seleccionado</translation>
     </message>
     <message>
         <location filename="../src/plugins/evis/evis.cpp" line="116"/>
@@ -94958,7 +95031,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3122"/>
         <source>gdal2tiles</source>
-        <translation type="unfinished"></translation>
+        <translation>gdalAteselas</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3123"/>
@@ -94973,7 +95046,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3125"/>
         <source>Tile cutting profile</source>
-        <translation type="unfinished"></translation>
+        <translation>Perfil de corte de teselas</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3126"/>
@@ -94983,67 +95056,67 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3127"/>
         <source>The spatial reference system used for the source input data</source>
-        <translation type="unfinished"></translation>
+        <translation>El sistema de referencia espacial usado para los datos de entrada de origen</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3128"/>
         <source>Zoom levels to render</source>
-        <translation type="unfinished"></translation>
+        <translation>Niveles de zoom a representar</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3129"/>
         <source>Resume mode, generate only missing files</source>
-        <translation type="unfinished"></translation>
+        <translation>Modo continuación, generar solo los archivos que falten</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3130"/>
         <source>NODATA transparency value to assign to the input data</source>
-        <translation type="unfinished"></translation>
+        <translation>Valor de transparencia para SINDATOS a asignar a los datos de entrada</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3131"/>
         <source>Generate KML for Google Earth - default for "geodetic" profile and "raster" in EPSG:4326</source>
-        <translation type="unfinished"></translation>
+        <translation>Generar KML para Google Earth - predeterminado para perfil "geodetic" y "raster" en EPSG:4326</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3132"/>
         <source>Avoid automatic generation of KML files for EPSG:4326</source>
-        <translation type="unfinished"></translation>
+        <translation>Evitar generación automática de archivos KML para EPSG:4326</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3133"/>
         <source>URL address where the generated tiles are going to be published</source>
-        <translation type="unfinished"></translation>
+        <translation>Dirección URL donde se van a publicar las teselas generadas</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3134"/>
         <source>Web viewer to generate</source>
-        <translation type="unfinished"></translation>
+        <translation>Visor web a generar</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3135"/>
         <source>Title of the map</source>
-        <translation type="unfinished"></translation>
+        <translation>Título del mapa</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3136"/>
         <source>Copyright for the map</source>
-        <translation type="unfinished"></translation>
+        <translation>Copyright para el mapa</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3137"/>
         <source>Google Maps API key from http://code.google.com/apis/maps/signup.html</source>
-        <translation type="unfinished"></translation>
+        <translation>Clave API de Google Maps de http://code.google.com/apis/maps/signup.html</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3138"/>
         <source>Bing Maps API key from https://www.bingmapsportal.com/</source>
-        <translation type="unfinished"></translation>
+        <translation>Clave API de Bing Maps de https://www.bingmapsportal.com/</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3139"/>
         <source>The directory where the tile result is created</source>
-        <translation type="unfinished"></translation>
+        <translation>El directorio donde se crea el resultado de la tesela</translation>
     </message>
 </context>
 <context>
@@ -97688,7 +97761,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../src/plugins/grass/grasslabels-i18n.cpp" line="494"/>
         <source>Transform or reproject vector from another Location</source>
-        <translation type="unfinished"></translation>
+        <translation>Transformar o reproyectar vectorial desde otra Localización</translation>
     </message>
     <message>
         <location filename="../src/plugins/grass/grasslabels-i18n.cpp" line="495"/>
@@ -99575,7 +99648,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3669"/>
         <source>overwrite existing files</source>
-        <translation type="unfinished"></translation>
+        <translation>sobreescribir archivos existentes</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3670"/>
@@ -99608,7 +99681,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3678"/>
         <source>type of portal</source>
-        <translation type="unfinished"></translation>
+        <translation>tipo de portal</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3679"/>
@@ -99638,7 +99711,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3684"/>
         <source>overwrite existing files</source>
-        <translation type="unfinished"></translation>
+        <translation>sobreescribir archivos existentes</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3685"/>
@@ -100395,7 +100468,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3880"/>
         <source>Raster extent</source>
-        <translation type="unfinished"></translation>
+        <translation>Extensión del ráster</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3881"/>
@@ -100491,7 +100564,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3903"/>
         <source>Retile</source>
-        <translation type="unfinished"></translation>
+        <translation>Reteselar</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3904"/>
@@ -100506,12 +100579,12 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3906"/>
         <source>Pixel size to be used for the output file (XSIZE YSIZE like 512 512)</source>
-        <translation type="unfinished"></translation>
+        <translation>Tamaño de píxel a usar para el archivo de salida (XSIZE YSIZE como 512 512)</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3907"/>
         <source>Resampling algorithm</source>
-        <translation type="unfinished"></translation>
+        <translation>Algoritmo de remuestreo</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3908"/>
@@ -100521,12 +100594,12 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3909"/>
         <source>Number of pyramids levels to build</source>
-        <translation type="unfinished"></translation>
+        <translation>Número de niveles de pirámides a construir</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3910"/>
         <source>Build only the pyramids</source>
-        <translation type="unfinished"></translation>
+        <translation>Construir solo las pirámides</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3911"/>
@@ -100536,37 +100609,37 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3912"/>
         <source>Output raster format</source>
-        <translation type="unfinished"></translation>
+        <translation>Formato del ráster de salida</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3913"/>
         <source>Use a directory for each row</source>
-        <translation type="unfinished"></translation>
+        <translation>Usar un directorio para cada fila</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3914"/>
         <source>Name of the csv file containing the tile(s) georeferencing information</source>
-        <translation type="unfinished"></translation>
+        <translation>Nombre del archivo CSV que contiene la información de georreferenciación de la(s) tesela(s)</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3915"/>
         <source>Column delimiter used in the CSV file</source>
-        <translation type="unfinished"></translation>
+        <translation>Delimitador de columnas usado en el archivo CSV</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3916"/>
         <source>name of shape file containing the result tile(s) index</source>
-        <translation type="unfinished"></translation>
+        <translation>nombre del archivo shape que contiene el índice de la(s) tesela(s) resultante(s)</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3917"/>
         <source>name of the attribute containing the tile name in the result shape file</source>
-        <translation type="unfinished"></translation>
+        <translation>nombre del atributo que contiene el nombre de la tesela en el archivo shape de salida</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3918"/>
         <source>The directory where the tile result is created</source>
-        <translation type="unfinished"></translation>
+        <translation>El directorio donde se crea la tesela resultante</translation>
     </message>
 </context>
 <context>
@@ -100707,7 +100780,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="3937"/>
         <source>Spatialite files(*.sqlite)</source>
-        <translation type="unfinished"></translation>
+        <translation>Archivos SpatiaLite (*.sqlite)</translation>
     </message>
 </context>
 <context>
@@ -100827,7 +100900,7 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="5004"/>
         <source>Color of symbol used to render the feature.</source>
-        <translation type="unfinished"></translation>
+        <translation>Color de símbolo usado para representar el objeto.</translation>
     </message>
 </context>
 <context>
@@ -101316,22 +101389,22 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4948"/>
         <source>Operating system name, eg 'windows', 'linux' or 'osx'.</source>
-        <translation type="unfinished"></translation>
+        <translation>Nombre del sistema operativo, ej. 'windows', 'linux' o 'osx'</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4949"/>
         <source>QGIS platform, eg 'desktop' or 'server'.</source>
-        <translation type="unfinished"></translation>
+        <translation>Platarforma de QGIS, por ejemplo "escritorio" o "servidor".</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4950"/>
         <source>Current user's operating system account name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Nombre de la cuenta del sistema operativo del usuario actual.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4951"/>
         <source>Current user's operating system user name (if available).</source>
-        <translation type="unfinished"></translation>
+        <translation>Nombre de usuario del sistema operativo del usuario actual (si está disponible).</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4954"/>
@@ -101466,17 +101539,17 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4990"/>
         <source>Center of map.</source>
-        <translation type="unfinished"></translation>
+        <translation>Centro de mapa.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4991"/>
         <source>Width of map.</source>
-        <translation type="unfinished"></translation>
+        <translation>Anchura de mapa.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4992"/>
         <source>Height of map.</source>
-        <translation type="unfinished"></translation>
+        <translation>Altura de mapa.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4994"/>
@@ -101496,22 +101569,22 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="4999"/>
         <source>Number of parts in rendered feature's geometry.</source>
-        <translation type="unfinished"></translation>
+        <translation>Número de partes en la geometría del objeto representado.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="5000"/>
         <source>Current geometry part number for feature being rendered.</source>
-        <translation type="unfinished"></translation>
+        <translation>Número de parte de la geometría actual para el objeto que se está representado.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="5001"/>
         <source>Number of points in the rendered geometry's part. It is only meaningful for line geometries and for symbol layers that set this variable.</source>
-        <translation type="unfinished"></translation>
+        <translation>Número de puntos en la parte de la geometría representada. Solo tiene sentido para geometrías de línea y para capas de símbolos que establezcan esta variable.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="5002"/>
         <source>Current point number in the rendered geometry's part. It is only meaningful for line geometries and for symbol layers that set this variable.</source>
-        <translation type="unfinished"></translation>
+        <translation>Número del punto actual en la parte de la geometría representada. Solo tiene sentido para geometrías de línea y para capas de símbolos que establezcan esta variable.</translation>
     </message>
     <message>
         <location filename="../src/core/qgsexpression.cpp" line="5017"/>
@@ -101579,12 +101652,12 @@ archivo de el atributo)</translation>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="4043"/>
         <source>Raster extent</source>
-        <translation type="unfinished"></translation>
+        <translation>Extensión del ráster</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="4044"/>
         <source>CRS of the raster extent</source>
-        <translation type="unfinished"></translation>
+        <translation>SRC de la extensión del ráster</translation>
     </message>
     <message>
         <location filename="../python/plugins/processing/python-i18n.cpp" line="4046"/>
diff --git a/python/core/geometry/qgsgeometry.sip b/python/core/geometry/qgsgeometry.sip
index c55875c..40f0f61 100644
--- a/python/core/geometry/qgsgeometry.sip
+++ b/python/core/geometry/qgsgeometry.sip
@@ -396,6 +396,15 @@ class QgsGeometry
      */
     int reshapeGeometry( const QList<QgsPoint>& reshapeWithLine );
 
+    /**
+      * Replaces a part of this geometry with another line with Z support
+      *
+      * @return 0 in case of success
+      *
+      * @note added in 2.18
+      */
+    int reshapeGeometry( const QList<QgsPointV2>& reshapeWithLine );
+
     /** Changes this geometry such that it does not intersect the other geometry
      * @param other geometry that should not be intersect
      * @return 0 in case of success
diff --git a/python/core/qgsbrowsermodel.sip b/python/core/qgsbrowsermodel.sip
index f22616f..8e05692 100644
--- a/python/core/qgsbrowsermodel.sip
+++ b/python/core/qgsbrowsermodel.sip
@@ -5,7 +5,7 @@ class QgsBrowserModel : QAbstractItemModel
 %End
 
   public:
-    explicit QgsBrowserModel( QObject *parent = 0 );
+    explicit QgsBrowserModel( QObject *parent = 0, bool initialize = true );
     ~QgsBrowserModel();
 
     enum ItemDataRole
@@ -81,6 +81,12 @@ class QgsBrowserModel : QAbstractItemModel
     bool canFetchMore( const QModelIndex & parent ) const;
     void fetchMore( const QModelIndex & parent );
 
+    //! Returns true if the model has been initialized
+    bool initialized( );
+
+    //! Delayed initialization
+    void init();
+
   signals:
     /** Emitted when item children fetch was finished */
     void stateChanged( const QModelIndex & index, QgsDataItem::State oldState );
diff --git a/python/core/qgsvectordataprovider.sip b/python/core/qgsvectordataprovider.sip
index 34b18d9..f264a6d 100644
--- a/python/core/qgsvectordataprovider.sip
+++ b/python/core/qgsvectordataprovider.sip
@@ -390,7 +390,17 @@ class QgsVectorDataProvider : QgsDataProvider
 
     void pushError( const QString& msg );
 
-    /** Converts the geometry to the provider type if possible / necessary
-    @return the converted geometry or nullptr if no conversion was necessary or possible*/
+    /** \brief Converts the geometry to the provider type if possible / necessary
+     * this is the list of possible modifications:
+     * - convert compoundcurve to circularstring
+     *   (possible if compoundcurve consists of one circular string)
+     * - convert to multitype if necessary
+     * - convert to curved type if necessary
+     * - convert to linear type from curved type
+     * - Add z/m 0 default values
+     * - Remove z/m
+     * \ref QgsVectorLayerEditBuffer::adaptGeometry()
+     * \param geom Geometry to convert
+     * \returns the converted geometry or nullptr if no conversion was necessary or possible*/
     QgsGeometry* convertToProviderType( const QgsGeometry* geom ) const /Factory/;
 };
diff --git a/python/core/qgsvectorlayereditbuffer.sip b/python/core/qgsvectorlayereditbuffer.sip
index b99ec2d..8f99482 100644
--- a/python/core/qgsvectorlayereditbuffer.sip
+++ b/python/core/qgsvectorlayereditbuffer.sip
@@ -148,4 +148,17 @@ class QgsVectorLayerEditBuffer : QObject
     void updateAttributeMapIndex( QgsAttributeMap& attrs, int index, int offset ) const;
 
     void updateLayerFields();
+
+    /** \brief Apply geometry modification basing on provider geometry type.
+     * Geometry is modified only if successful conversion is possible.
+     * adaptGeometry calls \ref QgsVectorDataProvider::convertToProviderType()
+     * if necessary and that apply the modifications.
+     * \param geometry pointer to the geometry that should be adapted to provider
+     * \returns bool true if success.
+     *  True: Input geometry is changed because conversion is applied or
+     *  geometry is untouched if geometry conversion is not necessary.
+     *  False: Conversion is not possible and geometry is untouched.
+     * \note added in QGIS 2.18.14
+     */
+    bool adaptGeometry( QgsGeometry* geometry );
 };
diff --git a/python/gui/qgsmaptoolcapture.sip b/python/gui/qgsmaptoolcapture.sip
index 97dd5db..598392e 100644
--- a/python/gui/qgsmaptoolcapture.sip
+++ b/python/gui/qgsmaptoolcapture.sip
@@ -164,6 +164,15 @@ class QgsMapToolCapture : public QgsMapToolAdvancedDigitizing
     QList<QgsPoint> points();
 
     /**
+     * List of digitized points with z support
+     *
+     * @return List of points
+     *
+     * @node added in 2.18
+     */
+    QList<QgsPointV2> pointsV2();
+
+    /**
      * Set the points on which to work
      *
      * @param pointList A list of points
diff --git a/python/gui/qgsvertexmarker.sip b/python/gui/qgsvertexmarker.sip
index 561d057..c27be6c 100644
--- a/python/gui/qgsvertexmarker.sip
+++ b/python/gui/qgsvertexmarker.sip
@@ -1,3 +1,6 @@
+%ModuleHeaderCode
+#include <qgsvertexmarker.h>
+%End
 
 class QgsVertexMarker : QgsMapCanvasItem
 {
@@ -5,6 +8,13 @@ class QgsVertexMarker : QgsMapCanvasItem
 #include <qgsvertexmarker.h>
 %End
 
+%ConvertToSubClassCode
+  if ( dynamic_cast< QgsVertexMarker* > ( sipCpp ) )
+    sipType = sipType_QgsVertexMarker;
+  else
+    sipType = nullptr;
+%End
+
   public:
 
     //! Icons
diff --git a/python/plugins/db_manager/db_plugins/gpkg/plugin.py b/python/plugins/db_manager/db_plugins/gpkg/plugin.py
index 9e3c31a..d7c0c8c 100644
--- a/python/plugins/db_manager/db_plugins/gpkg/plugin.py
+++ b/python/plugins/db_manager/db_plugins/gpkg/plugin.py
@@ -189,7 +189,7 @@ class GPKGTable(Table):
     def mimeUri(self):
 
         # QGIS has no provider to load Geopackage vectors, let's use OGR
-        return u"vector:ogr:%s:%s" % (self.name, self.ogrUri())
+        return u"vector:ogr:%s:%s" % (self.name, self.ogrUri().replace(":", "\:"))
 
     def toMapLayer(self):
         from qgis.core import QgsVectorLayer
diff --git a/python/plugins/db_manager/db_plugins/spatialite/plugin.py b/python/plugins/db_manager/db_plugins/spatialite/plugin.py
index 4b5e25a..21cc96a 100644
--- a/python/plugins/db_manager/db_plugins/spatialite/plugin.py
+++ b/python/plugins/db_manager/db_plugins/spatialite/plugin.py
@@ -19,7 +19,6 @@ email                : brush.tyler at gmail.com
  *                                                                         *
  ***************************************************************************/
 """
-
 # this will disable the dbplugin if the connector raise an ImportError
 from .connector import SpatiaLiteDBConnector
 
@@ -183,7 +182,8 @@ class SLTable(Table):
         return ogrUri
 
     def mimeUri(self):
-        return Table.mimeUri(self)
+        layerType = "raster" if self.type == Table.RasterType else "vector"
+        return u"%s:%s:%s:%s" % (layerType, self.database().dbplugin().providerName(), self.name, self.uri().uri(False).replace(":", "\:"))
 
     def toMapLayer(self):
         from qgis.core import QgsVectorLayer
@@ -268,7 +268,7 @@ class SLRasterTable(SLTable, RasterTable):
 
     def mimeUri(self):
         # QGIS has no provider to load rasters, let's use GDAL
-        uri = u"raster:gdal:%s:%s" % (self.name, self.uri().database())
+        uri = u"raster:gdal:%s:%s" % (self.name, self.uri().database().replace(":", "\:"))
         return uri
 
     def toMapLayer(self):
diff --git a/python/plugins/processing/algs/gdal/gdalcalc.py b/python/plugins/processing/algs/gdal/gdalcalc.py
index c53f441..0d97436 100644
--- a/python/plugins/processing/algs/gdal/gdalcalc.py
+++ b/python/plugins/processing/algs/gdal/gdalcalc.py
@@ -56,7 +56,6 @@ class gdalcalc(GdalAlgorithm):
     EXTRA = 'EXTRA'
     RTYPE = 'RTYPE'
     TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
-    #DEBUG = 'DEBUG'
 
     def defineCharacteristics(self):
         self.name, self.i18n_name = self.trAlgorithm('Raster calculator')
@@ -85,14 +84,13 @@ class gdalcalc(GdalAlgorithm):
             self.INPUT_F, self.tr('Input layer F'), True))
         self.addParameter(ParameterString(self.BAND_F,
                                           self.tr('Number of raster band for raster F'), '1', optional=True))
+
         self.addParameter(ParameterString(self.FORMULA,
                                           self.tr('Calculation in gdalnumeric syntax using +-/* or any numpy array functions (i.e. logical_and())'), 'A*2', optional=False))
         self.addParameter(ParameterString(self.NO_DATA,
                                           self.tr('Set output nodata value'), '', optional=True))
         self.addParameter(ParameterSelection(self.RTYPE,
                                              self.tr('Output raster type'), self.TYPE, 5))
-        #self.addParameter(ParameterBoolean(
-        #    self.DEBUG, self.tr('Print debugging information'), False))
         self.addParameter(ParameterString(self.EXTRA,
                                           self.tr('Additional creation parameters'), '', optional=True))
         self.addOutput(OutputRaster(self.OUTPUT, self.tr('Calculated')))
@@ -102,7 +100,6 @@ class gdalcalc(GdalAlgorithm):
         extra = self.getParameterValue(self.EXTRA)
         if extra is not None:
             extra = unicode(extra)
-        #debug = self.getParameterValue(self.DEBUG)
         formula = self.getParameterValue(self.FORMULA)
         noData = self.getParameterValue(self.NO_DATA)
         if noData is not None:
@@ -120,8 +117,7 @@ class gdalcalc(GdalAlgorithm):
             arguments.append(noData)
         if extra and len(extra) > 0:
             arguments.append(extra)
-        #if debug:
-        #    arguments.append('--debug')
+
         arguments.append('-A')
         arguments.append(self.getParameterValue(self.INPUT_A))
         if self.getParameterValue(self.BAND_A):
diff --git a/python/plugins/processing/algs/gdal/rasterize.py b/python/plugins/processing/algs/gdal/rasterize.py
index dbb8985..280625f 100644
--- a/python/plugins/processing/algs/gdal/rasterize.py
+++ b/python/plugins/processing/algs/gdal/rasterize.py
@@ -202,4 +202,7 @@ class rasterize(GdalAlgorithm):
         arguments.append(ogrLayer)
 
         arguments.append(unicode(self.getOutputValue(self.OUTPUT)))
+        if None in arguments:
+            return ['gdal_rasterize']
+
         return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]
diff --git a/python/plugins/processing/algs/gdal/rasterize_over.py b/python/plugins/processing/algs/gdal/rasterize_over.py
index 50e2845..7f810e3 100644
--- a/python/plugins/processing/algs/gdal/rasterize_over.py
+++ b/python/plugins/processing/algs/gdal/rasterize_over.py
@@ -77,4 +77,6 @@ class rasterize_over(GdalAlgorithm):
         arguments.append(ogrLayer)
         arguments.append(ogrRasterLayer)
 
+        if None in arguments:
+            return ['gdal_rasterize']
         return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]
diff --git a/python/plugins/processing/algs/grass7/Grass7AlgorithmProvider.py b/python/plugins/processing/algs/grass7/Grass7AlgorithmProvider.py
index 0556265..22d93d9 100644
--- a/python/plugins/processing/algs/grass7/Grass7AlgorithmProvider.py
+++ b/python/plugins/processing/algs/grass7/Grass7AlgorithmProvider.py
@@ -33,7 +33,6 @@ from processing.core.ProcessingLog import ProcessingLog
 from .Grass7Utils import Grass7Utils
 from .Grass7Algorithm import Grass7Algorithm
 from processing.tools.system import isWindows, isMac
-from .nviz7 import nviz7
 
 pluginPath = os.path.normpath(os.path.join(
     os.path.split(os.path.dirname(__file__))[0], os.pardir))
@@ -91,7 +90,6 @@ class Grass7AlgorithmProvider(AlgorithmProvider):
                     ProcessingLog.addToLog(
                         ProcessingLog.LOG_ERROR,
                         self.tr('Could not open GRASS GIS 7 algorithm: %s\n%s') % (descriptionFile, unicode(e)))
-        self.preloadedAlgs.append(nviz7())
 
     def _loadAlgorithms(self):
         self.algs = self.preloadedAlgs
diff --git a/python/plugins/processing/algs/grass7/description/nviz.txt b/python/plugins/processing/algs/grass7/description/nviz.txt
deleted file mode 100644
index 704e807..0000000
--- a/python/plugins/processing/algs/grass7/description/nviz.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-nviz
-Visualization and animation tool for GRASS data.
-Visualization(NVIZ)
-ParameterMultipleInput|elevation|Name of elevation raster map|3|False
-ParameterMultipleInput|color|Name of raster map(s) for Color|3|False
-ParameterMultipleInput|vector|Name of vector lines/areas overlay map(s)|-1|False
-ParameterMultipleInput|point|Name of vector points overlay file(s)|0|True
-ParameterMultipleInput|volume|Name of existing 3d raster map|3|True
diff --git a/python/plugins/processing/algs/grass7/ext/v_build_polylines.py b/python/plugins/processing/algs/grass7/ext/v_build_polylines.py
index d69f17d..a3ee231 100644
--- a/python/plugins/processing/algs/grass7/ext/v_build_polylines.py
+++ b/python/plugins/processing/algs/grass7/ext/v_build_polylines.py
@@ -31,7 +31,7 @@ import os
 
 def processOutputs(alg):
     out = alg.getOutputValue('output')
-    command = u"v.out.ogr -c -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -c -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         alg.exportedLayers[out],
         os.path.dirname(out),
         os.path.splitext(os.path.basename(out))[0]
diff --git a/python/plugins/processing/algs/grass7/ext/v_distance.py b/python/plugins/processing/algs/grass7/ext/v_distance.py
index c07f788..da09959 100644
--- a/python/plugins/processing/algs/grass7/ext/v_distance.py
+++ b/python/plugins/processing/algs/grass7/ext/v_distance.py
@@ -68,7 +68,7 @@ def processOutputs(alg):
     # Output results ('from' table and output table)
     for output in [u'from_output', u'output']:
         out = alg.getOutputValue(output)
-        command = u"v.out.ogr -c type=auto -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+        command = u"v.out.ogr --overwrite -c type=auto -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
             alg.exportedLayers[out],
             os.path.dirname(out),
             os.path.basename(out)[:-4]
diff --git a/python/plugins/processing/algs/grass7/ext/v_edit.py b/python/plugins/processing/algs/grass7/ext/v_edit.py
index 7bbced3..34dd9ea 100644
--- a/python/plugins/processing/algs/grass7/ext/v_edit.py
+++ b/python/plugins/processing/algs/grass7/ext/v_edit.py
@@ -66,7 +66,7 @@ def processOutputs(alg):
     # We need to add the from layer to outputs:
     out = alg.exportedLayers[alg.getParameterValue('map')]
     from_out = alg.getOutputValue('output')
-    command = u"v.out.ogr -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         out, os.path.dirname(from_out),
         os.path.splitext(os.path.basename(from_out))[0]
     )
diff --git a/python/plugins/processing/algs/grass7/ext/v_net_connect.py b/python/plugins/processing/algs/grass7/ext/v_net_connect.py
index b38e909..f1ecffb 100644
--- a/python/plugins/processing/algs/grass7/ext/v_net_connect.py
+++ b/python/plugins/processing/algs/grass7/ext/v_net_connect.py
@@ -30,7 +30,7 @@ import os
 
 def processOutputs(alg):
     out = alg.getOutputValue(u"output")
-    command = u"v.out.ogr -c type=line layer=1 -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -c type=line layer=1 -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         alg.exportedLayers[out],
         os.path.dirname(out),
         os.path.basename(out)[:-4]
diff --git a/python/plugins/processing/algs/grass7/ext/v_rast_stats.py b/python/plugins/processing/algs/grass7/ext/v_rast_stats.py
index 06c6540..778a2ee 100644
--- a/python/plugins/processing/algs/grass7/ext/v_rast_stats.py
+++ b/python/plugins/processing/algs/grass7/ext/v_rast_stats.py
@@ -42,7 +42,7 @@ def processOutputs(alg):
     # We need to add the vector layer to outputs:
     out = alg.exportedLayers[alg.getParameterValue('map')]
     from_out = alg.getOutputValue('output')
-    command = u"v.out.ogr -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         out, os.path.dirname(from_out),
         os.path.splitext(os.path.basename(from_out))[0]
     )
diff --git a/python/plugins/processing/algs/grass7/ext/v_vect_stats.py b/python/plugins/processing/algs/grass7/ext/v_vect_stats.py
index 3e3ed7a..c65d650 100644
--- a/python/plugins/processing/algs/grass7/ext/v_vect_stats.py
+++ b/python/plugins/processing/algs/grass7/ext/v_vect_stats.py
@@ -42,7 +42,7 @@ def processOutputs(alg):
     # We need to add the vector layer to outputs:
     out = alg.exportedLayers[alg.getParameterValue('areas')]
     from_out = alg.getOutputValue('output')
-    command = u"v.out.ogr -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         out, os.path.dirname(from_out),
         os.path.splitext(os.path.basename(from_out))[0]
     )
diff --git a/python/plugins/processing/algs/grass7/ext/v_what_rast.py b/python/plugins/processing/algs/grass7/ext/v_what_rast.py
index 187f64c..4c04b23 100644
--- a/python/plugins/processing/algs/grass7/ext/v_what_rast.py
+++ b/python/plugins/processing/algs/grass7/ext/v_what_rast.py
@@ -46,7 +46,7 @@ def removeOutput(alg):
 def outputInput(alg):
     """Make output the initial point/polygon layer"""
     output = alg.getOutputValue(u'output')
-    command = u"v.out.ogr -c type=auto -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -c type=auto -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         alg.exportedLayers[alg.getParameterValue(u'map')],
         os.path.dirname(output),
         os.path.basename(output)[:-4]
diff --git a/python/plugins/processing/algs/grass7/ext/v_what_vect.py b/python/plugins/processing/algs/grass7/ext/v_what_vect.py
index 97ed3f0..ecc3ca6 100644
--- a/python/plugins/processing/algs/grass7/ext/v_what_vect.py
+++ b/python/plugins/processing/algs/grass7/ext/v_what_vect.py
@@ -42,7 +42,7 @@ def processOutputs(alg):
     # We need to add the vector layer to outputs:
     out = alg.exportedLayers[alg.getParameterValue('map')]
     from_out = alg.getOutputValue('output')
-    command = u"v.out.ogr -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
+    command = u"v.out.ogr --overwrite -s -e input={} output=\"{}\" format=ESRI_Shapefile output_layer={}".format(
         out, os.path.dirname(from_out),
         os.path.splitext(os.path.basename(from_out))[0]
     )
diff --git a/python/plugins/processing/algs/grass7/nviz7.py b/python/plugins/processing/algs/grass7/nviz7.py
deleted file mode 100644
index 6f9d591..0000000
--- a/python/plugins/processing/algs/grass7/nviz7.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-***************************************************************************
-    nviz7.py
-    ---------------------
-    Date                 : August 2012
-    Copyright            : (C) 2012 by Victor Olaya
-    Email                : volayaf at gmail dot com
-***************************************************************************
-*                                                                         *
-*   This program is free software; you can redistribute it and/or modify  *
-*   it under the terms of the GNU General Public License as published by  *
-*   the Free Software Foundation; either version 2 of the License, or     *
-*   (at your option) any later version.                                   *
-*                                                                         *
-***************************************************************************
-"""
-
-__author__ = 'Victor Olaya'
-__date__ = 'August 2012'
-__copyright__ = '(C) 2012, Victor Olaya'
-
-# This will get replaced with a git SHA1 when you do a git archive
-
-__revision__ = '$Format:%H$'
-
-import os
-import time
-
-from qgis.PyQt.QtGui import QIcon
-from qgis.core import QgsRasterLayer
-
-from processing.core.GeoAlgorithm import GeoAlgorithm
-from processing.core.parameters import ParameterMultipleInput
-from processing.core.parameters import ParameterExtent
-from processing.core.parameters import ParameterNumber
-from processing.core.parameters import ParameterRaster
-from .Grass7Utils import Grass7Utils
-from processing.tools.system import getNumExportedLayers
-from processing.tools import dataobjects
-
-pluginPath = os.path.normpath(os.path.join(
-    os.path.split(os.path.dirname(__file__))[0], os.pardir))
-
-
-class nviz7(GeoAlgorithm):
-
-    ELEVATION = 'ELEVATION'
-    VECTOR = 'VECTOR'
-    COLOR = 'COLOR'
-    GRASS_REGION_EXTENT_PARAMETER = 'GRASS_REGION_PARAMETER'
-    GRASS_REGION_CELLSIZE_PARAMETER = 'GRASS_REGION_CELLSIZE_PARAMETER'
-
-    def __init__(self):
-        GeoAlgorithm.__init__(self)
-        self.showInModeler = False
-
-    def getIcon(self):
-        return QIcon(os.path.join(pluginPath, 'images', 'grass.png'))
-
-    def defineCharacteristics(self):
-        self.name, self.i18n_name = self.trAlgorithm('nviz7')
-        self.group, self.i18n_group = self.trAlgorithm('Visualization(NVIZ)')
-        self.addParameter(ParameterMultipleInput(
-            nviz7.ELEVATION,
-            self.tr('Raster file(s) for elevation'),
-            ParameterMultipleInput.TYPE_RASTER, True))
-        self.addParameter(ParameterMultipleInput(
-            nviz7.VECTOR,
-            self.tr('Vector lines/areas overlay file(s)'),
-            ParameterMultipleInput.TYPE_VECTOR_ANY, True))
-        self.addParameter(ParameterMultipleInput(
-            nviz7.COLOR,
-            self.tr('Raster file(s) for color'),
-            ParameterMultipleInput.TYPE_RASTER, True))
-        self.addParameter(ParameterExtent(
-            nviz7.GRASS_REGION_EXTENT_PARAMETER,
-            self.tr('GRASS region extent')))
-        self.addParameter(ParameterNumber(
-            self.GRASS_REGION_CELLSIZE_PARAMETER,
-            self.tr('GRASS region cellsize (leave 0 for default)'),
-            0, None, 0.0))
-
-    def processAlgorithm(self, progress):
-        commands = []
-        vector = self.getParameterValue(self.VECTOR)
-        elevation = self.getParameterValue(self.ELEVATION)
-        color = self.getParameterValue(self.COLOR)
-
-        region = \
-            unicode(self.getParameterValue(self.GRASS_REGION_EXTENT_PARAMETER))
-        regionCoords = region.split(',')
-        command = 'g.region '
-        command += 'n=' + unicode(regionCoords[3])
-        command += ' s=' + unicode(regionCoords[2])
-        command += ' e=' + unicode(regionCoords[1])
-        command += ' w=' + unicode(regionCoords[0])
-        cellsize = self.getParameterValue(self.GRASS_REGION_CELLSIZE_PARAMETER)
-        if cellsize:
-            command += ' res=' + unicode(cellsize)
-        else:
-            command += ' res=' + unicode(self.getDefaultCellsize())
-        commands.append(command)
-
-        command = 'nviz7'
-        if vector:
-            layers = vector.split(';')
-            for layer in layers:
-                (cmd, newfilename) = self.exportVectorLayer(layer)
-                commands.append(cmd)
-                vector = vector.replace(layer, newfilename)
-            command += ' vector=' + vector.replace(';', ',')
-        if color:
-            layers = color.split(';')
-            for layer in layers:
-                (cmd, newfilename) = self.exportRasterLayer(layer)
-                commands.append(cmd)
-                color = color.replace(layer, newfilename)
-            command += ' color=' + color.replace(';', ',')
-        if elevation:
-            layers = elevation.split(';')
-            for layer in layers:
-                (cmd, newfilename) = self.exportRasterLayer(layer)
-                commands.append(cmd)
-                elevation = elevation.replace(layer, newfilename)
-            command += ' elevation=' + elevation.replace(';', ',')
-        if elevation is None and vector is None:
-            command += ' -q'
-        commands.append(command)
-        Grass7Utils.createTempMapset()
-        Grass7Utils.executeGrass7(commands, progress)
-
-    def getTempFilename(self):
-        filename = 'tmp' + unicode(time.time()).replace('.', '') \
-            + unicode(getNumExportedLayers())
-        return filename
-
-    def exportVectorLayer(self, layer):
-        destFilename = self.getTempFilename()
-        command = 'v.in.ogr'
-        command += ' min_area=-1'
-        command += ' input="' + os.path.dirname(layer) + '"'
-        command += ' layer=' + os.path.basename(layer)[:-4]
-        command += ' output=' + destFilename
-        command += ' --overwrite -o'
-        return (command, destFilename)
-
-    def exportRasterLayer(self, layer):
-        destFilename = self.getTempFilename()
-        command = 'r.in.gdal'
-        command += ' input="' + layer + '"'
-        command += ' band=1'
-        command += ' out=' + destFilename
-        command += ' --overwrite -o'
-        return (command, destFilename)
-
-    def getDefaultCellsize(self):
-        cellsize = 0
-        for param in self.parameters:
-            if param.value:
-                if isinstance(param, ParameterRaster):
-                    if isinstance(param.value, QgsRasterLayer):
-                        layer = param.value
-                    else:
-                        layer = dataobjects.getObjectFromUri(param.value)
-                    cellsize = max(cellsize, (layer.extent().xMaximum()
-                                              - layer.extent().xMinimum())
-                                   / layer.width())
-                elif isinstance(param, ParameterMultipleInput):
-
-                    layers = param.value.split(';')
-                    for layername in layers:
-                        layer = dataobjects.getObjectFromUri(layername)
-                        if isinstance(layer, QgsRasterLayer):
-                            cellsize = max(cellsize, (
-                                layer.extent().xMaximum()
-                                - layer.extent().xMinimum())
-                                / layer.width())
-
-        if cellsize == 0:
-            cellsize = 1
-        return cellsize
diff --git a/python/plugins/processing/algs/qgis/Clip.py b/python/plugins/processing/algs/qgis/Clip.py
index e5f8f99..fb69245 100644
--- a/python/plugins/processing/algs/qgis/Clip.py
+++ b/python/plugins/processing/algs/qgis/Clip.py
@@ -96,7 +96,7 @@ class Clip(GeoAlgorithm):
                 continue
 
             if single_clip_feature:
-                total = 100.0 / len(features) if len(features) > 0 else 1
+                total = 100.0 / len(input_features) if len(input_features) > 0 else 1
             else:
                 total = 0
 
diff --git a/python/plugins/processing/algs/qgis/PointDistance.py b/python/plugins/processing/algs/qgis/PointDistance.py
index d2e5e0e..dd89bc8 100644
--- a/python/plugins/processing/algs/qgis/PointDistance.py
+++ b/python/plugins/processing/algs/qgis/PointDistance.py
@@ -92,12 +92,15 @@ class PointDistance(GeoAlgorithm):
         nPoints = self.getParameterValue(self.NEAREST_POINTS)
 
         outputFile = self.getOutputFromName(self.DISTANCE_MATRIX)
+        self.writer = outputFile.getTableWriter([])
+
+        if inLayer.id() == targetLayer.id():
+            if nPoints > 0:
+                nPoints += 1
 
         if nPoints < 1:
             nPoints = len(vector.features(targetLayer))
 
-        self.writer = outputFile.getTableWriter([])
-
         if matType == 0:
             # Linear distance matrix
             self.linearMatrix(inLayer, inField, targetLayer, targetField,
@@ -158,33 +161,30 @@ class PointDistance(GeoAlgorithm):
 
     def regularMatrix(self, inLayer, inField, targetLayer, targetField,
                       nPoints, progress):
-        index = vector.spatialindex(targetLayer)
+        features = vector.features(inLayer)
+        total = 100.0 / len(features) if len(features) > 0 else 1
 
-        inIdx = inLayer.fieldNameIndex(inField)
+        targetIdx = targetLayer.fieldNameIndex(targetField)
 
+        first = True
         distArea = QgsDistanceArea()
+        index = vector.spatialindex(targetLayer)
 
-        first = True
-        features = vector.features(inLayer)
-        total = 100.0 / len(features) if len(features) > 0 else 1
         for current, inFeat in enumerate(features):
             inGeom = inFeat.geometry()
-            inID = unicode(inFeat.attributes()[inIdx])
-            featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
             if first:
+                featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
                 first = False
                 data = ['ID']
-                for i in range(len(featList)):
-                    data.append('DIST_{0}'.format(i + 1))
+                request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([targetIdx])
+                for f in targetLayer.getFeatures(request):
+                    data.append(unicode(f[targetField]))
                 self.writer.addRecord(data)
 
-            data = [inID]
-            for i in featList:
-                request = QgsFeatureRequest().setFilterFid(i)
-                outFeat = targetLayer.getFeatures(request).next()
-                outGeom = outFeat.geometry()
-                dist = distArea.measureLine(inGeom.asPoint(),
-                                            outGeom.asPoint())
+            data = [unicode(inFeat[inField])]
+            for f in targetLayer.getFeatures(request):
+                outGeom = f.geometry()
+                dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint())
                 data.append(unicode(float(dist)))
             self.writer.addRecord(data)
 
diff --git a/python/plugins/processing/algs/qgis/SelectByAttribute.py b/python/plugins/processing/algs/qgis/SelectByAttribute.py
index 208d436..dde2169 100644
--- a/python/plugins/processing/algs/qgis/SelectByAttribute.py
+++ b/python/plugins/processing/algs/qgis/SelectByAttribute.py
@@ -57,6 +57,7 @@ class SelectByAttribute(GeoAlgorithm):
     def defineCharacteristics(self):
         self.name, self.i18n_name = self.trAlgorithm('Select by attribute')
         self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
+        self.showInModeler = False
 
         self.i18n_operators = ['=',
                                '!=',
diff --git a/python/plugins/processing/algs/qgis/SelectByAttributeSum.py b/python/plugins/processing/algs/qgis/SelectByAttributeSum.py
index c040cb7..34b58cb 100644
--- a/python/plugins/processing/algs/qgis/SelectByAttributeSum.py
+++ b/python/plugins/processing/algs/qgis/SelectByAttributeSum.py
@@ -62,7 +62,7 @@ class SelectByAttributeSum(GeoAlgorithm):
 
         selected = layer.selectedFeaturesIds()
         if len(selected) == 0:
-            GeoAlgorithmExecutionException(
+            raise GeoAlgorithmExecutionException(
                 self.tr('There is no selection in the input layer. '
                         'Select one feature and try again.'))
 
diff --git a/python/plugins/processing/algs/qgis/SelectByExpression.py b/python/plugins/processing/algs/qgis/SelectByExpression.py
index da6a1d3..ff9ba15 100644
--- a/python/plugins/processing/algs/qgis/SelectByExpression.py
+++ b/python/plugins/processing/algs/qgis/SelectByExpression.py
@@ -44,6 +44,7 @@ class SelectByExpression(GeoAlgorithm):
     def defineCharacteristics(self):
         self.name, self.i18n_name = self.trAlgorithm('Select by expression')
         self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
+        self.showInModeler = False
 
         self.methods = [self.tr('creating new selection'),
                         self.tr('adding to current selection'),
diff --git a/python/plugins/processing/algs/qgis/SelectByLocation.py b/python/plugins/processing/algs/qgis/SelectByLocation.py
index ce14bc2..88fbb7d 100644
--- a/python/plugins/processing/algs/qgis/SelectByLocation.py
+++ b/python/plugins/processing/algs/qgis/SelectByLocation.py
@@ -57,6 +57,7 @@ class SelectByLocation(GeoAlgorithm):
     def defineCharacteristics(self):
         self.name, self.i18n_name = self.trAlgorithm('Select by location')
         self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
+        self.showInModeler = False
 
         self.methods = [self.tr('creating new selection'),
                         self.tr('adding to current selection'),
diff --git a/python/plugins/processing/algs/qgis/ZonalStatistics.py b/python/plugins/processing/algs/qgis/ZonalStatistics.py
index 2d3c61f..9c25aa4 100644
--- a/python/plugins/processing/algs/qgis/ZonalStatistics.py
+++ b/python/plugins/processing/algs/qgis/ZonalStatistics.py
@@ -226,10 +226,9 @@ class ZonalStatistics(GeoAlgorithm):
             rasterizedArray = rasterizedDS.ReadAsArray()
 
             masked = numpy.ma.MaskedArray(srcArray,
-                                          mask=numpy.logical_or.reduce((
+                                          mask=numpy.logical_or(
                                               srcArray == noData,
-                                              numpy.logical_not(rasterizedArray),
-                                              numpy.isnan(srcArray))))
+                                              numpy.logical_not(rasterizedArray)))
 
             outFeat.setGeometry(geom)
 
diff --git a/python/plugins/processing/algs/qgis/ui/FieldsMappingPanel.py b/python/plugins/processing/algs/qgis/ui/FieldsMappingPanel.py
index 1f64f72..f40d1ea 100644
--- a/python/plugins/processing/algs/qgis/ui/FieldsMappingPanel.py
+++ b/python/plugins/processing/algs/qgis/ui/FieldsMappingPanel.py
@@ -51,7 +51,7 @@ class FieldsMappingModel(QAbstractTableModel):
         (QVariant.Double, "Double"),
         (QVariant.String, "String"),
         (QVariant.DateTime, "Date"),
-        (QVariant.LongLong, "Double"),
+        (QVariant.LongLong, "Long integer"),
         (QVariant.Date, "Date")])
 
     columns = [
diff --git a/python/plugins/processing/algs/saga/SagaAlgorithm.py b/python/plugins/processing/algs/saga/SagaAlgorithm.py
index 0a5d5f4..2d220c8 100644
--- a/python/plugins/processing/algs/saga/SagaAlgorithm.py
+++ b/python/plugins/processing/algs/saga/SagaAlgorithm.py
@@ -129,18 +129,17 @@ class SagaAlgorithm(GeoAlgorithm):
                 line = lines.readline().strip('\n').strip()
             hasRaster = False
             for param in self.parameters:
-                if (isinstance(param, ParameterRaster) or 
-                    (isinstance(param, ParameterMultipleInput) 
-                        and param.type == ParameterMultipleInput.TYPE_RASTER)):
+                if (isinstance(param, ParameterRaster) or
+                    (isinstance(param, ParameterMultipleInput)
+                        and param.datatype == ParameterMultipleInput.TYPE_RASTER)):
                     hasRaster = True
-                    break;
+                    break
 
             if (not self.noResamplingChoice and hasRaster):
                 param = ParameterSelection(self.RESAMPLING, "Resampling method", ["Nearest Neighbour", "Bilinear Interpolation", "Bicubic Spline Interpolation", "B-Spline Interpolation"], 3)
                 param.isAdvanced = True
                 self.addParameter(param)
 
-
     def processAlgorithm(self, progress):
         commands = list()
         self.exportedLayers = {}
diff --git a/python/plugins/processing/algs/saga/SagaNameDecorator.py b/python/plugins/processing/algs/saga/SagaNameDecorator.py
index b150bfb..12cda07 100644
--- a/python/plugins/processing/algs/saga/SagaNameDecorator.py
+++ b/python/plugins/processing/algs/saga/SagaNameDecorator.py
@@ -155,7 +155,7 @@ algorithms = {'Add Grid Values to Points': 'Add raster values to points',
               'Threshold Buffer': 'Threshold raster buffer',
               'Transform Shapes': 'Transform vector layer',
               'Transpose Grids': 'Transpose Raster layers',
-              'Union': 'Polygon uUnion',
+              'Union': 'Polygon Union',
               'Update': 'Polygon update',
               'Upslope Area': 'Upslope Area',
               'Zonal Grid Statistics': 'Zonal raster statistics'}
diff --git a/python/plugins/processing/algs/saga/description/AddGridValuestoPoints.txt b/python/plugins/processing/algs/saga/description/AddGridValuestoPoints.txt
index 56164a8..398f940 100644
--- a/python/plugins/processing/algs/saga/description/AddGridValuestoPoints.txt
+++ b/python/plugins/processing/algs/saga/description/AddGridValuestoPoints.txt
@@ -2,6 +2,6 @@ Add Grid Values to Points
 shapes_grid
 ParameterVector|SHAPES|Points|0|False
 ParameterMultipleInput|GRIDS|Grids|3|False
-ParameterSelection|INTERPOL|Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
 OutputVector|RESULT|Result
 AllowUnmatching
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AddGridValuestoShapes.txt b/python/plugins/processing/algs/saga/description/AddGridValuestoShapes.txt
index 1795975..105992f 100644
--- a/python/plugins/processing/algs/saga/description/AddGridValuestoShapes.txt
+++ b/python/plugins/processing/algs/saga/description/AddGridValuestoShapes.txt
@@ -2,6 +2,6 @@ Add Grid Values to Shapes
 shapes_grid
 ParameterVector|SHAPES|Shapes|-1|False
 ParameterMultipleInput|GRIDS|Grids|3|False
-ParameterSelection|INTERPOL|Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
 OutputVector|RESULT|Result
 AllowUnmatching
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt b/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt
deleted file mode 100644
index e4d3201..0000000
--- a/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Distance (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Features|False
-OutputRaster|OUTPUT|Distance
-ParameterSelection|NORM|Type of distance calculation|[0] Chessboard;[1] Manhattan;[2] Euclidean| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt b/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt
deleted file mode 100644
index f67e399..0000000
--- a/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Edge Detection (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Edges
-ParameterSelection|TYPE|Detector type|[0] Canny;[1] Shen-Castan| 0
-ParameterNumber|SCALE|Operator scale| 0.000000|None| 1.000000
-ParameterNumber|THRESHOLD|Gradient threshold| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt
deleted file mode 100644
index 1c062d0..0000000
--- a/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Fourier Filter (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Output
-ParameterNumber|SCALE|Size of smoothing filter| 0.000000|None| 2.000000
-ParameterNumber|POWER|Power|None|None| 0.500000
-ParameterNumber|RANGE_MIN|Range (Min)|None|None|None
-ParameterNumber|RANGE_MAX|Range (Max)|None|None|None
-ParameterSelection|FILTER|Filter|[0] gaussian;[1] power of distance;[2] include range;[3] exclude range| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt
deleted file mode 100644
index cea405f..0000000
--- a/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Fourier Transform (Real, ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Output
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt
deleted file mode 100644
index 368f152..0000000
--- a/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Fourier Transform (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|REAL|Real
-OutputRaster|IMAG|Imaginary
-ParameterBoolean|CENTER|Centered|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt
deleted file mode 100644
index 4c93e01..0000000
--- a/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Fourier Transform Inverse (ViGrA)
-imagery_vigra
-ParameterRaster|REAL|Real|False
-ParameterRaster|IMAG|Imaginary|False
-OutputRaster|OUTPUT|Output
-ParameterBoolean|CENTER|Centered|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt b/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt
index b1bee55..8a673da 100644
--- a/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt
+++ b/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt
@@ -2,7 +2,7 @@ K-Means Clustering for Grids
 imagery_classification
 ParameterMultipleInput|GRIDS|Grids|3|False
 OutputRaster|CLUSTER|Clusters
-ParameterTable|STATISTICS|Statistics|False
+OutputTable|STATISTICS|Statistics|False
 ParameterSelection|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing| 1
 ParameterNumber|NCLUSTER|Clusters| 2|None| 10
 ParameterNumber|MAXITER|Maximum Iterations| 0|None| 0
diff --git a/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt b/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt
deleted file mode 100644
index a0bb3b0..0000000
--- a/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Morphological Filter (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Output
-ParameterSelection|TYPE|Operation|[0] Dilation;[1] Erosion;[2] Median;[3] User defined rank| 0
-ParameterNumber|RADIUS|Radius (cells)| 0|None| 1
-ParameterNumber|RANK|User defined rank| 0.000000| 1.000000| 0.500000
-ParameterBoolean|RESCALE|Rescale Values (0-255)|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridGrids).txt b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridGrids).txt
index 3263553..7c15ea0 100644
--- a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridGrids).txt
+++ b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridGrids).txt
@@ -1,15 +1,16 @@
-Multiple Regression Analysis (Grid/Grids)
+Multiple Regression Analysis (Grid and Predictor Grids)
 statistics_regression
 ParameterRaster|DEPENDENT|Dependent|False
-ParameterMultipleInput|GRIDS|Grids|3|False
-ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
-ParameterBoolean|COORD_X         |Include X Coordinate|True
-ParameterBoolean|COORD_Y         |Include Y Coordinate|True
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterBoolean|COORD_X|Include X Coordinate|True
+ParameterBoolean|COORD_Y|Include Y Coordinate|True
 ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise
-ParameterNumber|P_IN|P in|None|None|5
-ParameterNumber|P_OUT|P out|None|None|5
+ParameterNumber|P_VALUE|Significance Level|0.0|100.0|5.0
+ParameterSelection|CROSSVAL|Cross Validation|[0] None;[1] leave one out;[2] 2-fold;[3] k-fold
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples|2|None|10
 OutputRaster|REGRESSION|Regression
 OutputRaster|RESIDUALS|Residuals
 OutputTable|INFO_COEFF|Details: Coefficients
 OutputTable|INFO_MODEL|Details: Model
-OutputTable|INFO_STEPS|Details: Steps
+OutputTable|INFO_STEPS|Details: Steps
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsGrids).txt b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsGrids).txt
index c5dbbf0..4d2ef97 100644
--- a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsGrids).txt
+++ b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsGrids).txt
@@ -1,16 +1,20 @@
-Multiple Regression Analysis (Points/Grids)
+Multiple Regression Analysis (Points and Predictor Grids)
 statistics_regression
-ParameterMultipleInput|GRIDS|Grids|3|False
-ParameterVector|SHAPES|Shapes|-1|False
-ParameterTableField|ATTRIBUTE|Attribute|SHAPES|-1|False
-ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
-ParameterBoolean|COORD_X         |Include X Coordinate|True
-ParameterBoolean|COORD_Y         |Include Y Coordinate|True
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+ParameterVector|POINTS|Shapes|-1|False
+ParameterTableField|ATTRIBUTE|Attribute|POINTS|-1|False
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterBoolean|COORD_X|Include X Coordinate|True
+ParameterBoolean|COORD_Y|Include Y Coordinate|True
+ParameterBoolean|INTERCEPT|Intercept|True
 ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise
-ParameterNumber|P_IN|P in|None|None|5
-ParameterNumber|P_OUT|P out|None|None|5
+ParameterNumber|P_VALUE|Significance Level|0.0|100.0|5.0
+ParameterSelection|CROSSVAL|Cross Validation|[0] None;[1] leave one out;[2] 2-fold;[3] k-fold
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples|2|None|10
+ParameterSelection|RESIDUAL_COR|Residual Interpolation|[0] Multleve B-Spline Interpolation;[1] Inverse Distance Weighted
 OutputTable|INFO_COEFF|Details: Coefficients
 OutputTable|INFO_MODEL|Details: Model
 OutputTable|INFO_STEPS|Details: Steps
 OutputVector|RESIDUALS|Residuals
 OutputRaster|REGRESSION|Regression
+OutputRaster|REGRESCORR|Regression with Residual Correction
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/NaturalNeighbour.txt b/python/plugins/processing/algs/saga/description/NaturalNeighbour.txt
index 70353b1..83b2017 100644
--- a/python/plugins/processing/algs/saga/description/NaturalNeighbour.txt
+++ b/python/plugins/processing/algs/saga/description/NaturalNeighbour.txt
@@ -3,7 +3,7 @@ grid_gridding
 ParameterVector|SHAPES|Points|0|False
 ParameterTableField|FIELD|Attribute|SHAPES|-1|False
 Hardcoded|-TARGET_DEFINITION 0
-ParameterBoolean|SIBSON|Sibson|True
+ParameterSelection|METHOD|Method|[0] Linear;[1] Sibson;[1] Non-Sibsonian
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
 ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells
diff --git a/python/plugins/processing/algs/saga/description/OrdinaryKriging(Global).txt b/python/plugins/processing/algs/saga/description/OrdinaryKriging(Global).txt
index 9d3c71e..b5eb676 100644
--- a/python/plugins/processing/algs/saga/description/OrdinaryKriging(Global).txt
+++ b/python/plugins/processing/algs/saga/description/OrdinaryKriging(Global).txt
@@ -23,5 +23,5 @@ ParameterNumber|SEARCH_POINTS_MIN|Minimum|1|None|4
 ParameterNumber|SEARCH_POINTS_MAX|Maximum|1|None|20
 ParameterSelection|SEARCH_DIRECTION|Search Direction|[0] all directions;[1] quadrants
 ParameterMultipleInput|PREDICTORS|Predictors|3|True
-ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
-ParameterBoolean|COORDS|Coordinates|False
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterBoolean|COORDS|Coordinates|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Patching.txt b/python/plugins/processing/algs/saga/description/Patching.txt
index 6a70404..01e24f2 100644
--- a/python/plugins/processing/algs/saga/description/Patching.txt
+++ b/python/plugins/processing/algs/saga/description/Patching.txt
@@ -2,5 +2,5 @@ Patching
 grid_tools
 ParameterRaster|ORIGINAL|Grid|False
 ParameterRaster|ADDITIONAL|Patch Grid|False
-ParameterSelection|INTERPOLATION|Interpolation Method|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
-OutputRaster|COMPLETED|Completed Grid
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+OutputRaster|COMPLETED|Completed Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt b/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt
deleted file mode 100644
index ec6bf74..0000000
--- a/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Random Forest Presence Prediction (ViGrA)
-imagery_vigra
-ParameterMultipleInput|FEATURES|Features|3|False
-OutputRaster|PREDICTION|Presence Prediction
-OutputRaster|PROBABILITY|Presence Probability
-ParameterVector|PRESENCE|Presence Data|-1|False
-ParameterNumber|BACKGROUND|Background Sample Density [Percent]| 0.000000| 100.000000| 1.000000
-ParameterBoolean|DO_MRMR|Minimum Redundancy Feature Selection|False
-ParameterNumber|mRMR_NFEATURES|Number of Features| 1|None| 50
-ParameterBoolean|mRMR_DISCRETIZE|Discretization|True
-ParameterNumber|mRMR_THRESHOLD|Discretization Threshold| 0.000000|None| 1.000000
-ParameterSelection|mRMR_METHOD|Selection Method|[0] Mutual Information Difference (MID);[1] Mutual Information Quotient (MIQ)| 0
-ParameterFile|RF_IMPORT|Import from File|False|False
-ParameterFile|RF_EXPORT|Export to File|False|False
-ParameterNumber|RF_TREE_COUNT|Tree Count| 1|None| 32
-ParameterNumber|RF_TREE_SAMPLES|Samples per Tree| 0.000000| 1.000000| 1.000000
-ParameterBoolean|RF_REPLACE|Sample with Replacement|True
-ParameterNumber|RF_SPLIT_MIN_SIZE|Minimum Node Split Size| 1|None| 1
-ParameterSelection|RF_NODE_FEATURES|Features per Node|[0] logarithmic;[1] square root;[2] all| 1
-ParameterSelection|RF_STRATIFICATION|Stratification|[0] none;[1] equal;[2] proportional| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsGrid).txt b/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsGrid).txt
index fd41340..ad2a61a 100644
--- a/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsGrid).txt
+++ b/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsGrid).txt
@@ -1,9 +1,9 @@
-Regression analysis|Regression Analysis (Points/Grid)
+Regression Analysis (Points and Predictor Grid)
 statistics_regression
-ParameterRaster|GRID|Grid|False
-ParameterVector|SHAPES|Shapes|-1|False
-ParameterTableField|ATTRIBUTE|Attribute|SHAPES|-1|False
-ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterRaster|PREDICTOR|Predictor|False
+ParameterVector|POINTS|Shapes|-1|False
+ParameterTableField|ATTRIBUTE|Attribute|POINTS|-1|False
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
 ParameterSelection|METHOD|Regression Function|[0] Y = a + b * X (linear);[1] Y = a + b / X;[2] Y = a / (b - X);[3] Y = a * X^b (power);[4] Y = a e^(b * X) (exponential);[5] Y = a + b * ln(X) (logarithmic)
 OutputRaster|REGRESSION|Regression
-OutputVector|RESIDUAL|Residuals
+OutputVector|RESIDUAL|Residuals
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt b/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt
index 1e91a03..06d0f8c 100644
--- a/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt
+++ b/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt
@@ -1,9 +1,9 @@
 RiverGridGeneration
 sim_rivflow
-ParameterRaster|INPUT|Gel�ndemodell (DTM)|False
+ParameterRaster|INPUT|Gelandemodell (DTM)|False
 OutputRaster|OUTPUT|HG Raster
 ParameterNumber|SX|Abflusspfad-Quelle, x-Wert| 0|None| 0
 ParameterNumber|SY|Abflusspfad-Quelle, y-Wert| 0|None| 0
-ParameterNumber|MX|Abflusspfad-M�ndung, x-Wert| 0|None| 0
-ParameterNumber|MY|Abflusspfad-M�ndung, y-Wert| 0|None| 0
+ParameterNumber|MX|Abflusspfad-Mundung, x-Wert| 0|None| 0
+ParameterNumber|MY|Abflusspfad-Mundung, y-Wert| 0|None| 0
 ParameterBoolean|Owrite|Overwrite RiverGridCells|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt b/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt
deleted file mode 100644
index 94d3f21..0000000
--- a/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Smoothing (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Output
-ParameterSelection|TYPE|Type of smoothing|[0] exponential;[1] nonlinear;[2] gaussian| 0
-ParameterNumber|SCALE|Size of smoothing filter| 0.000000|None| 2.000000
-ParameterNumber|EDGE|Edge threshold for nonlinear smoothing| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/UniversalKriging(Global).txt b/python/plugins/processing/algs/saga/description/UniversalKriging(Global).txt
index c27e4e4..f6e1761 100644
--- a/python/plugins/processing/algs/saga/description/UniversalKriging(Global).txt
+++ b/python/plugins/processing/algs/saga/description/UniversalKriging(Global).txt
@@ -23,7 +23,7 @@ ParameterBoolean|COORD_Y|Include Y Coordinate|False
 ParameterBoolean|INTERCEPT|Intercept|True
 ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise|3
 ParameterNumber|P_VALUE|Significance Level|0|100.0|5.0
-ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
 ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global
 ParameterNumber|SEARCH_RADIUS|Maximum Search Distance|0|None|1000
 ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance
diff --git a/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt b/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt
deleted file mode 100644
index 153e254..0000000
--- a/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Watershed Segmentation (ViGrA)
-imagery_vigra
-ParameterRaster|INPUT|Input|False
-OutputRaster|OUTPUT|Segmentation
-ParameterNumber|SCALE|Width of gradient filter| 0.000000|None| 1.000000
-ParameterBoolean|RGB|RGB coded data|False
-ParameterBoolean|EDGES|Edges|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt b/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt
index c5b80b5..206e8d4 100644
--- a/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt
+++ b/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt
@@ -3,12 +3,12 @@ statistics_regression
 ParameterMultipleInput|PREDICTORS|Predictors|3|False
 ParameterVector|ZONES|Zones|-1|False
 ParameterVector|POINTS|Points|-1|False
-ParameterTable|ATTRIBUTE|Dependent Variable|False
-OutputVector|RESIDUALS|Residuals
-OutputRaster|REGRESSION|Regression
+ParameterTableField|ATTRIBUTE|Dependent Variable|POINTS|-1|False
 ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
 ParameterBoolean|COORD_X|Include X Coordinate|False
 ParameterBoolean|COORD_Y|Include Y Coordinate|False
 ParameterBoolean|INTERCEPT|Intercept|True
 ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
-ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
\ No newline at end of file
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+OutputVector|RESIDUALS|Residuals
+OutputRaster|REGRESSION|Regression
\ No newline at end of file
diff --git a/python/plugins/processing/gui/AlgorithmDialogBase.py b/python/plugins/processing/gui/AlgorithmDialogBase.py
index 8d6490f..13fe3a8 100644
--- a/python/plugins/processing/gui/AlgorithmDialogBase.py
+++ b/python/plugins/processing/gui/AlgorithmDialogBase.py
@@ -89,17 +89,22 @@ class AlgorithmDialogBase(BASE, WIDGET):
 
         isText, algHelp = self.alg.help()
         if algHelp is not None:
-            algHelp = algHelp if isText else QUrl(algHelp)
             try:
                 if isText:
                     self.txtHelp.setHtml(algHelp)
                 else:
-                    html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
-                    self.txtHelp.setHtml(html)
-                    rq = QNetworkRequest(algHelp)
-                    self.reply = QgsNetworkAccessManager.instance().get(rq)
-                    self.reply.finished.connect(self.requestFinished)
-            except Exception, e:
+                    if algHelp.startswith('http'):
+                        html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
+                        self.txtHelp.setHtml(html)
+                        rq = QNetworkRequest(QUrl(algHelp))
+                        self.reply = QgsNetworkAccessManager.instance().get(rq)
+                        self.reply.finished.connect(self.requestFinished)
+                    else:
+                        if algHelp.startswith('file://'):
+                            p = os.path.dirname(algHelp[7:])
+                            self.txtHelp.setSearchPaths([p])
+                            self.txtHelp.setSource(QUrl(algHelp))
+            except Exception as e:
                 self.tabWidget.removeTab(2)
         else:
             self.tabWidget.removeTab(2)
diff --git a/python/plugins/processing/gui/GetScriptsAndModels.py b/python/plugins/processing/gui/GetScriptsAndModels.py
index f3bbdd9..cf45863 100644
--- a/python/plugins/processing/gui/GetScriptsAndModels.py
+++ b/python/plugins/processing/gui/GetScriptsAndModels.py
@@ -194,9 +194,6 @@ class GetScriptsAndModelsDialog(BASE, WIDGET):
         else:
             reply.finished.connect(partial(loadFunction, reply))
 
-        while not reply.isFinished():
-            QCoreApplication.processEvents()
-
     def populateTree(self):
         self.uptodateItem = QTreeWidgetItem()
         self.uptodateItem.setText(0, self.tr('Installed'))
diff --git a/python/plugins/processing/gui/ParametersPanel.py b/python/plugins/processing/gui/ParametersPanel.py
index b08fac3..3a54c40 100644
--- a/python/plugins/processing/gui/ParametersPanel.py
+++ b/python/plugins/processing/gui/ParametersPanel.py
@@ -116,7 +116,7 @@ class ParametersPanel(BASE, WIDGET):
                 if isinstance(param, ParameterVector):
                     if dataobjects.canUseVectorLayer(layer, param.shapetype):
                         widget = self.valueItems[param.name]
-                        if isinstance(widget, InputLayerSelectorPanel):
+                        if isinstance(widget, InputLayerSelectorPanel) and hasattr(widget.cmbText, 'addItem'):
                             widget = widget.cmbText
                         widget.addItem(self.getExtendedLayerName(layer), layer)
         elif layer.type() == QgsMapLayer.RasterLayer and dataobjects.canUseRasterLayer(layer):
@@ -145,6 +145,12 @@ class ParametersPanel(BASE, WIDGET):
                     if isinstance(widget, InputLayerSelectorPanel):
                         widget = widget.cmbText
 
+                        if widget is not None:
+                            idx = widget.findData(layer)
+                            if idx != -1:
+                                widget.removeItem(idx)
+                            widget = None
+
         elif layer.type() == QgsMapLayer.RasterLayer:
             for param in self.alg.parameters:
                 if param.hidden:
@@ -152,10 +158,11 @@ class ParametersPanel(BASE, WIDGET):
                 if isinstance(param, ParameterRaster):
                     widget = self.valueItems[param.name].cmbText
 
-        if widget is not None:
-            idx = widget.findData(layer)
-            if idx != -1:
-                widget.removeItem(idx)
+                    if widget is not None:
+                        idx = widget.findData(layer)
+                        if idx != -1:
+                            widget.removeItem(idx)
+                        widget = None
 
         self.updateMultipleInputs()
 
diff --git a/python/plugins/processing/tools/vector.py b/python/plugins/processing/tools/vector.py
index bb58383..aa8c877 100644
--- a/python/plugins/processing/tools/vector.py
+++ b/python/plugins/processing/tools/vector.py
@@ -71,7 +71,8 @@ TYPE_MAP_MEMORY_LAYER = {
     QVariant.Int: "integer",
     QVariant.Date: "date",
     QVariant.DateTime: "datetime",
-    QVariant.Time: "time"
+    QVariant.Time: "time",
+    QVariant.LongLong: "integer"
 }
 
 TYPE_MAP_POSTGIS_LAYER = {
@@ -419,6 +420,7 @@ def checkMinDistance(point, index, distance, points):
 def _toQgsField(f):
     if isinstance(f, QgsField):
         return f
+    print f[0], f[1]
     return QgsField(f[0], TYPE_MAP.get(f[1], QVariant.String))
 
 
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index d2826c1..97ba0e2 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -116,6 +116,7 @@
 #include "qgsauthsslerrorsdialog.h"
 #endif
 #include "qgsbookmarks.h"
+#include "qgsbrowsermodel.h"
 #include "qgsbrowserdockwidget.h"
 #include "qgsadvanceddigitizingdockwidget.h"
 #include "qgsclipboard.h"
@@ -803,12 +804,14 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
   mSnappingDialog->setObjectName( "SnappingOption" );
   endProfile();
 
-  mBrowserWidget = new QgsBrowserDockWidget( tr( "Browser Panel" ), this );
+  // Create the (shared) model with delayed initialization
+  mBrowserModel = new QgsBrowserModel( this, false );
+  mBrowserWidget = new QgsBrowserDockWidget( tr( "Browser Panel" ), mBrowserModel, this );
   mBrowserWidget->setObjectName( "Browser" );
   addDockWidget( Qt::LeftDockWidgetArea, mBrowserWidget );
   mBrowserWidget->hide();
 
-  mBrowserWidget2 = new QgsBrowserDockWidget( tr( "Browser Panel (2)" ), this );
+  mBrowserWidget2 = new QgsBrowserDockWidget( tr( "Browser Panel (2)" ), mBrowserModel, this );
   mBrowserWidget2->setObjectName( "Browser2" );
   addDockWidget( Qt::LeftDockWidgetArea, mBrowserWidget2 );
   mBrowserWidget2->hide();
@@ -1147,6 +1150,7 @@ QgisApp::QgisApp()
     , mPythonUtils( nullptr )
     , mUndoWidget( nullptr )
     , mUndoDock( nullptr )
+    , mBrowserModel( nullptr )
     , mBrowserWidget( nullptr )
     , mBrowserWidget2( nullptr )
     , mAdvancedDigitizingDockWidget( nullptr )
@@ -3704,7 +3708,7 @@ bool QgisApp::askUserForZipItemLayers( QString path )
   // if 1 or 0 child found, exit so a normal item is created by gdal or ogr provider
   if ( zipItem->rowCount() <= 1 )
   {
-    delete zipItem;
+    zipItem->deleteLater();
     return false;
   }
 
@@ -3716,7 +3720,7 @@ bool QgisApp::askUserForZipItemLayers( QString path )
   // exit if promptLayers=Never
   else if ( promptLayers == 2 )
   {
-    delete zipItem;
+    zipItem->deleteLater();
     return false;
   }
   else
@@ -3785,7 +3789,7 @@ bool QgisApp::askUserForZipItemLayers( QString path )
     }
   }
 
-  delete zipItem;
+  zipItem->deleteLater();
   return ok;
 }
 
@@ -7158,7 +7162,7 @@ void QgisApp::mergeSelectedFeatures()
     if ( !isDefaultValue && !vl->fields().at( i ).convertCompatible( val ) )
     {
       messageBar()->pushMessage(
-        tr( "Invalid result" ),
+        tr( "Merge features" ),
         tr( "Could not store value '%1' in field of type %2" ).arg( attrs.at( i ).toString(), vl->fields().at( i ).typeName() ),
         QgsMessageBar::WARNING );
     }
@@ -7172,9 +7176,15 @@ void QgisApp::mergeSelectedFeatures()
     vl->deleteFeature( *feature_it );
   }
 
-  vl->addFeature( newFeature, false );
-
-  vl->endEditCommand();
+  // addFeature can fail if newFeature has no compatibile geometry
+  if ( !vl->addFeature( newFeature, false ) )
+  {
+    vl->destroyEditCommand();
+  }
+  else
+  {
+    vl->endEditCommand();
+  }
 
   if ( mapCanvas() )
   {
@@ -7529,8 +7539,14 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
     ++featureIt;
   }
 
-  pasteVectorLayer->addFeatures( features );
-  pasteVectorLayer->endEditCommand();
+  if ( !pasteVectorLayer->addFeatures( features ) )
+  {
+    pasteVectorLayer->destroyEditCommand();
+  }
+  else
+  {
+    pasteVectorLayer->endEditCommand();
+  }
 
   int nCopiedFeatures = features.count();
   if ( nCopiedFeatures == 0 )
@@ -7717,7 +7733,7 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
       feature.geometry()->convertToMultiType();
     }
   }
-  if ( ! layer->addFeatures( features, false ) || !layer->commitChanges() )
+  if ( !layer->addFeatures( features, false ) || !layer->commitChanges() )
   {
     QgsDebugMsg( "Cannot add features or commit changes" );
     delete layer;
@@ -7987,6 +8003,18 @@ void QgisApp::saveEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRep
   if ( vlayer == activeLayer() )
     mSaveRollbackInProgress = true;
 
+  // stop rendering to avoid lock in case of
+  // splilte and gpkg fix #15498
+  if ( mMapCanvas->mapSettings().layers().contains( vlayer->id() ) )
+  {
+    if ( vlayer->dataProvider()->storageType().count( "SQLite" ) ||
+         vlayer->dataProvider()->storageType().count( "GPKG" ) )
+    {
+      if ( mMapCanvas->isDrawing() )
+        mMapCanvas->stopRendering();
+    }
+  }
+
   if ( !vlayer->commitChanges() )
   {
     mSaveRollbackInProgress = false;
diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h
index cf2d3fd..9ab8c4a 100644
--- a/src/app/qgisapp.h
+++ b/src/app/qgisapp.h
@@ -82,6 +82,7 @@ class QNetworkProxy;
 class QAuthenticator;
 
 class QgsBrowserDockWidget;
+class QgsBrowserModel;
 class QgsAdvancedDigitizingDockWidget;
 class QgsSnappingDialog;
 class QgsGPSInformationWidget;
@@ -1724,6 +1725,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
     QgsUndoWidget *mUndoWidget;
     QgsDockWidget *mUndoDock;
 
+    QgsBrowserModel *mBrowserModel;
     QgsBrowserDockWidget *mBrowserWidget;
     QgsBrowserDockWidget *mBrowserWidget2;
 
diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp
index 0eac05e..cf7b3f9 100644
--- a/src/app/qgsattributetabledialog.cpp
+++ b/src/app/qgsattributetabledialog.cpp
@@ -508,10 +508,17 @@ void QgsAttributeTableDialog::runFieldCalculation( QgsVectorLayer* layer, const
   {
     QMessageBox::critical( nullptr, tr( "Error" ), tr( "An error occurred while evaluating the calculation string:\n%1" ).arg( error ) );
     mLayer->destroyEditCommand();
-    return;
   }
+  else
+  {
+    mLayer->endEditCommand();
 
-  mLayer->endEditCommand();
+    // refresh table with updated values
+    // fixes https://issues.qgis.org/issues/17312
+    QgsAttributeTableModel* masterModel = mMainView->masterModel();
+    int modelColumn = masterModel->fieldCol( fieldindex );
+    masterModel->reload( masterModel->index( 0, modelColumn ), masterModel->index( masterModel->rowCount() - 1, modelColumn ) );
+  }
 }
 
 void QgsAttributeTableDialog::replaceSearchWidget( QWidget* oldw, QWidget* neww )
diff --git a/src/app/qgsbrowserdockwidget.cpp b/src/app/qgsbrowserdockwidget.cpp
index bb23ff4..18fd3be 100644
--- a/src/app/qgsbrowserdockwidget.cpp
+++ b/src/app/qgsbrowserdockwidget.cpp
@@ -261,6 +261,18 @@ void QgsBrowserPropertiesDialog::setItem( QgsDataItem* item )
   setWindowTitle( item->type() == QgsDataItem::Layer ? tr( "Layer Properties" ) : tr( "Directory Properties" ) );
 }
 
+
+QgsBrowserDockWidget::QgsBrowserDockWidget( const QString& name, QgsBrowserModel *model, QWidget * parent )
+    : QgsDockWidget( parent )
+    , mModel( model )
+    , mProxyModel( nullptr )
+    , mPropertiesWidgetEnabled( false )
+    , mPropertiesWidgetHeight( 0 )
+{
+  init( name );
+}
+
+
 QgsBrowserDockWidget::QgsBrowserDockWidget( const QString& name, QWidget * parent )
     : QgsDockWidget( parent )
     , mModel( nullptr )
@@ -268,6 +280,12 @@ QgsBrowserDockWidget::QgsBrowserDockWidget( const QString& name, QWidget * paren
     , mPropertiesWidgetEnabled( false )
     , mPropertiesWidgetHeight( 0 )
 {
+  init( name );
+}
+
+
+void QgsBrowserDockWidget::init( const QString& name )
+{
   setupUi( this );
 
   mContents->layout()->setContentsMargins( 0, 0, 0, 0 );
@@ -324,6 +342,7 @@ QgsBrowserDockWidget::QgsBrowserDockWidget( const QString& name, QWidget * paren
   connect( mSplitter, SIGNAL( splitterMoved( int, int ) ), this, SLOT( splitterMoved() ) );
 }
 
+
 QgsBrowserDockWidget::~QgsBrowserDockWidget()
 {
   QSettings settings;
@@ -334,11 +353,20 @@ QgsBrowserDockWidget::~QgsBrowserDockWidget()
 
 void QgsBrowserDockWidget::showEvent( QShowEvent * e )
 {
-  // delayed initialization of the model
+
   if ( !mModel )
   {
     mModel = new QgsBrowserModel( mBrowserView );
+  }
 
+  // delayed initialization of the model
+  if ( !mModel->initialized( ) )
+  {
+    mModel->init();
+  }
+
+  if ( ! mProxyModel )
+  {
     connect( QgisApp::instance(), SIGNAL( newProject() ), mModel, SLOT( updateProjectHome() ) );
 
     mProxyModel = new QgsBrowserTreeFilterProxyModel( this );
diff --git a/src/app/qgsbrowserdockwidget.h b/src/app/qgsbrowserdockwidget.h
index 7005599..4efbf4f 100644
--- a/src/app/qgsbrowserdockwidget.h
+++ b/src/app/qgsbrowserdockwidget.h
@@ -105,6 +105,7 @@ class APP_EXPORT QgsBrowserDockWidget : public QgsDockWidget, private Ui::QgsBro
     Q_OBJECT
   public:
     explicit QgsBrowserDockWidget( const QString& name, QWidget *parent = nullptr );
+    explicit QgsBrowserDockWidget( const QString& name, QgsBrowserModel *model, QWidget *parent = nullptr );
     ~QgsBrowserDockWidget();
     void addFavouriteDirectory( const QString& favDir );
 
@@ -153,6 +154,7 @@ class APP_EXPORT QgsBrowserDockWidget : public QgsDockWidget, private Ui::QgsBro
     float mPropertiesWidgetHeight;
 
   private:
+    void init( const QString& name );
 };
 
 
diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp
index f766dd3..24b8a1d 100644
--- a/src/app/qgsfieldcalculator.cpp
+++ b/src/app/qgsfieldcalculator.cpp
@@ -295,7 +295,12 @@ void QgsFieldCalculator::accept()
         if ( value.canConvert< QgsGeometry >() )
         {
           QgsGeometry geom = value.value< QgsGeometry >();
-          mVectorLayer->changeGeometry( feature.id(), &geom );
+          if ( !mVectorLayer->changeGeometry( feature.id(), &geom ) )
+          {
+            calculationSuccess = false;
+            error = tr( "Can not change geometry for feature: %1", "Field calculator" ).arg( feature.id() );
+            break;
+          }
         }
       }
       else
diff --git a/src/app/qgsmaptooladdpart.cpp b/src/app/qgsmaptooladdpart.cpp
index b425ed9..3f30cfe 100644
--- a/src/app/qgsmaptooladdpart.cpp
+++ b/src/app/qgsmaptooladdpart.cpp
@@ -219,6 +219,10 @@ void QgsMapToolAddPart::cadCanvasReleaseEvent( QgsMapMouseEvent * e )
     case 6:
       errorMessage = tr( "Selected geometry could not be found" );
       break;
+
+    case 7:
+      errorMessage = tr( "Update geometry error" );
+      break;
   }
 
   emit messageEmitted( errorMessage, QgsMessageBar::WARNING );
diff --git a/src/app/qgsmaptooldeletepart.cpp b/src/app/qgsmaptooldeletepart.cpp
index 6806150..422275e 100644
--- a/src/app/qgsmaptooldeletepart.cpp
+++ b/src/app/qgsmaptooldeletepart.cpp
@@ -105,8 +105,10 @@ void QgsMapToolDeletePart::canvasReleaseEvent( QgsMapMouseEvent* e )
   if ( g->deletePart( mPressedPartNum ) )
   {
     vlayer->beginEditCommand( tr( "Part of multipart feature deleted" ) );
-    vlayer->changeGeometry( f.id(), g );
-    vlayer->endEditCommand();
+    if ( !vlayer->changeGeometry( f.id(), g ) )
+      vlayer->destroyEditCommand();
+    else
+      vlayer->endEditCommand();
     vlayer->triggerRepaint();
   }
   else
diff --git a/src/app/qgsmaptooldeletering.cpp b/src/app/qgsmaptooldeletering.cpp
index 4c241c7..105af9c 100644
--- a/src/app/qgsmaptooldeletering.cpp
+++ b/src/app/qgsmaptooldeletering.cpp
@@ -113,7 +113,11 @@ void QgsMapToolDeleteRing::canvasReleaseEvent( QgsMapMouseEvent* e )
   if ( g->deleteRing( mPressedRingNum, mPressedPartNum ) )
   {
     vlayer->beginEditCommand( tr( "Ring deleted" ) );
-    vlayer->changeGeometry( mPressedFid, g );
+    if ( !vlayer->changeGeometry( mPressedFid, g ) )
+    {
+      vlayer->destroyEditCommand();
+      return;
+    }
     vlayer->endEditCommand();
     vlayer->triggerRepaint();
   }
diff --git a/src/app/qgsmaptoolreshape.cpp b/src/app/qgsmaptoolreshape.cpp
index 6711a13..5c80c69 100644
--- a/src/app/qgsmaptoolreshape.cpp
+++ b/src/app/qgsmaptoolreshape.cpp
@@ -97,7 +97,7 @@ void QgsMapToolReshape::cadCanvasReleaseEvent( QgsMapMouseEvent * e )
       QgsGeometry* geom = f.geometry();
       if ( geom )
       {
-        reshapeReturn = geom->reshapeGeometry( points() );
+        reshapeReturn = geom->reshapeGeometry( pointsV2() );
         if ( reshapeReturn == 0 )
         {
           //avoid intersections on polygon layers
diff --git a/src/app/qgsmaptoolsimplify.cpp b/src/app/qgsmaptoolsimplify.cpp
index c03c66e..f2cfc0c 100644
--- a/src/app/qgsmaptoolsimplify.cpp
+++ b/src/app/qgsmaptoolsimplify.cpp
@@ -176,17 +176,30 @@ void QgsMapToolSimplify::storeSimplified()
   double layerTolerance = QgsTolerance::toleranceInMapUnits( mTolerance, vlayer, mCanvas->mapSettings(), mToleranceUnits );
 
   vlayer->beginEditCommand( tr( "Geometry simplified" ) );
+  bool success = true;
   Q_FOREACH ( const QgsFeature& feat, mSelectedFeatures )
   {
     if ( QgsGeometry* g = feat.constGeometry()->simplify( layerTolerance ) )
     {
-      vlayer->changeGeometry( feat.id(), g );
+      if ( !vlayer->changeGeometry( feat.id(), g ) )
+      {
+        success = false;
+      }
       delete g;
+
+      if ( !success )
+        break;
     }
   }
-  vlayer->endEditCommand();
-
-  clearSelection();
+  if ( success )
+  {
+    vlayer->endEditCommand();
+    clearSelection();
+  }
+  else
+  {
+    vlayer->destroyEditCommand();
+  }
 
   vlayer->triggerRepaint();
 }
diff --git a/src/auth/basic/qgsauthbasicmethod.cpp b/src/auth/basic/qgsauthbasicmethod.cpp
index ed66943..404c2a3 100644
--- a/src/auth/basic/qgsauthbasicmethod.cpp
+++ b/src/auth/basic/qgsauthbasicmethod.cpp
@@ -20,10 +20,13 @@
 #include "qgsauthmanager.h"
 #include "qgslogger.h"
 
+#include <QNetworkProxy>
+#include <QMutexLocker>
+
 static const QString AUTH_METHOD_KEY = "Basic";
 static const QString AUTH_METHOD_DESCRIPTION = "Basic authentication";
 
-QMap<QString, QgsAuthMethodConfig> QgsAuthBasicMethod::mAuthConfigCache = QMap<QString, QgsAuthMethodConfig>();
+QMap<QString, QgsAuthMethodConfig> QgsAuthBasicMethod::sAuthConfigCache = QMap<QString, QgsAuthMethodConfig>();
 
 
 QgsAuthBasicMethod::QgsAuthBasicMethod()
@@ -149,12 +152,13 @@ void QgsAuthBasicMethod::clearCachedConfig( const QString &authcfg )
 
 QgsAuthMethodConfig QgsAuthBasicMethod::getMethodConfig( const QString &authcfg, bool fullconfig )
 {
+  QMutexLocker locker( &mConfigMutex );
   QgsAuthMethodConfig mconfig;
 
   // check if it is cached
-  if ( mAuthConfigCache.contains( authcfg ) )
+  if ( sAuthConfigCache.contains( authcfg ) )
   {
-    mconfig = mAuthConfigCache.value( authcfg );
+    mconfig = sAuthConfigCache.value( authcfg );
     QgsDebugMsg( QString( "Retrieved config for authcfg: %1" ).arg( authcfg ) );
     return mconfig;
   }
@@ -167,6 +171,7 @@ QgsAuthMethodConfig QgsAuthBasicMethod::getMethodConfig( const QString &authcfg,
   }
 
   // cache bundle
+  locker.unlock();
   putMethodConfig( authcfg, mconfig );
 
   return mconfig;
@@ -174,15 +179,17 @@ QgsAuthMethodConfig QgsAuthBasicMethod::getMethodConfig( const QString &authcfg,
 
 void QgsAuthBasicMethod::putMethodConfig( const QString &authcfg, const QgsAuthMethodConfig& mconfig )
 {
+  QMutexLocker locker( &mConfigMutex );
   QgsDebugMsg( QString( "Putting basic config for authcfg: %1" ).arg( authcfg ) );
-  mAuthConfigCache.insert( authcfg, mconfig );
+  sAuthConfigCache.insert( authcfg, mconfig );
 }
 
 void QgsAuthBasicMethod::removeMethodConfig( const QString &authcfg )
 {
-  if ( mAuthConfigCache.contains( authcfg ) )
+  QMutexLocker locker( &mConfigMutex );
+  if ( sAuthConfigCache.contains( authcfg ) )
   {
-    mAuthConfigCache.remove( authcfg );
+    sAuthConfigCache.remove( authcfg );
     QgsDebugMsg( QString( "Removed basic config for authcfg: %1" ).arg( authcfg ) );
   }
 }
diff --git a/src/auth/basic/qgsauthbasicmethod.h b/src/auth/basic/qgsauthbasicmethod.h
index ce7e19a..cc7f194 100644
--- a/src/auth/basic/qgsauthbasicmethod.h
+++ b/src/auth/basic/qgsauthbasicmethod.h
@@ -18,6 +18,7 @@
 #define QGSAUTHBASICMETHOD_H
 
 #include <QObject>
+#include <QMutex>
 
 #include "qgsauthconfig.h"
 #include "qgsauthmethod.h"
@@ -57,7 +58,9 @@ class QgsAuthBasicMethod : public QgsAuthMethod
 
     QString escapeUserPass( const QString &theVal, QChar delim = '\'' ) const;
 
-    static QMap<QString, QgsAuthMethodConfig> mAuthConfigCache;
+    static QMap<QString, QgsAuthMethodConfig> sAuthConfigCache;
+
+    QMutex mConfigMutex;
 };
 
 #endif // QGSAUTHBASICMETHOD_H
diff --git a/src/auth/identcert/qgsauthidentcertmethod.cpp b/src/auth/identcert/qgsauthidentcertmethod.cpp
index bcef8b9..1dfe8a9 100644
--- a/src/auth/identcert/qgsauthidentcertmethod.cpp
+++ b/src/auth/identcert/qgsauthidentcertmethod.cpp
@@ -25,6 +25,7 @@
 #include <QSslConfiguration>
 #include <QSslError>
 #endif
+#include <QMutexLocker>
 
 #include "qgsauthcertutils.h"
 #include "qgsauthmanager.h"
@@ -33,7 +34,7 @@
 static const QString AUTH_METHOD_KEY = "Identity-Cert";
 static const QString AUTH_METHOD_DESCRIPTION = "Identity certificate authentication";
 
-QMap<QString, QgsPkiConfigBundle *> QgsAuthIdentCertMethod::mPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
+QMap<QString, QgsPkiConfigBundle *> QgsAuthIdentCertMethod::sPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
 
 
 QgsAuthIdentCertMethod::QgsAuthIdentCertMethod()
@@ -51,8 +52,9 @@ QgsAuthIdentCertMethod::QgsAuthIdentCertMethod()
 
 QgsAuthIdentCertMethod::~QgsAuthIdentCertMethod()
 {
-  qDeleteAll( mPkiConfigBundleCache );
-  mPkiConfigBundleCache.clear();
+  QMutexLocker locker( &mConfigMutex );
+  qDeleteAll( sPkiConfigBundleCache );
+  sPkiConfigBundleCache.clear();
 }
 
 QString QgsAuthIdentCertMethod::key() const
@@ -220,12 +222,13 @@ void QgsAuthIdentCertMethod::updateMethodConfig( QgsAuthMethodConfig &mconfig )
 
 QgsPkiConfigBundle *QgsAuthIdentCertMethod::getPkiConfigBundle( const QString &authcfg )
 {
-  QgsPkiConfigBundle * bundle = nullptr;
+  QMutexLocker locker( &mConfigMutex );
+  QgsPkiConfigBundle *bundle = nullptr;
 
   // check if it is cached
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    bundle = mPkiConfigBundleCache.value( authcfg );
+    bundle = sPkiConfigBundleCache.value( authcfg );
     if ( bundle )
     {
       QgsDebugMsg( QString( "Retrieved PKI bundle for authcfg %1" ).arg( authcfg ) );
@@ -264,6 +267,7 @@ QgsPkiConfigBundle *QgsAuthIdentCertMethod::getPkiConfigBundle( const QString &a
 
   bundle = new QgsPkiConfigBundle( mconfig, clientcert, clientkey );
 
+  locker.unlock();
   // cache bundle
   putPkiConfigBundle( authcfg, bundle );
 
@@ -272,15 +276,17 @@ QgsPkiConfigBundle *QgsAuthIdentCertMethod::getPkiConfigBundle( const QString &a
 
 void QgsAuthIdentCertMethod::putPkiConfigBundle( const QString &authcfg, QgsPkiConfigBundle *pkibundle )
 {
+  QMutexLocker locker( &mConfigMutex );
   QgsDebugMsg( QString( "Putting PKI bundle for authcfg %1" ).arg( authcfg ) );
-  mPkiConfigBundleCache.insert( authcfg, pkibundle );
+  sPkiConfigBundleCache.insert( authcfg, pkibundle );
 }
 
 void QgsAuthIdentCertMethod::removePkiConfigBundle( const QString &authcfg )
 {
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  QMutexLocker locker( &mConfigMutex );
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    QgsPkiConfigBundle * pkibundle = mPkiConfigBundleCache.take( authcfg );
+    QgsPkiConfigBundle * pkibundle = sPkiConfigBundleCache.take( authcfg );
     delete pkibundle;
     pkibundle = nullptr;
     QgsDebugMsg( QString( "Removed PKI bundle for authcfg: %1" ).arg( authcfg ) );
diff --git a/src/auth/identcert/qgsauthidentcertmethod.h b/src/auth/identcert/qgsauthidentcertmethod.h
index 1e9e6b7..1b707e3 100644
--- a/src/auth/identcert/qgsauthidentcertmethod.h
+++ b/src/auth/identcert/qgsauthidentcertmethod.h
@@ -18,6 +18,7 @@
 #define QGSAUTHIDENTCERTMETHOD_H
 
 #include <QObject>
+#include <QMutex>
 
 #include "qgsauthconfig.h"
 #include "qgsauthmethod.h"
@@ -56,7 +57,9 @@ class QgsAuthIdentCertMethod : public QgsAuthMethod
 
     void removePkiConfigBundle( const QString &authcfg );
 
-    static QMap<QString, QgsPkiConfigBundle *> mPkiConfigBundleCache;
+    static QMap<QString, QgsPkiConfigBundle *> sPkiConfigBundleCache;
+
+    QMutex mConfigMutex;
 };
 
 #endif // QGSAUTHIDENTCERTMETHOD_H
diff --git a/src/auth/pkipaths/qgsauthpkipathsmethod.cpp b/src/auth/pkipaths/qgsauthpkipathsmethod.cpp
index a9d1f5e..4c1ab57 100644
--- a/src/auth/pkipaths/qgsauthpkipathsmethod.cpp
+++ b/src/auth/pkipaths/qgsauthpkipathsmethod.cpp
@@ -25,6 +25,7 @@
 #include <QSslConfiguration>
 #include <QSslError>
 #endif
+#include <QMutexLocker>
 
 #include "qgsauthcertutils.h"
 #include "qgsauthmanager.h"
@@ -34,7 +35,7 @@
 static const QString AUTH_METHOD_KEY = "PKI-Paths";
 static const QString AUTH_METHOD_DESCRIPTION = "PKI paths authentication";
 
-QMap<QString, QgsPkiConfigBundle *> QgsAuthPkiPathsMethod::mPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
+QMap<QString, QgsPkiConfigBundle *> QgsAuthPkiPathsMethod::sPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
 
 
 QgsAuthPkiPathsMethod::QgsAuthPkiPathsMethod()
@@ -52,8 +53,9 @@ QgsAuthPkiPathsMethod::QgsAuthPkiPathsMethod()
 
 QgsAuthPkiPathsMethod::~QgsAuthPkiPathsMethod()
 {
-  qDeleteAll( mPkiConfigBundleCache );
-  mPkiConfigBundleCache.clear();
+  QMutexLocker locker( &mConfigMutex );
+  qDeleteAll( sPkiConfigBundleCache );
+  sPkiConfigBundleCache.clear();
 }
 
 QString QgsAuthPkiPathsMethod::key() const
@@ -224,12 +226,13 @@ void QgsAuthPkiPathsMethod::updateMethodConfig( QgsAuthMethodConfig &mconfig )
 
 QgsPkiConfigBundle *QgsAuthPkiPathsMethod::getPkiConfigBundle( const QString &authcfg )
 {
-  QgsPkiConfigBundle * bundle = nullptr;
+  QMutexLocker locker( &mConfigMutex );
+  QgsPkiConfigBundle *bundle = nullptr;
 
   // check if it is cached
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    bundle = mPkiConfigBundleCache.value( authcfg );
+    bundle = sPkiConfigBundleCache.value( authcfg );
     if ( bundle )
     {
       QgsDebugMsg( QString( "Retrieved PKI bundle for authcfg %1" ).arg( authcfg ) );
@@ -266,6 +269,7 @@ QgsPkiConfigBundle *QgsAuthPkiPathsMethod::getPkiConfigBundle( const QString &au
 
   bundle = new QgsPkiConfigBundle( mconfig, clientcert, clientkey );
 
+  locker.unlock();
   // cache bundle
   putPkiConfigBundle( authcfg, bundle );
 
@@ -274,15 +278,17 @@ QgsPkiConfigBundle *QgsAuthPkiPathsMethod::getPkiConfigBundle( const QString &au
 
 void QgsAuthPkiPathsMethod::putPkiConfigBundle( const QString &authcfg, QgsPkiConfigBundle *pkibundle )
 {
+  QMutexLocker locker( &mConfigMutex );
   QgsDebugMsg( QString( "Putting PKI bundle for authcfg %1" ).arg( authcfg ) );
-  mPkiConfigBundleCache.insert( authcfg, pkibundle );
+  sPkiConfigBundleCache.insert( authcfg, pkibundle );
 }
 
 void QgsAuthPkiPathsMethod::removePkiConfigBundle( const QString &authcfg )
 {
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  QMutexLocker locker( &mConfigMutex );
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    QgsPkiConfigBundle * pkibundle = mPkiConfigBundleCache.take( authcfg );
+    QgsPkiConfigBundle * pkibundle = sPkiConfigBundleCache.take( authcfg );
     delete pkibundle;
     pkibundle = nullptr;
     QgsDebugMsg( QString( "Removed PKI bundle for authcfg: %1" ).arg( authcfg ) );
diff --git a/src/auth/pkipaths/qgsauthpkipathsmethod.h b/src/auth/pkipaths/qgsauthpkipathsmethod.h
index c274b64..ad615f8 100644
--- a/src/auth/pkipaths/qgsauthpkipathsmethod.h
+++ b/src/auth/pkipaths/qgsauthpkipathsmethod.h
@@ -18,6 +18,7 @@
 #define QGSAUTHPKIPATHSMETHOD_H
 
 #include <QObject>
+#include <QMutex>
 
 #include "qgsauthconfig.h"
 #include "qgsauthmethod.h"
@@ -56,7 +57,10 @@ class QgsAuthPkiPathsMethod : public QgsAuthMethod
 
     void removePkiConfigBundle( const QString &authcfg );
 
-    static QMap<QString, QgsPkiConfigBundle *> mPkiConfigBundleCache;
+    static QMap<QString, QgsPkiConfigBundle *> sPkiConfigBundleCache;
+
+    QMutex mConfigMutex;
+
 };
 
 #endif // QGSAUTHPKIPATHSMETHOD_H
diff --git a/src/auth/pkipkcs12/qgsauthpkcs12method.cpp b/src/auth/pkipkcs12/qgsauthpkcs12method.cpp
index 87dc26f..3ab3475 100644
--- a/src/auth/pkipkcs12/qgsauthpkcs12method.cpp
+++ b/src/auth/pkipkcs12/qgsauthpkcs12method.cpp
@@ -25,6 +25,7 @@
 #include <QSslConfiguration>
 #include <QSslError>
 #endif
+#include <QMutexLocker>
 
 #include "qgsauthcertutils.h"
 #include "qgsauthmanager.h"
@@ -34,7 +35,7 @@
 static const QString AUTH_METHOD_KEY = "PKI-PKCS#12";
 static const QString AUTH_METHOD_DESCRIPTION = "PKI PKCS#12 authentication";
 
-QMap<QString, QgsPkiConfigBundle *> QgsAuthPkcs12Method::mPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
+QMap<QString, QgsPkiConfigBundle *> QgsAuthPkcs12Method::sPkiConfigBundleCache = QMap<QString, QgsPkiConfigBundle *>();
 
 
 QgsAuthPkcs12Method::QgsAuthPkcs12Method()
@@ -52,8 +53,9 @@ QgsAuthPkcs12Method::QgsAuthPkcs12Method()
 
 QgsAuthPkcs12Method::~QgsAuthPkcs12Method()
 {
-  qDeleteAll( mPkiConfigBundleCache );
-  mPkiConfigBundleCache.clear();
+  QMutexLocker locker( &mConfigMutex );
+  qDeleteAll( sPkiConfigBundleCache );
+  sPkiConfigBundleCache.clear();
 }
 
 QString QgsAuthPkcs12Method::key() const
@@ -222,12 +224,13 @@ void QgsAuthPkcs12Method::updateMethodConfig( QgsAuthMethodConfig &mconfig )
 
 QgsPkiConfigBundle *QgsAuthPkcs12Method::getPkiConfigBundle( const QString &authcfg )
 {
-  QgsPkiConfigBundle * bundle = nullptr;
+  QMutexLocker locker( &mConfigMutex );
+  QgsPkiConfigBundle *bundle = nullptr;
 
   // check if it is cached
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    bundle = mPkiConfigBundleCache.value( authcfg );
+    bundle = sPkiConfigBundleCache.value( authcfg );
     if ( bundle )
     {
       QgsDebugMsg( QString( "Retrieved PKI bundle for authcfg %1" ).arg( authcfg ) );
@@ -272,6 +275,7 @@ QgsPkiConfigBundle *QgsAuthPkcs12Method::getPkiConfigBundle( const QString &auth
 
   bundle = new QgsPkiConfigBundle( mconfig, clientcert, clientkey );
 
+  locker.unlock();
   // cache bundle
   putPkiConfigBundle( authcfg, bundle );
 
@@ -280,15 +284,17 @@ QgsPkiConfigBundle *QgsAuthPkcs12Method::getPkiConfigBundle( const QString &auth
 
 void QgsAuthPkcs12Method::putPkiConfigBundle( const QString &authcfg, QgsPkiConfigBundle *pkibundle )
 {
+  QMutexLocker locker( &mConfigMutex );
   QgsDebugMsg( QString( "Putting PKI bundle for authcfg %1" ).arg( authcfg ) );
-  mPkiConfigBundleCache.insert( authcfg, pkibundle );
+  sPkiConfigBundleCache.insert( authcfg, pkibundle );
 }
 
 void QgsAuthPkcs12Method::removePkiConfigBundle( const QString &authcfg )
 {
-  if ( mPkiConfigBundleCache.contains( authcfg ) )
+  QMutexLocker locker( &mConfigMutex );
+  if ( sPkiConfigBundleCache.contains( authcfg ) )
   {
-    QgsPkiConfigBundle * pkibundle = mPkiConfigBundleCache.take( authcfg );
+    QgsPkiConfigBundle * pkibundle = sPkiConfigBundleCache.take( authcfg );
     delete pkibundle;
     pkibundle = nullptr;
     QgsDebugMsg( QString( "Removed PKI bundle for authcfg: %1" ).arg( authcfg ) );
diff --git a/src/auth/pkipkcs12/qgsauthpkcs12method.h b/src/auth/pkipkcs12/qgsauthpkcs12method.h
index d957d91..7692363 100644
--- a/src/auth/pkipkcs12/qgsauthpkcs12method.h
+++ b/src/auth/pkipkcs12/qgsauthpkcs12method.h
@@ -18,6 +18,7 @@
 #define QGSAUTHPKCS12METHOD_H
 
 #include <QObject>
+#include <QMutex>
 
 #include "qgsauthconfig.h"
 #include "qgsauthmethod.h"
@@ -57,7 +58,9 @@ class QgsAuthPkcs12Method : public QgsAuthMethod
 
     void removePkiConfigBundle( const QString &authcfg );
 
-    static QMap<QString, QgsPkiConfigBundle *> mPkiConfigBundleCache;
+    static QMap<QString, QgsPkiConfigBundle *> sPkiConfigBundleCache;
+
+    QMutex mConfigMutex;
 };
 
 #endif // QGSAUTHPKCS12METHOD_H
diff --git a/src/core/dxf/qgsdxfexport.cpp b/src/core/dxf/qgsdxfexport.cpp
index 3d5d336..78d454d 100644
--- a/src/core/dxf/qgsdxfexport.cpp
+++ b/src/core/dxf/qgsdxfexport.cpp
@@ -524,6 +524,10 @@ int QgsDxfExport::writeToFile( QIODevice* d, const QString& encoding )
   mTextStream.setDevice( d );
   mTextStream.setCodec( encoding.toLocal8Bit() );
 
+  if ( mCrs >= 0 )
+    mMapSettings.setDestinationCrs( QgsCRSCache::instance()->crsBySrsId( mCrs ) );
+  mMapSettings.setCrsTransformEnabled( mCrs >= 0 );
+
   if ( mExtent.isEmpty() )
   {
     Q_FOREACH ( QString id, mMapSettings.layers() )
@@ -553,9 +557,6 @@ int QgsDxfExport::writeToFile( QIODevice* d, const QString& encoding )
   mFactor = 1000 * dpi / mSymbologyScaleDenominator / 25.4 * QgsUnitTypes::fromUnitToUnitFactor( mMapUnits, QGis::Meters );
   mMapSettings.setOutputSize( QSize( mExtent.width() * mFactor, mExtent.height() * mFactor ) );
   mMapSettings.setOutputDpi( dpi );
-  if ( mCrs >= 0 )
-    mMapSettings.setDestinationCrs( QgsCRSCache::instance()->crsBySrsId( mCrs ) );
-  mMapSettings.setCrsTransformEnabled( mCrs >= 0 );
 
   writeHeader( dxfEncoding( encoding ) );
   writeTables();
@@ -1002,7 +1003,7 @@ void QgsDxfExport::writeEntities()
     renderer->startRender( ctx, vl->fields() );
 
     QStringList attributes = renderer->usedAttributes();
-    int attrIdx = mLayerNameAttribute.value( vl->id(), 1 );
+    int attrIdx = mLayerNameAttribute.value( vl->id(), -1 );
     if ( vl->fields().exists( attrIdx ) )
     {
       QString layerAttr = vl->fields().at( attrIdx ).name();
diff --git a/src/core/geometry/qgsgeometry.cpp b/src/core/geometry/qgsgeometry.cpp
index f58749c..a3104f0 100644
--- a/src/core/geometry/qgsgeometry.cpp
+++ b/src/core/geometry/qgsgeometry.cpp
@@ -801,27 +801,34 @@ int QgsGeometry::splitGeometry( const QList<QgsPoint>& splitLine, QList<QgsGeome
 /** Replaces a part of this geometry with another line*/
 int QgsGeometry::reshapeGeometry( const QList<QgsPoint>& reshapeWithLine )
 {
+  QgsPointSequenceV2 reshapeLine;
+  convertPointList( reshapeWithLine, reshapeLine );
+  return reshapeGeometry( reshapeLine );
+}
+
+int QgsGeometry::reshapeGeometry( const QList<QgsPointV2>& reshapeLine )
+{
   if ( !d->geometry )
   {
     return 0;
   }
 
-  QgsPointSequenceV2 reshapeLine;
-  convertPointList( reshapeWithLine, reshapeLine );
   QgsLineStringV2 reshapeLineString;
   reshapeLineString.setPoints( reshapeLine );
-
   QgsGeos geos( d->geometry );
   int errorCode = 0;
   QgsAbstractGeometryV2* geom = geos.reshapeGeometry( reshapeLineString, &errorCode );
+
   if ( errorCode == 0 && geom )
   {
     detach( false );
-    delete d->geometry;
-    d->geometry = geom;
     removeWkbGeos();
+    d->geometry = geom;
     return 0;
   }
+
+  delete geom;
+
   return errorCode;
 }
 
diff --git a/src/core/geometry/qgsgeometry.h b/src/core/geometry/qgsgeometry.h
index 0bde341..68346de 100644
--- a/src/core/geometry/qgsgeometry.h
+++ b/src/core/geometry/qgsgeometry.h
@@ -438,6 +438,15 @@ class CORE_EXPORT QgsGeometry
      */
     int reshapeGeometry( const QList<QgsPoint>& reshapeWithLine );
 
+    /**
+     * Replaces a part of this geometry with another line with Z support
+     *
+     * @return 0 in case of success
+     *
+     * @note added in 2.18
+     */
+    int reshapeGeometry( const QList<QgsPointV2>& reshapeLine );
+
     /** Changes this geometry such that it does not intersect the other geometry
      * @param other geometry that should not be intersect
      * @return 0 in case of success
diff --git a/src/core/layertree/qgslayertreemodel.cpp b/src/core/layertree/qgslayertreemodel.cpp
index 33b04f2..60f253f 100644
--- a/src/core/layertree/qgslayertreemodel.cpp
+++ b/src/core/layertree/qgslayertreemodel.cpp
@@ -227,6 +227,12 @@ QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const
         if ( testFlag( ShowRasterPreviewIcon ) )
         {
           QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer );
+          // avoid to create preview for wms that imply a better multi thread management
+          // due to async nature of wms.
+          // The following two line of code is part of the fix of
+          // https://issues.qgis.org/issues/16803
+          if ( rlayer->providerType() == QLatin1String( "wms" ) )
+            return QgsLayerItem::iconRaster();
           return QIcon( QPixmap::fromImage( rlayer->previewAsImage( QSize( 32, 32 ) ) ) );
         }
         else
diff --git a/src/core/qgsbrowsermodel.cpp b/src/core/qgsbrowsermodel.cpp
index 41961b0..5012fe7 100644
--- a/src/core/qgsbrowsermodel.cpp
+++ b/src/core/qgsbrowsermodel.cpp
@@ -47,14 +47,14 @@ static bool cmpByDataItemName_( QgsDataItem* a, QgsDataItem* b )
   return QString::localeAwareCompare( a->name(), b->name() ) < 0;
 }
 
-QgsBrowserModel::QgsBrowserModel( QObject *parent )
+QgsBrowserModel::QgsBrowserModel( QObject *parent, bool initialize )
     : QAbstractItemModel( parent )
     , mFavourites( nullptr )
     , mProjectHome( nullptr )
+    , mInitialized( false )
 {
-  connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument & ) ), this, SLOT( updateProjectHome() ) );
-  connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument & ) ), this, SLOT( updateProjectHome() ) );
-  addRootItems();
+  if ( initialize )
+    init();
 }
 
 QgsBrowserModel::~QgsBrowserModel()
@@ -574,3 +574,14 @@ void QgsBrowserModel::hidePath( QgsDataItem *item )
     emit endRemoveRows();
   }
 }
+
+void QgsBrowserModel::init()
+{
+  if ( ! mInitialized )
+  {
+    connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument & ) ), this, SLOT( updateProjectHome() ) );
+    connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument & ) ), this, SLOT( updateProjectHome() ) );
+    addRootItems();
+    mInitialized = true;
+  }
+}
diff --git a/src/core/qgsbrowsermodel.h b/src/core/qgsbrowsermodel.h
index 2a5ff09..662cef9 100644
--- a/src/core/qgsbrowsermodel.h
+++ b/src/core/qgsbrowsermodel.h
@@ -53,7 +53,13 @@ class CORE_EXPORT QgsBrowserModel : public QAbstractItemModel
     Q_OBJECT
 
   public:
-    explicit QgsBrowserModel( QObject *parent = nullptr );
+
+    /**
+      * @brief QgsBrowserModel
+      * @param parent
+      * @param initialize immediately called init, default to true
+      */
+    explicit QgsBrowserModel( QObject *parent = nullptr , bool initialize = true );
     ~QgsBrowserModel();
 
     enum ItemDataRole
@@ -129,6 +135,12 @@ class CORE_EXPORT QgsBrowserModel : public QAbstractItemModel
     bool canFetchMore( const QModelIndex & parent ) const override;
     void fetchMore( const QModelIndex & parent ) override;
 
+    //! Returns true if the model has been initialized
+    bool initialized( ) const { return mInitialized; }
+
+    //! Delayed initialization
+    void init();
+
   signals:
     /** Emitted when item children fetch was finished */
     void stateChanged( const QModelIndex & index, QgsDataItem::State oldState );
@@ -158,6 +170,9 @@ class CORE_EXPORT QgsBrowserModel : public QAbstractItemModel
     QVector<QgsDataItem*> mRootItems;
     QgsFavouritesItem *mFavourites;
     QgsDirectoryItem *mProjectHome;
+
+  private:
+    bool mInitialized;
 };
 
 #endif // QGSBROWSERMODEL_H
diff --git a/src/core/qgsofflineediting.cpp b/src/core/qgsofflineediting.cpp
index 73e76d5..8455251 100644
--- a/src/core/qgsofflineediting.cpp
+++ b/src/core/qgsofflineediting.cpp
@@ -54,7 +54,8 @@ extern "C"
 #define PROJECT_ENTRY_SCOPE_OFFLINE "OfflineEditingPlugin"
 #define PROJECT_ENTRY_KEY_OFFLINE_DB_PATH "/OfflineDbPath"
 
-QgsOfflineEditing::QgsOfflineEditing()
+QgsOfflineEditing::QgsOfflineEditing():
+    syncError( false )
 {
   connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ), this, SLOT( layerAdded( QgsMapLayer* ) ) );
 }
@@ -261,6 +262,7 @@ void QgsOfflineEditing::synchronize()
       updateVisibilityPresets( offlineLayer, remoteLayer );
 
       // apply layer edit log
+      syncError = false;
       QString qgisLayerId = layer->id();
       QString sql = QString( "SELECT \"id\" FROM 'log_layer_ids' WHERE \"qgis_id\" = '%1'" ).arg( qgisLayerId );
       int layerId = sqlQueryInt( db, sql, -1 );
@@ -276,37 +278,49 @@ void QgsOfflineEditing::synchronize()
           QgsDebugMsgLevel( "Apply commits chronologically", 4 );
           // apply commits chronologically
           applyAttributesAdded( remoteLayer, db, layerId, i );
-          applyAttributeValueChanges( offlineLayer, remoteLayer, db, layerId, i );
-          applyGeometryChanges( remoteLayer, db, layerId, i );
+          if ( !syncError )
+            applyAttributeValueChanges( offlineLayer, remoteLayer, db, layerId, i );
+          if ( !syncError )
+            applyGeometryChanges( remoteLayer, db, layerId, i );
         }
 
-        applyFeaturesAdded( offlineLayer, remoteLayer, db, layerId );
-        applyFeaturesRemoved( remoteLayer, db, layerId );
+        if ( !syncError )
+          applyFeaturesAdded( offlineLayer, remoteLayer, db, layerId );
+        if ( !syncError )
+          applyFeaturesRemoved( remoteLayer, db, layerId );
 
-        if ( remoteLayer->commitChanges() )
+        if ( !syncError )
         {
-          // update fid lookup
-          updateFidLookup( remoteLayer, db, layerId );
-
-          // clear edit log for this layer
-          sql = QString( "DELETE FROM 'log_added_attrs' WHERE \"layer_id\" = %1" ).arg( layerId );
-          sqlExec( db, sql );
-          sql = QString( "DELETE FROM 'log_added_features' WHERE \"layer_id\" = %1" ).arg( layerId );
-          sqlExec( db, sql );
-          sql = QString( "DELETE FROM 'log_removed_features' WHERE \"layer_id\" = %1" ).arg( layerId );
-          sqlExec( db, sql );
-          sql = QString( "DELETE FROM 'log_feature_updates' WHERE \"layer_id\" = %1" ).arg( layerId );
-          sqlExec( db, sql );
-          sql = QString( "DELETE FROM 'log_geometry_updates' WHERE \"layer_id\" = %1" ).arg( layerId );
-          sqlExec( db, sql );
-
-          // reset commitNo
-          QString sql = QString( "UPDATE 'log_indices' SET 'last_index' = 0 WHERE \"name\" = 'commit_no'" );
-          sqlExec( db, sql );
+          if ( remoteLayer->commitChanges() )
+          {
+            // update fid lookup
+            updateFidLookup( remoteLayer, db, layerId );
+
+            // clear edit log for this layer
+            sql = QString( "DELETE FROM 'log_added_attrs' WHERE \"layer_id\" = %1" ).arg( layerId );
+            sqlExec( db, sql );
+            sql = QString( "DELETE FROM 'log_added_features' WHERE \"layer_id\" = %1" ).arg( layerId );
+            sqlExec( db, sql );
+            sql = QString( "DELETE FROM 'log_removed_features' WHERE \"layer_id\" = %1" ).arg( layerId );
+            sqlExec( db, sql );
+            sql = QString( "DELETE FROM 'log_feature_updates' WHERE \"layer_id\" = %1" ).arg( layerId );
+            sqlExec( db, sql );
+            sql = QString( "DELETE FROM 'log_geometry_updates' WHERE \"layer_id\" = %1" ).arg( layerId );
+            sqlExec( db, sql );
+
+            // reset commitNo
+            QString sql = QString( "UPDATE 'log_indices' SET 'last_index' = 0 WHERE \"name\" = 'commit_no'" );
+            sqlExec( db, sql );
+          }
+          else
+          {
+            showWarning( remoteLayer->commitErrors().join( "\n" ) );
+          }
         }
         else
         {
-          showWarning( remoteLayer->commitErrors().join( "\n" ) );
+          remoteLayer->rollBack();
+          showWarning( tr( "Syncronization failed" ) );
         }
       }
       else
@@ -688,7 +702,8 @@ QgsVectorLayer* QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlit
           f.geometry()->setGeometry( geom );
         }
 
-        newLayer->addFeature( f, false );
+        if ( !newLayer->addFeature( f, false ) )
+          return nullptr;
 
         emit progressUpdated( featureCount++ );
       }
@@ -762,7 +777,11 @@ void QgsOfflineEditing::applyAttributesAdded( QgsVectorLayer* remoteLayer, sqlit
     {
       QString typeName = typeNameLookup[ field.type()];
       field.setTypeName( typeName );
-      remoteLayer->addAttribute( field );
+      if ( !remoteLayer->addAttribute( field ) )
+      {
+        syncError = true;
+        return;
+      }
     }
     else
     {
@@ -830,7 +849,11 @@ void QgsOfflineEditing::applyFeaturesAdded( QgsVectorLayer* offlineLayer, QgsVec
 
     f.setAttributes( newAttrs );
 
-    remoteLayer->addFeature( f, false );
+    if ( !remoteLayer->addFeature( f, false ) )
+    {
+      syncError = true;
+      return;
+    }
 
     emit progressUpdated( i++ );
   }
@@ -847,7 +870,11 @@ void QgsOfflineEditing::applyFeaturesRemoved( QgsVectorLayer* remoteLayer, sqlit
   for ( QgsFeatureIds::const_iterator it = values.begin(); it != values.end(); ++it )
   {
     QgsFeatureId fid = remoteFid( db, layerId, *it );
-    remoteLayer->deleteFeature( fid );
+    if ( !remoteLayer->deleteFeature( fid ) )
+    {
+      syncError = true;
+      return;
+    }
 
     emit progressUpdated( i++ );
   }
@@ -866,7 +893,11 @@ void QgsOfflineEditing::applyAttributeValueChanges( QgsVectorLayer* offlineLayer
   {
     QgsFeatureId fid = remoteFid( db, layerId, values.at( i ).fid );
     QgsDebugMsgLevel( QString( "Offline changeAttributeValue %1 = %2" ).arg( QString( attrLookup[ values.at( i ).attr ] ), values.at( i ).value ), 4 );
-    remoteLayer->changeAttributeValue( fid, attrLookup[ values.at( i ).attr ], values.at( i ).value );
+    if ( !remoteLayer->changeAttributeValue( fid, attrLookup[ values.at( i ).attr ], values.at( i ).value ) )
+    {
+      syncError = true;
+      return;
+    }
 
     emit progressUpdated( i + 1 );
   }
@@ -882,7 +913,11 @@ void QgsOfflineEditing::applyGeometryChanges( QgsVectorLayer* remoteLayer, sqlit
   for ( int i = 0; i < values.size(); i++ )
   {
     QgsFeatureId fid = remoteFid( db, layerId, values.at( i ).fid );
-    remoteLayer->changeGeometry( fid, QgsGeometry::fromWkt( values.at( i ).geom_wkt ) );
+    if ( !remoteLayer->changeGeometry( fid, QgsGeometry::fromWkt( values.at( i ).geom_wkt ) ) )
+    {
+      syncError = true;
+      return;
+    }
 
     emit progressUpdated( i + 1 );
   }
diff --git a/src/core/qgsofflineediting.h b/src/core/qgsofflineediting.h
index ac1568a..abc4359 100644
--- a/src/core/qgsofflineediting.h
+++ b/src/core/qgsofflineediting.h
@@ -153,6 +153,11 @@ class CORE_EXPORT QgsOfflineEditing : public QObject
     };
     typedef QList<GeometryChange> GeometryChanges;
     GeometryChanges sqlQueryGeometryChanges( sqlite3* db, const QString& sql );
+    /**
+     * in case of sync error the flag is set to true
+     */
+    bool syncError;
+
 
   private slots:
     void layerAdded( QgsMapLayer* layer );
diff --git a/src/core/qgsvectordataprovider.cpp b/src/core/qgsvectordataprovider.cpp
index 8ec3871..432a58a 100644
--- a/src/core/qgsvectordataprovider.cpp
+++ b/src/core/qgsvectordataprovider.cpp
@@ -714,10 +714,37 @@ QgsGeometry* QgsVectorDataProvider::convertToProviderType( const QgsGeometry* ge
     outputGeom->addMValue();
   }
 
+  // remove Z if provider does not have
+  // control added to fix https://issues.qgis.org/issues/16927
+  if ( !QgsWKBTypes::hasZ( providerGeomType ) && QgsWKBTypes::hasZ( geometry->wkbType() ) )
+  {
+    if ( !outputGeom )
+    {
+      outputGeom = geometry->clone();
+    }
+    outputGeom->dropZValue();
+  }
+
+  // remove M if provider does not have
+  // control added as follow-up of https://issues.qgis.org/issues/16927
+  if ( !QgsWKBTypes::hasM( providerGeomType ) && QgsWKBTypes::hasM( geometry->wkbType() ) )
+  {
+    if ( !outputGeom )
+    {
+      outputGeom = geometry->clone();
+    }
+    outputGeom->dropMValue();
+  }
+
   if ( outputGeom )
   {
     return new QgsGeometry( outputGeom );
   }
+
+  QString msg = tr( "Geometry type %1 not compatible with provider type %2.", "not compatible geometry" )
+                .arg( QgsWKBTypes::displayString( geometry->wkbType() ) )
+                .arg( QgsWKBTypes::displayString( providerGeomType ) );
+  const_cast<QgsVectorDataProvider*>( this )->pushError( msg );
   return nullptr;
 }
 
diff --git a/src/core/qgsvectordataprovider.h b/src/core/qgsvectordataprovider.h
index fbe8bbe..83d0412 100644
--- a/src/core/qgsvectordataprovider.h
+++ b/src/core/qgsvectordataprovider.h
@@ -468,8 +468,18 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider
     /** Old-style mapping of index to name for QgsPalLabeling fix */
     QgsAttrPalIndexNameHash mAttrPalIndexName;
 
-    /** Converts the geometry to the provider type if possible / necessary
-    @return the converted geometry or nullptr if no conversion was necessary or possible*/
+    /** \brief Converts the geometry to the provider type if possible / necessary
+     * this is the list of possible modifications:
+     * - convert compoundcurve to circularstring
+     *   (possible if compoundcurve consists of one circular string)
+     * - convert to multitype if necessary
+     * - convert to curved type if necessary
+     * - convert to linear type from curved type
+     * - Add z/m 0 default values
+     * - Remove z/m
+     * \ref QgsVectorLayerEditBuffer::adaptGeometry()
+     * \param geom Geometry to convert
+     * \returns the converted geometry or nullptr if no conversion was necessary or possible*/
     QgsGeometry* convertToProviderType( const QgsGeometry* geom ) const;
 
   private:
diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp
index 70f66d6..8d6cacf 100644
--- a/src/core/qgsvectorlayer.cpp
+++ b/src/core/qgsvectorlayer.cpp
@@ -4367,14 +4367,14 @@ void QgsVectorLayer::saveStyleToDatabase( const QString& name, const QString& de
 
   QDomDocument qmlDocument, sldDocument;
   this->exportNamedStyle( qmlDocument, msgError );
-  if ( !msgError.isNull() )
+  if ( !msgError.isEmpty() )
   {
     return;
   }
   qmlStyle = qmlDocument.toString();
 
   this->exportSldStyle( sldDocument, msgError );
-  if ( !msgError.isNull() )
+  if ( !msgError.isEmpty() )
   {
     return;
   }
diff --git a/src/core/qgsvectorlayereditbuffer.cpp b/src/core/qgsvectorlayereditbuffer.cpp
index 4bb671e..fe98d4d 100644
--- a/src/core/qgsvectorlayereditbuffer.cpp
+++ b/src/core/qgsvectorlayereditbuffer.cpp
@@ -16,6 +16,7 @@
 
 #include "qgsgeometry.h"
 #include "qgslogger.h"
+#include <qgsmessagelog.h>
 #include "qgsvectorlayerundocommand.h"
 #include "qgsvectordataprovider.h"
 #include "qgsvectorlayer.h"
@@ -112,25 +113,25 @@ void QgsVectorLayerEditBuffer::updateChangedAttributes( QgsFeature &f )
   f.setAttributes( attrs );
 }
 
-
-
-
 bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
 {
-  if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures ) )
+  QgsVectorDataProvider* provider = L->dataProvider();
+
+  if ( !( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) )
   {
     return false;
   }
   if ( L->mUpdatedFields.count() != f.attributes().count() )
     return false;
 
-  // TODO: check correct geometry type
+  // if not then try to convert to a compatible geometry type
+  if ( !adaptGeometry( f.geometry() ) )
+    return false;
 
   L->undoStack()->push( new QgsVectorLayerUndoCommandAddFeature( this, f ) );
   return true;
 }
 
-
 bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
 {
   if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures ) )
@@ -138,7 +139,8 @@ bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
 
   for ( QgsFeatureList::iterator iter = features.begin(); iter != features.end(); ++iter )
   {
-    addFeature( *iter );
+    if ( !addFeature( *iter ) )
+      return false;
   }
 
   L->updateExtents();
@@ -178,6 +180,32 @@ bool QgsVectorLayerEditBuffer::deleteFeatures( const QgsFeatureIds& fids )
   return true;
 }
 
+bool QgsVectorLayerEditBuffer::adaptGeometry( QgsGeometry* geometry )
+{
+  /* this routine was introduced to fi the following issue:
+   * https://issues.qgis.org/issues/15741
+   * and later used in changeGeometry and addFeature to
+   * fix also the following issue
+   * https://issues.qgis.org/issues/16948
+   * https://issues.qgis.org/issues/15741
+   */
+  QgsVectorDataProvider* provider = L->dataProvider();
+  if ( geometry && geometry->geometry() &&
+       !geometry->isEmpty() &&
+       geometry->wkbType() != provider->geometryType() )
+  {
+    // check if provider do strict geometry control
+    // otherwise leave to the commit to rise provider errors
+    if ( provider->doesStrictFeatureTypeCheck() )
+    {
+      QgsGeometry* newGeom = provider->convertToProviderType( geometry );
+      if ( !newGeom )
+        return false;
+      geometry = newGeom;
+    }
+  }
+  return true;
+}
 
 bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* geom )
 {
@@ -194,7 +222,11 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
   else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
     return false;
 
-  // TODO: check compatible geometry
+  // if not then try to convert to a compatible geometry type
+  if ( !adaptGeometry( geom ) )
+  {
+    return false;
+  }
 
   L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, geom ) );
   return true;
@@ -302,40 +334,6 @@ bool QgsVectorLayerEditBuffer::commitChanges( QStringList& commitErrors )
   // no                 yes                   => changeAttributeValues
   // yes                yes                   => changeFeatures
 
-  // to fix https://issues.qgis.org/issues/15741
-  // first of all check if feature to add is compatible with provider type
-  // this check have to be done before all checks to avoid to clear internal
-  // buffer if some of next steps success.
-  if ( success && !mAddedFeatures.isEmpty() )
-  {
-    if ( cap & QgsVectorDataProvider::AddFeatures )
-    {
-      if ( provider->doesStrictFeatureTypeCheck() )
-      {
-        QgsFeatureMap::iterator featureIt = mAddedFeatures.begin();
-        for ( ; featureIt != mAddedFeatures.end(); ++featureIt )
-        {
-          if ( !featureIt->geometry() ||
-               featureIt->geometry()->isEmpty() ||
-               featureIt->geometry()->wkbType() == provider->geometryType() )
-            continue;
-
-          if ( !provider->convertToProviderType( featureIt->geometry() ) )
-          {
-            commitErrors << tr( "ERROR: %n feature(s) not added - geometry type is not compatible with the current layer.", "not added features count", mAddedFeatures.size() );
-            success = false;
-            break;
-          }
-        }
-      }
-    }
-    else
-    {
-      commitErrors << tr( "ERROR: %n feature(s) not added - provider doesn't support adding features.", "not added features count", mAddedFeatures.size() );
-      success = false;
-    }
-  }
-
   //
   // update geometries
   //
diff --git a/src/core/qgsvectorlayereditbuffer.h b/src/core/qgsvectorlayereditbuffer.h
index 7e0bdfc..8930b92 100644
--- a/src/core/qgsvectorlayereditbuffer.h
+++ b/src/core/qgsvectorlayereditbuffer.h
@@ -178,6 +178,19 @@ class CORE_EXPORT QgsVectorLayerEditBuffer : public QObject
 
     void updateLayerFields();
 
+    /** \brief Apply geometry modification basing on provider geometry type.
+     * Geometry is modified only if successful conversion is possible.
+     * adaptGeometry calls \ref QgsVectorDataProvider::convertToProviderType()
+     * if necessary and that apply the modifications.
+     * \param geometry pointer to the geometry that should be adapted to provider
+     * \returns bool true if success.
+     *  True: Input geometry is changed because conversion is applied or
+     *  geometry is untouched if geometry conversion is not necessary.
+     *  False: Conversion is not possible and geometry is untouched.
+     * \note added in QGIS 2.18.14
+     */
+    bool adaptGeometry( QgsGeometry* geometry );
+
   protected:
     QgsVectorLayer* L;
     friend class QgsVectorLayer;
diff --git a/src/core/qgsvectorlayereditutils.cpp b/src/core/qgsvectorlayereditutils.cpp
index ccae831..84c7537 100644
--- a/src/core/qgsvectorlayereditutils.cpp
+++ b/src/core/qgsvectorlayereditutils.cpp
@@ -50,8 +50,7 @@ bool QgsVectorLayerEditUtils::insertVertex( double x, double y, QgsFeatureId atF
 
   geometry.insertVertex( x, y, beforeVertex );
 
-  L->editBuffer()->changeGeometry( atFeatureId, &geometry );
-  return true;
+  return L->editBuffer()->changeGeometry( atFeatureId, &geometry );
 }
 
 
@@ -79,8 +78,7 @@ bool QgsVectorLayerEditUtils::moveVertex( const QgsPointV2& p, QgsFeatureId atFe
 
   geometry.moveVertex( p, atVertex );
 
-  L->editBuffer()->changeGeometry( atFeatureId, &geometry );
-  return true;
+  return L->editBuffer()->changeGeometry( atFeatureId, &geometry );
 }
 
 
@@ -115,7 +113,9 @@ QgsVectorLayer::EditResult QgsVectorLayerEditUtils::deleteVertexV2( QgsFeatureId
     geometry.setGeometry( nullptr );
   }
 
-  L->editBuffer()->changeGeometry( featureId, &geometry );
+  if ( !L->editBuffer()->changeGeometry( featureId, &geometry ) )
+    return QgsVectorLayer::EditFailed;
+
   return !geometry.isEmpty() ? QgsVectorLayer::Success : QgsVectorLayer::EmptyGeometry;
 }
 
@@ -166,7 +166,11 @@ int QgsVectorLayerEditUtils::addRing( QgsCurveV2* ring, const QgsFeatureIds& tar
     addRingReturnCode = f.geometry()->addRing( static_cast< QgsCurveV2* >( ring->clone() ) );
     if ( addRingReturnCode == 0 )
     {
-      L->editBuffer()->changeGeometry( f.id(), f.geometry() );
+      if ( !L->editBuffer()->changeGeometry( f.id(), f.geometry() ) )
+      {
+        addRingReturnCode = 5;
+        break;
+      }
       if ( modifiedFeatureId )
         *modifiedFeatureId = f.id();
 
@@ -223,7 +227,8 @@ int QgsVectorLayerEditUtils::addPart( const QgsPointSequenceV2 &points, QgsFeatu
       //convert back to single part if required by layer
       geometry.convertToSingleType();
     }
-    L->editBuffer()->changeGeometry( featureId, &geometry );
+    if ( !L->editBuffer()->changeGeometry( featureId, &geometry ) )
+      errorCode = 7; // update geometry error
   }
   return errorCode;
 }
@@ -262,7 +267,8 @@ int QgsVectorLayerEditUtils::addPart( QgsCurveV2* ring, QgsFeatureId featureId )
       //convert back to single part if required by layer
       geometry.convertToSingleType();
     }
-    L->editBuffer()->changeGeometry( featureId, &geometry );
+    if ( !L->editBuffer()->changeGeometry( featureId, &geometry ) )
+      errorCode = 7; // update geometry error
   }
   return errorCode;
 }
@@ -287,7 +293,8 @@ int QgsVectorLayerEditUtils::translateFeature( QgsFeatureId featureId, double dx
   int errorCode = geometry.translate( dx, dy );
   if ( errorCode == 0 )
   {
-    L->editBuffer()->changeGeometry( featureId, &geometry );
+    if ( !L->editBuffer()->changeGeometry( featureId, &geometry ) )
+      errorCode = 1;
   }
   return errorCode;
 }
@@ -369,7 +376,8 @@ int QgsVectorLayerEditUtils::splitFeatures( const QList<QgsPoint>& splitLine, bo
     if ( splitFunctionReturn == 0 )
     {
       //change this geometry
-      L->editBuffer()->changeGeometry( feat.id(), feat.geometry() );
+      if ( !L->editBuffer()->changeGeometry( feat.id(), feat.geometry() ) )
+        continue;
 
       //insert new features
       for ( int i = 0; i < newGeometries.size(); ++i )
@@ -424,7 +432,8 @@ int QgsVectorLayerEditUtils::splitFeatures( const QList<QgsPoint>& splitLine, bo
 
 
   //now add the new features to this vectorlayer
-  L->editBuffer()->addFeatures( newFeatures );
+  if ( !L->editBuffer()->addFeatures( newFeatures ) )
+    returnCode = 7; // "No feature split done" + "The geometry is invalid. Please repair before trying to split it."
 
   return returnCode;
 }
@@ -513,11 +522,7 @@ int QgsVectorLayerEditUtils::splitParts( const QList<QgsPoint>& splitLine, bool
       // For test only: Exception already thrown here...
       // feat.geometry()->asWkb();
 
-      if ( !addPartRet )
-      {
-        L->editBuffer()->changeGeometry( feat.id(), feat.geometry() );
-      }
-      else
+      if ( addPartRet )
       {
         // Test addPartRet
         switch ( addPartRet )
@@ -535,7 +540,11 @@ int QgsVectorLayerEditUtils::splitParts( const QList<QgsPoint>& splitLine, bool
             break;
         }
       }
-      L->editBuffer()->changeGeometry( feat.id(), feat.geometry() );
+      if ( !L->editBuffer()->changeGeometry( feat.id(), feat.geometry() ) )
+      {
+        splitFunctionReturn = 2; // value > 1 means no split and error
+        break;
+      }
 
       if ( topologicalEditing )
       {
diff --git a/src/customwidgets/qgiscustomwidgets.cpp b/src/customwidgets/qgiscustomwidgets.cpp
index 0662136..79fb799 100644
--- a/src/customwidgets/qgiscustomwidgets.cpp
+++ b/src/customwidgets/qgiscustomwidgets.cpp
@@ -25,8 +25,10 @@
 #include "qgsdoublespinboxplugin.h"
 #include "qgsexpressionbuilderwidgetplugin.h"
 #include "qgsextentgroupboxplugin.h"
+#include "qgsexternalresourcewidgetplugin.h"
 #include "qgsfieldcomboboxplugin.h"
 #include "qgsfieldexpressionwidgetplugin.h"
+#include "qgsfilewidgetplugin.h"
 #include "qgsfilterlineeditplugin.h"
 #include "qgsmaplayercomboboxplugin.h"
 #include "qgsprojectionselectionwidgetplugin.h"
@@ -49,8 +51,10 @@ QgisCustomWidgets::QgisCustomWidgets( QObject *parent )
   mWidgets.append( new QgsDoubleSpinBoxPlugin( this ) );
   mWidgets.append( new QgsExpressionBuilderWidgetPlugin( this ) );
   mWidgets.append( new QgsExtentGroupBoxPlugin( this ) );
+  mWidgets.append( new QgsExternalResourceWidgetPlugin( this ) );
   mWidgets.append( new QgsFieldComboBoxPlugin( this ) );
   mWidgets.append( new QgsFieldExpressionWidgetPlugin( this ) );
+  mWidgets.append( new QgsFileWidgetPlugin( this ) );
   mWidgets.append( new QgsFilterLineEditPlugin( this ) );
   mWidgets.append( new QgsMapLayerComboBoxPlugin( this ) );
   mWidgets.append( new QgsProjectionSelectionWidgetPlugin( this ) );
@@ -69,5 +73,3 @@ QList<QDesignerCustomWidgetInterface*> QgisCustomWidgets::customWidgets() const
 #if QT_VERSION < 0x050000
 Q_EXPORT_PLUGIN2( customwidgetsplugin, QgisCustomWidgets )
 #endif
-
-
diff --git a/src/customwidgets/qgsdockwidgetplugin.cpp b/src/customwidgets/qgsdockwidgetplugin.cpp
index ec3df1e..9b74a0b 100644
--- a/src/customwidgets/qgsdockwidgetplugin.cpp
+++ b/src/customwidgets/qgsdockwidgetplugin.cpp
@@ -91,6 +91,7 @@ QString QgsDockWidgetPlugin::domXml() const
                   "    <height>500</height>\n"
                   "   </rect>\n"
                   "  </property>\n"
+                  "  <widget class=\"QWidget\" name=\"dockWidgetContents\"/>"
                   " </widget>\n"
                   "</ui>\n" )
          .arg( name() );
diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp
index c81bd2d..80957b5 100644
--- a/src/gui/attributetable/qgsattributetablemodel.cpp
+++ b/src/gui/attributetable/qgsattributetablemodel.cpp
@@ -289,7 +289,8 @@ void QgsAttributeTableModel::attributeValueChanged( QgsFeatureId fid, int idx, c
   // No filter request: skip all possibly heavy checks
   if ( mFeatureRequest.filterType() == QgsFeatureRequest::FilterNone )
   {
-    setData( index( idToRow( fid ), fieldCol( idx ) ), value, Qt::EditRole );
+    if ( loadFeatureAtId( fid ) )
+      setData( index( idToRow( fid ), fieldCol( idx ) ), value, Qt::EditRole );
   }
   else
   {
diff --git a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
index 8b3d3d9..d3d54d3 100644
--- a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
@@ -310,6 +310,15 @@ void QgsRelationReferenceWidget::setForeignKey( const QVariant& value )
 void QgsRelationReferenceWidget::deleteForeignKey()
 {
   QVariant nullValue = QSettings().value( "qgis/nullValue", "NULL" );
+
+  // deactivate filter comboboxes
+  if ( mChainFilters && !mFilterComboBoxes.isEmpty() )
+  {
+    QComboBox *cb = mFilterComboBoxes.first();
+    cb->setCurrentIndex( 0 );
+    disableChainedComboBoxes( cb );
+  }
+
   if ( mReadOnlySelector )
   {
     QString nullText = "";
@@ -522,6 +531,13 @@ void QgsRelationReferenceWidget::init()
             mFilterCache[mFilterFields[i]][cf] << nf;
           }
         }
+
+        if ( !mFilterComboBoxes.isEmpty() )
+        {
+          QComboBox *cb = mFilterComboBoxes.first();
+          cb->setCurrentIndex( 0 );
+          disableChainedComboBoxes( cb );
+        }
       }
     }
     else
diff --git a/src/gui/editorwidgets/qgsrelationreferencewidget.h b/src/gui/editorwidgets/qgsrelationreferencewidget.h
index 0579612..e5eb7b1 100644
--- a/src/gui/editorwidgets/qgsrelationreferencewidget.h
+++ b/src/gui/editorwidgets/qgsrelationreferencewidget.h
@@ -179,8 +179,8 @@ class GUI_EXPORT QgsRelationReferenceWidget : public QWidget
     QgsMessageBarItem* mMessageBarItem;
     QString mRelationName;
     QgsAttributeForm* mReferencedAttributeForm;
-    QgsVectorLayer* mReferencedLayer;
-    QgsVectorLayer* mReferencingLayer;
+    QPointer<QgsVectorLayer> mReferencedLayer;
+    QPointer<QgsVectorLayer> mReferencingLayer;
     QgsAttributeTableModel* mMasterModel;
     QgsAttributeTableFilterModel* mFilterModel;
     QgsFeatureListModel* mFeatureListModel;
diff --git a/src/gui/qgsmaptoolcapture.cpp b/src/gui/qgsmaptoolcapture.cpp
index 41108a2..0b0f421 100644
--- a/src/gui/qgsmaptoolcapture.cpp
+++ b/src/gui/qgsmaptoolcapture.cpp
@@ -722,6 +722,13 @@ QList<QgsPoint> QgsMapToolCapture::points()
   return points;
 }
 
+QgsPointSequenceV2 QgsMapToolCapture::pointsV2()
+{
+  QgsPointSequenceV2 pts;
+  mCaptureCurve.points( pts );
+  return pts;
+}
+
 void QgsMapToolCapture::setPoints( const QList<QgsPoint>& pointList )
 {
   QgsPointSequenceV2 pts;
diff --git a/src/gui/qgsmaptoolcapture.h b/src/gui/qgsmaptoolcapture.h
index 2cb469b..1cc26b0 100644
--- a/src/gui/qgsmaptoolcapture.h
+++ b/src/gui/qgsmaptoolcapture.h
@@ -195,6 +195,15 @@ class GUI_EXPORT QgsMapToolCapture : public QgsMapToolAdvancedDigitizing
     QList<QgsPoint> points();
 
     /**
+     * List of digitized points with z support
+     *
+     * @return List of points
+     *
+     * @note added in 2.18
+     */
+    QgsPointSequenceV2 pointsV2();
+
+    /**
      * Set the points on which to work
      *
      * @param pointList A list of points
diff --git a/src/gui/qgsrelationeditorwidget.cpp b/src/gui/qgsrelationeditorwidget.cpp
index 233ce25..3aedf53 100644
--- a/src/gui/qgsrelationeditorwidget.cpp
+++ b/src/gui/qgsrelationeditorwidget.cpp
@@ -379,6 +379,7 @@ void QgsRelationEditorWidget::linkFeature()
         newFeatures << linkFeature;
       }
 
+      // TODO: what to do in case of addFeature fail?
       mRelation.referencingLayer()->addFeatures( newFeatures );
 
       updateUi();
diff --git a/src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp b/src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp
index bc99e02..e10de3e 100644
--- a/src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp
+++ b/src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp
@@ -363,6 +363,11 @@ void QgsSingleBandPseudoColorRendererWidget::on_mClassifyButton_clicked()
   double min = lineEditValue( mMinLineEdit );
   double max = lineEditValue( mMaxLineEdit );
 
+  if ( qIsNaN( min ) || qIsNaN( max ) )
+  {
+    return;
+  }
+
   QScopedPointer< QgsVectorColorRampV2 > colorRamp( mColorRampComboBox->currentColorRamp() );
 
   if ( mClassificationModeComboBox->itemData( mClassificationModeComboBox->currentIndex() ).toInt() == Continuous )
diff --git a/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp b/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
index 964471c..0c8a482 100644
--- a/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
+++ b/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
@@ -272,7 +272,11 @@ bool QgsGeometryCheckerResultTab::exportErrorsDo( const QString& file )
     f.setAttribute( fieldFeatureId, error->featureId() );
     f.setAttribute( fieldErrDesc, error->description() );
     f.setGeometry( new QgsGeometry( error->location().clone() ) );
-    layer->dataProvider()->addFeatures( QgsFeatureList() << f );
+    if ( !layer->dataProvider()->addFeatures( QgsFeatureList() << f ) )
+    {
+      delete layer;
+      return false;
+    }
   }
 
   // Remove existing layer with same uri
diff --git a/src/plugins/geometry_checker/ui/qgsgeometrycheckersetuptab.cpp b/src/plugins/geometry_checker/ui/qgsgeometrycheckersetuptab.cpp
index ffd8325..facdf04 100644
--- a/src/plugins/geometry_checker/ui/qgsgeometrycheckersetuptab.cpp
+++ b/src/plugins/geometry_checker/ui/qgsgeometrycheckersetuptab.cpp
@@ -248,7 +248,11 @@ void QgsGeometryCheckerSetupTab::runChecks()
           features.append( feature );
         }
       }
-      newlayer->dataProvider()->addFeatures( features );
+      if ( !newlayer->dataProvider()->addFeatures( features ) )
+      {
+        QMessageBox::critical( this, tr( "Populate output Layer" ), tr( "Can not add features to output layer: %1." ).arg( filename ) );
+        return;
+      }
 
       // Set selected features
       newlayer->selectByIds( selectedFeatures );
diff --git a/src/providers/gdal/qgsgdaldataitems.cpp b/src/providers/gdal/qgsgdaldataitems.cpp
index 68755ee..655db3d 100644
--- a/src/providers/gdal/qgsgdaldataitems.cpp
+++ b/src/providers/gdal/qgsgdaldataitems.cpp
@@ -259,13 +259,13 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
       // do not print errors, but write to debug
       CPLPushErrorHandler( CPLQuietErrorHandler );
       CPLErrorReset();
-      if ( ! GDALIdentifyDriver( TO8F( thePath ), nullptr ) )
+      GDALDriverH hDriver = GDALIdentifyDriver( TO8F( thePath ), nullptr );
+      CPLPopErrorHandler();
+      if ( !hDriver || GDALGetDriverShortName( hDriver ) == QString( "OGR_VRT" ) )
       {
         QgsDebugMsgLevel( "Skipping VRT file because root is not a GDAL VRT", 2 );
-        CPLPopErrorHandler();
         return nullptr;
       }
-      CPLPopErrorHandler();
     }
     // add the item
     QStringList sublayers;
diff --git a/src/providers/ogr/qgsogrfeatureiterator.cpp b/src/providers/ogr/qgsogrfeatureiterator.cpp
index d4849bd..f49acb6 100644
--- a/src/providers/ogr/qgsogrfeatureiterator.cpp
+++ b/src/providers/ogr/qgsogrfeatureiterator.cpp
@@ -152,6 +152,7 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool
     OGR_L_SetAttributeFilter( ogrLayer, nullptr );
   }
 
+
   //start with first feature
   rewind();
 }
@@ -172,23 +173,28 @@ bool QgsOgrFeatureIterator::nextFeatureFilterExpression( QgsFeature& f )
 bool QgsOgrFeatureIterator::fetchFeatureWithId( QgsFeatureId id, QgsFeature& feature ) const
 {
   feature.setValid( false );
-  OGRFeatureH fet;
+  OGRFeatureH fet = 0;
   if ( mOrigFidAdded )
   {
     OGR_L_ResetReading( ogrLayer );
-    while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
+    OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer );
+    int lastField = OGR_FD_GetFieldCount( fdef ) - 1;
+    if ( lastField >= 0 )
     {
-      if (
+      while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) )
+      {
+        if (
 #if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 2000000
-        OGR_F_GetFieldAsInteger64
+          OGR_F_GetFieldAsInteger64
 #else
-        OGR_F_GetFieldAsInteger
+          OGR_F_GetFieldAsInteger
 #endif
-        ( fet, 0 ) == FID_TO_NUMBER( id ) )
-      {
-        break;
+          ( fet, lastField ) == FID_TO_NUMBER( id ) )
+        {
+          break;
+        }
+        OGR_F_Destroy( fet );
       }
-      OGR_F_Destroy( fet );
     }
   }
   else
@@ -322,11 +328,16 @@ bool QgsOgrFeatureIterator::readFeature( OGRFeatureH fet, QgsFeature& feature )
 {
   if ( mOrigFidAdded )
   {
+    OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer );
+    int lastField = OGR_FD_GetFieldCount( fdef ) - 1;
+    if ( lastField >= 0 )
 #if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 2000000
-    feature.setFeatureId( OGR_F_GetFieldAsInteger64( fet, 0 ) );
+      feature.setFeatureId( OGR_F_GetFieldAsInteger64( fet, lastField ) );
 #else
-    feature.setFeatureId( OGR_F_GetFieldAsInteger( fet, 0 ) );
+      feature.setFeatureId( OGR_F_GetFieldAsInteger( fet, lastField ) );
 #endif
+    else
+      feature.setFeatureId( OGR_F_GetFID( fet ) );
   }
   else
   {
diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp
index f6c53b7..9be2a3d 100644
--- a/src/providers/ogr/qgsogrprovider.cpp
+++ b/src/providers/ogr/qgsogrprovider.cpp
@@ -95,6 +95,8 @@ class QgsCPLErrorHandler
     }
 };
 
+static const QByteArray ORIG_OGC_FID = "orig_ogc_fid";
+
 
 bool QgsOgrProvider::convertField( QgsField &field, const QTextCodec &encoding )
 {
@@ -1030,7 +1032,11 @@ void QgsOgrProviderUtils::setRelevantFields( OGRLayerH ogrLayer, int fieldCount,
       if ( !fetchAttributes.contains( i ) )
       {
         // add to ignored fields
-        ignoredFields.append( OGR_Fld_GetNameRef( OGR_FD_GetFieldDefn( featDefn, firstAttrIsFid ? i - 1 : i ) ) );
+        const char *fieldName = OGR_Fld_GetNameRef( OGR_FD_GetFieldDefn( featDefn, firstAttrIsFid ? i - 1 : i ) );
+        if ( qstrcmp( fieldName, ORIG_OGC_FID ) != 0 )
+        {
+          ignoredFields.append( fieldName );
+        }
       }
     }
 
@@ -1174,7 +1180,7 @@ const QgsFields & QgsOgrProvider::fields() const
 }
 
 
-//TODO - add sanity check for shape file layers, to include cheking to
+//TODO - add sanity check for shape file layers, to include checking to
 //       see if the .shp, .dbf, .shx files are all present and the layer
 //       actually has features
 bool QgsOgrProvider::isValid()
@@ -2396,7 +2402,7 @@ QString createFilters( QString type )
       {
         myDirectoryDrivers += QObject::tr( "U.S. Census TIGER/Line" ) + ",TIGER;";
       }
-      else if ( driverName.startsWith( "VRT" ) )
+      else if ( driverName.contains( "VRT" ) ) // match both GDAL 1.x "VRT" and GDAL 2.x "OGR_VRT"
       {
         myFileFilters += createFileFilter_( QObject::tr( "VRT - Virtual Datasource" ),
                                             "*.vrt *.ovf" );
@@ -3443,34 +3449,60 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
       layerName = encoding->fromUnicode( modifiedLayerName );
     }
   }
-  QByteArray sql;
-  if ( subsetString.startsWith( "SELECT ", Qt::CaseInsensitive ) )
-    sql = encoding->fromUnicode( subsetString );
+  OGRLayerH subsetLayer = 0;
+  if ( subsetString.startsWith( QLatin1String( "SELECT " ), Qt::CaseInsensitive ) )
+  {
+    QByteArray sql = encoding->fromUnicode( subsetString );
+
+    QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
+    subsetLayer = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
+  }
   else
   {
+    QByteArray sqlPart1 = "SELECT *";
+    QByteArray sqlPart3 = " FROM " + quotedIdentifier( layerName, ogrDriverName )
+                          + " WHERE " + encoding->fromUnicode( subsetString );
+
+    origFidAddAttempted = true;
+
     QByteArray fidColumn = OGR_L_GetFIDColumn( layer );
+    // Fallback to FID if OGR_L_GetFIDColumn returns nothing
+    if ( fidColumn.isEmpty() )
+    {
+      fidColumn = "FID";
+    }
+
+    QByteArray sql = sqlPart1 + ", " + fidColumn + " as " + ORIG_OGC_FID + sqlPart3;
+    QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
+    subsetLayer = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
 
-    sql = QByteArray( "SELECT " );
-    if ( !fidColumn.isEmpty() )
+    // See https://lists.osgeo.org/pipermail/qgis-developer/2017-September/049802.html
+    // If execute SQL fails because it did not find the fidColumn, retry with hardcoded FID
+    if ( !subsetLayer )
     {
-      sql += fidColumn + " as orig_ogc_fid, ";
-      origFidAddAttempted = true;
+      QByteArray sql = sqlPart1 + ", " + "FID as " + ORIG_OGC_FID + sqlPart3;
+      QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
+      subsetLayer = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
+    }
+    // If that also fails, just continue without the orig_ogc_fid
+    if ( !subsetLayer )
+    {
+      QByteArray sql = sqlPart1 + sqlPart3;
+      QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
+      subsetLayer = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
+      origFidAddAttempted = false;
     }
-    sql += "* FROM " + quotedIdentifier( layerName, ogrDriverName );
-    sql += " WHERE " + encoding->fromUnicode( subsetString );
   }
 
-  QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
-  OGRLayerH subsetLayer = OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );
-
-  // Check if first column is orig_ogc_fid
+  // Check if last column is orig_ogc_fid
   if ( origFidAddAttempted && subsetLayer )
   {
     OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( subsetLayer );
-    if ( OGR_FD_GetFieldCount( fdef ) > 0 )
+    int fieldCount = OGR_FD_GetFieldCount( fdef );
+    if ( fieldCount > 0 )
     {
-      OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, 0 );
-      origFidAdded = qstrcmp( OGR_Fld_GetNameRef( fldDef ), "orig_ogc_fid" ) == 0;
+      OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, fieldCount - 1 );
+      origFidAdded = qstrcmp( OGR_Fld_GetNameRef( fldDef ), ORIG_OGC_FID ) == 0;
     }
   }
 
diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp
index 65bc445..c46d362 100644
--- a/src/providers/postgres/qgspostgresconn.cpp
+++ b/src/providers/postgres/qgspostgresconn.cpp
@@ -956,7 +956,7 @@ QString QgsPostgresConn::quotedValue( const QVariant& value )
   }
 }
 
-PGresult *QgsPostgresConn::PQexec( const QString& query, bool logError )
+PGresult *QgsPostgresConn::PQexec( const QString& query, bool logError ) const
 {
   if ( PQstatus() != CONNECTION_OK )
   {
@@ -1138,13 +1138,13 @@ void QgsPostgresConn::PQfinish()
   mConn = nullptr;
 }
 
-int QgsPostgresConn::PQstatus()
+int QgsPostgresConn::PQstatus() const
 {
   Q_ASSERT( mConn );
   return ::PQstatus( mConn );
 }
 
-QString QgsPostgresConn::PQerrorMessage()
+QString QgsPostgresConn::PQerrorMessage() const
 {
   Q_ASSERT( mConn );
   return QString::fromUtf8( ::PQerrorMessage( mConn ) );
@@ -1795,3 +1795,21 @@ bool QgsPostgresConn::cancel()
 
   return res == 0;
 }
+
+QString QgsPostgresConn::currentDatabase() const
+{
+  QString database;
+  QString sql = "SELECT current_database()";
+  QgsPostgresResult res( PQexec( sql ) );
+
+  if ( res.PQresultStatus() == PGRES_TUPLES_OK )
+  {
+    database = res.PQgetvalue( 0, 0 );
+  }
+  else
+  {
+    QgsMessageLog::logMessage( tr( "SQL:%1\nresult:%2\nerror:%3\n" ).arg( sql ).arg( res.PQresultStatus() ).arg( res.PQresultErrorMessage() ), tr( "PostGIS" ) );
+  }
+
+  return database;
+}
diff --git a/src/providers/postgres/qgspostgresconn.h b/src/providers/postgres/qgspostgresconn.h
index 264eb99..ad49df4 100644
--- a/src/providers/postgres/qgspostgresconn.h
+++ b/src/providers/postgres/qgspostgresconn.h
@@ -244,11 +244,11 @@ class QgsPostgresConn : public QObject
     //
 
     // run a query and check for errors
-    PGresult *PQexec( const QString& query, bool logError = true );
+    PGresult *PQexec( const QString& query, bool logError = true ) const;
     void PQfinish();
-    QString PQerrorMessage();
+    QString PQerrorMessage() const;
     int PQsendQuery( const QString& query );
-    int PQstatus();
+    int PQstatus() const;
     PGresult *PQgetResult();
     PGresult *PQprepare( const QString& stmtName, const QString& query, int nParams, const Oid *paramTypes );
     PGresult *PQexecPrepared( const QString& stmtName, const QStringList &params );
@@ -310,6 +310,13 @@ class QgsPostgresConn : public QObject
 
     QString connInfo() const { return mConnInfo; }
 
+    /**
+     * Returns the underlying database.
+     *
+     * @since QGIS 2.18
+     */
+    QString currentDatabase() const;
+
     static const int sGeomTypeSelectLimit;
 
     static QString displayStringForWkbType( QGis::WkbType wkbType );
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index 1f73aa6..c3c0f94 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -4073,6 +4073,11 @@ QGISEXTERN bool saveStyle( const QString& uri, const QString& qmlStyle, const QS
     }
   }
 
+  if ( dsUri.database().isEmpty() ) // typically when a service file is used
+  {
+    dsUri.setDatabase( conn->currentDatabase() );
+  }
+
   QString uiFileColumn;
   QString uiFileValue;
   if ( !uiFileContent.isEmpty() )
@@ -4199,6 +4204,11 @@ QGISEXTERN QString loadStyle( const QString& uri, QString& errCause )
     return "";
   }
 
+  if ( dsUri.database().isEmpty() ) // typically when a service file is used
+  {
+    dsUri.setDatabase( conn->currentDatabase() );
+  }
+
   QString selectQmlQuery = QString( "SELECT styleQML"
                                     " FROM layer_styles"
                                     " WHERE f_table_catalog=%1"
@@ -4232,6 +4242,11 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na
     return -1;
   }
 
+  if ( dsUri.database().isEmpty() ) // typically when a service file is used
+  {
+    dsUri.setDatabase( conn->currentDatabase() );
+  }
+
   QString selectRelatedQuery = QString( "SELECT id,styleName,description"
                                         " FROM layer_styles"
                                         " WHERE f_table_catalog=%1"
diff --git a/src/providers/wfs/qgswfsdataitems.cpp b/src/providers/wfs/qgswfsdataitems.cpp
index 926723e..b92c5a3 100644
--- a/src/providers/wfs/qgswfsdataitems.cpp
+++ b/src/providers/wfs/qgswfsdataitems.cpp
@@ -32,7 +32,7 @@ QgsWFSLayerItem::QgsWFSLayerItem( QgsDataItem* parent, QString name, const QgsDa
 {
   QSettings settings;
   bool useCurrentViewExtent = settings.value( "/Windows/WFSSourceSelect/FeatureCurrentViewExtent", true ).toBool();
-  mUri = QgsWFSDataSourceURI::build( uri.uri(), featureType, crsString, QString(), useCurrentViewExtent );
+  mUri = QgsWFSDataSourceURI::build( uri.uri( false ), featureType, crsString, QString(), useCurrentViewExtent );
   setState( Populated );
   mIconName = "mIconConnect.png";
 }
@@ -146,7 +146,7 @@ QVector<QgsDataItem*> QgsWFSRootItem::createChildren()
   {
     QgsWFSConnection connection( connName );
     QString path = "wfs:/" + connName;
-    QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, path, connection.uri().uri() );
+    QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, path, connection.uri().uri( false ) );
     connections.append( conn );
   }
   return connections;
@@ -213,7 +213,7 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
     if ( QgsWFSConnection::connectionList().contains( connectionName ) )
     {
       QgsWFSConnection connection( connectionName );
-      return new QgsWFSConnectionItem( parentItem, "WFS", thePath, connection.uri().uri() );
+      return new QgsWFSConnectionItem( parentItem, "WFS", thePath, connection.uri().uri( false ) );
     }
   }
 
diff --git a/src/providers/wms/qgstilecache.cpp b/src/providers/wms/qgstilecache.cpp
index 2cc94ef..42c690f 100644
--- a/src/providers/wms/qgstilecache.cpp
+++ b/src/providers/wms/qgstilecache.cpp
@@ -33,10 +33,11 @@ void QgsTileCache::insertTile( const QUrl& url, const QImage& image )
 bool QgsTileCache::tile( const QUrl& url, QImage& image )
 {
   QMutexLocker locker( &sTileCacheMutex );
-  if ( QImage* i = sTileCache.object( url ) )
+  bool success = false;
+  if ( QImage *i = sTileCache.object( url ) )
   {
     image = *i;
-    return true;
+    success = true;
   }
   else if ( QgsNetworkAccessManager::instance()->cache()->metaData( url ).isValid() )
   {
@@ -48,10 +49,13 @@ bool QgsTileCache::tile( const QUrl& url, QImage& image )
       image = QImage::fromData( imageData );
 
       // cache it as well (mutex is already locked)
-      sTileCache.insert( url, new QImage( image ) );
-
-      return true;
+      // Check for null because it could be a redirect (see: https://issues.qgis.org/issues/16427 )
+      if ( ! image.isNull( ) )
+      {
+        sTileCache.insert( url, new QImage( image ) );
+        success = true;
+      }
     }
   }
-  return false;
+  return success;
 }
diff --git a/src/providers/wms/qgswmscapabilities.h b/src/providers/wms/qgswmscapabilities.h
index f219a10..4083401 100644
--- a/src/providers/wms/qgswmscapabilities.h
+++ b/src/providers/wms/qgswmscapabilities.h
@@ -501,12 +501,12 @@ struct QgsWmsAuthorization
     {
       return QgsAuthManager::instance()->updateNetworkRequest( request, mAuthCfg );
     }
-    else if ( !mUserName.isNull() || !mPassword.isNull() )
+    else if ( !mUserName.isEmpty() || !mPassword.isEmpty() )
     {
       request.setRawHeader( "Authorization", "Basic " + QString( "%1:%2" ).arg( mUserName, mPassword ).toAscii().toBase64() );
     }
 
-    if ( !mReferer.isNull() )
+    if ( !mReferer.isEmpty() )
     {
       request.setRawHeader( "Referer", QString( "%1" ).arg( mReferer ).toAscii() );
     }
diff --git a/tests/src/core/testqgstracer.cpp b/tests/src/core/testqgstracer.cpp
index 01c8c22..279f2e5 100644
--- a/tests/src/core/testqgstracer.cpp
+++ b/tests/src/core/testqgstracer.cpp
@@ -59,9 +59,9 @@ static QgsFeature make_feature( const QString& wkt )
   return f;
 }
 
-static QgsVectorLayer* make_layer( const QStringList& wkts )
+static QgsVectorLayer* make_layer( const QStringList& wkts, const QString& type = "LineString" )
 {
-  QgsVectorLayer* vl = new QgsVectorLayer( "LineString", "x", "memory" );
+  QgsVectorLayer* vl = new QgsVectorLayer( type, "x", "memory" );
   Q_ASSERT( vl->isValid() );
 
   vl->startEditing();
@@ -163,7 +163,7 @@ void TestQgsTracer::testPolygon()
   QStringList wkts;
   wkts << "POLYGON((0 0, 0 10, 20 10, 10 0, 0 0))";
 
-  QgsVectorLayer* vl = make_layer( wkts );
+  QgsVectorLayer* vl = make_layer( wkts, "Polygon" );
 
   QgsTracer tracer;
   tracer.setLayers( QList<QgsVectorLayer*>() << vl );
diff --git a/tests/src/gui/testqgsrelationreferencewidget.cpp b/tests/src/gui/testqgsrelationreferencewidget.cpp
index 9404e00..81b5710 100644
--- a/tests/src/gui/testqgsrelationreferencewidget.cpp
+++ b/tests/src/gui/testqgsrelationreferencewidget.cpp
@@ -38,6 +38,7 @@ class TestQgsRelationReferenceWidget : public QObject
 
     void testChainFilter();
     void testChainFilterRefreshed();
+    void testChainFilterDeleteForeignKey();
 
   private:
     QgsVectorLayer* mLayer1;
@@ -220,5 +221,48 @@ void TestQgsRelationReferenceWidget::testChainFilterRefreshed()
   QCOMPARE( cbs[2]->currentText(), QString( "sleeve" ) );
 }
 
+void TestQgsRelationReferenceWidget::testChainFilterDeleteForeignKey()
+{
+  // init a relation reference widget
+  QStringList filterFields = QStringList() << "material" << "diameter" << "raccord";
+
+  QgsRelationReferenceWidget w( new QWidget() );
+  w.setChainFilters( true );
+  w.setFilterFields( filterFields );
+  w.setRelation( *mRelation, true );
+  w.init();
+
+  // check the default status of filter comboboxes
+  QList<QComboBox *> cbs = w.mFilterComboBoxes;
+
+  QCOMPARE( cbs[0]->currentText(), QString( "material" ) );
+  QCOMPARE( cbs[0]->isEnabled(), true );
+
+  QCOMPARE( cbs[1]->currentText(), QString( "diameter" ) );
+  QCOMPARE( cbs[1]->isEnabled(), false );
+
+  QCOMPARE( cbs[2]->currentText(), QString( "raccord" ) );
+  QCOMPARE( cbs[2]->isEnabled(), false );
+
+  // set a foreign key
+  w.setForeignKey( QVariant( 11 ) );
+
+  QCOMPARE( cbs[0]->currentText(), QString( "iron" ) );
+  QCOMPARE( cbs[1]->currentText(), QString( "120" ) );
+  QCOMPARE( cbs[2]->currentText(), QString( "sleeve" ) );
+
+  // delete the foreign key
+  w.deleteForeignKey();
+
+  QCOMPARE( cbs[0]->currentText(), QString( "material" ) );
+  QCOMPARE( cbs[0]->isEnabled(), true );
+
+  QCOMPARE( cbs[1]->currentText(), QString( "diameter" ) );
+  QCOMPARE( cbs[1]->isEnabled(), false );
+
+  QCOMPARE( cbs[2]->currentText(), QString( "raccord" ) );
+  QCOMPARE( cbs[2]->isEnabled(), false );
+}
+
 QTEST_MAIN( TestQgsRelationReferenceWidget )
 #include "testqgsrelationreferencewidget.moc"
diff --git a/tests/src/python/test_provider_ogr.py b/tests/src/python/test_provider_ogr.py
index 485b3b4..39634a8 100644
--- a/tests/src/python/test_provider_ogr.py
+++ b/tests/src/python/test_provider_ogr.py
@@ -17,7 +17,7 @@ import shutil
 import sys
 import tempfile
 
-from qgis.core import QgsVectorLayer, QgsVectorDataProvider, QgsWKBTypes
+from qgis.core import QgsVectorLayer, QgsVectorDataProvider, QgsWKBTypes, QgsFeature
 from qgis.testing import (
     start_app,
     unittest
@@ -240,5 +240,23 @@ class PyQgsOGRProvider(unittest.TestCase):
         os.unlink(datasource)
         self.assertFalse(os.path.exists(datasource))
 
+    def testGdb(self):
+        """ Test opening a GDB database layer"""
+        gdb_path = os.path.join(unitTestDataPath(), 'test_gdb.gdb')
+        for i in range(3):
+            l = QgsVectorLayer(gdb_path + '|layerid=' + str(i), 'test', 'ogr')
+            self.assertTrue(l.isValid())
+
+    def testGdbFilter(self):
+        """ Test opening a GDB database layer with filter"""
+        gdb_path = os.path.join(unitTestDataPath(), 'test_gdb.gdb')
+        l = QgsVectorLayer(gdb_path + '|layerid=1|subset="text" = \'shape 2\'', 'test', 'ogr')
+        self.assertTrue(l.isValid())
+        it = l.getFeatures()
+        f = QgsFeature()
+        while it.nextFeature(f):
+            self.assertTrue(f.attribute("text") == "shape 2")
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/src/python/test_provider_ogr_sqlite.py b/tests/src/python/test_provider_ogr_sqlite.py
index 47e80ee..4267fac 100644
--- a/tests/src/python/test_provider_ogr_sqlite.py
+++ b/tests/src/python/test_provider_ogr_sqlite.py
@@ -175,7 +175,7 @@ class TestPyQgsOGRProviderSqlite(unittest.TestCase):
 
         vl = QgsVectorLayer(tmpfile + "|subset=type=2", 'test', 'ogr')
         self.assertTrue(vl.isValid())
-        self.assertTrue(vl.fields().at(0).name() == "orig_ogc_fid")
+        self.assertTrue(vl.fields().at(vl.fields().count() - 1).name() == "orig_ogc_fid")
 
         req = QgsFeatureRequest()
         req.setFilterExpression("value=16")
@@ -184,9 +184,21 @@ class TestPyQgsOGRProviderSqlite(unittest.TestCase):
         self.assertTrue(it.nextFeature(f))
         self.assertTrue(f.id() == 5)
 
+        # Ensure that orig_ogc_fid is still retrieved even if attribute subset is passed
+        req = QgsFeatureRequest()
+        req.setSubsetOfAttributes([])
+        it = vl.getFeatures(req)
+        ids = []
+        while it.nextFeature(f):
+            ids.append(f.id())
+        self.assertTrue(len(ids) == 3)
+        self.assertTrue(3 in ids)
+        self.assertTrue(4 in ids)
+        self.assertTrue(5 in ids)
+
         # Check that subset string is correctly set on reload
         vl.reload()
-        self.assertTrue(vl.fields().at(0).name() == "orig_ogc_fid")
+        self.assertTrue(vl.fields().at(vl.fields().count() - 1).name() == "orig_ogc_fid")
 
 
 if __name__ == '__main__':
diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py
index d6fdb1e..a2fe122 100644
--- a/tests/src/python/test_provider_postgres.py
+++ b/tests/src/python/test_provider_postgres.py
@@ -391,6 +391,22 @@ class TestPyQgsPostgresProvider(unittest.TestCase, ProviderTestCase):
         testKey(lyr, '"f1","F2","f3"', ['f1', 'F2', 'f3'])
         testKey(lyr, None, ['id'])
 
+    def testStyleDatabaseWithService(self):
+        myconn = 'service=\'qgis_test\''
+        if 'QGIS_PGTEST_DB' in os.environ:
+            myconn = os.environ['QGIS_PGTEST_DB']
+        myvl = QgsVectorLayer(myconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="qgis_test"."someData" (geom) sql=', 'test', 'postgres')
+        self.assertTrue(myvl.isValid())
+
+        styles = myvl.listStylesInDatabase()
+        ids = styles[1]
+        self.assertEqual(len(ids), 0)
+
+        myvl.saveStyleToDatabase('mystyle', '', False, '', '')
+        styles = myvl.listStylesInDatabase()
+        ids = styles[1]
+        self.assertEqual(len(ids), 1)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/src/python/test_qgsgeometry.py b/tests/src/python/test_qgsgeometry.py
index 04d9502..2ab7abe 100644
--- a/tests/src/python/test_qgsgeometry.py
+++ b/tests/src/python/test_qgsgeometry.py
@@ -1685,6 +1685,16 @@ class TestQgsGeometry(unittest.TestCase):
         wkt = g.exportToWkt()
         assert compareWkt(expWkt, wkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
 
+        # Test reshape with z support
+        wkt = 'LineStringZ (-1 0 -3, 0 0 20, 5 0 9999)'
+        g = QgsGeometry.fromWkt(wkt)
+
+        self.assertEqual(g.reshapeGeometry([QgsPointV2(QgsWKBTypes.PointZ, -1, 0, -3), QgsPointV2(QgsWKBTypes.PointZ, -6, 5, 55)]), 0)
+        wkt = g.exportToWkt()
+
+        expWkt = 'LineStringZ (-6 5 55, -1 0 -3, 0 0 20, 5 0 9999)'
+        assert compareWkt(expWkt, wkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
+
     def testConvertToMultiType(self):
         """ Test converting geometries to multi type """
         point = QgsGeometry.fromWkt('Point (1 2)')
@@ -3515,5 +3525,6 @@ class TestQgsGeometry(unittest.TestCase):
         self.assertAlmostEqual(polygon.angleAtVertex(3), math.radians(225.0), places=3)
         self.assertAlmostEqual(polygon.angleAtVertex(4), math.radians(135.0), places=3)
 
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/src/python/test_qgsvectorlayereditbuffer.py b/tests/src/python/test_qgsvectorlayereditbuffer.py
index 27d3c3e..cc9cc14 100644
--- a/tests/src/python/test_qgsvectorlayereditbuffer.py
+++ b/tests/src/python/test_qgsvectorlayereditbuffer.py
@@ -20,7 +20,9 @@ from qgis.core import (QgsVectorLayer,
                        QgsFeature,
                        QgsGeometry,
                        QgsPoint,
-                       QgsField)
+                       QgsField,
+                       QgsWKBTypes,
+                       QGis)
 from qgis.testing import start_app, unittest
 start_app()
 
@@ -51,6 +53,13 @@ def createEmptyLinestringLayer():
     return layer
 
 
+def createEmptyMultiLinestringLayer():
+    layer = QgsVectorLayer("MultiLinestring?field=fldtxt:string&field=fldint:integer",
+                           "addfeat", "memory")
+    assert layer.isValid()
+    return layer
+
+
 class TestQgsVectorLayerEditBuffer(unittest.TestCase):
 
     def testAddFeatures(self):
@@ -100,11 +109,58 @@ class TestQgsVectorLayerEditBuffer(unittest.TestCase):
             [QgsPoint(1, 1), QgsPoint(2, 2)],
             [QgsPoint(3, 3), QgsPoint(4, 4)],
         ]
+        geom = QgsGeometry.fromMultiPolyline(multiline)
+        f1 = QgsFeature(layer.fields(), 1)
+        f1.setGeometry(geom)
+        f1.setAttributes(["test", 123])
+
+        self.assertTrue(QgsWKBTypes.isMultiType(QGis.fromOldWkbType(geom.wkbType())))
+        self.assertFalse((layer.editBuffer().addFeatures([f1])))
+
+        # check is possibile to adapt single to multi
+        # This test should belong to vectordataprovider test
+        layer = createEmptyMultiLinestringLayer()
+        self.assertTrue(layer.startEditing())
+        self.assertEqual(layer.editBuffer().addedFeatures(), {})
+        line = [
+            QgsPoint(1, 1), QgsPoint(2, 2), QgsPoint(3, 3)
+        ]
+        geom = QgsGeometry.fromPolyline(line)
+        f1 = QgsFeature(layer.fields(), 1)
+        f1.setGeometry(geom)
+        f1.setAttributes(["test", 123])
+
+        self.assertTrue(QgsWKBTypes.isSingleType(QGis.fromOldWkbType(geom.wkbType())))
+        self.assertTrue((layer.editBuffer().addFeatures([f1])))
+
+        # check that is NOT possibile to adapt Multi to single if only one simple geometry
+        # This because to avoid to have a bunch of successful import for that
+        # thac can be converted and other feature that fails => better leave to
+        # the user the explicit work to convert to singletype
+        layer = createEmptyLinestringLayer()
+        self.assertTrue(layer.startEditing())
+        self.assertEqual(layer.editBuffer().addedFeatures(), {})
+        multiline = [
+            [QgsPoint(1, 1), QgsPoint(2, 2), QgsPoint(3, 3)]
+        ]
+        geom = QgsGeometry.fromMultiPolyline(multiline)
+        self.assertTrue(QgsWKBTypes.isMultiType(QGis.fromOldWkbType(geom.wkbType())))
+        f1 = QgsFeature(layer.fields(), 1)
+        f1.setGeometry(geom)
+        f1.setAttributes(["test", 123])
+        self.assertFalse((layer.editBuffer().addFeatures([f1])))
+
+        # check is possibile to adapt M geom to NOT M provider type
+        layer = createEmptyLayer()
+        self.assertTrue(layer.startEditing())
+        self.assertEqual(layer.editBuffer().addedFeatures(), {})
+        geom = QgsGeometry.fromPoint(QgsPoint(1, 1))
+        geom.geometry().addMValue(1)
+        self.assertTrue(QgsWKBTypes.hasM(geom.geometry().wkbType()))
         f1 = QgsFeature(layer.fields(), 1)
-        f1.setGeometry(QgsGeometry.fromMultiPolyline(multiline))
+        f1.setGeometry(geom)
         f1.setAttributes(["test", 123])
-        self.assertTrue(layer.addFeatures([f1]))
-        self.assertFalse(layer.commitChanges())
+        self.assertTrue((layer.editBuffer().addFeatures([f1])))
 
     def testAddMultipleFeatures(self):
         # test adding multiple features to an edit buffer
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
index 9fa1cb1..49cabb4 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
    <Attribute value="2" name="id"/>
    <Attribute value="two" name="name"/>
    <Attribute value="two àò" name="utf8nameè"/>
+   <Attribute value="1" name="orig_ogc_fid"/>
    <BoundingBox CRS="EPSG:3857" maxx="913214.6741" minx="913214.6741" maxy="5606017.8743" miny="5606017.8743"/>
    <Attribute value="Point (913214.6741 5606017.8743)" type="derived" name="geometry"/>
   </Feature>
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
index 9fba971..d1afc76 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
    <Attribute value="2" name="id"/>
    <Attribute value="two" name="name"/>
    <Attribute value="two àò" name="utf8nameè"/>
+   <Attribute value="1" name="orig_ogc_fid"/>
    <BoundingBox CRS="EPSG:3857" maxx="913214.6741" minx="913214.6741" maxy="5606017.8743" miny="5606017.8743"/>
    <Attribute value="Point (913214.6741 5606017.8743)" type="derived" name="geometry"/>
   </Feature>
@@ -15,6 +16,7 @@ Content-Type: text/xml; charset=utf-8
    <Attribute value="3" name="id"/>
    <Attribute value="three" name="name"/>
    <Attribute value="three èé↓" name="utf8nameè"/>
+   <Attribute value="2" name="orig_ogc_fid"/>
    <BoundingBox CRS="EPSG:3857" maxx="913204.9128" minx="913204.9128" maxy="5606011.4565" miny="5606011.4565"/>
    <Attribute value="Point (913204.9128 5606011.4565)" type="derived" name="geometry"/>
   </Feature>
diff --git a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
index 9fba971..d1afc76 100644
--- a/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
+++ b/tests/testdata/qgis_server/wms_getfeatureinfo_filter_or_utf8.txt
@@ -8,6 +8,7 @@ Content-Type: text/xml; charset=utf-8
    <Attribute value="2" name="id"/>
    <Attribute value="two" name="name"/>
    <Attribute value="two àò" name="utf8nameè"/>
+   <Attribute value="1" name="orig_ogc_fid"/>
    <BoundingBox CRS="EPSG:3857" maxx="913214.6741" minx="913214.6741" maxy="5606017.8743" miny="5606017.8743"/>
    <Attribute value="Point (913214.6741 5606017.8743)" type="derived" name="geometry"/>
   </Feature>
@@ -15,6 +16,7 @@ Content-Type: text/xml; charset=utf-8
    <Attribute value="3" name="id"/>
    <Attribute value="three" name="name"/>
    <Attribute value="three èé↓" name="utf8nameè"/>
+   <Attribute value="2" name="orig_ogc_fid"/>
    <BoundingBox CRS="EPSG:3857" maxx="913204.9128" minx="913204.9128" maxy="5606011.4565" miny="5606011.4565"/>
    <Attribute value="Point (913204.9128 5606011.4565)" type="derived" name="geometry"/>
   </Feature>
diff --git a/tests/testdata/test_gdb.gdb/a00000001.TablesByName.atx b/tests/testdata/test_gdb.gdb/a00000001.TablesByName.atx
new file mode 100644
index 0000000..94d3ea1
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000001.TablesByName.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000001.gdbindexes b/tests/testdata/test_gdb.gdb/a00000001.gdbindexes
new file mode 100644
index 0000000..b02aa75
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000001.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000001.gdbtable b/tests/testdata/test_gdb.gdb/a00000001.gdbtable
new file mode 100644
index 0000000..6a6563f
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000001.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000001.gdbtablx b/tests/testdata/test_gdb.gdb/a00000001.gdbtablx
new file mode 100644
index 0000000..ca55551
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000001.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000002.gdbtable b/tests/testdata/test_gdb.gdb/a00000002.gdbtable
new file mode 100644
index 0000000..a0af90e
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000002.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000002.gdbtablx b/tests/testdata/test_gdb.gdb/a00000002.gdbtablx
new file mode 100644
index 0000000..7c12c56
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000002.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000003.gdbindexes b/tests/testdata/test_gdb.gdb/a00000003.gdbindexes
new file mode 100644
index 0000000..58df68d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000003.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000003.gdbtable b/tests/testdata/test_gdb.gdb/a00000003.gdbtable
new file mode 100644
index 0000000..204468c
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000003.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000003.gdbtablx b/tests/testdata/test_gdb.gdb/a00000003.gdbtablx
new file mode 100644
index 0000000..2f80ed4
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000003.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.CatItemsByPhysicalName.atx b/tests/testdata/test_gdb.gdb/a00000004.CatItemsByPhysicalName.atx
new file mode 100644
index 0000000..88eb585
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.CatItemsByPhysicalName.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.CatItemsByType.atx b/tests/testdata/test_gdb.gdb/a00000004.CatItemsByType.atx
new file mode 100644
index 0000000..d40a500
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.CatItemsByType.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.FDO_UUID.atx b/tests/testdata/test_gdb.gdb/a00000004.FDO_UUID.atx
new file mode 100644
index 0000000..b86a404
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.FDO_UUID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.gdbindexes b/tests/testdata/test_gdb.gdb/a00000004.gdbindexes
new file mode 100644
index 0000000..a4f334d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.gdbtable b/tests/testdata/test_gdb.gdb/a00000004.gdbtable
new file mode 100644
index 0000000..5e95361
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.gdbtablx b/tests/testdata/test_gdb.gdb/a00000004.gdbtablx
new file mode 100644
index 0000000..f0ffbc1
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000004.spx b/tests/testdata/test_gdb.gdb/a00000004.spx
new file mode 100644
index 0000000..6d236bd
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000004.spx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByName.atx b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByName.atx
new file mode 100644
index 0000000..d3696bb
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByName.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByParentTypeID.atx b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByParentTypeID.atx
new file mode 100644
index 0000000..2b76cf6
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByParentTypeID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByUUID.atx b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByUUID.atx
new file mode 100644
index 0000000..f446472
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.CatItemTypesByUUID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.gdbindexes b/tests/testdata/test_gdb.gdb/a00000005.gdbindexes
new file mode 100644
index 0000000..bc88709
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.gdbtable b/tests/testdata/test_gdb.gdb/a00000005.gdbtable
new file mode 100644
index 0000000..8838885
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000005.gdbtablx b/tests/testdata/test_gdb.gdb/a00000005.gdbtablx
new file mode 100644
index 0000000..929d65f
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000005.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.CatRelsByDestinationID.atx b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByDestinationID.atx
new file mode 100644
index 0000000..8282c82
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByDestinationID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.CatRelsByOriginID.atx b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByOriginID.atx
new file mode 100644
index 0000000..ad296bb
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByOriginID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.CatRelsByType.atx b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByType.atx
new file mode 100644
index 0000000..cb91518
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.CatRelsByType.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.FDO_UUID.atx b/tests/testdata/test_gdb.gdb/a00000006.FDO_UUID.atx
new file mode 100644
index 0000000..8b1d561
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.FDO_UUID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.gdbindexes b/tests/testdata/test_gdb.gdb/a00000006.gdbindexes
new file mode 100644
index 0000000..c608a88
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.gdbtable b/tests/testdata/test_gdb.gdb/a00000006.gdbtable
new file mode 100644
index 0000000..534ae97
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000006.gdbtablx b/tests/testdata/test_gdb.gdb/a00000006.gdbtablx
new file mode 100644
index 0000000..e28936d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000006.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByBackwardLabel.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByBackwardLabel.atx
new file mode 100644
index 0000000..112150d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByBackwardLabel.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByDestItemTypeID.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByDestItemTypeID.atx
new file mode 100644
index 0000000..987980c
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByDestItemTypeID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByForwardLabel.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByForwardLabel.atx
new file mode 100644
index 0000000..dc49bec
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByForwardLabel.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByName.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByName.atx
new file mode 100644
index 0000000..5a8a7b6
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByName.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByOriginItemTypeID.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByOriginItemTypeID.atx
new file mode 100644
index 0000000..a86eea4
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByOriginItemTypeID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByUUID.atx b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByUUID.atx
new file mode 100644
index 0000000..376cd7d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.CatRelTypesByUUID.atx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.gdbindexes b/tests/testdata/test_gdb.gdb/a00000007.gdbindexes
new file mode 100644
index 0000000..2a98c93
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.gdbtable b/tests/testdata/test_gdb.gdb/a00000007.gdbtable
new file mode 100644
index 0000000..e12521d
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000007.gdbtablx b/tests/testdata/test_gdb.gdb/a00000007.gdbtablx
new file mode 100644
index 0000000..e48b5e1
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000007.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000009.gdbindexes b/tests/testdata/test_gdb.gdb/a00000009.gdbindexes
new file mode 100644
index 0000000..cc24e2a
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000009.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a00000009.gdbtable b/tests/testdata/test_gdb.gdb/a00000009.gdbtable
new file mode 100644
index 0000000..b9037fb
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000009.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a00000009.gdbtablx b/tests/testdata/test_gdb.gdb/a00000009.gdbtablx
new file mode 100644
index 0000000..d8f22c6
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000009.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a00000009.spx b/tests/testdata/test_gdb.gdb/a00000009.spx
new file mode 100644
index 0000000..cf6aa5c
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a00000009.spx differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000a.gdbindexes b/tests/testdata/test_gdb.gdb/a0000000a.gdbindexes
new file mode 100644
index 0000000..cc24e2a
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000a.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000a.gdbtable b/tests/testdata/test_gdb.gdb/a0000000a.gdbtable
new file mode 100644
index 0000000..51121bf
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000a.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000a.gdbtablx b/tests/testdata/test_gdb.gdb/a0000000a.gdbtablx
new file mode 100644
index 0000000..015177e
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000a.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000a.spx b/tests/testdata/test_gdb.gdb/a0000000a.spx
new file mode 100644
index 0000000..2ac4c8e
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000a.spx differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000b.gdbindexes b/tests/testdata/test_gdb.gdb/a0000000b.gdbindexes
new file mode 100644
index 0000000..cc24e2a
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000b.gdbindexes differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000b.gdbtable b/tests/testdata/test_gdb.gdb/a0000000b.gdbtable
new file mode 100644
index 0000000..ac5472e
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000b.gdbtable differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000b.gdbtablx b/tests/testdata/test_gdb.gdb/a0000000b.gdbtablx
new file mode 100644
index 0000000..a5ad2af
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000b.gdbtablx differ
diff --git a/tests/testdata/test_gdb.gdb/a0000000b.spx b/tests/testdata/test_gdb.gdb/a0000000b.spx
new file mode 100644
index 0000000..987f974
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/a0000000b.spx differ
diff --git a/tests/testdata/test_gdb.gdb/gdb b/tests/testdata/test_gdb.gdb/gdb
new file mode 100644
index 0000000..a786e12
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/gdb differ
diff --git a/tests/testdata/test_gdb.gdb/timestamps b/tests/testdata/test_gdb.gdb/timestamps
new file mode 100644
index 0000000..3808df3
Binary files /dev/null and b/tests/testdata/test_gdb.gdb/timestamps differ

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



More information about the Pkg-grass-devel mailing list