[qgis] 02/08: Imported Upstream version 2.8.2+dfsg

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sun May 10 11:43:36 UTC 2015


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

sebastic pushed a commit to branch master
in repository qgis.

commit 0ca35746520d3354ab0ae9799aecf06f9a914241
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sun May 10 10:35:18 2015 +0200

    Imported Upstream version 2.8.2+dfsg
---
 CMakeLists.txt                                     |    4 +-
 ChangeLog                                          |  662 +++++++++++
 cmake/MacBundleMacros.cmake                        |    6 +-
 cmake_templates/Doxyfile.in                        |    1 +
 debian/changelog                                   |   10 +-
 debian/qgis-common.links                           |    1 +
 doc/TRANSLATORS                                    |   89 +-
 i18n/CMakeLists.txt                                |    2 +-
 i18n/qgis_de.ts                                    | 1163 +++++++++++++++++++-
 i18n/qgis_en.ts                                    |  931 +++++++++++++++-
 mac/cmake/0qgis.cmake.in                           |    5 +
 ms-windows/osgeo4w/package-nightly.cmd             |    5 +-
 ms-windows/osgeo4w/postinstall-dev.bat             |   12 +-
 ms-windows/osgeo4w/preremove-dev.bat               |   11 +
 python/core/core.sip                               |    1 +
 python/core/qgslayerdefinition.sip                 |   16 +-
 .../editorwidgets/core/qgseditorwidgetfactory.sip  |    2 +-
 python/gui/qgsmapcanvas.sip                        |    3 +
 python/plugins/MetaSearch/dialogs/maindialog.py    |   14 +-
 python/plugins/db_manager/db_model.py              |    2 +-
 .../db_manager/db_plugins/spatialite/plugin.py     |    8 +-
 .../plugins/processing/algs/gdal/ClipByExtent.py   |    2 +-
 python/plugins/processing/algs/gdal/ColorRelief.py |    2 +-
 python/plugins/processing/algs/gdal/GridAverage.py |    2 +-
 .../processing/algs/gdal/GridDataMetrics.py        |    2 +-
 python/plugins/processing/algs/gdal/GridInvDist.py |    2 +-
 python/plugins/processing/algs/gdal/GridNearest.py |    2 +-
 .../plugins/processing/algs/gdal/OgrAlgorithm.py   |   33 +-
 python/plugins/processing/algs/gdal/aspect.py      |    2 +-
 python/plugins/processing/algs/gdal/buildvrt.py    |    2 +-
 python/plugins/processing/algs/gdal/fillnodata.py  |    2 +-
 python/plugins/processing/algs/gdal/gdal2xyz.py    |    2 +-
 python/plugins/processing/algs/gdal/gdaladdo.py    |    2 +-
 python/plugins/processing/algs/gdal/hillshade.py   |    2 +-
 python/plugins/processing/algs/gdal/merge.py       |    2 +-
 python/plugins/processing/algs/gdal/nearblack.py   |    2 +-
 python/plugins/processing/algs/gdal/pct2rgb.py     |    2 +-
 python/plugins/processing/algs/gdal/polygonize.py  |    2 +-
 python/plugins/processing/algs/gdal/proximity.py   |    2 +-
 python/plugins/processing/algs/gdal/rasterize.py   |   40 +-
 python/plugins/processing/algs/gdal/rgb2pct.py     |    2 +-
 python/plugins/processing/algs/gdal/roughness.py   |    2 +-
 python/plugins/processing/algs/gdal/sieve.py       |    2 +-
 python/plugins/processing/algs/gdal/slope.py       |    2 +-
 python/plugins/processing/algs/gdal/tpi.py         |    2 +-
 python/plugins/processing/algs/gdal/translate.py   |    4 +-
 python/plugins/processing/algs/gdal/warp.py        |    4 +-
 .../algs/grass/description/v.buffer.column.txt     |    2 +-
 .../algs/grass/description/v.buffer.distance.txt   |    2 +-
 .../algs/grass7/description/v.buffer.column.txt    |    2 +-
 .../algs/grass7/description/v.buffer.distance.txt  |    2 +-
 .../algs/grass7/description/v.generalize.txt       |    3 +-
 python/plugins/processing/algs/otb/OTBUtils.py     |    3 +-
 python/plugins/processing/algs/qgis/Grid.py        |   10 +-
 .../processing/algs/qgis/HypsometricCurves.py      |    6 +
 .../processing/algs/qgis/QGISAlgorithmProvider.py  |    4 +-
 ...ricalDifference.py => SymmetricalDifference.py} |    4 +-
 .../processing/algs/qgis/VectorLayerScatterplot.py |    2 +
 .../description/2.1.3/AddCoordinatestopoints.txt   |    2 +-
 .../2.1.3/CatchmentArea(FlowTracing).txt           |    8 +-
 .../description/2.1.3/CatchmentArea(Parallel).txt  |    4 +-
 .../description/2.1.3/CatchmentArea(Recursive).txt |    6 +-
 .../saga/description/2.1.3/ClipGridwithPolygon.txt |    2 +-
 .../description/2.1.3/ContourLinesfromGrid.txt     |    2 +-
 .../algs/saga/description/2.1.3/CropToData.txt     |    2 +-
 .../algs/saga/description/2.1.3/GridCalculator.txt |    2 +-
 .../description/2.1.3/InverseDistanceWeighted.txt  |   10 +-
 .../description/2.1.3/KernelDensityEstimation.txt  |    5 +-
 .../MultilevelB-SplineInterpolation(fromGrid).txt  |    4 +-
 .../2.1.3/MultilevelB-SplineInterpolation.txt      |   10 +-
 .../saga/description/2.1.3/NaturalNeighbour.txt    |    2 +-
 .../saga/description/2.1.3/NearestNeighbour.txt    |    2 +-
 .../description/2.1.3/OrdinaryKriging(Global).txt  |    2 +-
 .../saga/description/2.1.3/OrdinaryKriging.txt     |    2 +-
 .../description/2.1.3/PolynomialRegression.txt     |    2 +-
 .../algs/saga/description/2.1.3/Resampling.txt     |    2 +-
 .../2.1.3/Separatepointsbydirection.txt            |    2 +-
 .../algs/saga/description/2.1.3/ShapestoGrid.txt   |   14 +-
 .../description/2.1.3/Slope,Aspect,Curvature.txt   |    6 +-
 .../saga/description/2.1.3/StatisticsforGrids.txt  |    6 +-
 .../saga/description/2.1.3/TransformShapes.txt     |    2 +-
 .../algs/saga/description/2.1.3/Triangulation.txt  |    2 +-
 .../description/2.1.3/UniversalKriging(Global).txt |    2 +-
 .../saga/description/2.1.3/UniversalKriging.txt    |    2 +-
 .../description/2.1.3/VectorisingGridClasses.txt   |    6 +-
 .../plugins/processing/algs/taudem/CMakeLists.txt  |    6 +-
 .../processing/algs/taudem/TauDEMAlgorithm.py      |    7 +-
 .../algs/taudem/TauDEMAlgorithmProvider.py         |  113 +-
 ...DEMAlgorithm.py => TauDEMMultifileAlgorithm.py} |   23 +-
 .../plugins/processing/algs/taudem/TauDEMUtils.py  |   28 +-
 .../algs/taudem/description/multi/aread8.txt       |    8 +
 .../algs/taudem/description/multi/areadinf.txt     |    8 +
 .../algs/taudem/description/multi/d8flowdir.txt    |    6 +
 .../{ => multi}/d8flowpathextremeup.txt            |    8 +-
 .../taudem/description/multi/d8hdisttostrm.txt     |    7 +
 .../taudem/description/multi/dinfavalanche.txt     |   11 +
 .../taudem/description/multi/dinfconclimaccum.txt  |   11 +
 .../taudem/description/multi/dinfdecayaccum.txt    |    9 +
 .../algs/taudem/description/multi/dinfflowdir.txt  |    6 +
 .../algs/taudem/description/multi/dinfrevaccum.txt |    7 +
 .../taudem/description/multi/dinfupdependence.txt  |    6 +
 .../taudem/description/multi/gagewatershed.txt     |    6 +
 .../taudem/description/multi/gagewatershed2.txt    |    7 +
 .../description/{ => multi}/moveoutletstostrm.txt  |    6 +-
 .../algs/taudem/description/multi/pitremove.txt    |    5 +
 .../taudem/description/multi/selectgtthreshold.txt |    6 +
 .../taudem/description/multi/slopearearatio.txt    |    6 +
 .../algs/taudem/description/multi/slopeavedown.txt |    7 +
 .../algs/taudem/description/multi/streamnet.txt    |   14 +
 .../algs/taudem/description/multi/threshold.txt    |    7 +
 .../algs/taudem/description/multi/twi.txt          |    6 +
 .../taudem/description/{ => single}/aread8.txt     |    0
 .../taudem/description/{ => single}/areadinf.txt   |    0
 .../taudem/description/{ => single}/d8flowdir.txt  |    0
 .../{ => single}/d8flowpathextremeup.txt           |    0
 .../description/{ => single}/d8hdisttostrm.txt     |    0
 .../description/{ => single}/dinfavalanche.txt     |    0
 .../description/{ => single}/dinfconclimaccum.txt  |    0
 .../description/{ => single}/dinfdecayaccum.txt    |    0
 .../description/{ => single}/dinfflowdir.txt       |    0
 .../description/{ => single}/dinfrevaccum.txt      |    0
 .../description/{ => single}/dinfupdependence.txt  |    0
 .../taudem/description/single/gagewatershed.txt    |    6 +
 .../taudem/description/single/gagewatershed2.txt   |    7 +
 .../description/{ => single}/moveoutletstostrm.txt |    0
 .../taudem/description/{ => single}/pitremove.txt  |    0
 .../description/single/selectgtthreshold.txt       |    6 +
 .../description/{ => single}/slopearearatio.txt    |    0
 .../description/{ => single}/slopeavedown.txt      |    0
 .../taudem/description/{ => single}/streamnet.txt  |    0
 .../taudem/description/{ => single}/threshold.txt  |    0
 .../algs/taudem/description/single/twi.txt         |    6 +
 .../plugins/processing/algs/taudem/dinfdistdown.py |    2 +-
 .../{dinfdistdown.py => dinfdistdown_multi.py}     |   43 +-
 .../plugins/processing/algs/taudem/dinfdistup.py   |    2 +-
 .../taudem/{dinfdistup.py => dinfdistup_multi.py}  |   39 +-
 .../processing/algs/taudem/dinftranslimaccum.py    |    2 +-
 .../processing/algs/taudem/dinftranslimaccum2.py   |    2 +-
 ...anslimaccum2.py => dinftranslimaccum2_multi.py} |   44 +-
 ...translimaccum.py => dinftranslimaccum_multi.py} |   38 +-
 .../processing/algs/taudem/dropanalysis_multi.py   |  124 +++
 .../{dinftranslimaccum.py => gridnet_multi.py}     |   96 +-
 .../processing/algs/taudem/lengtharea_multi.py     |   96 ++
 .../processing/algs/taudem/peukerdouglas_multi.py  |   94 ++
 .../processing/algs/taudem/slopearea_multi.py      |   96 ++
 python/plugins/processing/gui/BatchPanel.py        |    2 +-
 .../processing/gui/MultipleFileInputDialog.py      |    3 +
 .../processing/modeler/AddModelFromFileAction.py   |    8 +-
 .../processing/script/AddScriptFromFileAction.py   |    8 +-
 resources/customization.xml                        |    1 -
 scripts/tsstat.pl                                  |    4 +-
 scripts/update_ts.sh                               |    2 +-
 src/analysis/raster/qgsrastermatrix.cpp            |    2 +-
 .../composer/qgscomposerattributetablewidget.cpp   |    2 +-
 src/app/main.cpp                                   |   18 +
 src/app/qgisapp.cpp                                |   15 +-
 src/app/qgsattributetabledialog.cpp                |    8 +-
 src/app/qgsdecorationgriddialog.cpp                |    1 +
 src/app/qgsfieldcalculator.cpp                     |    6 +-
 src/app/qgslabelpropertydialog.cpp                 |    2 +-
 src/app/qgsrasterlayerproperties.cpp               |    2 +-
 src/browser/CMakeLists.txt                         |    2 +
 src/browser/main.cpp                               |   28 +
 src/core/diagram/qgstextdiagram.cpp                |    7 -
 src/core/dxf/qgsdxfexport.cpp                      |   89 +-
 src/core/dxf/qgsdxfpaintengine.cpp                 |   36 +-
 src/core/dxf/qgsdxfpaintengine.h                   |    1 -
 src/core/pal/feature.cpp                           |   10 +-
 src/core/qgsexpression.cpp                         |    8 +-
 src/core/qgsmimedatautils.cpp                      |    2 +
 src/core/qgspallabeling.cpp                        |   26 +-
 src/core/qgspointlocator.cpp                       |   29 +-
 src/core/qgsvectorlayer.cpp                        |   15 +-
 src/core/symbology-ng/qgsheatmaprenderer.cpp       |   23 +-
 src/core/symbology-ng/qgsmarkersymbollayerv2.cpp   |    2 +-
 .../editorwidgets/core/qgseditorwidgetfactory.h    |    2 +-
 src/gui/qgsattributedialog.cpp                     |    1 +
 src/gui/qgsexpressionbuilderwidget.cpp             |    2 +-
 src/gui/qgsmapcanvas.cpp                           |   11 +
 src/gui/qgsmapcanvas.h                             |    3 +
 src/gui/qgsrasterlayersaveasdialog.cpp             |    8 +-
 src/gui/qgsrubberband.cpp                          |   25 +-
 src/gui/raster/qgsrasterhistogramwidget.cpp        |    2 +-
 .../symbology-ng/qgsrulebasedrendererv2widget.cpp  |    8 +-
 src/plugins/grass/qgsgrassnewmapset.cpp            |    7 +-
 .../qgsdelimitedtextfeatureiterator.cpp            |    3 +-
 .../delimitedtext/qgsdelimitedtextprovider.cpp     |    8 +-
 src/providers/gdal/qgsgdalprovider.cpp             |   10 +-
 src/providers/grass/qgsgrass.cpp                   |   31 +-
 src/providers/grass/qgsgrass.h                     |   16 +-
 .../oracle/ocispatial/qsql_ocispatial.cpp          |    6 +
 src/providers/oracle/qgsoracleconn.cpp             |    2 +-
 src/providers/oracle/qgsoraclefeatureiterator.cpp  |    7 +-
 src/providers/oracle/qgsoraclenewconnection.cpp    |    2 +-
 src/providers/oracle/qgsoracleprovider.cpp         |    2 +-
 src/providers/postgres/qgspgnewconnection.cpp      |    2 +-
 src/providers/postgres/qgspostgresconn.cpp         |   46 +-
 src/providers/postgres/qgspostgresconn.h           |    2 +-
 src/providers/postgres/qgspostgresdataitems.cpp    |    3 +-
 .../postgres/qgspostgresfeatureiterator.cpp        |   13 +-
 src/providers/postgres/qgspostgresprovider.cpp     |   15 +-
 .../spatialite/qgsspatialitefeatureiterator.cpp    |   15 +
 .../spatialite/qgsspatialitefeatureiterator.h      |    1 +
 src/providers/spatialite/qgsspatialiteprovider.cpp |    2 +-
 src/providers/wms/qgswmscapabilities.h             |    2 +-
 src/providers/wms/qgswmsprovider.cpp               |   10 +-
 src/providers/wms/qgswmsprovider.h                 |    2 +-
 src/server/CMakeLists.txt                          |    4 +
 src/server/qgis_map_serv.cpp                       |   10 +
 src/server/qgshttprequesthandler.cpp               |    7 +-
 src/server/qgsserverprojectparser.cpp              |   21 +-
 src/server/qgsserverprojectparser.h                |    4 +
 src/server/qgswfsserver.cpp                        |   12 +-
 src/server/qgswmsprojectparser.cpp                 |  211 +---
 src/server/qgswmsprojectparser.h                   |   12 +-
 src/server/qgswmsserver.cpp                        |   69 +-
 src/ui/qgsattributetabledialog.ui                  |   25 +-
 src/ui/qgscategorizedsymbolrendererv2widget.ui     |   11 -
 src/ui/qgscolordialog.ui                           |    2 +-
 src/ui/qgscomposerlegendwidgetbase.ui              |    2 +-
 src/ui/qgsfieldspropertiesbase.ui                  |    2 +-
 src/ui/qgsoptionsbase.ui                           |    2 +-
 src/ui/qgsprojectpropertiesbase.ui                 |    2 +-
 src/ui/qgsrasterlayerpropertiesbase.ui             |    2 +-
 src/ui/qgsrelationmanagerdialogbase.ui             |    2 +-
 src/ui/qgsrulebasedrendererv2widget.ui             |    2 +-
 .../qgssinglebandpseudocolorrendererwidgetbase.ui  |    2 +-
 tests/bench/CMakeLists.txt                         |    6 +
 tests/bench/main.cpp                               |   18 +
 tests/src/gui/testqgsrubberband.cpp                |   89 +-
 tests/src/providers/CMakeLists.txt                 |    1 +
 tests/src/providers/testqgsgdalprovider.cpp        |  107 ++
 tests/testdata/int_raster_with_scale.tif           |  Bin 0 -> 1022 bytes
 tests/testdata/int_raster_with_scale.tif.aux.xml   |   30 +
 tests/testdata/requires_warped_vrt.tif             |  Bin 0 -> 978 bytes
 235 files changed, 4598 insertions(+), 949 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c3012f0..26f46b9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
 SET(CPACK_PACKAGE_VERSION_MINOR "8")
-SET(CPACK_PACKAGE_VERSION_PATCH "1")
+SET(CPACK_PACKAGE_VERSION_PATCH "2")
 SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
 SET(RELEASE_NAME "Wien")
 IF (POLICY CMP0048) # in CMake 3.0.0+
@@ -293,7 +293,7 @@ IF (ENABLE_TESTS)
     IMMEDIATE @ONLY)
   # For server side testing we have no X, we can use xfvb as a fake x
   # sudo apt-get install xfvb
-  add_custom_target(check-no-x COMMAND xvfb-run --server-args="-screen 10 1024x768x24" ctest --output-on-failure)
+  add_custom_target(check-no-x COMMAND xvfb-run --server-args=-screen\ 10\ 1024x768x24 ctest --output-on-failure)
 ENDIF (ENABLE_TESTS)
 
 IF (SUPPRESS_QT_WARNINGS)
diff --git a/ChangeLog b/ChangeLog
index 5739058..ebfe747 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,665 @@
+Juergen E. Fischer <jef at norbit.de>	2015-05-06
+
+    postgres provider: ignore system columns
+
+    (cherry picked from commit aa377a088a473c4490f25b846990de40756ad9c1)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-09
+
+    db manager: fix BaseError handing (fixes #12645; backport 102f6d3)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-06
+
+    handle projects path with apostrophe (fixes #12691)
+
+    (cherry picked from commit b49b49232a598ac22b60be398e5d8e125b53a3d6)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-08
+
+    oracle provider: fix srid detection (fixes #12674)
+
+    (cherry picked from commit 656af530c3fa9353e35a812f880350e01f37ebc0)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-26
+
+    osgeo4w: reflect packagename and version in nightly build
+
+    (cherry-picked from 9c5cbd4, dec0ca5 and 51a7317)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-21
+
+    fix where clause when multiple features are filtered by ids (fixes #12616, followup d1e23a6)
+
+    (cherry picked from commit 02f5c73ae2067c3a92a2254761a8e2db0a565eae)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-26
+
+    german translation update
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-22
+
+    Properly handle non matching number of WMS styles and layers in WMS provider (inspired by PR #2001)
+
+    (cherry picked from commit bcb95137f07134c62094fdc68cb998d9a56409ab)
+
+Sandro Santilli <strk at keybit.net>	2015-04-22
+
+    Fix quoting of xfb-run invocation
+
+    Works For Me (Ubuntu 14.04.2)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-20
+
+    processing: fix interpretation of oracle layers (fixes #12590)
+
+    Funded by norbit.de
+
+    (cherry picked from commit f0daab9c7c188bd0361d7d11652830558231e1b6)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-17
+
+    remove unused button in categorized renderer ui
+
+    (cherry picked from commit 812d5b11832c31a875048ceda6609814b194a5ee)
+
+Sandro Mani <manisandro at gmail.com>	2015-04-14
+
+    Fix primary key search
+
+    (cherry picked from commit 265c253995ae755194df514a07ecaad35fd3ec57)
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2015-04-13
+
+    doxygen: add effects directory
+    (cherry picked from commit d660acbfa365ac52164916b798c8c0167a1f655d)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-09
+
+    server: fix 'LayerDrawingOrder' (fixes #12484)
+
+    cherry picked from de5a3f5 + 04324fd
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-10
+
+    oracle spatial: use sdo_relate for exact intersect feature requests where oracle spatial is available
+
+    (cherry picked from commit fa99a960844e8bc6c909c58961bf9a0df070d877)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-09
+
+    include pointer to message in connection error message (fixes #12526)
+
+    (cherry picked from commit 10a51f672fa6b98174e9b94dd932dc08e5d77e71)
+
+Sandro Santilli <strk at keybit.net>	2015-04-24
+
+    Make QgsPointLocator discard geometries that cannot be projected
+
+    Fix #12634 (crash snapping in measure tool)
+
+    (cherry picked from commit 0480cabfc91353156c58285b5748ef1c83bbe5d7)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-04-23
+
+    QgsMimeDataUtils::encode fix (escape also backslash)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-19
+
+    german translation update
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-17
+
+    Update ShapestoGrid.txt
+
+    Better default for saga rasterization
+
+pcav <cavallini at faunalia.it>	2015-04-16
+
+    Better default for COMPRESSTYPE in GDAL
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-16
+
+    Update Slope,Aspect,Curvature.txt
+
+    Better defaults for slope and aspect in saga:processing
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-14
+
+    fix GRASS7 v.generalize
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-10
+
+    fix gdal_rasterize: remove duplicate options
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-04-10
+
+    [processing] set CRS for output grid (fix #12518)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-04-10
+
+    [processing] display X and Y labels on the scatterplot (fix #12095)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-04-10
+
+    [processing] save last used models/scripts directory (fix #12536)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-04-10
+
+    [processing] fix typo in the algorithm name (fix #12227)
+
+pcav <cavallini at faunalia.it>	2015-04-10
+
+    Better output names for SAGA models
+
+pcav <cavallini at faunalia.it>	2015-04-10
+
+    Better naming for GDAL outputs (partial fix for http://hub.qgis.org/issues/12542)
+
+    Conflicts:
+python/plugins/processing/algs/gdal/gdalcalc.py
+python/plugins/processing/algs/gdal/gdaltindex.py
+
+pcav <cavallini at faunalia.it>	2015-04-10
+
+    Various fixes to Processing algs; fix for http://hub.qgis.org/issues/12537
+
+    Conflicts:
+python/plugins/processing/algs/gdal/ogr2ogrbuffer.py
+python/plugins/processing/algs/gdal/ogr2ogrdissolve.py
+
+pcav <cavallini at faunalia.it>	2015-04-10
+
+    Better default for a Processing:SAGA module
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-09
+
+    Update ShapestoGrid.txt
+
+    Better defaults for Shapes to grid
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-04-09
+
+    remove duplicate condition
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    better option text
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix gdal rasterize when using an existing raster layer
+
+radosuav <rmgu at dhi-gras.com>	2015-04-07
+
+    [Processing] Avoid consecutive quotes when calling OTB algorithms.
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix typo
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix saga interpolations modules
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix saga catchment area modules
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix saga shapes to grid
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-04-09
+
+    fix SAGA contour lines from grid
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-08
+
+    Update MultilevelB-SplineInterpolation(fromGrid).txt
+
+    Partial fix for https://hub.qgis.org/issues/12519
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-08
+
+    Update MultilevelB-SplineInterpolation.txt
+
+    Partial fix for https://hub.qgis.org/issues/12519
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-08
+
+    Update CatchmentArea(Parallel).txt
+
+    Partial fix for https://hub.qgis.org/issues/12483
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-08
+
+    Update CatchmentArea(FlowTracing).txt
+
+Paolo Cavallini <cavallini at faunalia.it>	2015-04-08
+
+    Update CatchmentArea(Recursive).txt
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-04-13
+
+    Fix incorrect calculation of priority for diagrams (fix #4692)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-04-13
+
+    Fix scale dependant rendering of diagrams (fix #10700)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-04-11
+
+    Fix setting min in raster histogram using mouse also zooms chart
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-18
+
+    Avoid creating 3 identical label candidates in offset point mode
+
+    ...should speed up label position calculation
+
+Anatoliy Golubev <darth.naihil at gmail.com>	2015-04-10
+
+    Fix QgsWmsDpiMode enum declaration
+
+    (cherry picked from commit 1f58f3371f58e0d54fdcf8d1536d7dc741c984ff)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-04-08
+
+    Partially reverted 5e1b5a43 because it breaks GRASS create new mapset
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-07
+
+    postgres data items: don't set srid for geometryless layers
+
+    (cherry picked from commit d6e22af94965a6601d93374e892edb2a9a5ebd6c)
+
+Anatoliy Golubev <darth.naihil at gmail.com>	2015-04-02
+
+    Fix QgsRubberBand visibility behavior (followup 37171dc0)
+
+    Visibility behavior stays the same as in QGIS 2.6
+    Test included.
+
+    Fix #12486
+    Contributed via https://github.com/qgis/QGIS/pull/1972
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-04
+
+    map canvas: update sip bindings (followup bef4059f)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-27
+
+    dxf export:
+    * reinstate palette colors, but exclude black/white
+    * fix hatch transparency
+    * fix active (initial) v(iew)port
+
+    (cherry-picked b6a4194 and 9961095)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-02
+
+    postgres provider: also apply filterWhereClause to feature iterators (fixes #12499 & #12500)
+
+    (cherry picked from commit 97572244dc699c6d5480f736e38d9246496cef20)
+
+Juergen E. Fischer <jef at norbit.de>	2015-04-04
+
+    db manager: fix setting of contrast enhancement for spatialite rasters (fixes #12497)
+
+rldhont <rldhont at gmail.com>	2015-03-31
+
+    [BUGFIX] Update DatumTransformInfo on layerCrsChanged
+
+    The QgsMapCanvas datumTransformInfo is not updated after a layerCrsChanged.
+     This causes a bug in QGIS-Server which does not use the right srcAuthId.
+
+    To update QgsMapCanvas datumTransformInfo, the user had to change the map
+     canvas CRS or to disable/enable transform.
+
+    This patch add a SLOT to the QgsMapLayer layerCrs Changed SIGNAL to update
+     QgsMapCanvas datumTransformInfo.
+
+Sandro Santilli <strk at keybit.net>	2015-04-01
+
+    Fix QgsRubberBand refresh
+
+    - Fixes invalid calculation of rubberband boundingRect
+    - Scales icon and pen width with rubberband when computing rect
+    - Recompute rubberband extent on zoom/pan
+
+    Fix #12392
+    Includes testcase
+
+    (backport of master commits d43d8bf 84d47c9 a844bfa)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-04-01
+
+    [GRASS] mutex function called by browser item (fixes crash in simultaneous loading, e.g. state restore)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-03-31
+
+    [GRASS] fix crash in browser when opening GRASS 6 mapset with GRASS 7
+
+Radim Blazek <radim.blazek at gmail.com>	2015-03-12
+
+    GRASS 7.0.0 API change
+
+rldhont <rldhont at gmail.com>	2015-03-30
+
+    [BUGFIX] In WFS GetFeature joined fields not are not returned
+
+    In the WFS GetFeature Request, the joined fields are not returned. It's due to
+     the use of provider instead of layer to retrieve all fields.
+
+    The correction is to use layer->pendingFields() and layer->pendingAllAttributesList()
+
+Chris Crook <ccrook at linz.govt.nz>	2015-03-30
+
+    Backport of pull request #1932
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-28
+
+    Fix buffer size was incorrectly stored in x position data defined
+    field for label properties dialog
+
+Sandro Mani <manisandro at gmail.com>	2015-03-03
+
+    Don't keep dangling pointers in QgisApp::mPrintComposers
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-23
+
+    Standardise use of red minus icon (fix #12425)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-20
+
+    server: deduce service wms from request if not explictly given (SERVICE not mandatory for WMS GetMap / GetFeatureInfo)
+
+    (cherry picked from commit 3552b83474682f3c2fc1515d4225b906a0cab74c)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-20
+
+    server: fix parsing of bbox numbers in scientific notation containing +
+    (reverts 905561f, cherry picked and merged 6309dbd, 57046c5, 8c8a9e0)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-23
+
+    expressions: fix modulo 0 crashes (fixes #12431)
+
+    (cherry picked from commit 9596f97db605421eabe6643a10f25db8a7747df9)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-23
+
+    update_ts.sh: include locations
+
+    (cherry picked from commit 45fbb3f5a954d52779ba742087811ff4d9a91582)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-24
+
+    include qgslayerdefinition.sip in bindings
+
+    (cherry picked from commit 80bbed1595d352c22a79cff5c87d62e740826b25)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-19
+
+    vector layer: connect missing edit buffer signals
+
+    (cherry picked from commit 65378e6a108656fb33e919de59feabb10b8b6e19)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-24
+
+    dxf export: fix data defined outline color of simple markers
+
+    (cherry picked from commit 7469d2bbf038d17a5801b42dcb6e388ca093fe17)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-20
+
+    dxf export:
+    * switch to rgb colors only (fixes black/white issues)
+    * fix drawing of polygon outlines
+    * distiguish polygon outlines from filled polygons in paint engine
+      (fixes #12368)
+
+    (cherry picked from commit 25e4e4d3d687d5f32fc6ffe3fb4263448ea1d079)
+
+Chris Crook <ccrook at linz.govt.nz>	2015-03-22
+
+    Backport of missing type definitions in delimited text provider
+
+Chris Crook <ccrook at linz.govt.nz>	2015-03-22
+
+    Backport of dangling pointer bug
+
+Larry Shaffer <larrys at dakotacarto.com>	2015-03-19
+
+    Redo "server: stop processing after 'no REQUEST' exception (fixes #11543)" from 1d3f8a7
+
+    - Accidentally removed during merge conflict in 670719c?
+
+Larry Shaffer <larrys at dakotacarto.com>	2015-03-20
+
+    Set GDAL env vars for when gdal lib is bundled in app on Mac
+
+Larry Shaffer <larrys at dakotacarto.com>	2015-02-20
+
+    Update Mac bundling for qgis_server lib
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-19
+
+    Fix shortcut keys in attribute table dialog (fix #12272)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-18
+
+    debian packaging: create LICENSE link (fixes #12400)
+
+    (cherry picked from commit b8dc08f8ef4630880e2696e9948e308620bbe287)
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-03-18
+
+    Close attribute dialog when layer is removed
+
+    Fix #12336
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-03-18
+
+    Custom widgets: make sure config can loaded from the project
+
+    Apparently sip cannot handle private virtual methods
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-17
+
+    qoci spatial driver: cleanup session & connection when login failed
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-18
+
+    Fix grid annotation distance not restored in dialog (fix #11991)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-17
+
+    Fix heatmap renderer not working for reprojected layers (fix #12362)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-16
+
+    Fix power validity test in raster calculator (fix #11278)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-16
+
+    Remember last used directory for raster save as dialog (fix #6950)
+
+Werner Macho <werner.macho at gmail.com>	2015-03-16
+
+    adding french translators
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-10
+
+    Add some GDAL provider unit tests...
+
+    (...doing penance for my 2.8 sins)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-10
+
+    Followup 914ecc, also fix calculation of srcDataType
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-06
+
+    Fix incorrect data type for GDAL layers with gain/offset (fix #11573)
+
+    Test was incorrectly checking for both offset and gain, when it
+    should have been testing for either.
+
+Marco Hugentobler <marco.hugentobler at sourcepole.ch>	2015-03-05
+
+    Server: fix bug with multiple joins
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-10
+
+    german translation update
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-10
+
+    attribute table: ShowVisible behaviour mode
+    * change 'show all' action text
+    * add note to the window title
+    * also ignore mode for geometryless tables
+
+    (fixes #12318)
+
+    (cherry picked from commit 2a5d59e872f91de16eed73aab218aed46a71ec58)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-10
+
+    postgres provider: also cast field expressions to text (fixes #12346)
+
+    (cherry picked from commit 1acad42f48dcf7ce31512356c8dd609292f22899)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-03-04
+
+    [processing] fix handling of "Check for edge contamination" option in
+    TauDEM algorithms
+
+    (cherry-picked from fe24c8295606a1ddbc4e3d4bd1b80188584d0635)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-03-02
+
+    [processing] TauDEM provider overhaul
+
+     - add new TauDEM 5.1.2/5.2 tools: Gage watershed, TWI and Select GT
+       Threshold
+     - implement support for multifile TauDEM version
+     - allow to use single- and multifile versions simultaneously
+
+    Work done for Faunalia (http://faunalia.eu)
+
+    (cherry-picked from 427adf79bb975fd436e69d2120d1261081eb4687)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-03-10
+
+    Followup 5d15a07, also fix edit role
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2015-03-05
+
+    fix inline editing of scales in rule based renderer
+
+Werner Macho <werner.macho at gmail.com>	2015-03-09
+
+    updated names of swedish translators as requested by language coordinator
+
+    Signed-off-by: Werner Macho <werner.macho at gmail.com>
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-06
+
+    expression builder widget: save scripts in the same mode they are loaded
+    (avoids adding empty lines on every save on windows)
+
+    (cherry picked from commit 37a7831d2a1571616f10d20a476b71f1d539cc5d)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-05
+
+    german translation fix (fixes #12231)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-01
+
+    translation string fix
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-05
+
+    osgeo4w: also remove nightly shortcuts
+
+    (cherry picked from commit f40d547aecad8f71eb5ac7fdbf21a784926ab28c)
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-05
+
+    osgeo4w: add '(Nightly)' to the nightly build shortcuts
+
+    (cherry picked from commit c7f7f6f4847ebe96bb5d9728d12a95873f07a908)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-03-04
+
+    [processing] fix error in MultipleFileInput selector when user press
+    Cancel button
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-03
+
+    postgres provider: restore behaviour to keep 3d wkb (refs #9651,
+    followup bd311c8)
+
+Sandro Santilli <strk at keybit.net>	2015-03-03
+
+    Only scan for dimension if it is not already known as needing force2d
+
+    Also force 2d on 3d input
+
+Sandro Santilli <strk at keybit.net>	2015-03-03
+
+    Use ST_Force2D from PostGIS-2.1.0 up
+
+Sandro Santilli <strk at keybit.net>	2015-03-03
+
+    Add comment about possible pending bug in force2d need detection
+
+Giovanni Manghi <giovanni.manghi at faunalia.pt>	2015-03-03
+
+    fix SAGA 2.1.3 Kernel Density Estimation
+
+Juergen E. Fischer <jef at norbit.de>	2015-03-04
+
+    postgres provider: use min()/max() before casting (followup bf56457; fixes #12306)
+
+    (cherry picked from commit 7ce195ebec7330f101bb6922055a079958bfd58a)
+
+Sandro Santilli <strk at keybit.net>	2015-03-03
+
+    Detect number of dimensions for tables with unconstrained type
+
+    Fixes #9748
+
+    (cherry picked from commit f512e87ffd0ed7297520bf63830c1fc5c37d7ee9)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-02-27
+
+    Fix handling of warped VRT (refs #12264)
+
+    Loading of rasters requiring warped VRTs was broken, but the heatmap
+    plugin is still creating incorrect outputs which needs to be fixed.
+
+Juergen E. Fischer <jef at norbit.de>	2015-02-27
+
+    composer attribute table: fix changing header font (fixes #12233)
+
+    (cherry picked from commit ec0ab3f7ce4c7b009cff9abaf9d9277cb62437de)
+
+Tom Kralidis <tomkralidis at gmail.com>	2015-02-26
+
+    backport ada01603cb7b10786436aa0ed2361743b52ce48f
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-02-26
+
+    [processing] correctly handle tiny polygons smaller than raster cell
+    size in Hypsometric curves algorithm (fix #12278)
+
+Juergen E. Fischer <jef at norbit.de>	2015-02-26
+
+    Release of 2.8.1
+
 Juergen E. Fischer <jef at norbit.de>	2015-02-26
 
     fix measurement dialog translation (fixes #12262)
diff --git a/cmake/MacBundleMacros.cmake b/cmake/MacBundleMacros.cmake
index e9bfd7b..6bb9893 100644
--- a/cmake/MacBundleMacros.cmake
+++ b/cmake/MacBundleMacros.cmake
@@ -133,11 +133,12 @@ FUNCTION (UPDATEQGISPATHS LIBFROM LIBTO)
         FOREACH (QL ${QGFWLIST})
             INSTALLNAMETOOL_CHANGE ("${LIBFROM}" "${LIB_CHG_TO}" "${QFWDIR}/${QL}.framework/${QL}")
         ENDFOREACH (QL)
-        # libqgispython is not a framework
+        # libqgispython and libqgis_server are not frameworks
         IF (${OSX_HAVE_LOADERPATH})
             SET (LIB_CHG_TO "${ATLOADER}/${QGIS_LIB_SUBDIR_REV}/${LIBMID}/${LIBPOST}")
         ENDIF ()
         INSTALLNAMETOOL_CHANGE ("${LIBFROM}" "${LIB_CHG_TO}" "${QLIBDIR}/libqgispython.dylib")
+        INSTALLNAMETOOL_CHANGE ("${LIBFROM}" "${LIB_CHG_TO}" "${QLIBDIR}/libqgis_server.dylib")
         # crssync
         IF (${OSX_HAVE_LOADERPATH})
             SET (LIB_CHG_TO "${ATEXECUTABLE}/${QGIS_LIBEXEC_SUBDIR_REV}/${LIBMID}/${LIBPOST}")
@@ -200,6 +201,9 @@ ENDFOREACH (QARCH)
 FILE (GLOB QGFWLIST RELATIVE "${QFWDIR}" "${QFWDIR}/qgis*.framework")
 # for some reason, REPLACE is stripping list seps
 STRING(REPLACE ".framework" ";" QGFWLIST ${QGFWLIST})
+# don't collect any library symlinks, limit to versioned libs
+SET (Q_LIBVER ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR})
+FILE (GLOB QGLIBLIST  RELATIVE "${QLIBDIR}" "${QLIBDIR}/libqgis*.${Q_LIBVER}*.dylib")
 FILE (GLOB QGPLUGLIST "${QPLUGDIR}/*.so")
 FILE (GLOB QGPYLIST "${QGISPYDIR}/qgis/*.so")
 FILE (GLOB QGAPPLIST RELATIVE "${QBINDIR}" "${QBINDIR}/q*.app")
diff --git a/cmake_templates/Doxyfile.in b/cmake_templates/Doxyfile.in
index 1d44045..e25dc5c 100644
--- a/cmake_templates/Doxyfile.in
+++ b/cmake_templates/Doxyfile.in
@@ -575,6 +575,7 @@ INPUT                  = @CMAKE_SOURCE_DIR@/doc \
                          @CMAKE_SOURCE_DIR@/src/core/composer \
                          @CMAKE_SOURCE_DIR@/src/core/diagram \
                          @CMAKE_SOURCE_DIR@/src/core/dxf \
+                         @CMAKE_SOURCE_DIR@/src/core/effects \
                          @CMAKE_SOURCE_DIR@/src/core/gps \
                          @CMAKE_SOURCE_DIR@/src/core/layertree \
                          @CMAKE_SOURCE_DIR@/src/core/pal \
diff --git a/debian/changelog b/debian/changelog
index 38ca2bb..2fedf49 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.8.1) UNRELEASED; urgency=medium
+qgis (2.8.2) UNRELEASED; urgency=medium
+
+  * Release of 2.8.2
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Sat, 09 May 2015 22:02:02 +0200
+
+qgis (2.8.1) unstable; urgency=medium
 
   * Release of 2.8.1
 
- -- Jürgen E. Fischer <jef at norbit.de>  Thu, 26 Feb 2015 10:12:00 +0100
+ -- Jürgen E. Fischer <jef at norbit.de>  Sat, 09 May 2015 22:02:02 +0200
 
 qgis (2.8.0) unstable; urgency=medium
 
diff --git a/debian/qgis-common.links b/debian/qgis-common.links
new file mode 100644
index 0000000..eae1a05
--- /dev/null
+++ b/debian/qgis-common.links
@@ -0,0 +1 @@
+usr/share/common-licenses/GPL-2 usr/share/qgis/doc/LICENSE
diff --git a/doc/TRANSLATORS b/doc/TRANSLATORS
index 81cde9c..619640b 100644
--- a/doc/TRANSLATORS
+++ b/doc/TRANSLATORS
@@ -1,47 +1,46 @@
 <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:13174 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">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/gl.png"></td><td>Galician</td><td><div title="finished:13174 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Xan Vieiro</td></tr>
-<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Bokmal, Norwegian</td><td><div title="finished:13174 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>James Stott, Maléne Peterson</td></tr>
-<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:13174 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">100.0</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/sv.png"></td><td>Swedish</td><td><div title="finished:13174 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Lars Luthman, Magnus Homann, Victor Axbom</td></tr>
-<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:13174 unfinished:0 untranslated:1" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu</td></tr>
-<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:13174 unfinished:0 untranslated:1" class="bartodo"><div class="bardone" style="width:99px">100.0</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/nl.png"></td><td>Dutch</td><td><div title="finished:13172 unfinished:1 untranslated:2" class="bartodo"><div class="bardone" style="width:99px">100.0</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/it.png"></td><td>Italian</td><td><div title="finished:13170 unfinished:1 untranslated:4" class="bartodo"><div class="bardone" style="width:99px">100.0</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/es.png"></td><td>Spanish</td><td><div title="finished:13158 unfinished:1 untranslated:16" class="bartodo"><div class="bardone" style="width:99px">99.9</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/fi.png"></td><td>Finnish</td><td><div title="finished:13156 unfinished:1 untranslated:18" class="bartodo"><div class="bardone" style="width:99px">99.9</div></div></td><td>Kari Salovaara, Marko Järvenpää</td></tr>
-<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:13022 unfinished:1 untranslated:152" class="bartodo"><div class="bardone" style="width:98px">98.8</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
-<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:12961 unfinished:0 untranslated:214" class="bartodo"><div class="bardone" style="width:98px">98.4</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/pl.png"></td><td>Polish</td><td><div title="finished:12702 unfinished:1 untranslated:472" class="bartodo"><div class="bardone" style="width:96px">96.4</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok</td></tr>
-<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:12398 unfinished:5 untranslated:772" class="bartodo"><div class="bardone" style="width:94px">94.1</div></div></td><td>Zoltan Siki</td></tr>
-<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:12311 unfinished:4 untranslated:860" class="bartodo"><div class="bardone" style="width:93px">93.5</div></div></td><td>Sorin Călinică, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
-<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:12273 unfinished:4 untranslated:898" class="bartodo"><div class="bardone" style="width:93px">93.2</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
-<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:12197 unfinished:3 untranslated:975" class="bartodo"><div class="bardone" style="width:92px">92.6</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
-<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:12183 unfinished:2 untranslated:990" class="bartodo"><div class="bardone" style="width:92px">92.5</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
-<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:12087 unfinished:2 untranslated:1086" class="bartodo"><div class="bardone" style="width:91px">91.7</div></div></td><td>OSGeo Korean Chapter</td></tr>
-<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:12044 unfinished:25 untranslated:1106" class="bartodo"><div class="bardone" style="width:91px">91.5</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
-<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:12045 unfinished:14 untranslated:1116" class="bartodo"><div class="bardone" style="width:91px">91.5</div></div></td><td>Phan Anh, Bùi Hữu Mạnh</td></tr>
-<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan, Province of China)</td><td><div title="finished:11994 unfinished:5 untranslated:1176" class="bartodo"><div class="bardone" style="width:91px">91.1</div></div></td><td>Nung-yao Lin</td></tr>
-<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:11848 unfinished:5 untranslated:1322" class="bartodo"><div class="bardone" style="width:89px">89.9</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
-<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:11373 unfinished:3 untranslated:1799" class="bartodo"><div class="bardone" style="width:86px">86.3</div></div></td><td>Harish Kumar Solanki</td></tr>
-<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10759 unfinished:63 untranslated:2353" class="bartodo"><div class="bardone" style="width:81px">81.9</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/lt.png"></td><td>Lithuanian</td><td><div title="finished:10779 unfinished:10 untranslated:2386" class="bartodo"><div class="bardone" style="width:81px">81.9</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
-<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:10519 unfinished:15 untranslated:2641" class="bartodo"><div class="bardone" style="width:79px">79.9</div></div></td><td>Almir Karabegovic</td></tr>
-<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9384 unfinished:9 untranslated:3782" class="bartodo"><div class="bardone" style="width:71px">71.3</div></div></td><td>Khoem Sokhem</td></tr>
-<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9041 unfinished:12 untranslated:4122" class="bartodo"><div class="bardone" style="width:68px">68.7</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
-<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:8905 unfinished:48 untranslated:4222" class="bartodo"><div class="bardone" style="width:67px">67.8</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
-<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:8893 unfinished:31 untranslated:4251" class="bartodo"><div class="bardone" style="width:67px">67.6</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
-<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:8816 unfinished:32 untranslated:4327" class="bartodo"><div class="bardone" style="width:67px">67.0</div></div></td><td>Veiko Viil</td></tr>
-<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7455 unfinished:15 untranslated:5705" class="bartodo"><div class="bardone" style="width:56px">56.6</div></div></td><td>Zoran Jankovic</td></tr>
-<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:6841 unfinished:7 untranslated:6327" class="bartodo"><div class="bardone" style="width:51px">52.0</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
-<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:5933 unfinished:980 untranslated:6262" class="bartodo"><div class="bardone" style="width:48px">48.8</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
-<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian (latin)</td><td><div title="finished:6247 unfinished:39 untranslated:6889" class="bartodo"><div class="bardone" style="width:47px">47.6</div></div></td><td>Goran Ivanković</td></tr>
-<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:6189 unfinished:12 untranslated:6974" class="bartodo"><div class="bardone" style="width:47px">47.0</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
-<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian</td><td><div title="finished:6005 unfinished:27 untranslated:7143" class="bartodo"><div class="bardone" style="width:45px">45.7</div></div></td><td>Goran Ivanković</td></tr>
-<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:5155 unfinished:24 untranslated:7996" class="bartodo"><div class="bardone" style="width:39px">39.2</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
-<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:5074 unfinished:27 untranslated:8074" class="bartodo"><div class="bardone" style="width:38px">38.6</div></div></td><td>Man Chao</td></tr>
-<tr><td><img src="qrc:/images/flags/fa.png"></td><td>Persian</td><td><div title="finished:5040 unfinished:32 untranslated:8103" class="bartodo"><div class="bardone" style="width:38px">38.4</div></div></td><td>Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan</td></tr>
-<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:4920 unfinished:28 untranslated:8227" class="bartodo"><div class="bardone" style="width:37px">37.4</div></div></td><td>Ásta Kristín Óladóttir, Thordur Ivarsson</td></tr>
-<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:4839 unfinished:21 untranslated:8315" class="bartodo"><div class="bardone" style="width:36px">36.8</div></div></td><td>Alexander Bruy</td></tr>
-<tr><td><img src="qrc:/images/flags/mn.png"></td><td>Mongolian</td><td><div title="finished:4635 unfinished:19 untranslated:8521" class="bartodo"><div class="bardone" style="width:35px">35.3</div></div></td><td>Bayarmaa Enkhtur</td></tr></table>
+<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:13254 unfinished:1 untranslated:0" class="bartodo"><div class="bardone" style="width:99px">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/fr.png"></td><td>French</td><td><div title="finished:13131 unfinished:92 untranslated:32" class="bartodo"><div class="bardone" style="width:99px">99.4</div></div></td><td>Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu, Marie Silvestre, V [...]
+<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Norwegian Bokmal</td><td><div title="finished:13131 unfinished:89 untranslated:35" class="bartodo"><div class="bardone" style="width:99px">99.4</div></div></td><td>James Stott, Maléne Peterson</td></tr>
+<tr><td><img src="qrc:/images/flags/gl.png"></td><td>Galician</td><td><div title="finished:13131 unfinished:88 untranslated:36" class="bartodo"><div class="bardone" style="width:99px">99.4</div></div></td><td>Xan Vieiro</td></tr>
+<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:13131 unfinished:88 untranslated:36" class="bartodo"><div class="bardone" style="width:99px">99.4</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/sv.png"></td><td>Swedish</td><td><div title="finished:13131 unfinished:83 untranslated:41" class="bartodo"><div class="bardone" style="width:99px">99.4</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/it.png"></td><td>Italian</td><td><div title="finished:13127 unfinished:89 untranslated:39" class="bartodo"><div class="bardone" style="width:99px">99.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/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:13131 unfinished:81 untranslated:43" class="bartodo"><div class="bardone" style="width:99px">99.4</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/nl.png"></td><td>Dutch</td><td><div title="finished:13129 unfinished:80 untranslated:46" class="bartodo"><div class="bardone" style="width:99px">99.4</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/es.png"></td><td>Spanish</td><td><div title="finished:13115 unfinished:84 untranslated:56" class="bartodo"><div class="bardone" style="width:99px">99.3</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/fi.png"></td><td>Finnish</td><td><div title="finished:13113 unfinished:77 untranslated:65" class="bartodo"><div class="bardone" style="width:99px">99.2</div></div></td><td>Kari Salovaara, Marko Järvenpää</td></tr>
+<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:12980 unfinished:88 untranslated:187" class="bartodo"><div class="bardone" style="width:98px">98.3</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
+<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:12918 unfinished:52 untranslated:285" class="bartodo"><div class="bardone" style="width:97px">97.7</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/pl.png"></td><td>Polish</td><td><div title="finished:12665 unfinished:33 untranslated:557" class="bartodo"><div class="bardone" style="width:95px">95.7</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok</td></tr>
+<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:12361 unfinished:58 untranslated:836" class="bartodo"><div class="bardone" style="width:93px">93.5</div></div></td><td>Zoltan Siki</td></tr>
+<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:12269 unfinished:64 untranslated:922" class="bartodo"><div class="bardone" style="width:92px">92.8</div></div></td><td>Sorin Călinică, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
+<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:12237 unfinished:27 untranslated:991" class="bartodo"><div class="bardone" style="width:92px">92.4</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
+<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:12158 unfinished:39 untranslated:1058" class="bartodo"><div class="bardone" style="width:91px">91.9</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
+<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:12144 unfinished:38 untranslated:1073" class="bartodo"><div class="bardone" style="width:91px">91.8</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
+<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:12051 unfinished:12 untranslated:1192" class="bartodo"><div class="bardone" style="width:90px">91.0</div></div></td><td>OSGeo Korean Chapter</td></tr>
+<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:12010 unfinished:45 untranslated:1200" class="bartodo"><div class="bardone" style="width:90px">90.8</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
+<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:12009 unfinished:28 untranslated:1218" class="bartodo"><div class="bardone" style="width:90px">90.7</div></div></td><td>Phan Anh, Bùi Hữu Mạnh</td></tr>
+<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan (Province of China))</td><td><div title="finished:11959 unfinished:28 untranslated:1268" class="bartodo"><div class="bardone" style="width:90px">90.3</div></div></td><td>Nung-yao Lin</td></tr>
+<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:11813 unfinished:32 untranslated:1410" class="bartodo"><div class="bardone" style="width:89px">89.2</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
+<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:11339 unfinished:17 untranslated:1899" class="bartodo"><div class="bardone" style="width:85px">85.6</div></div></td><td>Harish Kumar Solanki</td></tr>
+<tr><td><img src="qrc:/images/flags/lt.png"></td><td>Lithuanian</td><td><div title="finished:10743 unfinished:43 untranslated:2469" class="bartodo"><div class="bardone" style="width:81px">81.2</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
+<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10724 unfinished:71 untranslated:2460" class="bartodo"><div class="bardone" style="width:81px">81.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/bs.png"></td><td>Bosnian</td><td><div title="finished:10484 unfinished:29 untranslated:2742" class="bartodo"><div class="bardone" style="width:79px">79.2</div></div></td><td>Almir Karabegovic</td></tr>
+<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9352 unfinished:20 untranslated:3883" class="bartodo"><div class="bardone" style="width:70px">70.6</div></div></td><td>Khoem Sokhem</td></tr>
+<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9006 unfinished:24 untranslated:4225" class="bartodo"><div class="bardone" style="width:68px">68.0</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
+<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:8871 unfinished:60 untranslated:4324" class="bartodo"><div class="bardone" style="width:67px">67.2</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
+<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:8859 unfinished:43 untranslated:4353" class="bartodo"><div class="bardone" style="width:66px">67.0</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
+<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:8783 unfinished:44 untranslated:4428" class="bartodo"><div class="bardone" style="width:66px">66.4</div></div></td><td>Veiko Viil</td></tr>
+<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7421 unfinished:25 untranslated:5809" class="bartodo"><div class="bardone" style="width:56px">56.1</div></div></td><td>Zoran Jankovic</td></tr>
+<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:6810 unfinished:20 untranslated:6425" class="bartodo"><div class="bardone" style="width:51px">51.5</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
+<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:5927 unfinished:961 untranslated:6367" class="bartodo"><div class="bardone" style="width:48px">48.3</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
+<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian (latin)</td><td><div title="finished:6216 unfinished:49 untranslated:6990" class="bartodo"><div class="bardone" style="width:47px">47.1</div></div></td><td>Goran Ivanković</td></tr>
+<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:6156 unfinished:19 untranslated:7080" class="bartodo"><div class="bardone" style="width:46px">46.5</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
+<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian</td><td><div title="finished:5975 unfinished:36 untranslated:7244" class="bartodo"><div class="bardone" style="width:45px">45.2</div></div></td><td>Goran Ivanković</td></tr>
+<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:5126 unfinished:32 untranslated:8097" class="bartodo"><div class="bardone" style="width:38px">38.8</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
+<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:5043 unfinished:35 untranslated:8177" class="bartodo"><div class="bardone" style="width:38px">38.2</div></div></td><td>Man Chao</td></tr>
+<tr><td><img src="qrc:/images/flags/fa.png"></td><td>Persian</td><td><div title="finished:5011 unfinished:41 untranslated:8203" class="bartodo"><div class="bardone" style="width:37px">38.0</div></div></td><td>Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan</td></tr>
+<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:4891 unfinished:33 untranslated:8331" class="bartodo"><div class="bardone" style="width:37px">37.0</div></div></td><td>Ásta Kristín Óladóttir, Thordur Ivarsson</td></tr>
+<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:4808 unfinished:29 untranslated:8418" class="bartodo"><div class="bardone" style="width:36px">36.4</div></div></td><td>Alexander Bruy</td></tr></table>
diff --git a/i18n/CMakeLists.txt b/i18n/CMakeLists.txt
index 397e72b..719b9d7 100644
--- a/i18n/CMakeLists.txt
+++ b/i18n/CMakeLists.txt
@@ -22,7 +22,7 @@ ENDMACRO(ADD_TRANSLATION_FILES)
 # make sure the output directory exists
 file(MAKE_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/i18n)
 
-SET(TS_FILES qgis_ar.ts qgis_bs.ts qgis_ca.ts qgis_cs.ts qgis_da.ts qgis_de.ts qgis_el.ts qgis_es.ts qgis_et.ts qgis_eu.ts qgis_fa.ts qgis_fi.ts qgis_fr.ts qgis_gl.ts qgis_hi.ts qgis_hr.ts qgis_hu.ts qgis_id.ts qgis_is.ts qgis_it.ts qgis_ja.ts qgis_km.ts qgis_ko.ts qgis_lt.ts qgis_lv.ts qgis_mn.ts qgis_nb.ts qgis_nl.ts qgis_pl.ts qgis_pt_BR.ts qgis_pt_PT.ts qgis_ro.ts qgis_ru.ts qgis_sk.ts qgis_sl.ts qgis_sr.ts qgis_sr at latin.ts qgis_sv.ts qgis_th.ts qgis_tr.ts qgis_uk.ts qgis_vi.ts qgis_ [...]
+SET(TS_FILES qgis_ar.ts qgis_bs.ts qgis_ca.ts qgis_cs.ts qgis_da.ts qgis_de.ts qgis_el.ts qgis_es.ts qgis_et.ts qgis_eu.ts qgis_fa.ts qgis_fi.ts qgis_fr.ts qgis_gl.ts qgis_hi.ts qgis_hr.ts qgis_hu.ts qgis_id.ts qgis_is.ts qgis_it.ts qgis_ja.ts qgis_km.ts qgis_ko.ts qgis_lt.ts qgis_lv.ts qgis_nb.ts qgis_nl.ts qgis_pl.ts qgis_pt_BR.ts qgis_pt_PT.ts qgis_ro.ts qgis_ru.ts qgis_sk.ts qgis_sl.ts qgis_sr.ts qgis_sr at latin.ts qgis_sv.ts qgis_th.ts qgis_tr.ts qgis_uk.ts qgis_vi.ts qgis_zh-Hans.ts  [...]
 
 ADD_TRANSLATION_FILES (QM_FILES ${TS_FILES})
 
diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts
index 7b1a1eb..9e12fbf 100644
--- a/i18n/qgis_de.ts
+++ b/i18n/qgis_de.ts
@@ -632,12 +632,16 @@ Zum Überprüfen Ergebnisdialog öffnen.</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
         <translation>Leerwert, auf 'none' belassen, um den Leerwert aus der Eingabe zu übernehmen</translation>
     </message>
+    <message>
+        <source>Clipped</source>
+        <translation>Zugeschnitten</translation>
+    </message>
 </context>
 <context>
     <name>ClipByMask</name>
@@ -740,7 +744,11 @@ Zum Überprüfen Ergebnisdialog öffnen.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Color relief</source>
+        <translation>Farbrelief</translation>
     </message>
 </context>
 <context>
@@ -3193,6 +3201,45 @@ Soll wirklich fortgefahren werden?</translation>
     </message>
 </context>
 <context>
+    <name>DinfDistDownMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation>D-Infinity Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>Höhengitter mit gefüllten Löchern</translation>
+    </message>
+    <message>
+        <source>Stream Raster Grid</source>
+        <translation>Stromrastergitter</translation>
+    </message>
+    <message>
+        <source>Weight Path Grid</source>
+        <translation>Pfadgewichtungsgitter</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation>Statistische Methode</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation>Distanz Methode</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>Kantenverunreinigung prüfen</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
+        <translation>D-Infinity Sende and Strom Gitter</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>DinfDistUp</name>
     <message>
         <source>D-Infinity Flow Direction Grid</source>
@@ -3232,6 +3279,45 @@ Soll wirklich fortgefahren werden?</translation>
     </message>
 </context>
 <context>
+    <name>DinfDistUpMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation>D-Infinity Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>Höhengitter mit gefüllten Löchern</translation>
+    </message>
+    <message>
+        <source>Slope Grid</source>
+        <translation>Neigungsgitter</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation>Statistische Methode</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation>Distanz Methode</translation>
+    </message>
+    <message>
+        <source>Proportion Threshold</source>
+        <translation>Anteils Schwellenwert</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>Kantenverunreinigung prüfen</translation>
+    </message>
+    <message>
+        <source>D-Infinity Distance Up</source>
+        <translation>D-Infinity Entfernung hoch</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>DinfTransLimAccum</name>
     <message>
         <source>D-Infinity Flow Direction Grid</source>
@@ -3310,6 +3396,84 @@ Soll wirklich fortgefahren werden?</translation>
     </message>
 </context>
 <context>
+    <name>DinfTransLimAccum2Multi</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation>D-Infinity Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation>Versorgungsnetz</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation>Transportkapazitätsgitter</translation>
+    </message>
+    <message>
+        <source>Input Concentration Grid</source>
+        <translation>Eingangs Konzentrationsgitter</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>Auslaß-Shapedatei</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>Kantenverunreinigung prüfen</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
+        <translation>Transportbegrenztes Akkumulations Gitter</translation>
+    </message>
+    <message>
+        <source>Deposition Grid</source>
+        <translation>Ablagerungs Raster</translation>
+    </message>
+    <message>
+        <source>Output Concentration Grid</source>
+        <translation>Ausgangs Konzentrationsgitter</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
+    <name>DinfTransLimAccumMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation>D-Infinity Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation>Versorgungsnetz</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation>Transportkapazitätsgitter</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>Auslaß-Shapedatei</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>Kantenverunreinigung prüfen</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
+        <translation>Transportbegrenztes Akkumulations Gitter</translation>
+    </message>
+    <message>
+        <source>Deposition Grid</source>
+        <translation>Ablagerungs Raster</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>Dissolve</name>
     <message>
         <source>Geometry exception while dissolving</source>
@@ -3945,6 +4109,53 @@ Geometriespate - Spalte mit eindeutigen ganzahligen Werden</translation>
     </message>
 </context>
 <context>
+    <name>DropAnalysisMulti</name>
+    <message>
+        <source>D8 Contributing Area Grid</source>
+        <translation>D8 beitragende Fläche Raster</translation>
+    </message>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation>D8 Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>Höhengitter mit gefüllten Löchern</translation>
+    </message>
+    <message>
+        <source>Accumulated Stream Source Grid</source>
+        <translation>Kumuliertes Fluss Quellennetz</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>Auslaß-Shapedatei</translation>
+    </message>
+    <message>
+        <source>Minimum Threshold</source>
+        <translation>Minimum Schwellenwert</translation>
+    </message>
+    <message>
+        <source>Maximum Threshold</source>
+        <translation>Maximum Schwellenwert</translation>
+    </message>
+    <message>
+        <source>Number of Threshold Values</source>
+        <translation>Anzahl der Schwellenwerte</translation>
+    </message>
+    <message>
+        <source>Spacing for Threshold Values</source>
+        <translation>Abstand für Schwellenwerte</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
+        <translation>D-Infinity Sende and Strom Gitter</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>EditModelAction</name>
     <message>
         <source>Edit model</source>
@@ -4794,7 +5005,7 @@ Erweiterung wird nicht aktiviert.</translation>
     </message>
     <message>
         <source>Merge...</source>
-        <translation>Abfrage...</translation>
+        <translation>Verschmelzen...</translation>
     </message>
     <message>
         <source>Information...</source>
@@ -6804,7 +7015,7 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
     <message>
         <source>Output</source>
-        <translation>Ausgabe</translation>
+        <translation type="obsolete">Ausgabe</translation>
     </message>
     <message>
         <source>Invalid grid spacing: %s/%s</source>
@@ -6818,6 +7029,10 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <source>Vertical spacing is too small for the covered area</source>
         <translation>Vertikaler Abstand ist zu klein für abgedeckten Bereich</translation>
     </message>
+    <message>
+        <source>Grid</source>
+        <translation>Gitter</translation>
+    </message>
 </context>
 <context>
     <name>GridAverage</name>
@@ -6855,7 +7070,11 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Average</source>
+        <translation>Gemittelt</translation>
     </message>
 </context>
 <context>
@@ -6898,7 +7117,11 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Interpolated metrics</source>
+        <translation>Interpolierte Maße</translation>
     </message>
 </context>
 <context>
@@ -6945,12 +7168,16 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
     </message>
     <message>
         <source>Smoothing</source>
         <translation>Glättung</translation>
     </message>
+    <message>
+        <source>Interpolated IDW</source>
+        <translation>Interpolierte IDW</translation>
+    </message>
 </context>
 <context>
     <name>GridMetrics</name>
@@ -7027,7 +7254,11 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Interpolated nearest neighbor</source>
+        <translation>Interpolierter nächster Nachbar</translation>
     </message>
 </context>
 <context>
@@ -7066,6 +7297,41 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
     </message>
 </context>
 <context>
+    <name>GridNetMulti</name>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation>D8 Fliessrichtung Raster</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>Auslaß-Shapedatei</translation>
+    </message>
+    <message>
+        <source>Mask Grid</source>
+        <translation>Maskengitter</translation>
+    </message>
+    <message>
+        <source>Mask Threshold</source>
+        <translation>Maskenschwellenwert</translation>
+    </message>
+    <message>
+        <source>Longest Upslope Length Grid</source>
+        <translation>Längstes Steigungslängen Gitter</translation>
+    </message>
+    <message>
+        <source>Total Upslope Length Grid</source>
+        <translation>Gesamt Steigungslängen Gitter</translation>
+    </message>
+    <message>
+        <source>Strahler Network Order Grid</source>
+        <translation>Strahler Netzwerk Ordnungs Raster</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>GridSurfaceCreate</name>
     <message>
         <source>Input las layer</source>
@@ -7559,6 +7825,10 @@ im Installationsverzeichnis nicht erlaubt ist</translation>
         <source>Elevation</source>
         <translation>Geländehöhe</translation>
     </message>
+    <message>
+        <source>Feature %d is smaller than raster cell size</source>
+        <translation>Objekt %d ist kleiner als die Rasterzellengröße</translation>
+    </message>
 </context>
 <context>
     <name>ImportIntoPostGIS</name>
@@ -7897,6 +8167,33 @@ Bitte vor der Ausführung von LAStools-Algorithmen einstellen.</translation>
     </message>
 </context>
 <context>
+    <name>LengthAreaMulti</name>
+    <message>
+        <source>Length Grid</source>
+        <translation>Längengitter</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation>Beitragende Fläche Raster</translation>
+    </message>
+    <message>
+        <source>Threshold</source>
+        <translation>Schwelle</translation>
+    </message>
+    <message>
+        <source>Exponent</source>
+        <translation>Exponent</translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation>Strom Quellennetz</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>LidarToolsAlgorithmProvider</name>
     <message>
         <source>LAStools folder</source>
@@ -9447,6 +9744,10 @@ Funktioniert auf allen ändernbaren Layern</translation>
         <source>seconds</source>
         <translation>Sekunden</translation>
     </message>
+    <message>
+        <source>Record parsing error</source>
+        <translation>Datensatzfehler</translation>
+    </message>
 </context>
 <context>
     <name>ModelerAlgorithm</name>
@@ -10587,6 +10888,33 @@ Bitte die Processing-Einstellung überprüfen.</translation>
     </message>
 </context>
 <context>
+    <name>PeukerDouglasMulti</name>
+    <message>
+        <source>Elevation Grid</source>
+        <translation>Höhen Raster</translation>
+    </message>
+    <message>
+        <source>Center Smoothing Weight</source>
+        <translation>Glättungsgewichtung Mitte</translation>
+    </message>
+    <message>
+        <source>Side Smoothing Weight</source>
+        <translation>Seitenglättungsgewichtung</translation>
+    </message>
+    <message>
+        <source>Diagonal Smoothing Weight</source>
+        <translation>Diagonale Glättungsgewichtung</translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation>Strom Quellennetz</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>PointDistance</name>
     <message>
         <source>Input point layer</source>
@@ -14121,7 +14449,7 @@ Antwort war:
     </message>
     <message>
         <source>Fatal error occurred in GRASS library. QGIS gets over the error but any next fatal error will cause QGIS exit without warning. This is a problem of GRASS 7.0.0beta1 but it is fixed in GRASS 7.1 and higher. Error message: %1</source>
-        <translation>Fataler Fehler in der GRASS Bibliothek. QGIS überspringt diesen Fehler, wird jedoch beim nächsten fatalen Fehler ohne Warnung beendet. Dies ist ein Problem von GRASS 7.0.0beta1, wurde aber bereits für GRASS 7.1 und höher behoben. Fehlermeldung: %1</translation>
+        <translation type="obsolete">Fataler Fehler in der GRASS Bibliothek. QGIS überspringt diesen Fehler, wird jedoch beim nächsten fatalen Fehler ohne Warnung beendet. Dies ist ein Problem von GRASS 7.0.0beta1, wurde aber bereits für GRASS 7.1 und höher behoben. Fehlermeldung: %1</translation>
     </message>
     <message>
         <source>Raster image fill</source>
@@ -16633,7 +16961,7 @@ Ausdruckfehler:
     </message>
     <message>
         <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</source>
-        <translation>Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4</translation>
+        <translation type="obsolete">Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4</translation>
     </message>
     <message>
         <source>Update Filtered</source>
@@ -16681,6 +17009,22 @@ Ausdruckfehler:
         <source>Update Selected</source>
         <translation>Gewählte aktualisieren</translation>
     </message>
+    <message>
+        <source>Show All Features In Initial Canvas Extent</source>
+        <translation>Alle Objekte im anfänglichen Kartenausschnitt zeigen</translation>
+    </message>
+    <message>
+        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5</source>
+        <translation>Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4%5</translation>
+    </message>
+    <message>
+        <source>, spatially limited</source>
+        <translation>, räumlich beschränkt</translation>
+    </message>
+    <message>
+        <source>Ctrl+R</source>
+        <translation>Strg+R</translation>
+    </message>
 </context>
 <context>
     <name>QgsAttributeTableModel</name>
@@ -17283,7 +17627,7 @@ Datenbank: %2</translation>
     </message>
     <message>
         <source>Join</source>
-        <translation>Verbinden</translation>
+        <translation type="obsolete">Verbinden</translation>
     </message>
     <message>
         <source>Advanced</source>
@@ -24131,6 +24475,18 @@ nicht angezeigt</translation>
         <source>The file has been updated by another application - reloading</source>
         <translation>Die Datei wurde von einer anderen Applikation geändert - wird neugeladen</translation>
     </message>
+    <message>
+        <source>Whole number (integer)</source>
+        <translation>Ganzzahl (integer)</translation>
+    </message>
+    <message>
+        <source>Decimal number (double)</source>
+        <translation>Dezimalzahl (double)</translation>
+    </message>
+    <message>
+        <source>Text, unlimited length (text)</source>
+        <translation>Text, unbegrenzte Länge (text)</translation>
+    </message>
 </context>
 <context>
     <name>QgsDelimitedTextSourceSelect</name>
@@ -29594,7 +29950,7 @@ in Zeile %2, Spalte %3</translation>
     </message>
     <message>
         <source>Cannot activate grass</source>
-        <translation>Kann GRASS nicht aktivieren</translation>
+        <translation type="obsolete">Kann GRASS nicht aktivieren</translation>
     </message>
 </context>
 <context>
@@ -33237,22 +33593,6 @@ Die könnte auf ein Netzwerkproblem oder ein Problem des WMS-Server hindeuten.</
         <source>Segments [%1]</source>
         <translation>Segmente [%1]</translation>
     </message>
-    <message>
-        <source>Meters</source>
-        <translation>Meter</translation>
-    </message>
-    <message>
-        <source>Feet</source>
-        <translation>Fuß</translation>
-    </message>
-    <message>
-        <source>Degrees</source>
-        <translation>Grad</translation>
-    </message>
-    <message>
-        <source>Nautical Miles</source>
-        <translation>Seemeilen</translation>
-    </message>
 </context>
 <context>
     <name>QgsMeasureTool</name>
@@ -37020,10 +37360,17 @@ Fehler:%2
         <source>Connection failed - Check settings and try again.
 
 </source>
-        <translation>Verbindung gescheitert - Einstellungen überprüfen und wiederholen.
+        <translation type="obsolete">Verbindung gescheitert - Einstellungen überprüfen und wiederholen.
 
 </translation>
     </message>
+    <message>
+        <source>Connection failed - consult message log for details.
+
+</source>
+        <translation type="unfinished">Verbindung fehlgeschlagen - bitte das Protokoll für Details konsultieren.j
+</translation>
+    </message>
 </context>
 <context>
     <name>QgsOracleNewConnectionBase</name>
@@ -37974,10 +38321,17 @@ Fehler: %2</translation>
         <source>Connection failed - Check settings and try again.
 
 </source>
-        <translation>Verbindung gescheitert - Einstellungen überprüfen und wiederholen.
+        <translation type="obsolete">Verbindung gescheitert - Einstellungen überprüfen und wiederholen.
 
 </translation>
     </message>
+    <message>
+        <source>Connection failed - consult message log for details.
+
+</source>
+        <translation>Verbindung fehlgeschlagen - bitte das Protokoll für Details konsultieren.
+</translation>
+    </message>
 </context>
 <context>
     <name>QgsPgNewConnectionBase</name>
@@ -50323,6 +50677,33 @@ Fehler in Zeile %d</translation>
     </message>
 </context>
 <context>
+    <name>SlopeAreaMulti</name>
+    <message>
+        <source>Slope Grid</source>
+        <translation>Neigungsgitter</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation>Beitragende Fläche Raster</translation>
+    </message>
+    <message>
+        <source>Slope Exponent</source>
+        <translation>Neigungs Exponent</translation>
+    </message>
+    <message>
+        <source>Area Exponent</source>
+        <translation>Flächen Exponent</translation>
+    </message>
+    <message>
+        <source>Slope Area Grid</source>
+        <translation>Neigungsflächen Raster</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
+</context>
+<context>
     <name>SpatialJoin</name>
     <message>
         <source>Target vector layer</source>
@@ -50488,6 +50869,29 @@ Fehler in Zeile %d</translation>
     <name>SymetricalDifference</name>
     <message>
         <source>Input layer</source>
+        <translation type="obsolete">Eingabelayer</translation>
+    </message>
+    <message>
+        <source>Difference layer</source>
+        <translation type="obsolete">Differenzlayer</translation>
+    </message>
+    <message>
+        <source>Symetrical difference</source>
+        <translation type="obsolete">Symmetrische Differenz</translation>
+    </message>
+    <message>
+        <source>Geometry exception while computing symetrical difference</source>
+        <translation type="obsolete">Geometrieausnahme bei Berechnung der symmetrischen Differenz</translation>
+    </message>
+    <message>
+        <source>Feature exception while computing symetrical difference</source>
+        <translation type="obsolete">Objektausnahme beim Berechnen der symmetrischen Differenz</translation>
+    </message>
+</context>
+<context>
+    <name>SymmetricalDifference</name>
+    <message>
+        <source>Input layer</source>
         <translation>Eingabelayer</translation>
     </message>
     <message>
@@ -50542,6 +50946,37 @@ Fehler in Zeile %d</translation>
         <source>TauDEM (hydrologic analysis)</source>
         <translation>TauDEM (hydrologische Analyse)</translation>
     </message>
+    <message>
+        <source>TauDEM multifile command line tools folder</source>
+        <translation>TauDEM-Mehrdateibefehlszeilenwerkzeugverzeichnis</translation>
+    </message>
+    <message>
+        <source>Enable singlefile TauDEM tools</source>
+        <translation>TauDEM-Einzeldateiwerkzeuge aktivieren</translation>
+    </message>
+    <message>
+        <source>Enable multifile TauDEM tools</source>
+        <translation>TauDEM-Mehrdateiwerkzeuge aktivieren</translation>
+    </message>
+    <message>
+        <source>Could not open TauDEM algorithm %s:
+%s</source>
+        <translation>Konnte TauDEM-Algorithmus nicht öffnen: %s:
+%s</translation>
+    </message>
+</context>
+<context>
+    <name>TauDEMMultifileAlgorithm</name>
+    <message>
+        <source>Could not load TauDEM algorithm: %s
+%s</source>
+        <translation>Konnte TauDEM-Algorithmus nicht laden: %s
+%s</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
+    </message>
 </context>
 <context>
     <name>TauDEMUtils</name>
@@ -51964,7 +52399,11 @@ Fehler in Zeile %d</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Virtual</source>
+        <translation>Virtuell</translation>
     </message>
 </context>
 <context>
@@ -53950,7 +54389,7 @@ The following options can be added
 
 
 </source>
-        <translation><h3>Getrennter Textlayer</h3>
+        <translation type="obsolete"><h3>Getrennter Textlayer</h3>
 Lädt und zeigt getrennten Text an
 <p>
 <a href="#re">Überblick</a><br/>
@@ -54885,6 +55324,560 @@ Die Ergebnisse können in eine neue Attributspalte geschrieben oder eine vorhand
 Um den Feldrechner zu öffnen, müssen Sie den Vektorlayer zuvor in den Bearbeitungsmodus versetzen.
 </translation>
     </message>
+    <message>
+        <source><h3>Delimited Text File Layer</h3>
+Loads and displays delimited text files
+<p>
+<a href="#re">Overview</a><br/>
+<a href="#creating">Creating a delimited text layer</a><br/>
+<a href="#csv">How the delimiter, quote, and escape characters work</a><br />
+<a href="#regexp">How regular expression delimiters work</a><br />
+<a href="#wkt">How WKT text is interpreted</a><br />
+<a href="#attributes">Attributes in delimited text files</a><br />
+<a href="#example">Example of a text file with X,Y point coordinates</a><br/>
+<a href="#wkt_example">Example of a text file with WKT geometries</a><br/>
+<a href="#python">Using delimited text layers in Python</a><br/>
+</p>
+
+<h4><a name="re">Overview</a></h4>
+<p>A &quot;delimited text file&quot; contains data in which each record starts on a new line, and 
+is split into fields by a delimiter such as a comma.  
+This type of file is commonly exported from spreadsheets (for example CSV files) or databases.  
+Typically the first line of a delimited text file contains the names of the fields.  
+</p>
+<p>
+Delimited text files can be loaded into QGIS as a layer. 
+The records can be displayed spatially either as a point
+defined by X and Y coordinates, or using a Well Known Text (WKT) definition of a geometry which may
+describe points, lines, and polygons of arbitrary complexity.  The file can also be loaded as an attribute
+only table, which can then be joined to other tables in QGIS.
+</p>
+<p>
+In addition to the geometry definition the file can contain text, integer, and real number fields.  By default 
+QGIS will choose the type of field based on its the non blank values of the field.  If all can be interpreted
+as integer then the type will be integer, if all can be interpreted as real numbers then the type will
+be double, otherwise the type will be text.
+</p>
+<p>
+QGIS can also read the types from an OGR CSV driver compatible &quot;csvt&quot; file.  
+This is a file alongside the data file, but with a &quot;t&quot; appended to the file name. 
+The file should just contain one line which lists the type of each field. 
+Valid types are &quot;integer&quot;, &quot;long&quot;, &quot;longlong&quot;, &quot;real&quot;, 
+&quot;string&quot;, &quot;date&quot;, &quot;time&quot;, and &quot;datetime&quot;. 
+The date, time, and datetime types are treated as strings by the delimited text provider.
+Each type may be followed by a width and precision, for example &quot;real(10.4)&quot;.
+The list of types are separated by commas, regardless of the delimiter used in the data file.  An
+example of a valid format file would be:
+</p>
+
+<pre>
+&quot;integer&quot;,&quot;string&quot;,&quot;string(20)&quot;,&quot;real(20.4)&quot;
+</pre>
+
+<h4><a name="creating">Creating a delimited text layer</a></h4>
+<p>Creating a delimited text layer involves choosing the data file, defining the format (how each record is to
+be split into fields), and defining the geometry is represented.  
+This is managed with the delimited text dialog as detailed below.  
+The dialog box displays a sample from the beginning of the file which shows how the format
+options have been applied.
+</p>
+<h5>Choosing the data file</h5>
+<p>Use the &quot;Browse...&quot; button to select the data file.  Once the file is selected the
+layer name will automatically be populated based on the file name.  The layer name is used to represent
+the data in the QGIS legend.  
+</p>
+<p>
+By default files are assumed to be encoded as UTF-8.  However other file
+encodings can be selected.  For example &quot;System&quot; uses the default encoding for the operating system.  
+It is safer to use an explicit coding if the QGIS project needs to be portable.
+</p>
+<h5>Specifying the file format</h5>
+<p>The file format can be one of
+<ul>
+    <li>CSV file format.  This is a format commonly used by spreadsheets, in which fields are delimited
+    by a comma character, and quoted using a &quot;(quote) character.  Within quoted fields, a quote
+    mark is entered as &quot;&quot;.</li>
+    <li>Selected delimiters.  Each record is split into fields using one or more  delimiter character.
+    Quote characters are used for fields which may contain delimiters.  Escape characters may be used 
+    to treat the following character as a normal character (ie to include delimiter, quote, and 
+    new line characters in text fields).  The use of delimiter, quote, and escape characters is detailed <a href="#csv">below</a>.
+    <li>Regular expression.  Each line is split into fields using a &quot;regular expression&quot; delimiter.
+    The use of regular expressions is details <a href="#regexp">below</a>.
+</ul>
+<h5>Record and field options</h5>
+<p>The following options affect the selection of records and fields from the data file</p>
+<ul>
+    <li>Number of header lines to discard: used to ignore header lines at the beginning of the text file</li>
+    <li>First record has fields names: if selected then the first record in the file (after the discarded lines) is interpreted as names of fields, rather than as a data record.</li>
+    <li>Trim fields: if selected then leading and trailing whitespace characters will be removed from each field (except quoted fields). </li>
+    <li>Discard empty fields: if selected then empty fields (after trimming) will be discard.  This 
+    affects the alignment of data into fields and is equivalent to treating consecutive delimiters as a 
+    single delimiter.  Quoted fields are never discarded.</li>
+    <li>Decimal separator is comma: if selected then commas instead of points are used as the decimal separator in real numbers.  For
+    example <tt>-51,354</tt> is equivalent to -51.354.
+    </li>
+</ul>
+<h5>Geometry definition</h5>
+<p>The geometry is can be define as one of</p>
+<ul>
+    <li>Point coordinates: each feature is represented as a point defined by X and Y coordinates.</li>
+    <li>Well known text (WKT) geometry: each feature is represented as a well known text string, for example
+    <tt>POINT(1.525622 51.20836)</tt>.  See details of the <a href="#wkt">well known text</a> format.
+    <li>No geometry (attribute only table): records will not be displayed on the map, but can be viewed
+    in the attribute table and joined to other layers in QGIS</li>
+</ul>
+<p>For point coordinates the following options apply:</p>
+<ul>
+    <li>X field: specifies the field containing the X coordinate</li>
+    <li>Y field: specifies the field containing the Y coordinate</li>
+    <li>DMS angles: if selected coordinates are represented as degrees/minutes/seconds
+    or degrees/minutes.  QGIS is quite permissive in its interpretation of degrees/minutes/seconds.
+    A valid DMS coordinate will contain three numeric fields with an optional hemisphere prefix or suffix
+    (N, E, or + are positive, S, W, or - are negative).  Additional non numeric characters are 
+    generally discarded.  For example <tt>N41d54'01.54&quot;</tt> is a valid coordinate.
+    </li>
+</ul>
+<p>For well known text geometry the following options apply:</p>
+<ul>
+    <li>Geometry field: the field containing the well known text definition.</li>
+    <li>Geometry type: one of &quot;Detect&quot; (detect), &quot;Point&quot;, &quot;Line&quot;, or &quot;Polygon&quot;.
+    QGIS layers can only display one type of geometry feature (point, line, or polygon). This option selects
+    which geometry type is displayed in text files containing multiple geometry types. Records containing
+   other geometry types are discarded.   
+    If &quot;Detect&quot; is selected then the type of the first geometry in the file will be used.
+    &quot;Point&quot; includes POINT and MULTIPOINT WKT types, &quot;Line&quot; includes LINESTRING and
+    MULTLINESTRING WKT types, and &quot;Polygon&quot; includes POLYGON and MULTIPOLYGON WKT types.
+</ul>
+<h5>Layer settings</h5>
+<p>Layer settings control the way the layer is managed in QGIS.  The options available are:</p>
+<ul>
+<li>Use spatial index. Create a spatial index to improve the performance of displaying and selecting spatial objects.
+This option may be useful for files larger than a few megabytes in size.</li>
+<li>Use subset index. Create an index if a subset of records is being used (either by explicitly setting a subset string 
+from the layer properties dialog, or an implicit subset of features for which the geometry is valid in files
+for which all not geometries are valid).  The index will only be created when a subset is defined.</li>
+<li>Watch file.  If this options is selected QGIS will watch the file for changes by other applications, and 
+reload the file when it is changed.  The map will not be updated until refreshed by the user, but indexes and
+extents will be reloaded.  This option should be selected if indexes are used and it is likely that another
+application will change the file. </li>
+</ul>
+
+<h4><a name="csv">How the delimiter, quote, and escape characters work</a></h4>
+<p>Records are split into fields using three character sets: 
+delimiter characters, quote characters, and escape characters.  
+Other characters in the record are considered as data, split into
+fields by delimiter characters. 
+Quote characters occur in pairs and cause the text between them to be treated as a data.  Escape characters cause the character following them to be treated as data.   
+</p>
+<p>
+Quote and escape characters cannot be the same as delimiter characters - they
+will be ignored if they are. Escape characters can be the same as quote characters, but behave differently
+if they are.</p>
+<p>The delimiter characters are used to mark the end of each field.  If more than one delimiter character
+is defined then any one of the characters can mark the end of a field.  The quote and escape characters 
+can override the delimiter character, so that it is treated as a normal data character.</p>
+<p>Quote characters may be used to mark the beginning and end of quoted fields. Quoted fields can 
+contain delimiters and may span multiple lines in the text file.  If a field is quoted then it must
+start and end with the same quote character.  Quote characters cannot occur within a field unless they
+are escaped.</p>
+<p>Escape characters which are not quote characters force the following character to be treated as data.  
+(that is, to stop it being treated as a new line, delimiter, or quote character).  
+</p>
+<p>Escape characters that are also quote characters have much more limited effect.  They only apply within quotes and only escape themselves.  For example, if 
+<tt>'</tt> is a quote and escape character, then the string
+<tt>'Smith''s&nbsp;Creek'</tt> will represent the value Smith's&nbsp;Creek.
+</p>
+
+
+<h4><a name="regexp">How regular expression delimiters work</a></h4>
+<p>Regular expressions are mini-language used to represent character patterns.  There are many variations
+of regular expression syntax - QGIS uses the syntax provided by the <a href="http://qt-project.org/doc/qt-4.8/qregexp.html">QRegExp</a> class of the <a href="http://qt.digia.com">Qt</a> framework.</p>
+<p>In a regular expression delimited file each line is treated as a record.  Each match of the regular expression in the line is treated as the end of a field.  
+If the regular expression contains capture groups (eg <tt>(cat|dog)</tt>)
+ then these are extracted as fields. 
+ If this is not desired then use non-capturing groups (eg <tt>(?:cat|dog)</tt>).
+</p>
+<p>The regular expression is treated differently if it is anchored to the start of the line (that is, the pattern starts with <tt>^</tt>).
+In this case the regular expression is matched against each line.  If the line does not match it is discarded
+as an invalid record.  Each capture group in the expression is treated as a field.  The regular expression
+is invalid if it does not have capture groups.  As an example this can be used as a (somewhat 
+unintuitive) means of loading data with fixed width fields.  For example the 
+expression
+<pre>
+^(.{5})(.{10})(.{20})(.{20})
+</pre>
+<p>will extract four fields of widths 5, 10, 20, and 20 characters from each line.  
+Lines less than 55 characters long will be discarded.
+</p>
+
+
+<h4><a name="wkt">How WKT text is interpreted</a></h4>
+<p>
+The delimited text layer recognizes the following 
+<a href="http://en.wikipedia.org/wiki/Well-known_text">well known text</a> types - 
+<tt>POINT</tt>, <tt>MULTIPOINT</tt>, <tt>LINESTRING</tt>, <tt>MULTILINESTRING</tt>, <tt>POLYGON</tt>, and <tt>MULTIPOLYGON</tt>.  
+It will accept geometries with
+a Z coordinate (eg <tt>POINT&nbsp;Z</tt>), a measure (<tt>POINT&nbsp;M</tt>), or both (<tt>POINT&nbsp;ZM</tt>).
+</p>
+<p>
+It can also handle the PostGIS EWKT variation, in which the geometry is preceded by an spatial reference 
+system id (eg <tt>SRID=4326;POINT(175.3&nbsp;41.2)</tt>), and a variant used by Informix in which the WKT is 
+preceded by an integer spatial reference id (eg <tt>1 POINT(175.3&nbsp;41.2)</tt>).
+In both cases the SRID is ignored.
+</p>
+
+
+
+<h4><a name="attributes">Attributes in delimited text files</a></h4> 
+<p>Each record in the delimited text file is split into fields representing
+attributes of the record.  Usually the attribute names are taken from the first
+data record in the file.  However if this does not contain attribute names, then they will be named <tt>field_1</tt>, <tt>field_2</tt>, and so on.  
+Also if records have more fields than are defined in the header record then these
+will be named <tt>field_#</tt>, where # is the field number (note that empty fields at the end of a record are ignored).
+QGIS may override 
+the names in the text file if they are numbers, or have names like <tt>field_#</tt>,
+or are duplicated.
+</p>
+<p>
+In addition to the attributes explicitly in the data file QGIS assigns a unique 
+feature id to each record which is the line number in the source file on which
+the record starts.  
+</p>
+<p>
+Each attribute also has a data type, one of string (text), integer, longlong,
+or real number.
+The data type is inferred from the content of the fields - if every non blank value
+is a valid integer then the type is integer, otherwise if it is a valid long long
+nubmer then the type is longlong, otherwise if it is a valid real
+number then the type is real, otherwise the type is string.  Note that this is
+based on the content of the fields - quoting fields does not change the way they
+are interpreted.
+</p>
+
+
+<h4><a name="example">Example of a text file with X,Y point coordinates</a></h4> 
+<pre>
+X;Y;ELEV
+-300120;7689960;13
+-654360;7562040;52
+1640;7512840;3
+</pre>
+<p>This file:</p>
+<ul>
+<li> Uses <b>;</b> as delimiter. Any character can be used to delimit the fields.</li>
+<li>The first row is the header row. It contains the field names X, Y and ELEV.</li>
+<li>The x coordinates are contained in the X field.</li>
+<li>The y coordinates are contained in the Y field.</li>
+</ul>
+<h4><a name="wkt_example">Example of a text file with WKT geometries</a></h4>
+<pre>
+id|wkt
+1|POINT(172.0702250 -43.6031036)
+2|POINT(172.0702250 -43.6031036)
+3|POINT(172.1543206 -43.5731302)
+4|POINT(171.9282585 -43.5493308)
+5|POINT(171.8827359 -43.5875983)
+</pre>
+<p>This file:</p>
+<ul>
+  <li>Has two fields defined in the header row: id and wkt.
+  <li>Uses <b>|</b> as a delimiter.</li>
+  <li>Specifies each point using the WKT notation
+</ul>
+
+<h4><a name="python">Using delimited text layers in Python</a></h4>
+<p>Delimited text data sources can be creating from Python in a similar way to other vector layers.
+The pattern is:
+</p>
+<pre>
+from PyQt4.QtCore import QUrl, QString
+from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
+
+# Define the data source
+filename="test.csv"
+uri=QUrl.fromLocalFile(filename)
+uri.addQueryItem("type","csv")
+uri.addQueryItem("delimiter","|")
+uri.addQueryItem("wktField","wkt")
+# ... other delimited text parameters
+layer=QgsVectorLayer(QString(uri.toEncoded()),"Test CSV layer","delimitedtext")
+# Add the layer to the map
+if layer.isValid():
+    QgsMapLayerRegistry.instance().addMapLayer( layer )
+</pre>
+<p>This could be used to load the second example file above.</p>
+<p>The configuration of the delimited text layer is defined by adding query items to the uri.
+The following options can be added
+</p>
+<ul>
+    <li><tt>encoding=..</tt> defines the file encoding.  The default is &quot;UTF-8&quot;</li>
+    <li><tt>type=(csv|regexp|whitespace)</tt> defines the delimiter type.  Valid values are csv, 
+       regexp, and whitespace (which is just a special case of regexp).  The default is csv.</li>
+       <li><tt>delimiter=...</tt> defines the delimiters that will be used for csv formatted files, 
+       or the regular expression for regexp formatted files.  The default is , for CSV files.  There is
+       no default for regexp files.</li>
+       <li><tt>quote=..</tt> (for csv files) defines the characters used to quote fields. The default is &quot;</li>
+       <li><tt>escape=..</tt> (for csv files) defines the characters used to escape the special meaning of the next character. The default is &quot;</li>
+       <li><tt>skipLines=#</tt> defines the number of lines to discard from the beginning of the file. The default is 0.</li>
+       <li><tt>useHeader=(yes|no)</tt> defines whether the first data record contains the names of the data fields. The default is yes.</li>
+       <li><tt>trimFields=(yes|no)</tt> defines whether leading and trailing whitespace is to be removed from unquoted fields. The default is no.</li>
+       <li><tt>maxFields=#</tt> defines the maximum number of fields that will be loaded from the file.  
+       Additional fields in each record will be discarded. The default is 0 - include all fields.
+       (This option is not available from the delimited text layer dialog box).</li>
+       <li><tt>skipEmptyFields=(yes|no)</tt> defines whether empty unquoted fields will be discarded (applied after trimFields). The default is no.</li>
+       <li><tt>decimalPoint=.</tt> specifies an alternative character that may be used as a decimal point in numeric fields.  The default is a point (full stop) character.</li>
+       <li><tt>wktField=fieldname</tt> specifies the name or number (starting at 1) of the field containing a well known text geometry definition</li>
+       <li><tt>xField=fieldname</tt> specifies the name or number (starting at 1) of the field the X coordinate (only applies if wktField is not defined)</li>
+       <li><tt>yField=fieldname</tt> specifies the name or number (starting at 1) of the field the Y coordinate (only applies if wktField is not defined)</li>
+       <li><tt>geomType=(auto|point|line|polygon|none)</tt> specifies type of geometry for wkt fields, or none to load the file as an attribute-only table.  The default is auto.</li>
+       <li><tt>subset=expression</tt> specifies an expression used to identify a subset of the records that will be 
+       used.</li>
+       <li><tt>crs=...</tt> specifies the coordinate system to use for the vector layer, in a format accepted by QgsCoordinateReferenceSystem.createFromString (for example &quot;EPSG:4167&quot;).  If this is not 
+       specified then a dialog box may request this information from the user
+       when the layer is loaded (depending on QGIS CRS settings).</li>
+       <li><tt>subsetIndex=(yes|no)</tt> specifies whether the provider should build an index to define subset during the initial file scan.  The index will apply both for explicitly defined subsets, and for the implicit subset of features for which the geometry definition is valid.  By default the subset index is built if it is applicable.</li>
+       <li><tt>spatialIndex=(yes|no)</tt> specifies whether the provider should build a spatial index during the initial file scan.  By default the spatial index is not built. </li>
+       <li><tt>watchFile=(yes|no)</tt> specifies whether the provider should use a file system watcher to monitor for changes to the file.</li>
+       <li><tt>quiet=(yes|no)</tt> specifies whether errors encountered loading the layer are presented in a dialog box (they will be written to the QGIS log in any case). The default is no.  This option is not available from the GUI</li>
+</ul>
+
+
+</source>
+        <translation><h3>Getrennter Textlayer</h3>
+Lädt und zeigt getrennten Text an
+<p>
+<a href="#re">Überblick</a><br/>
+<a href="#creating">Erzeugung eines getrennten Textlayers</a><br/>
+<a href="#csv">Wie Trenn-, Anführungs- und Ausnahmezeichen funktionieren</a><br />
+<a href="#regexp">Wie reguläre Ausdrücke als Trennzeichen funktionieren</a><br />
+<a href="#wkt">Wie WKT interpretiert wird</a><br />
+<a href="#attributes">Attribute in getrennten Textdateien</a><br />
+<a href="#example">Beispiel einer Textdatei mit X,Y-Punktkoordinaten</a><br/>
+<a href="#wkt_example">Beispiel einer Textdatei mit WKT-Geometrien</a><br/>
+<a href="#python">Getrennte Textdateilayern in Python benutzen</a><br/>
+</p>
+
+<h4><a name="re">Überblick</a></h4>
+<p>Eine "getrennter Text"-Datei enthält Daten in denen jeder Datensatz in einer neuen Zeile beginnt, die durch Trennzeichen wie ein Komma in Felder aufgeteilt ist.
+Dieser Dateityp wird üblicherweise von Tabellenkalkulationen (z.B. CSV-Dateien) oder Datenbanken ausgegeben.  
+Normalerweise enthält die erste Zeile einer getrennten Textdatei die Feldnamen.  
+</p>
+<p>
+Getrennte Textdateien können in QGIS als Layer geladen werden. 
+Die Datensätze können räumlich entweder als durch X- und Y-Koordinaten definierte Punktkoordinaten oder als Well-Known-Text-Geometriedefinition (WKT), die Punkte, Linien und Polygone beliebiger Komplexität beschreibt, dargestellt werden. Die Datei kann auch nur als Attributtabelle geladen werden, die mit anderen Tabellen in QGIS verknüpft werden können.
+</p>
+<p>
+<p>
+Zusätzlich zur Geometriedefinition kann die Datei Text, ganze und Fließkommazahlen enthalten. QGIS wird den Feldtyp nach dem Inhalt der nicht leeren Felder wählen. Wenn alle als ganze Zahl interpretiert werden können, werden sie als gnaze Zahl, wenn alle als Fließkommazahl, werden sie als Fließkommazahl und ansonsten als Zeichenkette angesehen.
+</p>
+<p>
+QGIS kann die Typen auch einer OGR-CSV-Treiber kompatiblen "csvt"-Datei lesen. Diese Datei liegt nebene der Datendatei, aber mit einem an den Dateinamen angehängtem "t". Die Datei sollte nur eine Zeile enthalten, die die Feldtypen auflistet. Gültige Typen sind "integer" (ganze Zahl), "real" (Fließkommazahl), "string" (Zeichenkette), "date" (Datum), "time" (Zeit) und "datetime" (Datum&Zeit). Datum, Zeit un [...]
+</p>
+
+<pre>
+"integer","string","string(20)","real(20.4)"
+</pre>
+
+</p>
+<h4><a name="creating">Getrennten Textlayer erzeugen</a></h4>
+<p>Zur Erzeugung eines getrennten Textlayers muß eine Datei gewählt, das Format definiert (wie jeder Datensatz in Felder aufgeteilt wird) und festgelegt werden wird die Geometrierepräsentation angegeben werden.  
+Dies wird über den im folgenden beschriebenen Getrennter Textdialog eingegeben.  
+Der dialog zeigt ein Beispiele am Anfang der Datei an, die zeigen wie sich die Einstellungen auswirken.
+</p>
+<h5>Dateiauswahl</h5>
+<p>Klicken Sie auf den "Durchsuchen..."-Knopf um die Datei zu wählen.  Sobald die Datei gewählt ist, wird der Layername automatisch mit dem Dateinamen gefüllt.  Der Layername wird benutzt, um die Daten in der Legende anzuzeigen.  
+</p>
+<p>
+Normalerweise wird davon ausgegangen, dass die Dateien in UTF-8 kodiert sind.  Es können jedoch andere Kodierungen gewählt werden.  Z.B. nutzt "System" die voreingestellte Kodierung des Betriebssystems. 
+Es ist sicherer eine explizite Kodierung anzugeben, wenn das QGIS-Projekt portierbar sein muß.
+</p>
+<h5>Dateiformat festlegen</h5>
+<p>Folgende Dateiformat sind verfügbar:
+<ul>
+    <li>CSV-Dateiformat.  Dies ist ein Format, das üblicherweise von Tabellenkalkulationen benutzt wird. Hier sind die Felder durch ein Komma begrenzt und durch das Anführungszeichen " umschlossen.  Zwischen den Anführungszeichen wird ein Anführungszeichen durch "" eingegeben.</li>
+    <li>Gewählte Trennzeichen.  Jeder Datensatz wird durch ein oder mehrere Trennzeichen in Felder ausgeteilt.
+    Anführungszeichen werden für Felder verwendet, die Trennzeichen enthalten können.  Ausnahmezeichen könnten verwendet werden, um das darauffolgenden Zeichen als normales Zeichen (um Trennzeichen, Anführungszeichen und Zeilenumbrüche in Textfelden anzugeben).  Die Verwendung von Trenn-, Anführungs- und Ausnahmezeichen ist  <a href="#csv">unten</a> näher ausgeführt.
+    <li>Regulärer Ausdruck.  Jede Zeile wird mit "regulären Ausdrücken" als Trennzeichen in Felder aufgeteilt.
+    Der Verwendung von regulären Ausdrücken ist <a href="#regexp">unten</a> näher ausgeführt.
+</ul>
+<h5>Datensatz und Feldoptionen</h5>
+<p>Die folgenden Optionen beeinflussen die Auswahl von Datensätzen und Feldern aus der Datei</p>
+<ul>
+    <li>Anzahl der zu überspringenden führenden Zeilen: um führende Zeilen zu ignorieren</li>
+    <li>Erster Datensatz enthält Feldnamen: wenn gewählt wird die erste Zeile (nach den ignorierten Zeilen) als Feldnamenzeile statt Datenzeile interpretiert.</li>
+    <li>Felder kürzen: wenn gewählt, werden führende und schließende Leerzeichen abgeschnitten (außer für Felder in Anführungszeichen).</li>
+    <li>Leere Felder verwerfen: wenn gewählt, werden leere Felder (nach Kürzung) verworfen.  Dies beeinflußt die Zurordnung der Daten zu Feldern und entspricht der Behandlung von aufeinanderfolgenden Trennzeichen als ein Trennzeichen.  Felder in Anführungszeichen werden nie verworfen.</li>
+    <li>Dezimaltrennzeichen ist Komma: wenn gewählt, werden Kommata statt Punkte als Dezimaltrennzeichen in Fließkommazahlen verwendet.  Beispiel <tt>-51,354</tt> entspricht -51.354.
+    </li>
+</ul>
+<h5>Geometrie-Definition</h5>
+<p>Folgende Geometriedefinitionen sind verfügbar:</p>
+<ul>
+    <li>Punktkoordinaten: jedes Objekt wird als durch X- und Y-Koordinaten repräsentiert.</li>
+    <li>Well-Known-Text-Geometrie (WKT): jedes Objekt wird durch eine WKT-Zeichenkette repräsentiert, z.B.
+    <tt>POINT(1.525622 51.20836)</tt>.  Siehe <a href="#wkt">Well-Known-Text</a>-Format.
+    <li>Keine Geometrie (Nur Attributtabelle): Datensätze werden nicht in der Karte angezeigt, können aber in der Attributtabelle angezeigt und mit anderen Tabellen in QGIS verknüpft werden.</li>
+</ul>
+<p>Für Punktkoordinaten gelten folgenden Einstellungen:</p>
+<ul>
+    <li>X-Feld: gibt das Feld an, das die X-Koordinate enthält</li>
+    <li>Y Feld: gibt das Feld an, das die Y-Koordinate enthält</li>
+    <li>DMS-Winkel: wenn gewählt, werden Koordinaten in Grad/Minute/Sekunde oder Grad/Minute repräsentiert. QGIS ist bei der Interpretation von Grad/Minuten/Sekunden ser nachsichtig. Eine gültige DMS-Koordinaten enthält drei numerische Felder mit einem optionalen Hemisphärenpräfix oder -suffix (N, E oder + sind positiv, S, W oder - sind  negativ).  Weitere nicht numerische Zeichen werden verworfen.  Z.B. ist <tt>N41d54'01.54"</tt> eine gültige Koordinate.
+    </li>
+</ul>
+<p>Für Well-Known-Text-Geometrien gelten folgende Einstellungen:</p>
+<ul>
+    <li>Geometriefeld: das Feld, dass die Well-Known-Text-Definition enthält.</li>
+    <li>Geometrietyp: "Bestimmen" (bestimmen), "Punkt", "Linie", oder "Polygon". QGIS-Layer können nur einen Geometrietyp ( Punkt, Linie oder Polygon) darstellen. Diese Einstellung legt fest welcher Geometrietyp angezeigt wird, wenn eine Datei mehrere Geometrietypen enthält. Datensätze die davon abweichen werden verworfen. Wenn "Bestimmen" gewählt ist, wird der Geometrietyp der ersten Geometrie der Datei verwendet.
+    "Punkt" umfaßt POINT und MULTIPOINT WKT-Typen, "Line" umfaßt LINESTRING und MULTLINESTRING WKT-Typen und "Polygon" umfaßt POLYGON und MULTIPOLYGON WKT-Typen.
+</ul>
+<h5>Layereinstellungen</h5>
+<p>Layereinstellungen steuern wie ein Layer in QGIS behandelt wird.  Folgende Einstellungen sind verfügbar:</p>
+<ul>
+<li>Räumlichen Index nutzen. Einen räumlichen Index erzeugen, der die Anzeige- und räumliche Auswahlgeschwindigkeit verbessert.
+Diese Option kann für Dateien sinnvoll sein, deren Größe einige MB übersteigt.</li>
+<li>Untermengen-Index nutzen. Einen Index erzeugen, wenn eine Untermenge verwendet wird (entweder durch die Angabe eines Filters in den Layereigenschaftendialog oder implizite Untermenge, wenn nicht alle Geometrien gültig sind).  Der Index wird nur erzeugt, wenn eine Untermenge definiert ist.</li>
+<li>Datei überwachen.  Wenn dies eingestellt ist, überwacht QGIS die Datei auf Änderungen durch Applikationen und läd sie neue, wenn es geändert wird.  Die Karte wird nicht neugezeichnet bis der Benutzer sie aktualisiert, aber Indizes und Ausmaße werden neugeladen.  Diese Option sollte gewählt werden, wenn Indizes benutzt werden und es wahrscheinlich ist, dass anderen Applikationen die Datei ändern.</li>
+</ul>
+
+<h4><a name="csv">Wie Trenn-, Anführungs- und Ausnahmezeichen verwendet werden</a></h4>
+<p>Datensätze werden durch drei Zeichenarten in Felder aufgeteilt: 
+Trenn-, Anführungs- und Ausnahmezeichen.  
+Andere Zeichen im Datensatz werden als Daten betrachtet und durch Trennzeichen in Felder aufgeteilt. Anführungszeichen treten gepaart auf und bewriken das der Text dazwischen wie Daten behandelt wird.  Ausnahmezeichen bewirken, dass darauffolgede Zeichen als Daten behandelt werden.   
+</p>
+<p>
+Anführungs- und Ausnahmezeichen dürfen keine Trennzeichen sein - sie werden ignoriert, wenn sie es sind. Ausnahmezeichen können auch Anführungszeichen sein, verhalten sich aber unterschiedlich, wenn sie es sind.</p>
+<p>Trennzeichen markieren die Feldenden.  Wenn mehr als ein Trennzeichen definiert ist, kann ein jedes das Feldende markieren. Die Anführungs- und Ausnahmezeichen   übersteuern das Trennzeichen, sodaß es als normales Datenzeichen behandelt wird.</p>
+<p>Anführungszeichen können verwendet werden, um den Anfang und das Ende von Feldern zu markieren. Solche Felder können Trennzeichen enthalten und über mehrere Zeilen der Textdatei gehen. Wenn ein Feld in Anführungszeichen steht müssen die Anführungszeichen an beiden Ende übereinstimmen. Anführungszeichen für nicht in einem vorkommen außer sie sind mit einem Ausnahmezeichen versehen.</p>
+<p>Ausnahmezeichen, die keine Anführungszeichen sind sorgen dafür, dass das folgende Zeichen als Datenzeichen behandelt wird (d.h. nicht mehr als Zeilenumbruch, Trenn- oder Anführungszeichen behandelt wird).  
+</p>
+<p>Ausnahmezeichen, die auch Anführungszeichen sind, haben einen sehr viel begrenzden Effekt.  Sie wirken nur innerhalb von Anführungszeichen und nehme nur sich selbst aus. Wenn beispielsweise 
+<tt>'</tt> ein Anführungs- und Ausnahmezeichen ist, repräsentiert die Zeichenkette
+<tt>'Smith''s&nbsp;Creek'</tt> den Wert Smith's&nbsp;Creek.
+</p>
+
+
+<h4><a name="regexp">Wie reguläre Ausdrücke funktionieren</a></h4>
+<p>Reguläre Ausdrücke sind eine Minisprache um Zeichenmuster auszudrücken.  Es gibt viele Syntaxvarianten für reguläre Ausdrücke - QGIS nutzt die Syntax der Klasse <a href="http://qt-project.org/doc/qt-4.8/qregexp.html">QRegExp</a> des <a href="http://qt.digia.com">Qt</a> Frameworks.</p>
+<p>In einer durch regulären Ausdruck getrennten Datei wird jede Zeile als Datensatz behandelt.  Jeder Treffer des regulären Ausdrucks in der Zeile wird als Feldende behandelt. Wenn der reguläre Ausdruck Erfassungsgruppen (engl. capture groups; z.B. <tt>(cat|dog)</tt>) enthält werden diese als Felder extrahiert. Wenn dies nicht gewünscht ist, sollten Nicht-Erfassungsgruppen (z.B. <tt>(?:cat|dog)</tt>) verwendet werden.
+</p>
+<p>Der reguläre Ausdruck wird anders behandelt, wenn es sich auf den Anfang der Zeile bezieht (d.h, wenn das Muster mit <tt>^</tt> beginnt).
+In diesem Fall wird der Ausdruck auf jede Zeile angewendet. Wenn die Zeile kein Treffer ist, wird sie als ungültige Datensatz verworfen.  Jede Erfassungsgruppe im Ausdruck wird als Feld behandelt.  Der reguläre Ausdruck ist ungültig, wenn er keine Erfassungsgruppen enthält.  Zum Beispiel kann folgendes als ein (etwas uneingängiges) Mittel zum Laden von Daten mit festen Feldbreite verwendet werden:
+<pre>
+^(.{5})(.{10})(.{20})(.{20})
+</pre>
+<p>extrahiert vier Felder der Breiten 5, 10, 20 und 20 Zeichen einer jeden Zeile.  
+Zeilen mit weniger als 55 Zeichen werden verworfen.
+</p>
+
+
+<h4><a name="wkt">Wie WKT-Texte interpretiert werden</a></h4>
+<p>
+Ein getrennter Textlayer erkennt folgende <a href="http://en.wikipedia.org/wiki/Well-known_text">Well-Known-Text</a>-Typen - 
+<tt>POINT</tt>, <tt>MULTIPOINT</tt>, <tt>LINESTRING</tt>, <tt>MULTILINESTRING</tt>, <tt>POLYGON</tt>, and <tt>MULTIPOLYGON</tt>.  
+Es akzeptiert Geometrien mit einer Z-Koordinate (z.B. <tt>POINT&nbsp;Z</tt>), eine Messung (<tt>POINT&nbsp;M</tt>) oder beides (<tt>POINT&nbsp;ZM</tt>).
+</p>
+<p>
+Es unterstützt auch die PostGIS-EWKT-Variante, in der die Geometrie mit einer räumlichen Referenzsystem-ID eingeleitet wird (z.B. <tt>SRID=4326;POINT(175.3&nbsp;41.2)</tt>) und die Informix-Variante in der eine WKT nur mit einer ganzzahligen räumlichen Referenzsystem-ID eingeleitet wird (z.B. <tt>1 POINT(175.3&nbsp;41.2)</tt>).
+In beiden Fällen wird die SRID ignoriert.
+</p>
+
+
+
+<h4><a name="attributes">Attribute in getrennten Textdateien</a></h4> 
+<p>Jeder Datensatz wird in Felder aufgeteilt, die die Attribute des Datensatzes repräsentieren.  Normalerweise werden die Attributname der ersten Zeile entnommen.  Wenn sie keine Feldnamen enthält werden sie mit <tt>field_1</tt>, <tt>field_2</tt> usw. benannt.  
+Auch wenn es mehr Datensätzen mehr Felder als die in der Kopfzeile definierten hat, werden diese mit <tt>field_#</tt> benannt, wobei # die Feldnummer ist (zu beachten ist, das leere Felder am Ende des Datensatzes ignoriert werden).
+QGIS kann andere Feldnamen verwenden, wenn die Namen in der Textdateien Zahlen sind oder Namen wie <tt>field_#</tt> haben oder doppelt vorkommen.
+</p>
+<p>
+Zusätzlich zu den Attributen, die explizit in der Datei vorkommen, vergibt QGIS jedem Datensatz die Zeilennummer in der er beginnt als eindeutige Objektkennung.  
+</p>
+<p>
+Jedes Attribut hat auch einen Datentyp aus Zeichenkette (String, Text), ganzer Zahl oder Fließkommazahl.
+Der Datentyp wird aus dem Inhalt des Felds hergeleitet -wenn jeder nicht leere Wert eine ganze Zahl ist der Feldtyp Ganzzahl, wenn er eine gültige Fließkommazahl ist, ist der Feldtype Fließkommazahl und sonst ist der Typ Zeichenkette .  Zu beachten ist, das dies auf den Inhalten der Felder basiert, Anführungszeichen beeinflußen die Interpretation der Werte nicht.
+</p>
+
+
+<h4><a name="example">Beispiel für eine Textdatei mit X-,Y-Punktkoordinaten</a></h4> 
+<pre>
+X;Y;ELEV
+-300120;7689960;13
+-654360;7562040;52
+1640;7512840;3
+</pre>
+<p>Die Datei:</p>
+<ul>
+<li> benutzt <b>;</b> als Trennzeichen. Jedes Zeichen kann als Trennzeichen für Felder verwendet werden.</li>
+<li>Die erste Zeile ist die Kopfzeile. Es enthält die Feldnamen X, Y und ELEV.</li>
+<li>Die X-Koordinaten stehen im Feld X.</li>
+<li>Die Y Koordinaten stehen im Feld Y.</li>
+</ul>
+<h4><a name="wkt_example">Beispiel für eine Textdatei mit WKT-Geometrien</a></h4>
+<pre>
+id|wkt
+1|POINT(172.0702250 -43.6031036)
+2|POINT(172.0702250 -43.6031036)
+3|POINT(172.1543206 -43.5731302)
+4|POINT(171.9282585 -43.5493308)
+5|POINT(171.8827359 -43.5875983)
+</pre>
+<p>Diese Datei</p>
+<ul>
+  <li>hat zwei Felder in der Kopfzeile: id und wkt.
+  <li>nutzt <b>|</b> als Trennzeichen.</li>
+  <li>gibt jeden Punkt in WKT-Notation an
+</ul>
+
+<h4><a name="python">Getrennte Textlayer mit Python verwenden</a></h4>
+<p>Getrennte Textlayerdatenquellen können mit Python in ähnlicher Weise wie andere Vektorlayer erzeugt werden.
+Das Muster ist:
+</p>
+<pre>
+from PyQt4.QtCore import QUrl, QString
+from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
+
+# Define the data source
+filename="test.csv"
+uri=QUrl.fromLocalFile(filename)
+uri.addQueryItem("type","csv")
+uri.addQueryItem("delimiter","|")
+uri.addQueryItem("wktField","wkt")
+# ... other delimited text parameters
+layer=QgsVectorLayer(QString(uri.toEncoded()),"Test CSV layer","delimitedtext")
+# Add the layer to the map
+if layer.isValid():
+    QgsMapLayerRegistry.instance().addMapLayer( layer )
+</pre>
+<p>Dies könnte zum Laden des <a href="#wkt_example">zweiten</a> Beispiels oben verwendet werden.</p>
+<p>Die Konfiguration wird durch die Query-Items in der URI festgelegt.
+Die folgenden Optionen können verwendet werden
+</p>
+<ul>
+    <li><tt>encoding=..</tt> legt die Dateikodierung fest.  Voreingestellt ist "UTF-8"</li>
+    <li><tt>type=(csv|regexp|whitespace)</tt> legt den Trennzeichentyp fest.  Gültige Werte sind  csv, 
+       regexp, und whitespace (das nur ein Sonderfall von regexp ist).  Voreingestellt ist csv.</li>
+       <li><tt>delimiter=...</tt> legt das Trennzeichen, das für CSV oder regexp formatierte Dateien verwendet wird, fest.  Voreingestellt ist CSV-Dateien ist <tt>,</tt>.  Für regexp gibt es keine Voreinstellung.</li>
+       <li><tt>quote=..</tt> (für CSV-Dateien) legt die Anführungszeichen fest. Voreingestellt ist "</li>
+       <li><tt>escape=..</tt> (für CSV-Dateien) legt Ausnahmezeichen fest, das das folgende Zeichen von ihrer Sonderbedeutung ausnimmt. Voreingestellt ist "</li>
+       <li><tt>skipLines=#</tt> legt die Anzahl der Zeilen fest, die am Anfang der Datei übersprungen werden sollen. Voreingestellt ist 0.</li>
+       <li><tt>useHeader=(yes|no)</tt> legt fest, ob der erste Datensatz Feldnamen enthält. Voreingestellt ist yes.</li>
+       <li><tt>trimFields=(yes|no)</tt> legt fest, ob führende oder schließende Leerzeichen abgeschnitten von nicht mit Anführungszeichen umschlossenen Felder abgeschnitten werden sollen. Voreingestellt ist no.</li>
+       <li><tt>maxFields=#</tt> legt die Feldhöchstzahl fest, die aus der Datei geladen werden. Weitere Felder in den Datensätzen werden verworfen.Voreingestellt ist 0 - alle Felder einschließen
+       (Diese Option ist in der Dialogbox nicht vorhanden).</li>
+       <li><tt>skipEmptyFields=(yes|no)</tt> legt fest, ob leere nicht in Anführungszeichen stehende Felder verworfen werden (angewendet nach trimFields). Voreingestellt ist no.</li>
+       <li><tt>decimalPoint=.</tt> legt einen alternatives Zeichen als Dezimaltrennerzeichen in numerischen Feldern fest.  Voreingestellt ist Punkt (<tt>.</tt>).</li>
+       <li><tt>wktField=feldname</tt> legt den Namen oder die Feldnummer (beginnend mit 1) des Feldes fest, das eine WKT-Geometrie enthält</li>
+       <li><tt>xField=feldname</tt> legt den Name oder die Feldnummer (beginnend mit 1) des Feldes fest, das die X-Koordinate enthält (gilt nur, wenn kein wktField angegeben ist)</li>
+       <li><tt>yField=feldname</tt> legt den Name oder die Feldnummer (beginnend mit 1) des Feldes fest, das die Y-Koordinate enthält (gilt nur, wenn kein wktField angegeben ist)</li>
+       <li><tt>geomType=(auto|point|line|polygon|none)</tt> legt den Geometrietyp der WKT-Felder an oder <tt>none</t>, um nur die Attributtabelle zu laden.  Voreingestellt ist auto.</li>
+       <li><tt>subset=expression</tt> legt einen Ausdruck fest, der die zu verwendende Untermenge der Datensätze identifiziert.</li>
+       <li><tt>crs=...</tt> legt das zu verwendende Koordinatensystem des Vektorlayers in einem durch QgsCoordinateReferenceSystem.createFromString (z.B. "EPSG:4167") akzeptierten Formats fest.  Wenn dies nicht angegeben ist, kann die ein Dialog diese vom Benutzer erfragen (abhängig von der QGIS-KBS-Einstellung)</li>
+       <li><tt>subsetIndex=(yes|no)</tt> legt fest, das der Datenlieferanz einen Index beim ersten Laden aufbauen soll, um die Untermenge festzulegen.  Der Index kommt bei explizit definierten Untermengen und implizite Untermenge mit gültigen Geometrien zu Anwendung.  Voreingestellt ist, dass der Index, wenn möglicht erstellt wird.</li>
+       <li><tt>spatialIndex=(yes|no)</tt> legt fest, das ein räumlicher Index beim ersten Lesen der Datei erstellt werden soll.  Voreingestellt ist, dass kein Index erstellt wird. </li>
+       <li><tt>watchFile=(yes|no)</tt> legt fest, dass der Datenlieferant das Dateisystem auf Dateiänderungen überwachen soll.</li>
+       <li><tt>quiet=(yes|no)</tt> legt fest, ob Fehler beim Laden des Layers in einem Dialog angezeigt werden sollen (in jedem Fall werden sie in QGIS-Protokoll geschrieben). Voreingestellt ist no.  Diese Option ist in der Oberfläche nicht verfügbar</li>
+</ul></translation>
+    </message>
 </context>
 <context>
     <name>contour</name>
@@ -55803,7 +56796,11 @@ Erweiterung wird nicht aktiviert.</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Filled</source>
+        <translation>Gefüllt</translation>
     </message>
 </context>
 <context>
@@ -60507,7 +61504,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>xyz</source>
+        <translation>xyz</translation>
     </message>
 </context>
 <context>
@@ -60534,6 +61535,10 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Pyramidized</source>
         <translation>Ausgabelayer</translation>
     </message>
 </context>
@@ -62359,7 +63364,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Hillshade</source>
+        <translation>Schummerung</translation>
     </message>
 </context>
 <context>
@@ -63347,7 +64356,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Merged</source>
+        <translation>Verschmolzen</translation>
     </message>
 </context>
 <context>
@@ -63366,7 +64379,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Nearblack</source>
+        <translation>Fast-Schwarz</translation>
     </message>
 </context>
 <context>
@@ -63465,7 +64482,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>PCT to RGB</source>
+        <translation>PCT nach RGB</translation>
     </message>
 </context>
 <context>
@@ -63480,7 +64501,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Vectorized</source>
+        <translation>Vektorisiert</translation>
     </message>
 </context>
 <context>
@@ -63515,7 +64540,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Distance</source>
+        <translation>Entfernung</translation>
     </message>
 </context>
 <context>
@@ -63530,7 +64559,7 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Write values inside an existing raster layer(*)</source>
-        <translation>Werte in einen vorhandenen Rasterlayer(*) eintragen </translation>
+        <translation type="obsolete">Werte in einen vorhandenen Rasterlayer(*) eintragen </translation>
     </message>
     <message>
         <source>Set output raster size (ignored if above option is checked)</source>
@@ -63550,7 +64579,7 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer: mandatory to choose an existing raster layer if the (*) option is selected</source>
-        <translation>Ausgabelayer: Auswahl eines vorhandenen Rasters zwingend, wenn (*)  Option gewählt ist</translation>
+        <translation type="obsolete">Ausgabelayer: Auswahl eines vorhandenen Rasters zwingend, wenn (*)  Option gewählt ist</translation>
     </message>
     <message>
         <source>Nodata value</source>
@@ -63582,8 +64611,16 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
+        <translation type="obsolete">Erzeugung der zugehörigen ESRI-Worlddatei (.tfw) erzwingen</translation>
+    </message>
+    <message>
+        <source>Force the generation of an associated ESRI world file (.tfw)</source>
         <translation>Erzeugung der zugehörigen ESRI-Worlddatei (.tfw) erzwingen</translation>
     </message>
+    <message>
+        <source>Rasterized</source>
+        <translation>Gerastert</translation>
+    </message>
 </context>
 <context>
     <name>rgb2pct</name>
@@ -63597,7 +64634,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>RGB to PCT</source>
+        <translation>RGB nach PCT</translation>
     </message>
 </context>
 <context>
@@ -63616,7 +64657,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Roughness</source>
+        <translation>Rauhigkeit</translation>
     </message>
 </context>
 <context>
@@ -63705,7 +64750,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
+    </message>
+    <message>
+        <source>Sieved</source>
+        <translation>Gesiebt</translation>
     </message>
 </context>
 <context>
@@ -63736,7 +64785,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Slope</source>
+        <translation>Neigung</translation>
     </message>
 </context>
 <context>
@@ -63894,7 +64947,11 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output file</source>
-        <translation>Ausgabedatei</translation>
+        <translation type="obsolete">Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Topographic Position Index</source>
+        <translation>Topographischer Positionsindex</translation>
     </message>
 </context>
 <context>
@@ -63937,7 +64994,7 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
@@ -63971,6 +65028,10 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
         <translation>Erzeugung der zugehörigen ESRI-Worlddatei (.tfw) erzwingen</translation>
     </message>
+    <message>
+        <source>Translated</source>
+        <translation>Umgewandelt</translation>
+    </message>
 </context>
 <context>
     <name>tri</name>
@@ -64168,7 +65229,7 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Ausgabelayer</translation>
+        <translation type="obsolete">Ausgabelayer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
@@ -64202,5 +65263,9 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
         <translation>Erzeugung der zugehörigen ESRI-Worlddatei (.tfw) erzwingen</translation>
     </message>
+    <message>
+        <source>Warped</source>
+        <translation>Entzerrt</translation>
+    </message>
 </context>
 </TS>
diff --git a/i18n/qgis_en.ts b/i18n/qgis_en.ts
index cbf3648..6cda777 100644
--- a/i18n/qgis_en.ts
+++ b/i18n/qgis_en.ts
@@ -635,12 +635,16 @@ Open the results dialog to check it.</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
         <translation>Nodata value, leave blank to take the nodata value from input</translation>
     </message>
+    <message>
+        <source>Clipped</source>
+        <translation type="unfinished">Clipped</translation>
+    </message>
 </context>
 <context>
     <name>ClipByMask</name>
@@ -743,7 +747,11 @@ Open the results dialog to check it.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Color relief</source>
+        <translation type="unfinished">Color relief</translation>
     </message>
 </context>
 <context>
@@ -3196,6 +3204,45 @@ Are you sure you want to proceed?</translation>
     </message>
 </context>
 <context>
+    <name>DinfDistDownMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished">D-Infinity Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation type="unfinished">Pit Filled Elevation Grid</translation>
+    </message>
+    <message>
+        <source>Stream Raster Grid</source>
+        <translation type="unfinished">Stream Raster Grid</translation>
+    </message>
+    <message>
+        <source>Weight Path Grid</source>
+        <translation type="unfinished">Weight Path Grid</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation type="unfinished">Statistical Method</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation type="unfinished">Distance Method</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation type="unfinished">Check for edge contamination</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
+        <translation type="unfinished">D-Infinity Drop to Stream Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>DinfDistUp</name>
     <message>
         <source>D-Infinity Flow Direction Grid</source>
@@ -3235,6 +3282,45 @@ Are you sure you want to proceed?</translation>
     </message>
 </context>
 <context>
+    <name>DinfDistUpMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished">D-Infinity Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation type="unfinished">Pit Filled Elevation Grid</translation>
+    </message>
+    <message>
+        <source>Slope Grid</source>
+        <translation type="unfinished">Slope Grid</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation type="unfinished">Statistical Method</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation type="unfinished">Distance Method</translation>
+    </message>
+    <message>
+        <source>Proportion Threshold</source>
+        <translation type="unfinished">Proportion Threshold</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation type="unfinished">Check for edge contamination</translation>
+    </message>
+    <message>
+        <source>D-Infinity Distance Up</source>
+        <translation type="unfinished">D-Infinity Distance Up</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>DinfTransLimAccum</name>
     <message>
         <source>D-Infinity Flow Direction Grid</source>
@@ -3313,6 +3399,84 @@ Are you sure you want to proceed?</translation>
     </message>
 </context>
 <context>
+    <name>DinfTransLimAccum2Multi</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished">D-Infinity Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation type="unfinished">Supply Grid</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation type="unfinished">Transport Capacity Grid</translation>
+    </message>
+    <message>
+        <source>Input Concentration Grid</source>
+        <translation type="unfinished">Input Concentration Grid</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation type="unfinished">Outlets Shapefile</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation type="unfinished">Check for edge contamination</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
+        <translation type="unfinished">Transport Limited Accumulation Grid</translation>
+    </message>
+    <message>
+        <source>Deposition Grid</source>
+        <translation type="unfinished">Deposition Grid</translation>
+    </message>
+    <message>
+        <source>Output Concentration Grid</source>
+        <translation type="unfinished">Output Concentration Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
+    <name>DinfTransLimAccumMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished">D-Infinity Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation type="unfinished">Supply Grid</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation type="unfinished">Transport Capacity Grid</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation type="unfinished">Outlets Shapefile</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation type="unfinished">Check for edge contamination</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
+        <translation type="unfinished">Transport Limited Accumulation Grid</translation>
+    </message>
+    <message>
+        <source>Deposition Grid</source>
+        <translation type="unfinished">Deposition Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>Dissolve</name>
     <message>
         <source>Geometry exception while dissolving</source>
@@ -3948,6 +4112,53 @@ geometry column - column with unique integer values</translation>
     </message>
 </context>
 <context>
+    <name>DropAnalysisMulti</name>
+    <message>
+        <source>D8 Contributing Area Grid</source>
+        <translation type="unfinished">D8 Contributing Area Grid</translation>
+    </message>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation type="unfinished">D8 Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation type="unfinished">Pit Filled Elevation Grid</translation>
+    </message>
+    <message>
+        <source>Accumulated Stream Source Grid</source>
+        <translation type="unfinished">Accumulated Stream Source Grid</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation type="unfinished">Outlets Shapefile</translation>
+    </message>
+    <message>
+        <source>Minimum Threshold</source>
+        <translation type="unfinished">Minimum Threshold</translation>
+    </message>
+    <message>
+        <source>Maximum Threshold</source>
+        <translation type="unfinished">Maximum Threshold</translation>
+    </message>
+    <message>
+        <source>Number of Threshold Values</source>
+        <translation type="unfinished">Number of Threshold Values</translation>
+    </message>
+    <message>
+        <source>Spacing for Threshold Values</source>
+        <translation type="unfinished">Spacing for Threshold Values</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
+        <translation type="unfinished">D-Infinity Drop to Stream Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>EditModelAction</name>
     <message>
         <source>Edit model</source>
@@ -6808,7 +7019,7 @@ Please install it before running GRASS algorithms.</translation>
     </message>
     <message>
         <source>Output</source>
-        <translation>Output</translation>
+        <translation type="obsolete">Output</translation>
     </message>
     <message>
         <source>Invalid grid spacing: %s/%s</source>
@@ -6822,6 +7033,10 @@ Please install it before running GRASS algorithms.</translation>
         <source>Vertical spacing is too small for the covered area</source>
         <translation>Vertical spacing is too small for the covered area</translation>
     </message>
+    <message>
+        <source>Grid</source>
+        <translation type="unfinished">Grid</translation>
+    </message>
 </context>
 <context>
     <name>GridAverage</name>
@@ -6859,7 +7074,11 @@ Please install it before running GRASS algorithms.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Average</source>
+        <translation type="unfinished">Average</translation>
     </message>
 </context>
 <context>
@@ -6902,7 +7121,11 @@ Please install it before running GRASS algorithms.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Interpolated metrics</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -6949,12 +7172,16 @@ Please install it before running GRASS algorithms.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
     </message>
     <message>
         <source>Smoothing</source>
         <translation>Smoothing</translation>
     </message>
+    <message>
+        <source>Interpolated IDW</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>GridMetrics</name>
@@ -7031,7 +7258,11 @@ Please install it before running GRASS algorithms.</translation>
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Interpolated nearest neighbor</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -7070,6 +7301,41 @@ Please install it before running GRASS algorithms.</translation>
     </message>
 </context>
 <context>
+    <name>GridNetMulti</name>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation type="unfinished">D8 Flow Direction Grid</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation type="unfinished">Outlets Shapefile</translation>
+    </message>
+    <message>
+        <source>Mask Grid</source>
+        <translation type="unfinished">Mask Grid</translation>
+    </message>
+    <message>
+        <source>Mask Threshold</source>
+        <translation type="unfinished">Mask Threshold</translation>
+    </message>
+    <message>
+        <source>Longest Upslope Length Grid</source>
+        <translation type="unfinished">Longest Upslope Length Grid</translation>
+    </message>
+    <message>
+        <source>Total Upslope Length Grid</source>
+        <translation type="unfinished">Total Upslope Length Grid</translation>
+    </message>
+    <message>
+        <source>Strahler Network Order Grid</source>
+        <translation type="unfinished">Strahler Network Order Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>GridSurfaceCreate</name>
     <message>
         <source>Input las layer</source>
@@ -7566,6 +7832,10 @@ are stored on the installation folder</translation>
         <source>Elevation</source>
         <translation>Elevation</translation>
     </message>
+    <message>
+        <source>Feature %d is smaller than raster cell size</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>ImportIntoPostGIS</name>
@@ -7904,6 +8174,33 @@ Please configure it before running LAStools algorithms.</translation>
     </message>
 </context>
 <context>
+    <name>LengthAreaMulti</name>
+    <message>
+        <source>Length Grid</source>
+        <translation type="unfinished">Length Grid</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation type="unfinished">Contributing Area Grid</translation>
+    </message>
+    <message>
+        <source>Threshold</source>
+        <translation type="unfinished">Threshold</translation>
+    </message>
+    <message>
+        <source>Exponent</source>
+        <translation type="unfinished">Exponent</translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation type="unfinished">Stream Source Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>LidarToolsAlgorithmProvider</name>
     <message>
         <source>LAStools folder</source>
@@ -9455,6 +9752,10 @@ Acts on currently active editable layer</translation>
         <source>seconds</source>
         <translation>seconds</translation>
     </message>
+    <message>
+        <source>Record parsing error</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>ModelerAlgorithm</name>
@@ -10595,6 +10896,33 @@ Please check the configuration in the Processing settings dialog.</translation>
     </message>
 </context>
 <context>
+    <name>PeukerDouglasMulti</name>
+    <message>
+        <source>Elevation Grid</source>
+        <translation type="unfinished">Elevation Grid</translation>
+    </message>
+    <message>
+        <source>Center Smoothing Weight</source>
+        <translation type="unfinished">Center Smoothing Weight</translation>
+    </message>
+    <message>
+        <source>Side Smoothing Weight</source>
+        <translation type="unfinished">Side Smoothing Weight</translation>
+    </message>
+    <message>
+        <source>Diagonal Smoothing Weight</source>
+        <translation type="unfinished">Diagonal Smoothing Weight</translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation type="unfinished">Stream Source Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>PointDistance</name>
     <message>
         <source>Input point layer</source>
@@ -14137,7 +14465,7 @@ Response was:
     </message>
     <message>
         <source>Fatal error occurred in GRASS library. QGIS gets over the error but any next fatal error will cause QGIS exit without warning. This is a problem of GRASS 7.0.0beta1 but it is fixed in GRASS 7.1 and higher. Error message: %1</source>
-        <translation>Fatal error occurred in GRASS library. QGIS gets over the error but any next fatal error will cause QGIS exit without warning. This is a problem of GRASS 7.0.0beta1 but it is fixed in GRASS 7.1 and higher. Error message: %1</translation>
+        <translation type="obsolete">Fatal error occurred in GRASS library. QGIS gets over the error but any next fatal error will cause QGIS exit without warning. This is a problem of GRASS 7.0.0beta1 but it is fixed in GRASS 7.1 and higher. Error message: %1</translation>
     </message>
     <message>
         <source>Raster image fill</source>
@@ -16651,7 +16979,7 @@ Parser error:
     </message>
     <message>
         <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</source>
-        <translation>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</translation>
+        <translation type="obsolete">Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</translation>
     </message>
     <message>
         <source>Update Filtered</source>
@@ -16699,6 +17027,22 @@ Parser error:
         <source>Update Selected</source>
         <translation>Update Selected</translation>
     </message>
+    <message>
+        <source>Ctrl+R</source>
+        <translation type="unfinished">Ctrl+R</translation>
+    </message>
+    <message>
+        <source>Show All Features In Initial Canvas Extent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5</source>
+        <translation type="unfinished">Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5 {1 ?} {2,?} {3,?}</translation>
+    </message>
+    <message>
+        <source>, spatially limited</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsAttributeTableModel</name>
@@ -17301,7 +17645,7 @@ Database: %2</translation>
     </message>
     <message>
         <source>Join</source>
-        <translation>Join</translation>
+        <translation type="obsolete">Join</translation>
     </message>
     <message>
         <source>Advanced</source>
@@ -24056,6 +24400,18 @@ not displayed</translation>
         <source>The file has been updated by another application - reloading</source>
         <translation>The file has been updated by another application - reloading</translation>
     </message>
+    <message>
+        <source>Whole number (integer)</source>
+        <translation type="unfinished">Whole number (integer)</translation>
+    </message>
+    <message>
+        <source>Decimal number (double)</source>
+        <translation type="unfinished">Decimal number (double)</translation>
+    </message>
+    <message>
+        <source>Text, unlimited length (text)</source>
+        <translation type="unfinished">Text, unlimited length (text)</translation>
+    </message>
 </context>
 <context>
     <name>QgsDelimitedTextSourceSelect</name>
@@ -29522,7 +29878,7 @@ at line %2 column %3</translation>
     </message>
     <message>
         <source>Cannot activate grass</source>
-        <translation>Cannot activate grass</translation>
+        <translation type="obsolete">Cannot activate grass</translation>
     </message>
 </context>
 <context>
@@ -33168,19 +33524,19 @@ This may be a problem in your network connection or at the WMS server.</numerusf
     </message>
     <message>
         <source>Meters</source>
-        <translation>Meters</translation>
+        <translation type="obsolete">Meters</translation>
     </message>
     <message>
         <source>Feet</source>
-        <translation>Feet</translation>
+        <translation type="obsolete">Feet</translation>
     </message>
     <message>
         <source>Degrees</source>
-        <translation>Degrees</translation>
+        <translation type="obsolete">Degrees</translation>
     </message>
     <message>
         <source>Nautical Miles</source>
-        <translation>Nautical Miles</translation>
+        <translation type="obsolete">Nautical Miles</translation>
     </message>
 </context>
 <context>
@@ -36952,10 +37308,16 @@ error:%2
         <source>Connection failed - Check settings and try again.
 
 </source>
-        <translation>Connection failed - Check settings and try again.
+        <translation type="obsolete">Connection failed - Check settings and try again.
 
 </translation>
     </message>
+    <message>
+        <source>Connection failed - consult message log for details.
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsOracleNewConnectionBase</name>
@@ -37907,10 +38269,16 @@ Error: %2</translation>
         <source>Connection failed - Check settings and try again.
 
 </source>
-        <translation>Connection failed - Check settings and try again.
+        <translation type="obsolete">Connection failed - Check settings and try again.
 
 </translation>
     </message>
+    <message>
+        <source>Connection failed - consult message log for details.
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsPgNewConnectionBase</name>
@@ -50264,6 +50632,33 @@ Problem with line %d</translation>
     </message>
 </context>
 <context>
+    <name>SlopeAreaMulti</name>
+    <message>
+        <source>Slope Grid</source>
+        <translation type="unfinished">Slope Grid</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation type="unfinished">Contributing Area Grid</translation>
+    </message>
+    <message>
+        <source>Slope Exponent</source>
+        <translation type="unfinished">Slope Exponent</translation>
+    </message>
+    <message>
+        <source>Area Exponent</source>
+        <translation type="unfinished">Area Exponent</translation>
+    </message>
+    <message>
+        <source>Slope Area Grid</source>
+        <translation type="unfinished">Slope Area Grid</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
+</context>
+<context>
     <name>SpatialJoin</name>
     <message>
         <source>Target vector layer</source>
@@ -50429,23 +50824,46 @@ Problem with line %d</translation>
     <name>SymetricalDifference</name>
     <message>
         <source>Input layer</source>
-        <translation>Input layer</translation>
+        <translation type="obsolete">Input layer</translation>
     </message>
     <message>
         <source>Difference layer</source>
-        <translation>Difference layer</translation>
+        <translation type="obsolete">Difference layer</translation>
     </message>
     <message>
         <source>Symetrical difference</source>
-        <translation>Symetrical difference</translation>
+        <translation type="obsolete">Symetrical difference</translation>
     </message>
     <message>
         <source>Geometry exception while computing symetrical difference</source>
-        <translation>Geometry exception while computing symetrical difference</translation>
+        <translation type="obsolete">Geometry exception while computing symetrical difference</translation>
     </message>
     <message>
         <source>Feature exception while computing symetrical difference</source>
-        <translation>Feature exception while computing symetrical difference</translation>
+        <translation type="obsolete">Feature exception while computing symetrical difference</translation>
+    </message>
+</context>
+<context>
+    <name>SymmetricalDifference</name>
+    <message>
+        <source>Input layer</source>
+        <translation type="unfinished">Input layer</translation>
+    </message>
+    <message>
+        <source>Difference layer</source>
+        <translation type="unfinished">Difference layer</translation>
+    </message>
+    <message>
+        <source>Symetrical difference</source>
+        <translation type="unfinished">Symetrical difference</translation>
+    </message>
+    <message>
+        <source>Geometry exception while computing symetrical difference</source>
+        <translation type="unfinished">Geometry exception while computing symetrical difference</translation>
+    </message>
+    <message>
+        <source>Feature exception while computing symetrical difference</source>
+        <translation type="unfinished">Feature exception while computing symetrical difference</translation>
     </message>
 </context>
 <context>
@@ -50483,6 +50901,36 @@ Problem with line %d</translation>
         <source>TauDEM (hydrologic analysis)</source>
         <translation>TauDEM (hydrologic analysis)</translation>
     </message>
+    <message>
+        <source>TauDEM multifile command line tools folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable singlefile TauDEM tools</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable multifile TauDEM tools</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Could not open TauDEM algorithm %s:
+%s</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TauDEMMultifileAlgorithm</name>
+    <message>
+        <source>Could not load TauDEM algorithm: %s
+%s</source>
+        <translation type="unfinished">Could not load TauDEM algorithm: %s
+%s</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation type="unfinished">Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</translation>
+    </message>
 </context>
 <context>
     <name>TauDEMUtils</name>
@@ -51905,7 +52353,11 @@ Problem with line %d</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Virtual</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -53910,7 +54362,7 @@ The following options can be added
 
 
 </source>
-        <translation><h3>Delimited Text File Layer</h3>
+        <translation type="obsolete"><h3>Delimited Text File Layer</h3>
 Loads and displays delimited text files
 <p>
 <a href="#re">Overview</a><br/>
@@ -54949,6 +55401,327 @@ When you toggle to edition the layer, a new row of functions appears in the attr
 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  [...]
 </translation>
     </message>
+    <message>
+        <source><h3>Delimited Text File Layer</h3>
+Loads and displays delimited text files
+<p>
+<a href="#re">Overview</a><br/>
+<a href="#creating">Creating a delimited text layer</a><br/>
+<a href="#csv">How the delimiter, quote, and escape characters work</a><br />
+<a href="#regexp">How regular expression delimiters work</a><br />
+<a href="#wkt">How WKT text is interpreted</a><br />
+<a href="#attributes">Attributes in delimited text files</a><br />
+<a href="#example">Example of a text file with X,Y point coordinates</a><br/>
+<a href="#wkt_example">Example of a text file with WKT geometries</a><br/>
+<a href="#python">Using delimited text layers in Python</a><br/>
+</p>
+
+<h4><a name="re">Overview</a></h4>
+<p>A &quot;delimited text file&quot; contains data in which each record starts on a new line, and 
+is split into fields by a delimiter such as a comma.  
+This type of file is commonly exported from spreadsheets (for example CSV files) or databases.  
+Typically the first line of a delimited text file contains the names of the fields.  
+</p>
+<p>
+Delimited text files can be loaded into QGIS as a layer. 
+The records can be displayed spatially either as a point
+defined by X and Y coordinates, or using a Well Known Text (WKT) definition of a geometry which may
+describe points, lines, and polygons of arbitrary complexity.  The file can also be loaded as an attribute
+only table, which can then be joined to other tables in QGIS.
+</p>
+<p>
+In addition to the geometry definition the file can contain text, integer, and real number fields.  By default 
+QGIS will choose the type of field based on its the non blank values of the field.  If all can be interpreted
+as integer then the type will be integer, if all can be interpreted as real numbers then the type will
+be double, otherwise the type will be text.
+</p>
+<p>
+QGIS can also read the types from an OGR CSV driver compatible &quot;csvt&quot; file.  
+This is a file alongside the data file, but with a &quot;t&quot; appended to the file name. 
+The file should just contain one line which lists the type of each field. 
+Valid types are &quot;integer&quot;, &quot;long&quot;, &quot;longlong&quot;, &quot;real&quot;, 
+&quot;string&quot;, &quot;date&quot;, &quot;time&quot;, and &quot;datetime&quot;. 
+The date, time, and datetime types are treated as strings by the delimited text provider.
+Each type may be followed by a width and precision, for example &quot;real(10.4)&quot;.
+The list of types are separated by commas, regardless of the delimiter used in the data file.  An
+example of a valid format file would be:
+</p>
+
+<pre>
+&quot;integer&quot;,&quot;string&quot;,&quot;string(20)&quot;,&quot;real(20.4)&quot;
+</pre>
+
+<h4><a name="creating">Creating a delimited text layer</a></h4>
+<p>Creating a delimited text layer involves choosing the data file, defining the format (how each record is to
+be split into fields), and defining the geometry is represented.  
+This is managed with the delimited text dialog as detailed below.  
+The dialog box displays a sample from the beginning of the file which shows how the format
+options have been applied.
+</p>
+<h5>Choosing the data file</h5>
+<p>Use the &quot;Browse...&quot; button to select the data file.  Once the file is selected the
+layer name will automatically be populated based on the file name.  The layer name is used to represent
+the data in the QGIS legend.  
+</p>
+<p>
+By default files are assumed to be encoded as UTF-8.  However other file
+encodings can be selected.  For example &quot;System&quot; uses the default encoding for the operating system.  
+It is safer to use an explicit coding if the QGIS project needs to be portable.
+</p>
+<h5>Specifying the file format</h5>
+<p>The file format can be one of
+<ul>
+    <li>CSV file format.  This is a format commonly used by spreadsheets, in which fields are delimited
+    by a comma character, and quoted using a &quot;(quote) character.  Within quoted fields, a quote
+    mark is entered as &quot;&quot;.</li>
+    <li>Selected delimiters.  Each record is split into fields using one or more  delimiter character.
+    Quote characters are used for fields which may contain delimiters.  Escape characters may be used 
+    to treat the following character as a normal character (ie to include delimiter, quote, and 
+    new line characters in text fields).  The use of delimiter, quote, and escape characters is detailed <a href="#csv">below</a>.
+    <li>Regular expression.  Each line is split into fields using a &quot;regular expression&quot; delimiter.
+    The use of regular expressions is details <a href="#regexp">below</a>.
+</ul>
+<h5>Record and field options</h5>
+<p>The following options affect the selection of records and fields from the data file</p>
+<ul>
+    <li>Number of header lines to discard: used to ignore header lines at the beginning of the text file</li>
+    <li>First record has fields names: if selected then the first record in the file (after the discarded lines) is interpreted as names of fields, rather than as a data record.</li>
+    <li>Trim fields: if selected then leading and trailing whitespace characters will be removed from each field (except quoted fields). </li>
+    <li>Discard empty fields: if selected then empty fields (after trimming) will be discard.  This 
+    affects the alignment of data into fields and is equivalent to treating consecutive delimiters as a 
+    single delimiter.  Quoted fields are never discarded.</li>
+    <li>Decimal separator is comma: if selected then commas instead of points are used as the decimal separator in real numbers.  For
+    example <tt>-51,354</tt> is equivalent to -51.354.
+    </li>
+</ul>
+<h5>Geometry definition</h5>
+<p>The geometry is can be define as one of</p>
+<ul>
+    <li>Point coordinates: each feature is represented as a point defined by X and Y coordinates.</li>
+    <li>Well known text (WKT) geometry: each feature is represented as a well known text string, for example
+    <tt>POINT(1.525622 51.20836)</tt>.  See details of the <a href="#wkt">well known text</a> format.
+    <li>No geometry (attribute only table): records will not be displayed on the map, but can be viewed
+    in the attribute table and joined to other layers in QGIS</li>
+</ul>
+<p>For point coordinates the following options apply:</p>
+<ul>
+    <li>X field: specifies the field containing the X coordinate</li>
+    <li>Y field: specifies the field containing the Y coordinate</li>
+    <li>DMS angles: if selected coordinates are represented as degrees/minutes/seconds
+    or degrees/minutes.  QGIS is quite permissive in its interpretation of degrees/minutes/seconds.
+    A valid DMS coordinate will contain three numeric fields with an optional hemisphere prefix or suffix
+    (N, E, or + are positive, S, W, or - are negative).  Additional non numeric characters are 
+    generally discarded.  For example <tt>N41d54'01.54&quot;</tt> is a valid coordinate.
+    </li>
+</ul>
+<p>For well known text geometry the following options apply:</p>
+<ul>
+    <li>Geometry field: the field containing the well known text definition.</li>
+    <li>Geometry type: one of &quot;Detect&quot; (detect), &quot;Point&quot;, &quot;Line&quot;, or &quot;Polygon&quot;.
+    QGIS layers can only display one type of geometry feature (point, line, or polygon). This option selects
+    which geometry type is displayed in text files containing multiple geometry types. Records containing
+   other geometry types are discarded.   
+    If &quot;Detect&quot; is selected then the type of the first geometry in the file will be used.
+    &quot;Point&quot; includes POINT and MULTIPOINT WKT types, &quot;Line&quot; includes LINESTRING and
+    MULTLINESTRING WKT types, and &quot;Polygon&quot; includes POLYGON and MULTIPOLYGON WKT types.
+</ul>
+<h5>Layer settings</h5>
+<p>Layer settings control the way the layer is managed in QGIS.  The options available are:</p>
+<ul>
+<li>Use spatial index. Create a spatial index to improve the performance of displaying and selecting spatial objects.
+This option may be useful for files larger than a few megabytes in size.</li>
+<li>Use subset index. Create an index if a subset of records is being used (either by explicitly setting a subset string 
+from the layer properties dialog, or an implicit subset of features for which the geometry is valid in files
+for which all not geometries are valid).  The index will only be created when a subset is defined.</li>
+<li>Watch file.  If this options is selected QGIS will watch the file for changes by other applications, and 
+reload the file when it is changed.  The map will not be updated until refreshed by the user, but indexes and
+extents will be reloaded.  This option should be selected if indexes are used and it is likely that another
+application will change the file. </li>
+</ul>
+
+<h4><a name="csv">How the delimiter, quote, and escape characters work</a></h4>
+<p>Records are split into fields using three character sets: 
+delimiter characters, quote characters, and escape characters.  
+Other characters in the record are considered as data, split into
+fields by delimiter characters. 
+Quote characters occur in pairs and cause the text between them to be treated as a data.  Escape characters cause the character following them to be treated as data.   
+</p>
+<p>
+Quote and escape characters cannot be the same as delimiter characters - they
+will be ignored if they are. Escape characters can be the same as quote characters, but behave differently
+if they are.</p>
+<p>The delimiter characters are used to mark the end of each field.  If more than one delimiter character
+is defined then any one of the characters can mark the end of a field.  The quote and escape characters 
+can override the delimiter character, so that it is treated as a normal data character.</p>
+<p>Quote characters may be used to mark the beginning and end of quoted fields. Quoted fields can 
+contain delimiters and may span multiple lines in the text file.  If a field is quoted then it must
+start and end with the same quote character.  Quote characters cannot occur within a field unless they
+are escaped.</p>
+<p>Escape characters which are not quote characters force the following character to be treated as data.  
+(that is, to stop it being treated as a new line, delimiter, or quote character).  
+</p>
+<p>Escape characters that are also quote characters have much more limited effect.  They only apply within quotes and only escape themselves.  For example, if 
+<tt>'</tt> is a quote and escape character, then the string
+<tt>'Smith''s&nbsp;Creek'</tt> will represent the value Smith's&nbsp;Creek.
+</p>
+
+
+<h4><a name="regexp">How regular expression delimiters work</a></h4>
+<p>Regular expressions are mini-language used to represent character patterns.  There are many variations
+of regular expression syntax - QGIS uses the syntax provided by the <a href="http://qt-project.org/doc/qt-4.8/qregexp.html">QRegExp</a> class of the <a href="http://qt.digia.com">Qt</a> framework.</p>
+<p>In a regular expression delimited file each line is treated as a record.  Each match of the regular expression in the line is treated as the end of a field.  
+If the regular expression contains capture groups (eg <tt>(cat|dog)</tt>)
+ then these are extracted as fields. 
+ If this is not desired then use non-capturing groups (eg <tt>(?:cat|dog)</tt>).
+</p>
+<p>The regular expression is treated differently if it is anchored to the start of the line (that is, the pattern starts with <tt>^</tt>).
+In this case the regular expression is matched against each line.  If the line does not match it is discarded
+as an invalid record.  Each capture group in the expression is treated as a field.  The regular expression
+is invalid if it does not have capture groups.  As an example this can be used as a (somewhat 
+unintuitive) means of loading data with fixed width fields.  For example the 
+expression
+<pre>
+^(.{5})(.{10})(.{20})(.{20})
+</pre>
+<p>will extract four fields of widths 5, 10, 20, and 20 characters from each line.  
+Lines less than 55 characters long will be discarded.
+</p>
+
+
+<h4><a name="wkt">How WKT text is interpreted</a></h4>
+<p>
+The delimited text layer recognizes the following 
+<a href="http://en.wikipedia.org/wiki/Well-known_text">well known text</a> types - 
+<tt>POINT</tt>, <tt>MULTIPOINT</tt>, <tt>LINESTRING</tt>, <tt>MULTILINESTRING</tt>, <tt>POLYGON</tt>, and <tt>MULTIPOLYGON</tt>.  
+It will accept geometries with
+a Z coordinate (eg <tt>POINT&nbsp;Z</tt>), a measure (<tt>POINT&nbsp;M</tt>), or both (<tt>POINT&nbsp;ZM</tt>).
+</p>
+<p>
+It can also handle the PostGIS EWKT variation, in which the geometry is preceded by an spatial reference 
+system id (eg <tt>SRID=4326;POINT(175.3&nbsp;41.2)</tt>), and a variant used by Informix in which the WKT is 
+preceded by an integer spatial reference id (eg <tt>1 POINT(175.3&nbsp;41.2)</tt>).
+In both cases the SRID is ignored.
+</p>
+
+
+
+<h4><a name="attributes">Attributes in delimited text files</a></h4> 
+<p>Each record in the delimited text file is split into fields representing
+attributes of the record.  Usually the attribute names are taken from the first
+data record in the file.  However if this does not contain attribute names, then they will be named <tt>field_1</tt>, <tt>field_2</tt>, and so on.  
+Also if records have more fields than are defined in the header record then these
+will be named <tt>field_#</tt>, where # is the field number (note that empty fields at the end of a record are ignored).
+QGIS may override 
+the names in the text file if they are numbers, or have names like <tt>field_#</tt>,
+or are duplicated.
+</p>
+<p>
+In addition to the attributes explicitly in the data file QGIS assigns a unique 
+feature id to each record which is the line number in the source file on which
+the record starts.  
+</p>
+<p>
+Each attribute also has a data type, one of string (text), integer, longlong,
+or real number.
+The data type is inferred from the content of the fields - if every non blank value
+is a valid integer then the type is integer, otherwise if it is a valid long long
+nubmer then the type is longlong, otherwise if it is a valid real
+number then the type is real, otherwise the type is string.  Note that this is
+based on the content of the fields - quoting fields does not change the way they
+are interpreted.
+</p>
+
+
+<h4><a name="example">Example of a text file with X,Y point coordinates</a></h4> 
+<pre>
+X;Y;ELEV
+-300120;7689960;13
+-654360;7562040;52
+1640;7512840;3
+</pre>
+<p>This file:</p>
+<ul>
+<li> Uses <b>;</b> as delimiter. Any character can be used to delimit the fields.</li>
+<li>The first row is the header row. It contains the field names X, Y and ELEV.</li>
+<li>The x coordinates are contained in the X field.</li>
+<li>The y coordinates are contained in the Y field.</li>
+</ul>
+<h4><a name="wkt_example">Example of a text file with WKT geometries</a></h4>
+<pre>
+id|wkt
+1|POINT(172.0702250 -43.6031036)
+2|POINT(172.0702250 -43.6031036)
+3|POINT(172.1543206 -43.5731302)
+4|POINT(171.9282585 -43.5493308)
+5|POINT(171.8827359 -43.5875983)
+</pre>
+<p>This file:</p>
+<ul>
+  <li>Has two fields defined in the header row: id and wkt.
+  <li>Uses <b>|</b> as a delimiter.</li>
+  <li>Specifies each point using the WKT notation
+</ul>
+
+<h4><a name="python">Using delimited text layers in Python</a></h4>
+<p>Delimited text data sources can be creating from Python in a similar way to other vector layers.
+The pattern is:
+</p>
+<pre>
+from PyQt4.QtCore import QUrl, QString
+from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
+
+# Define the data source
+filename="test.csv"
+uri=QUrl.fromLocalFile(filename)
+uri.addQueryItem("type","csv")
+uri.addQueryItem("delimiter","|")
+uri.addQueryItem("wktField","wkt")
+# ... other delimited text parameters
+layer=QgsVectorLayer(QString(uri.toEncoded()),"Test CSV layer","delimitedtext")
+# Add the layer to the map
+if layer.isValid():
+    QgsMapLayerRegistry.instance().addMapLayer( layer )
+</pre>
+<p>This could be used to load the second example file above.</p>
+<p>The configuration of the delimited text layer is defined by adding query items to the uri.
+The following options can be added
+</p>
+<ul>
+    <li><tt>encoding=..</tt> defines the file encoding.  The default is &quot;UTF-8&quot;</li>
+    <li><tt>type=(csv|regexp|whitespace)</tt> defines the delimiter type.  Valid values are csv, 
+       regexp, and whitespace (which is just a special case of regexp).  The default is csv.</li>
+       <li><tt>delimiter=...</tt> defines the delimiters that will be used for csv formatted files, 
+       or the regular expression for regexp formatted files.  The default is , for CSV files.  There is
+       no default for regexp files.</li>
+       <li><tt>quote=..</tt> (for csv files) defines the characters used to quote fields. The default is &quot;</li>
+       <li><tt>escape=..</tt> (for csv files) defines the characters used to escape the special meaning of the next character. The default is &quot;</li>
+       <li><tt>skipLines=#</tt> defines the number of lines to discard from the beginning of the file. The default is 0.</li>
+       <li><tt>useHeader=(yes|no)</tt> defines whether the first data record contains the names of the data fields. The default is yes.</li>
+       <li><tt>trimFields=(yes|no)</tt> defines whether leading and trailing whitespace is to be removed from unquoted fields. The default is no.</li>
+       <li><tt>maxFields=#</tt> defines the maximum number of fields that will be loaded from the file.  
+       Additional fields in each record will be discarded. The default is 0 - include all fields.
+       (This option is not available from the delimited text layer dialog box).</li>
+       <li><tt>skipEmptyFields=(yes|no)</tt> defines whether empty unquoted fields will be discarded (applied after trimFields). The default is no.</li>
+       <li><tt>decimalPoint=.</tt> specifies an alternative character that may be used as a decimal point in numeric fields.  The default is a point (full stop) character.</li>
+       <li><tt>wktField=fieldname</tt> specifies the name or number (starting at 1) of the field containing a well known text geometry definition</li>
+       <li><tt>xField=fieldname</tt> specifies the name or number (starting at 1) of the field the X coordinate (only applies if wktField is not defined)</li>
+       <li><tt>yField=fieldname</tt> specifies the name or number (starting at 1) of the field the Y coordinate (only applies if wktField is not defined)</li>
+       <li><tt>geomType=(auto|point|line|polygon|none)</tt> specifies type of geometry for wkt fields, or none to load the file as an attribute-only table.  The default is auto.</li>
+       <li><tt>subset=expression</tt> specifies an expression used to identify a subset of the records that will be 
+       used.</li>
+       <li><tt>crs=...</tt> specifies the coordinate system to use for the vector layer, in a format accepted by QgsCoordinateReferenceSystem.createFromString (for example &quot;EPSG:4167&quot;).  If this is not 
+       specified then a dialog box may request this information from the user
+       when the layer is loaded (depending on QGIS CRS settings).</li>
+       <li><tt>subsetIndex=(yes|no)</tt> specifies whether the provider should build an index to define subset during the initial file scan.  The index will apply both for explicitly defined subsets, and for the implicit subset of features for which the geometry definition is valid.  By default the subset index is built if it is applicable.</li>
+       <li><tt>spatialIndex=(yes|no)</tt> specifies whether the provider should build a spatial index during the initial file scan.  By default the spatial index is not built. </li>
+       <li><tt>watchFile=(yes|no)</tt> specifies whether the provider should use a file system watcher to monitor for changes to the file.</li>
+       <li><tt>quiet=(yes|no)</tt> specifies whether errors encountered loading the layer are presented in a dialog box (they will be written to the QGIS log in any case). The default is no.  This option is not available from the GUI</li>
+</ul>
+
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>contour</name>
@@ -55869,7 +56642,11 @@ Plugin will not be enabled.</translation>
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Filled</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -60658,7 +61435,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>xyz</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -60685,7 +61466,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Pyramidized</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -62510,7 +63295,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Hillshade</source>
+        <translation type="unfinished">Hillshade</translation>
     </message>
 </context>
 <context>
@@ -63498,7 +64287,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Merged</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63517,7 +64310,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Nearblack</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63616,7 +64413,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>PCT to RGB</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63631,7 +64432,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Vectorized</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63666,7 +64471,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Distance</source>
+        <translation type="unfinished">Distance</translation>
     </message>
 </context>
 <context>
@@ -63681,7 +64490,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Write values inside an existing raster layer(*)</source>
-        <translation>Write values inside an existing raster layer(*)</translation>
+        <translation type="obsolete">Write values inside an existing raster layer(*)</translation>
     </message>
     <message>
         <source>Set output raster size (ignored if above option is checked)</source>
@@ -63701,7 +64510,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer: mandatory to choose an existing raster layer if the (*) option is selected</source>
-        <translation>Output layer: mandatory to choose an existing raster layer if the (*) option is selected</translation>
+        <translation type="obsolete">Output layer: mandatory to choose an existing raster layer if the (*) option is selected</translation>
     </message>
     <message>
         <source>Nodata value</source>
@@ -63733,7 +64542,15 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
-        <translation>Force the generation of an associated ESRI world file (.tfw))</translation>
+        <translation type="obsolete">Force the generation of an associated ESRI world file (.tfw))</translation>
+    </message>
+    <message>
+        <source>Force the generation of an associated ESRI world file (.tfw)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Rasterized</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63748,7 +64565,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>RGB to PCT</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63767,7 +64588,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Roughness</source>
+        <translation type="unfinished">Roughness</translation>
     </message>
 </context>
 <context>
@@ -63856,7 +64681,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
+    </message>
+    <message>
+        <source>Sieved</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63887,7 +64716,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Slope</source>
+        <translation type="unfinished">Slope</translation>
     </message>
 </context>
 <context>
@@ -64045,7 +64878,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output file</source>
-        <translation>Output file</translation>
+        <translation type="obsolete">Output file</translation>
+    </message>
+    <message>
+        <source>Topographic Position Index</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -64088,7 +64925,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
@@ -64122,6 +64959,10 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
         <translation>Force the generation of an associated ESRI world file (.tfw))</translation>
     </message>
+    <message>
+        <source>Translated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>tri</name>
@@ -64319,7 +65160,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Output layer</source>
-        <translation>Output layer</translation>
+        <translation type="obsolete">Output layer</translation>
     </message>
     <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
@@ -64353,5 +65194,9 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <source>Force the generation of an associated ESRI world file (.tfw))</source>
         <translation>Force the generation of an associated ESRI world file (.tfw))</translation>
     </message>
+    <message>
+        <source>Warped</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
diff --git a/mac/cmake/0qgis.cmake.in b/mac/cmake/0qgis.cmake.in
index ae66f48..cd5ec80 100644
--- a/mac/cmake/0qgis.cmake.in
+++ b/mac/cmake/0qgis.cmake.in
@@ -25,4 +25,9 @@ IF (@OSX_HAVE_LOADERPATH@)
             EXECUTE_PROCESS(COMMAND install_name_tool -id "${ATEXECUTABLE}/${QGIS_FW_SUBDIR}/${QL}.framework/${QL}" "${QFWDIR}/${QL}.framework/${QL}")
         ENDIF ()
     ENDFOREACH (QL)
+    FOREACH (QLIB ${QGLIBLIST})
+        GET_INSTALL_NAME ("${QLIBDIR}/${QLIB}" ${QLIB} QQ)
+        SET (QLIB_CHG "${QQ}")
+        UPDATEQGISPATHS ("${QLIB_CHG}" ${QLIB})
+    ENDFOREACH (QLIB)
 ENDIF (@OSX_HAVE_LOADERPATH@)
diff --git a/ms-windows/osgeo4w/package-nightly.cmd b/ms-windows/osgeo4w/package-nightly.cmd
index 973ff9e..bc674ba 100644
--- a/ms-windows/osgeo4w/package-nightly.cmd
+++ b/ms-windows/osgeo4w/package-nightly.cmd
@@ -56,7 +56,6 @@ path %path%;%PF86%\Microsoft Visual Studio 10.0\VC\bin
 
 set CMAKE_OPT=^
 	-G "Visual Studio 10" ^
-	-D BUILDNAME="OSGeo4W-Nightly-VC10-32" ^
 	-D SIP_BINARY_PATH=%O4W_ROOT%/apps/Python27/sip.exe ^
 	-D QWT_LIBRARY=%O4W_ROOT%/lib/qwt.lib ^
 	-D CMAKE_CXX_FLAGS_RELWITHDEBINFO="/MD /ZI /MP /Od /D NDEBUG /D QGISDEBUG" ^
@@ -75,7 +74,6 @@ if not exist "%SETUPAPI_LIBRARY%" (echo SETUPAPI_LIBRARY not found & goto error)
 
 set CMAKE_OPT=^
 	-G "Visual Studio 10 Win64" ^
-	-D BUILDNAME="OSGeo4W-Nightly-VC10-64" ^
 	-D SPATIALINDEX_LIBRARY=%O4W_ROOT%/lib/spatialindex-64.lib ^
 	-D SIP_BINARY_PATH=%O4W_ROOT%/bin/sip.exe ^
 	-D QWT_LIBRARY=%O4W_ROOT%/lib/qwt5.lib ^
@@ -142,6 +140,7 @@ set GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-%GRASS_VERSION%
 
 cmake %CMAKE_OPT% ^
 	-D SITE="qgis.org" ^
+	-D BUILDNAME="%PACKAGENAME%-%VERSION%-Nightly-VC10-%ARCH%" ^
 	-D PEDANTIC=TRUE ^
 	-D WITH_QSPATIALITE=TRUE ^
 	-D WITH_SERVER=TRUE ^
@@ -211,7 +210,7 @@ echo PACKAGE: %DATE% %TIME%
 cd ..
 sed -e 's/@package@/%PACKAGENAME%/g' -e 's/@version@/%VERSION%/g' -e 's/@grassversion@/%GRASS_VERSION%/g' postinstall-dev.bat >%OSGEO4W_ROOT%\etc\postinstall\%PACKAGENAME%.bat
 if errorlevel 1 (echo creation of desktop postinstall failed & goto error)
-sed -e 's/@package@/%PACKAGENAME%/g' -e 's/@version@/%VERSION%/g' -e 's/@grassversion@/%GRASS_VERSION%/g' preremove-desktop.bat >%OSGEO4W_ROOT%\etc\preremove\%PACKAGENAME%.bat
+sed -e 's/@package@/%PACKAGENAME%/g' -e 's/@version@/%VERSION%/g' -e 's/@grassversion@/%GRASS_VERSION%/g' preremove-dev.bat >%OSGEO4W_ROOT%\etc\preremove\%PACKAGENAME%.bat
 if errorlevel 1 (echo creation of desktop preremove failed & goto error)
 sed -e 's/@package@/%PACKAGENAME%/g' -e 's/@version@/%VERSION%/g' -e 's/@grassversion@/%GRASS_VERSION%/g' qgis.bat.tmpl >%OSGEO4W_ROOT%\bin\%PACKAGENAME%.bat.tmpl
 if errorlevel 1 (echo creation of desktop template failed & goto error)
diff --git a/ms-windows/osgeo4w/postinstall-dev.bat b/ms-windows/osgeo4w/postinstall-dev.bat
index 060f87c..04a97d9 100644
--- a/ms-windows/osgeo4w/postinstall-dev.bat
+++ b/ms-windows/osgeo4w/postinstall-dev.bat
@@ -3,13 +3,13 @@ textreplace -std -t bin\@package at -browser.bat
 textreplace -std -t bin\designer- at package@.bat
 
 if not %OSGEO4W_MENU_LINKS%==0 mkdir "%OSGEO4W_STARTMENU%"
-if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "QGIS Desktop @version@" "exec hide """%OSGEO4W_ROOT%\bin\@package at .bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
-if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "QGIS Browser @version@" "exec hide """%OSGEO4W_ROOT%\bin\@package at -browser.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
-if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "Qt Designer with QGIS @version@ custom widgets" "exec hide """%OSGEO4W_ROOT%\bin\designer- at package@.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "QGIS Desktop @version@ (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\@package at .bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "QGIS Browser @version@ (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\@package at -browser.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_MENU_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "%OSGEO4W_STARTMENU%" "Qt Designer with QGIS @version@ custom widgets (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\designer- at package@.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
 
-if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "QGIS Desktop @version@" "exec hide """%OSGEO4W_ROOT%\bin\@package at .bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
-if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "QGIS Browser @version@" "exec hide """%OSGEO4W_ROOT%\bin\@package at -browser.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
-if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "Qt Designer with QGIS @version@ custom widgets" "exec hide """%OSGEO4W_ROOT%\bin\designer- at package@.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "QGIS Desktop @version@ (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\@package at .bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "QGIS Browser @version@ (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\@package at -browser.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
+if not %OSGEO4W_DESKTOP_LINKS%==0 nircmd shortcut "%OSGEO4W_ROOT%\bin\nircmd.exe" "~$folder.desktop$" "Qt Designer with QGIS @version@ custom widgets (Nightly)" "exec hide """%OSGEO4W_ROOT%\bin\designer- at package@.bat"" "%OSGEO4W_ROOT%\apps\@package@\icons\QGIS.ico"
 
 set O4W_ROOT=%OSGEO4W_ROOT%
 set OSGEO4W_ROOT=%OSGEO4W_ROOT:\=\\%
diff --git a/ms-windows/osgeo4w/preremove-dev.bat b/ms-windows/osgeo4w/preremove-dev.bat
new file mode 100644
index 0000000..6165890
--- /dev/null
+++ b/ms-windows/osgeo4w/preremove-dev.bat
@@ -0,0 +1,11 @@
+del "%OSGEO4W_STARTMENU%\QGIS Desktop @version@ (Nightly).lnk"
+del "%OSGEO4W_STARTMENU%\QGIS Browser @version@ (Nightly).lnk"
+del "%OSGEO4W_STARTMENU%\Qt Designer with QGIS @version@ custom widgets (Nightly).lnk"
+del "%ALLUSERSPROFILE%\Desktop\QGIS Desktop @version@ (Nightly).lnk"
+del "%ALLUSERSPROFILE%\Desktop\QGIS Browser @version@ (Nightly).lnk"
+del "%ALLUSERSPROFILE%\Desktop\Qt Designer with QGIS @version@ custom widgets (Nightly).lnk"
+del "%OSGEO4W_ROOT%"\bin\@package at .bat
+del "%OSGEO4W_ROOT%"\bin\@package at -browser.bat
+del "%OSGEO4W_ROOT%"\bin\designer- at package@.bat
+del "%OSGEO4W_ROOT%"\apps\@package@\python\qgis\qgisconfig.py
+del "%OSGEO4W_ROOT%"\apps\@package@\bin\qgis.reg
diff --git a/python/core/core.sip b/python/core/core.sip
index 4469b18..4037e51 100644
--- a/python/core/core.sip
+++ b/python/core/core.sip
@@ -120,6 +120,7 @@
 %Include qgsprojectfiletransform.sip
 %Include qgsvectorlayereditutils.sip
 %Include qgsvectorlayerfeatureiterator.sip
+%Include qgslayerdefinition.sip
 
 %Include composer/qgsaddremoveitemcommand.sip
 %Include composer/qgsaddremovemultiframecommand.sip
diff --git a/python/core/qgslayerdefinition.sip b/python/core/qgslayerdefinition.sip
index 94e0af7..61fd156 100644
--- a/python/core/qgslayerdefinition.sip
+++ b/python/core/qgslayerdefinition.sip
@@ -5,17 +5,17 @@
  * to the QLR file once loaded.  Consider the QLR file a mini project file for layers and styles.  QLR
  * files also store the layer tree info for the exported layers, including group information.
  */
-class CORE_EXPORT QgsLayerDefinition
+class QgsLayerDefinition
 {
 %TypeHeaderCode
 #include <qgslayerdefinition.h>
 %End
-public:
-  /* Loads the QLR at path into QGIS.  New layers are added to rootGroup and the map layer registry*/
-  static bool openLayerDefinition( const QString & path, QgsLayerTreeGroup* rootGroup, QString &errorMessage /Out/ );
-  /* Loads the QLR from the XML document.  New layers are added to rootGroup and the map layer registry */
-  static bool openLayerDefinition( QDomDocument doc, QgsLayerTreeGroup* rootGroup, QString &errorMessage /Out/ );
-  /* Export the selected layer tree nodes to a QLR file */
-  static bool exportLayerDefinition( QString path, QList<QgsLayerTreeNode*> selectedTreeNodes, QString &errorMessage /Out/ );
+  public:
+    /* Loads the QLR at path into QGIS.  New layers are added to rootGroup and the map layer registry*/
+    static bool loadLayerDefinition( const QString & path, QgsLayerTreeGroup* rootGroup, QString &errorMessage /Out/ );
+    /* Loads the QLR from the XML document.  New layers are added to rootGroup and the map layer registry */
+    static bool loadLayerDefinition( QDomDocument doc, QgsLayerTreeGroup* rootGroup, QString &errorMessage /Out/ );
+    /* Export the selected layer tree nodes to a QLR file */
+    static bool exportLayerDefinition( QString path, QList<QgsLayerTreeNode*> selectedTreeNodes, QString &errorMessage /Out/ );
 };
 
diff --git a/python/gui/editorwidgets/core/qgseditorwidgetfactory.sip b/python/gui/editorwidgets/core/qgseditorwidgetfactory.sip
index ddcd0d3..2efa0b6 100644
--- a/python/gui/editorwidgets/core/qgseditorwidgetfactory.sip
+++ b/python/gui/editorwidgets/core/qgseditorwidgetfactory.sip
@@ -122,7 +122,6 @@ class QgsEditorWidgetFactory
      */
     virtual QVariant createCache( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config );
 
-  private:
     /**
      * Read the config from an XML file and map it to a proper {@link QgsEditorWidgetConfig}.
      *
@@ -134,6 +133,7 @@ class QgsEditorWidgetFactory
      */
     virtual QgsEditorWidgetConfig readConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx );
 
+  private:
     /**
      * This method allows disabling this editor widget type for a certain field.
      * By default, it returns true for all fields.
diff --git a/python/gui/qgsmapcanvas.sip b/python/gui/qgsmapcanvas.sip
index 68a72e8..8d75008 100644
--- a/python/gui/qgsmapcanvas.sip
+++ b/python/gui/qgsmapcanvas.sip
@@ -340,6 +340,9 @@ class QgsMapCanvas : QGraphicsView
     //! This slot is connected to the visibility change of one or more layers
     void layerStateChange();
 
+    //! This slot is connected to the layer's CRS change
+    void layerCrsChange();
+
     //! Whether to suppress rendering or not
     void setRenderFlag( bool theFlag );
     //! State of render suppression flag
diff --git a/python/plugins/MetaSearch/dialogs/maindialog.py b/python/plugins/MetaSearch/dialogs/maindialog.py
index 13403b1..e0dd5d8 100644
--- a/python/plugins/MetaSearch/dialogs/maindialog.py
+++ b/python/plugins/MetaSearch/dialogs/maindialog.py
@@ -518,7 +518,13 @@ class MetaSearchDialog(QDialog, BASE_CLASS):
             return
 
         identifier = get_item_data(item, 'identifier')
-        record = self.catalog.records[identifier]
+        try:
+            record = self.catalog.records[identifier]
+        except KeyError, err:
+            QMessageBox.warning(self,
+                                self.tr('Record parsing error'),
+                                'Unable to locate record identifier')
+            return
 
         # if the record has a bbox, show a footprint on the map
         if record.bbox is not None:
@@ -734,6 +740,12 @@ class MetaSearchDialog(QDialog, BASE_CLASS):
             QMessageBox.warning(self, self.tr('GetRecords error'),
                                 self.tr('Error getting response: %s') % err)
             return
+        except KeyError, err:
+            QMessageBox.warning(self,
+                                self.tr('Record parsing error'),
+                                'Unable to locate record identifier')
+            QApplication.restoreOverrideCursor()
+            return
 
         QApplication.restoreOverrideCursor()
 
diff --git a/python/plugins/db_manager/db_model.py b/python/plugins/db_manager/db_model.py
index 2c5800a..41fd630 100644
--- a/python/plugins/db_manager/db_model.py
+++ b/python/plugins/db_manager/db_model.py
@@ -152,7 +152,7 @@ class ConnectionItem(TreeItem):
                                         return False
 
                         except BaseError, e:
-                                DlgDbError.showError(unicode(e), None)
+                                DlgDbError.showError(e, None)
                                 return False
 
                 database = connection.database()
diff --git a/python/plugins/db_manager/db_plugins/spatialite/plugin.py b/python/plugins/db_manager/db_plugins/spatialite/plugin.py
index 1801b8b..7c2b5e3 100644
--- a/python/plugins/db_manager/db_plugins/spatialite/plugin.py
+++ b/python/plugins/db_manager/db_plugins/spatialite/plugin.py
@@ -33,8 +33,6 @@ try:
 except ImportError:
         pass
 
-
-
 def classFactory():
         return SpatiaLiteDBPlugin
 
@@ -86,7 +84,6 @@ class SLDatabase(Database):
         def connectorsFactory(self, uri):
                 return SpatiaLiteDBConnector(uri)
 
-
         def dataTablesFactory(self, row, db, schema=None):
                 return SLTable(row, db, schema)
 
@@ -96,7 +93,6 @@ class SLDatabase(Database):
         def rasterTablesFactory(self, row, db, schema=None):
                 return SLRasterTable(row, db, schema)
 
-
         def info(self):
                 from .info_model import SLDatabaseInfo
                 return SLDatabaseInfo(self)
@@ -224,10 +220,10 @@ class SLRasterTable(SLTable, RasterTable):
                 return uri
 
         def toMapLayer(self):
-                from qgis.core import QgsRasterLayer
+                from qgis.core import QgsRasterLayer, QgsContrastEnhancement
                 rl = QgsRasterLayer(self.gdalUri(), self.name)
                 if rl.isValid():
-                        rl.setContrastEnhancementAlgorithm("StretchToMinimumMaximum")
+                        rl.setContrastEnhancement(QgsContrastEnhancement.StretchToMinimumMaximum)
                 return rl
 
 
diff --git a/python/plugins/processing/algs/gdal/ClipByExtent.py b/python/plugins/processing/algs/gdal/ClipByExtent.py
index b08a0db..b00bfb0 100644
--- a/python/plugins/processing/algs/gdal/ClipByExtent.py
+++ b/python/plugins/processing/algs/gdal/ClipByExtent.py
@@ -54,7 +54,7 @@ class ClipByExtent(GdalAlgorithm):
         self.addParameter(ParameterExtent(self.PROJWIN, self.tr('Clipping extent')))
         self.addParameter(ParameterString(self.EXTRA,
             self.tr('Additional creation parameters'), '', optional=True))
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Clipped')))
 
     def processAlgorithm(self, progress):
         out = self.getOutputValue(self.OUTPUT)
diff --git a/python/plugins/processing/algs/gdal/ColorRelief.py b/python/plugins/processing/algs/gdal/ColorRelief.py
index ce36d54..ca8db90 100644
--- a/python/plugins/processing/algs/gdal/ColorRelief.py
+++ b/python/plugins/processing/algs/gdal/ColorRelief.py
@@ -63,7 +63,7 @@ class ColorRelief(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.MATCH_MODE,
             self.tr('Matching mode'), self.MATCHING_MODES, 0))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Color relief')))
 
     def processAlgorithm(self, progress):
         arguments = ['color-relief']
diff --git a/python/plugins/processing/algs/gdal/GridAverage.py b/python/plugins/processing/algs/gdal/GridAverage.py
index ba108e5..9611cda 100644
--- a/python/plugins/processing/algs/gdal/GridAverage.py
+++ b/python/plugins/processing/algs/gdal/GridAverage.py
@@ -74,7 +74,7 @@ class GridAverage(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Average')))
 
     def processAlgorithm(self, progress):
         arguments = ['-l']
diff --git a/python/plugins/processing/algs/gdal/GridDataMetrics.py b/python/plugins/processing/algs/gdal/GridDataMetrics.py
index c61cc90..6e54f7a 100644
--- a/python/plugins/processing/algs/gdal/GridDataMetrics.py
+++ b/python/plugins/processing/algs/gdal/GridDataMetrics.py
@@ -80,7 +80,7 @@ class GridDataMetrics(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Interpolated metrics')))
 
     def processAlgorithm(self, progress):
         arguments = ['-l']
diff --git a/python/plugins/processing/algs/gdal/GridInvDist.py b/python/plugins/processing/algs/gdal/GridInvDist.py
index 0a65d88..877aae5 100644
--- a/python/plugins/processing/algs/gdal/GridInvDist.py
+++ b/python/plugins/processing/algs/gdal/GridInvDist.py
@@ -84,7 +84,7 @@ class GridInvDist(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Interpolated IDW')))
 
     def processAlgorithm(self, progress):
         arguments = ['-l']
diff --git a/python/plugins/processing/algs/gdal/GridNearest.py b/python/plugins/processing/algs/gdal/GridNearest.py
index 737aa17..1e7b3b6 100644
--- a/python/plugins/processing/algs/gdal/GridNearest.py
+++ b/python/plugins/processing/algs/gdal/GridNearest.py
@@ -72,7 +72,7 @@ class GridNearest(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Interpolated nearest neighbor')))
 
     def processAlgorithm(self, progress):
         arguments = ['-l']
diff --git a/python/plugins/processing/algs/gdal/OgrAlgorithm.py b/python/plugins/processing/algs/gdal/OgrAlgorithm.py
index e9eeda5..563d042 100644
--- a/python/plugins/processing/algs/gdal/OgrAlgorithm.py
+++ b/python/plugins/processing/algs/gdal/OgrAlgorithm.py
@@ -66,8 +66,8 @@ class OgrAlgorithm(GdalAlgorithm):
                     if not ok:
                         break
 
-                    dsUri.setUsername( user )
-                    dsUri.setPassword( passwd )
+                    dsUri.setUsername(user)
+                    dsUri.setPassword(passwd)
 
             if not conn:
                 raise RuntimeError('Could not connect to PostgreSQL database - check connection info')
@@ -76,6 +76,35 @@ class OgrAlgorithm(GdalAlgorithm):
                 QgsCredentials.instance().put(conninfo, user, passwd)
 
             ogrstr = "PG:%s" % dsUri.connectionInfo()
+        elif provider == "oracle":
+            # OCI:user/password at host:port/service:table
+            dsUri = QgsDataSourceURI(layer.dataProvider().dataSourceUri())
+            ogrstr = "OCI:"
+            if dsUri.username() != "":
+                ogrstr += dsUri.username()
+                if dsUri.password() != "":
+                    ogr += "/" + dsUri.password()
+                delim = "@"
+
+            if dsUri.host() != "":
+                ogrstr += delim + dsUri.host()
+                delim = ""
+                if dsUri.port() != "" and dsUri.port() != 1521:
+                    ogrstr += ":%d" % dsUri.port()
+                ogrstr += "/"
+                if dsUri.database() != "":
+                    ogrstr += dsUri.database()
+            elif dsUri.database() != "":
+                ogrstr += delim + dsUri.database()
+
+            if ogrstr == "OCI:":
+                raise RuntimeError('Invalid oracle data source - check connection info')
+
+            ogrstr += ":"
+            if dsUri.schema() != "":
+                ogrstr += dsUri.schema() + "."
+
+            ogrstr += dsUri.table()
         else:
             ogrstr = unicode(layer.source()).split("|")[0]
 
diff --git a/python/plugins/processing/algs/gdal/aspect.py b/python/plugins/processing/algs/gdal/aspect.py
index 4120914..99692ca 100644
--- a/python/plugins/processing/algs/gdal/aspect.py
+++ b/python/plugins/processing/algs/gdal/aspect.py
@@ -64,7 +64,7 @@ class aspect(GdalAlgorithm):
         self.addParameter(ParameterBoolean(self.ZERO_FLAT,
             self.tr('Return 0 for flat (instead of -9999)'), False))
 
-        self.addOutput(OutputRaster(self.OUTPUT, 'Output file'))
+        self.addOutput(OutputRaster(self.OUTPUT, 'Aspect'))
 
     def processAlgorithm(self, progress):
         arguments = ['aspect']
diff --git a/python/plugins/processing/algs/gdal/buildvrt.py b/python/plugins/processing/algs/gdal/buildvrt.py
index 5979922..fe51281 100644
--- a/python/plugins/processing/algs/gdal/buildvrt.py
+++ b/python/plugins/processing/algs/gdal/buildvrt.py
@@ -57,7 +57,7 @@ class buildvrt(GdalAlgorithm):
             self.tr('Layer stack'), True))
         self.addParameter(ParameterBoolean(self.PROJ_DIFFERENCE,
             self.tr('Allow projection difference'), False))
-        self.addOutput(OutputRaster(buildvrt.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(buildvrt.OUTPUT, self.tr('Virtual')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/fillnodata.py b/python/plugins/processing/algs/gdal/fillnodata.py
index 0b3f4e4..bc46f43 100644
--- a/python/plugins/processing/algs/gdal/fillnodata.py
+++ b/python/plugins/processing/algs/gdal/fillnodata.py
@@ -64,7 +64,7 @@ class fillnodata(GdalAlgorithm):
         self.addParameter(ParameterBoolean(self.NO_DEFAULT_MASK,
             self.tr('Do not use default validity mask'), False))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Filled')))
 
     def processAlgorithm(self, progress):
         output = self.getOutputValue(self.OUTPUT)
diff --git a/python/plugins/processing/algs/gdal/gdal2xyz.py b/python/plugins/processing/algs/gdal/gdal2xyz.py
index 95db2f3..537f4ff 100644
--- a/python/plugins/processing/algs/gdal/gdal2xyz.py
+++ b/python/plugins/processing/algs/gdal/gdal2xyz.py
@@ -50,7 +50,7 @@ class gdal2xyz(GdalAlgorithm):
         self.addParameter(ParameterNumber(self.BAND,
             self.tr('Band number'), 1, 9999, 1))
 
-        self.addOutput(OutputTable(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputTable(self.OUTPUT, self.tr('xyz')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/gdaladdo.py b/python/plugins/processing/algs/gdal/gdaladdo.py
index e291404..1edabe2 100644
--- a/python/plugins/processing/algs/gdal/gdaladdo.py
+++ b/python/plugins/processing/algs/gdal/gdaladdo.py
@@ -73,7 +73,7 @@ class gdaladdo(GdalAlgorithm):
             self.tr('Resampling method'), self.METHODS, 0))
         self.addParameter(ParameterSelection(self.FORMAT,
             self.tr('Overview format'), self.FORMATS, 0))
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer'), True))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Pyramidized'), True))
 
     def processAlgorithm(self, progress):
         inFile = self.getParameterValue(self.INPUT)
diff --git a/python/plugins/processing/algs/gdal/hillshade.py b/python/plugins/processing/algs/gdal/hillshade.py
index 25fc183..1b83f8f 100644
--- a/python/plugins/processing/algs/gdal/hillshade.py
+++ b/python/plugins/processing/algs/gdal/hillshade.py
@@ -68,7 +68,7 @@ class hillshade(GdalAlgorithm):
         self.addParameter(ParameterNumber(self.ALTITUDE,
             self.tr('Altitude of the light'), 0.0, 99999999.999999, 45.0))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Hillshade')))
 
     def processAlgorithm(self, progress):
         arguments = ['hillshade']
diff --git a/python/plugins/processing/algs/gdal/merge.py b/python/plugins/processing/algs/gdal/merge.py
index 9eb014f..67f31cd 100644
--- a/python/plugins/processing/algs/gdal/merge.py
+++ b/python/plugins/processing/algs/gdal/merge.py
@@ -57,7 +57,7 @@ class merge(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
 
-        self.addOutput(OutputRaster(merge.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(merge.OUTPUT, self.tr('Merged')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/nearblack.py b/python/plugins/processing/algs/gdal/nearblack.py
index 9442fd5..c1872bc 100644
--- a/python/plugins/processing/algs/gdal/nearblack.py
+++ b/python/plugins/processing/algs/gdal/nearblack.py
@@ -50,7 +50,7 @@ class nearblack(GdalAlgorithm):
         self.addParameter(ParameterBoolean(nearblack.WHITE,
             self.tr('Search for nearly white pixels instead of nearly black'),
             False))
-        self.addOutput(OutputRaster(nearblack.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(nearblack.OUTPUT, self.tr('Nearblack')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/pct2rgb.py b/python/plugins/processing/algs/gdal/pct2rgb.py
index 249a88c..b43ec94 100644
--- a/python/plugins/processing/algs/gdal/pct2rgb.py
+++ b/python/plugins/processing/algs/gdal/pct2rgb.py
@@ -50,7 +50,7 @@ class pct2rgb(GdalAlgorithm):
             options.append(str(i + 1))
         self.addParameter(ParameterSelection(pct2rgb.NBAND,
             self.tr('Band to convert'), options))
-        self.addOutput(OutputRaster(pct2rgb.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(pct2rgb.OUTPUT, self.tr('PCT to RGB')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/polygonize.py b/python/plugins/processing/algs/gdal/polygonize.py
index 53a0a2a..106e6a9 100644
--- a/python/plugins/processing/algs/gdal/polygonize.py
+++ b/python/plugins/processing/algs/gdal/polygonize.py
@@ -50,7 +50,7 @@ class polygonize(GdalAlgorithm):
             self.tr('Input layer'), False))
         self.addParameter(ParameterString(polygonize.FIELD,
             self.tr('Output field name'), 'DN'))
-        self.addOutput(OutputVector(polygonize.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputVector(polygonize.OUTPUT, self.tr('Vectorized')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/proximity.py b/python/plugins/processing/algs/gdal/proximity.py
index ef76d91..ff7c333 100644
--- a/python/plugins/processing/algs/gdal/proximity.py
+++ b/python/plugins/processing/algs/gdal/proximity.py
@@ -71,7 +71,7 @@ class proximity(GdalAlgorithm):
             -1, 9999, -1))
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Distance')))
 
     def processAlgorithm(self, progress):
         output = self.getOutputValue(self.OUTPUT)
diff --git a/python/plugins/processing/algs/gdal/rasterize.py b/python/plugins/processing/algs/gdal/rasterize.py
index 95fc726..666b6bd 100644
--- a/python/plugins/processing/algs/gdal/rasterize.py
+++ b/python/plugins/processing/algs/gdal/rasterize.py
@@ -47,7 +47,6 @@ class rasterize(OgrAlgorithm):
     DIMENSIONS = 'DIMENSIONS'
     WIDTH = 'WIDTH'
     HEIGHT = 'HEIGHT'
-    WRITEOVER = 'WRITEOVER'
     RTYPE = 'RTYPE'
     OUTPUT = 'OUTPUT'
     TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
@@ -71,8 +70,6 @@ class rasterize(OgrAlgorithm):
         self.addParameter(ParameterVector(self.INPUT, self.tr('Input layer')))
         self.addParameter(ParameterTableField(self.FIELD,
             self.tr('Attribute field'), self.INPUT))
-        self.addParameter(ParameterBoolean(self.WRITEOVER,
-            self.tr('Write values inside an existing raster layer(*)'), False))
         self.addParameter(ParameterSelection(self.DIMENSIONS,
             self.tr('Set output raster size (ignored if above option is checked)'),
             ['Output size in pixels', 'Output resolution in map units per pixel'], 1))
@@ -86,7 +83,7 @@ class rasterize(OgrAlgorithm):
             self.tr("Nodata value"),
             '-9999'))
         self.addParameter(ParameterSelection(self.COMPRESS,
-            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
+            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 4))
         self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
             self.tr('Set the JPEG compression level'),
             1, 100, 75))
@@ -101,12 +98,11 @@ class rasterize(OgrAlgorithm):
         self.addParameter(ParameterSelection(self.BIGTIFF,
             self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
         self.addParameter(ParameterBoolean(self.TFW,
-            self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
+            self.tr('Force the generation of an associated ESRI world file (.tfw)'), False))
         self.addOutput(OutputRaster(self.OUTPUT,
-            self.tr('Output layer: mandatory to choose an existing raster layer if the (*) option is selected')))
+            self.tr('Rasterized')))
 
     def processAlgorithm(self, progress):
-        writeOver = self.getParameterValue(self.WRITEOVER)
         inLayer = self.getParameterValue(self.INPUT)
         ogrLayer = self.ogrConnectionString(inLayer)[1:-1]
         noData = str(self.getParameterValue(self.NO_DATA))
@@ -123,24 +119,26 @@ class rasterize(OgrAlgorithm):
         arguments.append('-a')
         arguments.append(str(self.getParameterValue(self.FIELD)))
 
-        if not writeOver:
-             arguments.append('-ot')
-             arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
+
+        arguments.append('-ot')
+        arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
         dimType = self.getParameterValue(self.DIMENSIONS)
         if dimType == 0:
-            # size in pixels
-            arguments.append('-ts')
-            arguments.append(str(self.getParameterValue(self.WIDTH)))
-            arguments.append(str(self.getParameterValue(self.HEIGHT)))
+           # size in pixels
+           arguments.append('-ts')
+           arguments.append(str(self.getParameterValue(self.WIDTH)))
+           arguments.append(str(self.getParameterValue(self.HEIGHT)))
         else:
-             # resolution in map units per pixel
-             arguments.append('-tr')
-             arguments.append(str(self.getParameterValue(self.WIDTH)))
-             arguments.append(str(self.getParameterValue(self.HEIGHT)))
+           # resolution in map units per pixel
+           arguments.append('-tr')
+           arguments.append(str(self.getParameterValue(self.WIDTH)))
+           arguments.append(str(self.getParameterValue(self.HEIGHT)))
+
         if len(noData) > 0:
-            arguments.append('-a_nodata')
-            arguments.append(noData)
-        if (GdalUtils.getFormatShortNameFromFilename(out) == "GTiff") and (writeOver is False):
+           arguments.append('-a_nodata')
+           arguments.append(noData)
+
+        if (GdalUtils.getFormatShortNameFromFilename(out) == "GTiff"):
             arguments.append("-co COMPRESS="+compress)
             if compress == 'JPEG':
                arguments.append("-co JPEG_QUALITY="+jpegcompression)
diff --git a/python/plugins/processing/algs/gdal/rgb2pct.py b/python/plugins/processing/algs/gdal/rgb2pct.py
index 0747627..4372390 100644
--- a/python/plugins/processing/algs/gdal/rgb2pct.py
+++ b/python/plugins/processing/algs/gdal/rgb2pct.py
@@ -48,7 +48,7 @@ class rgb2pct(GdalAlgorithm):
             self.tr('Input layer'), False))
         self.addParameter(ParameterNumber(rgb2pct.NCOLORS,
             self.tr('Number of colors'), 1, None, 2))
-        self.addOutput(OutputRaster(rgb2pct.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(rgb2pct.OUTPUT, self.tr('RGB to PCT')))
 
     def processAlgorithm(self, progress):
         arguments = []
diff --git a/python/plugins/processing/algs/gdal/roughness.py b/python/plugins/processing/algs/gdal/roughness.py
index ae05e8c..ef57580 100644
--- a/python/plugins/processing/algs/gdal/roughness.py
+++ b/python/plugins/processing/algs/gdal/roughness.py
@@ -50,7 +50,7 @@ class roughness(GdalAlgorithm):
         self.addParameter(ParameterBoolean(self.COMPUTE_EDGES,
             self.tr('Compute edges'), False))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Roughness')))
 
     def processAlgorithm(self, progress):
         arguments = ['roughness']
diff --git a/python/plugins/processing/algs/gdal/sieve.py b/python/plugins/processing/algs/gdal/sieve.py
index 65062b0..c3c8863 100644
--- a/python/plugins/processing/algs/gdal/sieve.py
+++ b/python/plugins/processing/algs/gdal/sieve.py
@@ -56,7 +56,7 @@ class sieve(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.CONNECTIONS,
             self.tr('Pixel connection'), self.PIXEL_CONNECTIONS, 0))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Sieved')))
 
     def processAlgorithm(self, progress):
         output = self.getOutputValue(self.OUTPUT)
diff --git a/python/plugins/processing/algs/gdal/slope.py b/python/plugins/processing/algs/gdal/slope.py
index 4f8dba7..7c3a19d 100644
--- a/python/plugins/processing/algs/gdal/slope.py
+++ b/python/plugins/processing/algs/gdal/slope.py
@@ -61,7 +61,7 @@ class slope(GdalAlgorithm):
             self.tr('Scale (ratio of vert. units to horiz.)'),
             0.0, 99999999.999999, 1.0))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Slope')))
 
     def processAlgorithm(self, progress):
         arguments = ['slope']
diff --git a/python/plugins/processing/algs/gdal/tpi.py b/python/plugins/processing/algs/gdal/tpi.py
index 60ce65f..4abfe9d 100644
--- a/python/plugins/processing/algs/gdal/tpi.py
+++ b/python/plugins/processing/algs/gdal/tpi.py
@@ -50,7 +50,7 @@ class tpi(GdalAlgorithm):
         self.addParameter(ParameterBoolean(self.COMPUTE_EDGES,
             self.tr('Compute edges'), False))
 
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output file')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Topographic Position Index')))
 
     def processAlgorithm(self, progress):
         arguments = ['TPI']
diff --git a/python/plugins/processing/algs/gdal/translate.py b/python/plugins/processing/algs/gdal/translate.py
index c2dc664..19ca956 100644
--- a/python/plugins/processing/algs/gdal/translate.py
+++ b/python/plugins/processing/algs/gdal/translate.py
@@ -90,7 +90,7 @@ class translate(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
         self.addParameter(ParameterSelection(self.COMPRESS,
-            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
+            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 4))
         self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
             self.tr('Set the JPEG compression level'),
             1, 100, 75))
@@ -108,7 +108,7 @@ class translate(GdalAlgorithm):
             self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
         self.addParameter(ParameterString(self.EXTRA,
             self.tr('Additional creation parameters'), '', optional=True))
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Translated')))
 
     def processAlgorithm(self, progress):
         out = self.getOutputValue(translate.OUTPUT)
diff --git a/python/plugins/processing/algs/gdal/warp.py b/python/plugins/processing/algs/gdal/warp.py
index b016459..8fe62dd 100644
--- a/python/plugins/processing/algs/gdal/warp.py
+++ b/python/plugins/processing/algs/gdal/warp.py
@@ -78,7 +78,7 @@ class warp(GdalAlgorithm):
         self.addParameter(ParameterSelection(self.RTYPE,
             self.tr('Output raster type'), self.TYPE, 5))
         self.addParameter(ParameterSelection(self.COMPRESS,
-            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
+            self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 4))
         self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
             self.tr('Set the JPEG compression level'),
             1, 100, 75))
@@ -96,7 +96,7 @@ class warp(GdalAlgorithm):
             self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
         self.addParameter(ParameterString(self.EXTRA,
             self.tr('Additional creation parameters'), '', optional=True))
-        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
+        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Warped')))
 
     def processAlgorithm(self, progress):
         noData = str(self.getParameterValue(self.NO_DATA))
diff --git a/python/plugins/processing/algs/grass/description/v.buffer.column.txt b/python/plugins/processing/algs/grass/description/v.buffer.column.txt
index 013a532..66b6564 100644
--- a/python/plugins/processing/algs/grass/description/v.buffer.column.txt
+++ b/python/plugins/processing/algs/grass/description/v.buffer.column.txt
@@ -7,5 +7,5 @@ ParameterNumber|scale|Scaling factor for attribute column values|None|None|1.0
 ParameterString|tolerance|Maximum distance between theoretical arc and polygon segments as multiple of buffer|0.01
 ParameterBoolean|-s|Make outside corners straight|False
 ParameterBoolean|-c|Don't make caps at the ends of polylines|False
-OutputVector|output|Output buffer
+OutputVector|output|Buffer
 
diff --git a/python/plugins/processing/algs/grass/description/v.buffer.distance.txt b/python/plugins/processing/algs/grass/description/v.buffer.distance.txt
index aaeb491..e355432 100644
--- a/python/plugins/processing/algs/grass/description/v.buffer.distance.txt
+++ b/python/plugins/processing/algs/grass/description/v.buffer.distance.txt
@@ -6,5 +6,5 @@ ParameterString|distance|Buffer distance in map units|
 ParameterString|tolerance|Maximum distance between theoretical arc and polygon segments as multiple of buffer|0.01
 ParameterBoolean|-s|Make outside corners straight|False
 ParameterBoolean|-c|Don't make caps at the ends of polylines|False
-OutputVector|output|Output buffer
+OutputVector|output|Buffer
 
diff --git a/python/plugins/processing/algs/grass7/description/v.buffer.column.txt b/python/plugins/processing/algs/grass7/description/v.buffer.column.txt
index d6029b6..346cb4a 100644
--- a/python/plugins/processing/algs/grass7/description/v.buffer.column.txt
+++ b/python/plugins/processing/algs/grass7/description/v.buffer.column.txt
@@ -7,4 +7,4 @@ ParameterNumber|scale|Scaling factor for attribute column values|None|None|1.0
 ParameterString|tolerance|Maximum distance between theoretical arc and polygon segments as multiple of buffer|0.01
 ParameterBoolean|-s|Make outside corners straight|False
 ParameterBoolean|-c|Do not make caps at the ends of polylines|False
-OutputVector|output|Output buffer
+OutputVector|output|Buffer
diff --git a/python/plugins/processing/algs/grass7/description/v.buffer.distance.txt b/python/plugins/processing/algs/grass7/description/v.buffer.distance.txt
index f9ae03b..2a46a2a 100644
--- a/python/plugins/processing/algs/grass7/description/v.buffer.distance.txt
+++ b/python/plugins/processing/algs/grass7/description/v.buffer.distance.txt
@@ -6,4 +6,4 @@ ParameterString|distance|Buffer distance in map units|
 ParameterString|tolerance|Maximum distance between theoretical arc and polygon segments as multiple of buffer|0.01
 ParameterBoolean|-s|Make outside corners straight|False
 ParameterBoolean|-c|Do not make caps at the ends of polylines|False
-OutputVector|output|Output buffer
+OutputVector|output|Buffer
diff --git a/python/plugins/processing/algs/grass7/description/v.generalize.txt b/python/plugins/processing/algs/grass7/description/v.generalize.txt
index 42c9847..7d6e3a9 100644
--- a/python/plugins/processing/algs/grass7/description/v.generalize.txt
+++ b/python/plugins/processing/algs/grass7/description/v.generalize.txt
@@ -14,6 +14,7 @@ ParameterNumber|betweeness_thresh|Betweeness threshold in network generalization
 ParameterNumber|alpha|Snakes alpha parameter|None|None|1.0
 ParameterNumber|beta|Snakes beta parameter|None|None|1.0
 ParameterNumber|iterations|Number of iterations|None|None|1
-ParameterBoolean|-c|Copy attributes|True
+ParameterBoolean|-t|Do not copy attributes|False
+ParameterBoolean|-l|Disable loop support|True
 OutputVector|output|Output layer
 
diff --git a/python/plugins/processing/algs/otb/OTBUtils.py b/python/plugins/processing/algs/otb/OTBUtils.py
index c45bf5d..eeb5990 100644
--- a/python/plugins/processing/algs/otb/OTBUtils.py
+++ b/python/plugins/processing/algs/otb/OTBUtils.py
@@ -29,6 +29,7 @@ __copyright__ = '(C) 2012, Victor Olaya'
 __revision__ = '$Format:%H$'
 
 import os
+import re
 from PyQt4.QtCore import QCoreApplication
 from qgis.core import QgsApplication
 import subprocess
@@ -130,7 +131,7 @@ class OTBUtils:
         loglines = []
         loglines.append(OTBUtils.tr("OTB execution console output"))
         os.putenv('ITK_AUTOLOAD_PATH', OTBUtils.otbLibPath())
-        fused_command = ''.join(['"%s" ' % c for c in commands])
+        fused_command = ''.join(['"%s" ' % re.sub(r'^"|"$', '', c) for c in commands])
         proc = subprocess.Popen(fused_command, shell=True, stdout=subprocess.PIPE, stdin=open(os.devnull),stderr=subprocess.STDOUT, universal_newlines=True).stdout
         for line in iter(proc.readline, ""):
             if "[*" in line:
diff --git a/python/plugins/processing/algs/qgis/Grid.py b/python/plugins/processing/algs/qgis/Grid.py
index 749ac14..4dd1f02 100644
--- a/python/plugins/processing/algs/qgis/Grid.py
+++ b/python/plugins/processing/algs/qgis/Grid.py
@@ -34,18 +34,15 @@ from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecution
 from processing.core.parameters import ParameterExtent
 from processing.core.parameters import ParameterNumber
 from processing.core.parameters import ParameterSelection
+from processing.core.parameters import ParameterCrs
 from processing.core.outputs import OutputVector
 
 
 class Grid(GeoAlgorithm):
     TYPE = 'TYPE'
     EXTENT = 'EXTENT'
-    WIDTH = 'WIDTH'
-    HEIGHT = 'HEIGHT'
     HSPACING = 'HSPACING'
     VSPACING = 'VSPACING'
-    CENTERX = 'CENTERX'
-    CENTERY = 'CENTERY'
     CRS = 'CRS'
     OUTPUT = 'OUTPUT'
 
@@ -67,14 +64,16 @@ class Grid(GeoAlgorithm):
             self.tr('Horizontal spacing'), default=10.0))
         self.addParameter(ParameterNumber(self.VSPACING,
             self.tr('Vertical spacing'), default=10.0))
+        self.addParameter(ParameterCrs(self.CRS, 'Grid CRS'))
 
-        self.addOutput(OutputVector(self.OUTPUT, self.tr('Output')))
+        self.addOutput(OutputVector(self.OUTPUT, self.tr('Grid')))
 
     def processAlgorithm(self, progress):
         idx = self.getParameterValue(self.TYPE)
         extent = self.getParameterValue(self.EXTENT).split(',')
         hSpacing = self.getParameterValue(self.HSPACING)
         vSpacing = self.getParameterValue(self.VSPACING)
+        crs = QgsCoordinateReferenceSystem(self.getParameterValue(self.CRS))
 
         bbox = QgsRectangle(float(extent[0]), float(extent[2]),
                             float(extent[1]), float(extent[3]))
@@ -85,7 +84,6 @@ class Grid(GeoAlgorithm):
         centerY = bbox.center().y()
         originX = centerX - width / 2.0
         originY = centerY - height / 2.0
-        crs = QgsCoordinateReferenceSystem(self.getParameterValue(self.CRS))
 
         if hSpacing <= 0 or vSpacing <= 0:
             raise GeoAlgorithmExecutionException(
diff --git a/python/plugins/processing/algs/qgis/HypsometricCurves.py b/python/plugins/processing/algs/qgis/HypsometricCurves.py
index 05237ad..e23f805 100644
--- a/python/plugins/processing/algs/qgis/HypsometricCurves.py
+++ b/python/plugins/processing/algs/qgis/HypsometricCurves.py
@@ -132,6 +132,12 @@ class HypsometricCurves(GeoAlgorithm):
             srcOffset = (startColumn, startRow, width, height)
             srcArray = rasterBand.ReadAsArray(*srcOffset)
 
+            if srcOffset[2] == 0 or srcOffset[3] == 0:
+                progress.setInfo(
+                    self.tr('Feature %d is smaller than raster '
+                            'cell size' % f.id()))
+                continue
+
             newGeoTransform = (
                 geoTransform[0] + srcOffset[0] * geoTransform[1],
                 geoTransform[1],
diff --git a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py
index b4e0a25..4955467 100644
--- a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py
+++ b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py
@@ -39,7 +39,7 @@ from processing.core.AlgorithmProvider import AlgorithmProvider
 from processing.script.ScriptUtils import ScriptUtils
 
 from RegularPoints import RegularPoints
-from SymetricalDifference import SymetricalDifference
+from SymmetricalDifference import SymmetricalDifference
 from VectorSplit import VectorSplit
 from VectorGrid import VectorGrid
 from RandomExtract import RandomExtract
@@ -152,7 +152,7 @@ class QGISAlgorithmProvider(AlgorithmProvider):
                         RandomSelection(), RandomSelectionWithinSubsets(),
                         SelectByLocation(), RandomExtract(),
                         RandomExtractWithinSubsets(), ExtractByLocation(),
-                        SpatialJoin(), RegularPoints(), SymetricalDifference(),
+                        SpatialJoin(), RegularPoints(), SymmetricalDifference(),
                         VectorSplit(), VectorGrid(), DeleteColumn(),
                         DeleteDuplicateGeometries(), TextToFloat(),
                         ExtractByAttribute(), SelectByAttribute(), Grid(),
diff --git a/python/plugins/processing/algs/qgis/SymetricalDifference.py b/python/plugins/processing/algs/qgis/SymmetricalDifference.py
similarity index 98%
rename from python/plugins/processing/algs/qgis/SymetricalDifference.py
rename to python/plugins/processing/algs/qgis/SymmetricalDifference.py
index 234e50c..4543eeb 100644
--- a/python/plugins/processing/algs/qgis/SymetricalDifference.py
+++ b/python/plugins/processing/algs/qgis/SymmetricalDifference.py
@@ -33,14 +33,14 @@ from processing.core.outputs import OutputVector
 from processing.tools import dataobjects, vector
 
 
-class SymetricalDifference(GeoAlgorithm):
+class SymmetricalDifference(GeoAlgorithm):
 
     INPUT = 'INPUT'
     OVERLAY = 'OVERLAY'
     OUTPUT = 'OUTPUT'
 
     def defineCharacteristics(self):
-        self.name = 'Symetrical difference'
+        self.name = 'Symmetrical difference'
         self.group = 'Vector overlay tools'
         self.addParameter(ParameterVector(self.INPUT,
             self.tr('Input layer'), [ParameterVector.VECTOR_TYPE_ANY]))
diff --git a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
index 904f05f..810d1bd 100644
--- a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
+++ b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
@@ -70,6 +70,8 @@ class VectorLayerScatterplot(GeoAlgorithm):
         values = vector.values(layer, xfieldname, yfieldname)
         plt.close()
         plt.scatter(values[xfieldname], values[yfieldname])
+        plt.ylabel(yfieldname)
+        plt.xlabel(xfieldname)
         plotFilename = output + '.png'
         lab.savefig(plotFilename)
         f = open(output, 'w')
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/AddCoordinatestopoints.txt b/python/plugins/processing/algs/saga/description/2.1.3/AddCoordinatestopoints.txt
index be76e8d..d4f6a0e 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/AddCoordinatestopoints.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/AddCoordinatestopoints.txt
@@ -1,4 +1,4 @@
 Add Coordinates to points
 shapes_points
 ParameterVector|INPUT|Points|0|False
-OutputVector|OUTPUT|Output
+OutputVector|OUTPUT|Points with coordinates
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(FlowTracing).txt b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(FlowTracing).txt
index 2ed37da..3d07743 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(FlowTracing).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(FlowTracing).txt
@@ -4,14 +4,14 @@ ParameterRaster|ELEVATION|Elevation|False
 ParameterRaster|SINKROUTE|Sink Routes|True
 ParameterRaster|WEIGHT|Weight|True
 ParameterRaster|MATERIAL|Material|True
+ParameterRaster|VAL_INPUT|nput for Mean over Catchment Calculation|True
 ParameterRaster|TARGET|Target|True
 ParameterNumber|STEP|Step|None|None|1
-ParameterSelection|Method|Method|[0] Rho 8;[1] Kinematic Routing Algorithm;[2] DEMON
+ParameterSelection|METHOD|Method|[0] Rho 8;[1] Kinematic Routing Algorithm;[2] DEMON
 ParameterNumber|MINDQV|DEMON - Min. DQV|None|None|0.0
-ParameterBoolean|CORRECT         |Flow Correction|True
+ParameterBoolean|CORRECT|Flow Correction|True
 OutputRaster|CAREA|Catchment Area
-OutputRaster|CHEIGHT|Catchment Height
-OutputRaster|CSLOPE|Catchment Slope
+OutputRaster|VAL_MEAN|Mean over Catchment
 OutputRaster|ACCU_TOT|Total accumulated Material
 OutputRaster|ACCU_LEFT|Accumulated Material from _left_ side
 OutputRaster|ACCU_RIGHT|Accumulated Material from _right_ side
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Parallel).txt b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Parallel).txt
index aeec060..a62ad93 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Parallel).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Parallel).txt
@@ -1,5 +1,5 @@
 Catchment Area|Catchment Area (Parallel)
 ta_hydrology
 ParameterRaster|ELEVATION|Elevation|False
-ParameterSelection|Method|Method|[0] Deterministic 8;[1] Rho 8;[2] Braunschweiger Reliefmodell;[3] Deterministic Infinity;[4] Multiple Flow Direction;[5] Multiple Triangular Flow Directon
-OutputRaster|CAREA|Catchment Area
+ParameterSelection|METHOD|Method|[0] Deterministic 8;[1] Rho 8;[2] Braunschweiger Reliefmodell;[3] Deterministic Infinity;[4] Multiple Flow Direction;[5] Multiple Triangular Flow Directon
+OutputRaster|CAREA|Catchment Area
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Recursive).txt b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Recursive).txt
index 710d8bc..a311880 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Recursive).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/CatchmentArea(Recursive).txt
@@ -4,14 +4,14 @@ ParameterRaster|ELEVATION|Elevation|False
 ParameterRaster|SINKROUTE|Sink Routes|True
 ParameterRaster|WEIGHT|Weight|True
 ParameterRaster|MATERIAL|Material|True
+ParameterRaster|VAL_INPUT|nput for Mean over Catchment Calculation|True
 ParameterRaster|TARGET|Target|True
 ParameterNumber|STEP|Step|None|None|1
 ParameterRaster|TARGETS|Target Areas|True
-ParameterSelection|Method|Method|[0] Deterministic 8;[1] Rho 8;[2] Deterministic Infinity;[3] Multiple Flow Direction
+ParameterSelection|METHOD|Method|[0] Deterministic 8;[1] Rho 8;[2] Deterministic Infinity;[3] Multiple Flow Direction
 ParameterNumber|CONVERGENCE|Convergence|None|None|1.1
 OutputRaster|CAREA|Catchment Area
-OutputRaster|CHEIGHT|Catchment Height
-OutputRaster|CSLOPE|Catchment Slope
+OutputRaster|VAL_MEAN|Mean over Catchment
 OutputRaster|ACCU_TOT|Total accumulated Material
 OutputRaster|ACCU_LEFT|Accumulated Material from _left_ side
 OutputRaster|ACCU_RIGHT|Accumulated Material from _right_ side
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/ClipGridwithPolygon.txt b/python/plugins/processing/algs/saga/description/2.1.3/ClipGridwithPolygon.txt
index f4bf000..b76d1a2 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/ClipGridwithPolygon.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/ClipGridwithPolygon.txt
@@ -2,4 +2,4 @@ Clip Grid with Polygon
 shapes_grid
 ParameterRaster|INPUT|Input|False
 ParameterVector|POLYGONS|Polygons|2|False
-OutputRaster|OUTPUT|Output
+OutputRaster|OUTPUT|Clipped
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/ContourLinesfromGrid.txt b/python/plugins/processing/algs/saga/description/2.1.3/ContourLinesfromGrid.txt
index 7db5e90..0c58ba1 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/ContourLinesfromGrid.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/ContourLinesfromGrid.txt
@@ -1,6 +1,6 @@
 Contour Lines from Grid
 shapes_grid
-ParameterRaster|INPUT|Grid|False
+ParameterRaster|GRID|Grid|False
 ParameterNumber|ZMIN|Minimum Contour Value|None|None|0.0
 ParameterNumber|ZMAX|Maximum Contour Value|None|None|10000.0
 ParameterNumber|ZSTEP|Equidistance|None|None|100.0
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/CropToData.txt b/python/plugins/processing/algs/saga/description/2.1.3/CropToData.txt
index 783a31c..e87ea99 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/CropToData.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/CropToData.txt
@@ -1,4 +1,4 @@
 Crop to Data
 grid_tools
 ParameterRaster|INPUT|Input layer|False
-OutputRaster|OUTPUT|Cropped layer
\ No newline at end of file
+OutputRaster|OUTPUT|Cropped
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/GridCalculator.txt b/python/plugins/processing/algs/saga/description/2.1.3/GridCalculator.txt
index 75cc869..e849948 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/GridCalculator.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/GridCalculator.txt
@@ -6,4 +6,4 @@ ParameterMultipleInput|XGRIDS|Additional layers|3|True
 ParameterString|FORMULA|Formula|
 ParameterBoolean|USE_NODATA|Use NoData|False
 ParameterSelection|TYPE|Output Data Type|[0] bit;[1] unsigned 1 byte integer;[2] signed 1 byte integer;[3] unsigned 2 byte integer;[4] signed 2 byte integer;[5] unsigned 4 byte integer;[6] signed 4 byte integer;[7] 4 byte floating point number;[8] 8 byte floating point number|7
-OutputRaster|RESULT|Result layer
\ No newline at end of file
+OutputRaster|RESULT|Calculated
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/InverseDistanceWeighted.txt b/python/plugins/processing/algs/saga/description/2.1.3/InverseDistanceWeighted.txt
index 9b2c896..8592a46 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/InverseDistanceWeighted.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/InverseDistanceWeighted.txt
@@ -2,15 +2,15 @@ Inverse Distance Weighted
 grid_gridding
 ParameterVector|SHAPES|Points|0|False
 ParameterTableField|FIELD|Attribute|SHAPES|-1|False
-Hardcoded|-TARGET_DEFINITION 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
 ParameterSelection|WEIGHTING|Distance Weighting|[0] inverse distance to a power;[1] linearly decreasing within search radius;[2] exponential weighting scheme;[3] gaussian weighting scheme
 ParameterNumber|WEIGHT_POWER|Inverse Distance Power|0.0|None|2
 ParameterNumber|WEIGHT_BANDWIDTH|Exponential and Gaussian Weighting Bandwidth|0.0|None|1
 ParameterSelection|SEARCH_RANGE|Search Range|[0] search radius (local);[1] no search radius (global)
 ParameterNumber|SEARCH_RADIUS|Search Radius|None|None|100.0
 ParameterSelection|SEARCH_DIRECTION|Search Mode|[0] all directions;[1] quadrants
-ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points
-ParameterNumber|SEARCH_POINTS_MAX|Maximum Number of Points|None|None|10
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
-ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
\ No newline at end of file
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+ParameterSelection|TARGET_DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells
+OutputRaster|TARGET_OUT_GRID|Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/KernelDensityEstimation.txt b/python/plugins/processing/algs/saga/description/2.1.3/KernelDensityEstimation.txt
index 4cc5c17..5c8831c 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/KernelDensityEstimation.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/KernelDensityEstimation.txt
@@ -6,5 +6,6 @@ ParameterNumber|RADIUS|Radius|None|None|10
 ParameterSelection|KERNEL|Kernel|[0] quartic kernel;[1] gaussian kernel
 Hardcoded|-TARGET_DEFINITION 0
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
-ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+ParameterSelection|TARGET_USER_FITS|Fit Choice|[0] nodes;[1] cells
+OutputRaster|TARGET_OUT_GRID|Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation(fromGrid).txt b/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation(fromGrid).txt
index e4b4a3e..d86243e 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation(fromGrid).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation(fromGrid).txt
@@ -7,5 +7,5 @@ ParameterNumber|EPSILON|Threshold Error|None|None|0.0001
 ParameterNumber|LEVEL_MAX|Maximum Level|None|None|11.0
 ParameterSelection|DATATYPE|Data Type|[0] same as input grid;[1] floating point
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
-ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+OutputRaster|TARGET_OUT_GRID|Grid
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation.txt b/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation.txt
index ef0c33d..d3d018c 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/MultilevelB-SplineInterpolation.txt
@@ -2,10 +2,12 @@ Multilevel B-Spline Interpolation
 grid_spline
 ParameterVector|SHAPES|Points|0|False
 ParameterTableField|FIELD|Attribute|SHAPES|-1|False
-Hardcoded|-TARGET_DEFINITION 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
 ParameterSelection|METHOD|Method|[0] without B-spline refinement;[1] with B-spline refinement
 ParameterNumber|EPSILON|Threshold Error|None|None|0.0001
-ParameterNumber|LEVEL_MAX|Maximum Level|None|None|11.0
+ParameterBoolean|UPDATE|Update View|False
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
-ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+ParameterSelection|TARGET_DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells
+OutputRaster|TARGET_OUT_GRID|Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/NaturalNeighbour.txt b/python/plugins/processing/algs/saga/description/2.1.3/NaturalNeighbour.txt
index d3705ab..6e8562e 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/NaturalNeighbour.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/NaturalNeighbour.txt
@@ -6,4 +6,4 @@ Hardcoded|-TARGET_DEFINITION 0
 ParameterBoolean|SIBSON         |Sibson|True
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Natural neighbour
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/NearestNeighbour.txt b/python/plugins/processing/algs/saga/description/2.1.3/NearestNeighbour.txt
index 88d19e7..e8cf0b4 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/NearestNeighbour.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/NearestNeighbour.txt
@@ -5,4 +5,4 @@ ParameterTableField|FIELD|Attribute|SHAPES|-1|False
 Hardcoded|-TARGET_DEFINITION 0
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Nearest neighbour
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging(Global).txt b/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging(Global).txt
index 0efe776..c320a9f 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging(Global).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging(Global).txt
@@ -18,5 +18,5 @@ ParameterNumber|POW_B|Power Function - B|None|None|0.5
 ParameterNumber|USER_CELL_SIZE|Grid Size|0|None|1.0
 ParameterBoolean|USER_FIT_EXTENT        |Fit Extent|True
 Extent USER_X_EXTENT_MIN USER_X_EXTENT_MAX USER_Y_EXTENT_MIN USER_Y_EXTENT_MIN
-OutputRaster|GRID|Grid
+OutputRaster|GRID|Ordinary kriging global
 OutputRaster|VARIANCE|Variance
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging.txt b/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging.txt
index 35b883e..7e7b5eb 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/OrdinaryKriging.txt
@@ -21,5 +21,5 @@ ParameterBoolean|USER_BVARIANCE              |Create Quality Grid|True
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|0|None|1.0
 ParameterSelection|USER_FIT|Search Direction|[0] nodes;[1] cells
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Ordinary kriging
 OutputRaster|USER_VARIANCE|Variance
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/PolynomialRegression.txt b/python/plugins/processing/algs/saga/description/2.1.3/PolynomialRegression.txt
index 73db6fb..81159e7 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/PolynomialRegression.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/PolynomialRegression.txt
@@ -10,4 +10,4 @@ ParameterSelection|TARGET|Trend Surface|[0] user defined
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
 OutputVector|RESIDUALS|Residuals
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Regression
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/Resampling.txt b/python/plugins/processing/algs/saga/description/2.1.3/Resampling.txt
index a617223..c9b4ece 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/Resampling.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/Resampling.txt
@@ -7,4 +7,4 @@ ParameterSelection|SCALE_UP_METHOD|Interpolation Method (Scale Up)|[0] Nearest N
 ParameterSelection|SCALE_DOWN_METHOD|Interpolation Method (Scale Down)|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Resampled
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/Separatepointsbydirection.txt b/python/plugins/processing/algs/saga/description/2.1.3/Separatepointsbydirection.txt
index 103f2b3..db1ec26 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/Separatepointsbydirection.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/Separatepointsbydirection.txt
@@ -3,4 +3,4 @@ shapes_points
 ParameterVector|POINTS|Points|0|False
 ParameterNumber|DIRECTIONS|Number of Directions|1.0|None|4
 ParameterNumber|TOLERANCE|Tolerance (Degree)|0.0|None|5
-OutputVector|OUTPUT|Ouput
+OutputVector|OUTPUT|Point direction
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/ShapestoGrid.txt b/python/plugins/processing/algs/saga/description/2.1.3/ShapestoGrid.txt
index 547c471..999a7f8 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/ShapestoGrid.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/ShapestoGrid.txt
@@ -1,11 +1,15 @@
 Shapes to Grid
 grid_gridding
-Hardcoded|-TARGET 0
 ParameterVector|INPUT|Shapes|-1|False
 ParameterTableField|FIELD|Attribute|INPUT|-1|False
-ParameterSelection|MULTIPLE|Method for Multiple Values|[0] first;[1] last;[2] minimum;[3] maximum;[4] mean
+ParameterSelection|OUTPUT|Output Values|[0] data / no-data;[1] index number; [2] attribute|2
+ParameterSelection|MULTIPLE|Method for Multiple Values|[0] first;[1] last;[2] minimum;[3] maximum;[4] mean|4
 ParameterSelection|LINE_TYPE|Method for Lines|[0] thin;[1] thick
-ParameterSelection|GRID_TYPE|Preferred Target Grid Type|[0] Integer (1 byte);[1] Integer (2 byte);[2] Integer (4 byte);[3] Floating Point (4 byte);[4] Floating Point (8 byte)
+ParameterSelection|POLY_TYPE|Polygon|[0] node;[1] cell
+ParameterSelection|GRID_TYPE|Preferred Target Grid Type|[0] Integer (1 byte);[1] Integer (2 byte);[2] Integer (4 byte);[3] Floating Point (4 byte);[4] Floating Point (8 byte)|3
+ParameterSelection|TARGET_DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
-ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
\ No newline at end of file
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells
+OutputRaster|TARGET_OUT_GRID|Rasterized
+OutputRaster|TARGET_COUNT|Number of Values
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/Slope,Aspect,Curvature.txt b/python/plugins/processing/algs/saga/description/2.1.3/Slope,Aspect,Curvature.txt
index eb6edcc..e9d707c 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/Slope,Aspect,Curvature.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/Slope,Aspect,Curvature.txt
@@ -2,8 +2,8 @@ Slope, Aspect, Curvature
 ta_morphometry
 ParameterRaster|ELEVATION|Elevation|False
 ParameterSelection|METHOD|Method|[0] Maximum Slope (Travis et al. 1975);[1] Maximum Triangle Slope (Tarboton 1997);[2] Least Squares Fitted Plane (Horn 1981, Costa-Cabral & Burgess 1996);[3] 6 parameter 2nd order polynom (Evans 1979);[4] 6 parameter 2nd order polynom (Heerdegen & Beran 1982);[5] 6 parameter 2nd order polynom (Bauer, Rohdenburg, Bork 1985);[6] 9 parameter 2nd order polynom (Zevenbergen & Thorne 1987);[7]10 parameter 3rd order polynom (Haralick 1983)|6
-ParameterSelection|UNIT_SLOPE|Slope Units|[0] radians;[1] degree;[2] percent|0
-ParameterSelection|UNIT_ASPECT|Aspect Units|[0] radians;[1] degree|0
+ParameterSelection|UNIT_SLOPE|Slope Units|[0] radians;[1] degree;[2] percent|1
+ParameterSelection|UNIT_ASPECT|Aspect Units|[0] radians;[1] degree|1
 OutputRaster|SLOPE|Slope
 OutputRaster|ASPECT|Aspect
 OutputRaster|C_GENE|General Curvature
@@ -15,4 +15,4 @@ OutputRaster|C_CROS|Cross-Sectional Curvature
 OutputRaster|C_MINI|Minimal Curvature
 OutputRaster|C_MAXI|Maximal Curvature
 OutputRaster|C_TOTA|Total Curvature
-OutputRaster|C_ROTO|Flow-Line Curvature
\ No newline at end of file
+OutputRaster|C_ROTO|Flow-Line Curvature
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/StatisticsforGrids.txt b/python/plugins/processing/algs/saga/description/2.1.3/StatisticsforGrids.txt
index fa10d25..e21300c 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/StatisticsforGrids.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/StatisticsforGrids.txt
@@ -1,10 +1,14 @@
 Statistics for Grids
 statistics_grid
 ParameterMultipleInput|GRIDS|Grids|3|False
+ParameterNumber|PCTL_VAL|Percentile|0.0|100.0|50.0
 OutputRaster|MEAN|Arithmetic Mean
 OutputRaster|MIN|Minimum
 OutputRaster|MAX|Maximum
 OutputRaster|VAR|Variance
+OutputRaster|SUM|Sum
+OutputRaster|RANGE|Range
+OutputRaster|PCTL|Percentile
 OutputRaster|STDDEV|Standard Deviation
 OutputRaster|STDDEVLO|Mean less Standard Deviation
-OutputRaster|STDDEVHI|Mean plus Standard Deviation
+OutputRaster|STDDEVHI|Mean plus Standard Deviation
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/TransformShapes.txt b/python/plugins/processing/algs/saga/description/2.1.3/TransformShapes.txt
index bbfe409..40e5862 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/TransformShapes.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/TransformShapes.txt
@@ -8,4 +8,4 @@ ParameterNumber|SCALEX|Scale Factor X|None|None|1.0
 ParameterNumber|SCALEY|Scale Factor Y|None|None|1.0
 ParameterNumber|ANCHORX|X|None|None|0.0
 ParameterNumber|ANCHORY|Y|None|None|0.0
-OutputVector|OUT|Output
+OutputVector|OUT|Transformed
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/Triangulation.txt b/python/plugins/processing/algs/saga/description/2.1.3/Triangulation.txt
index 0a9147b..b8c3ad5 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/Triangulation.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/Triangulation.txt
@@ -5,4 +5,4 @@ ParameterTableField|FIELD|Attribute|SHAPES|-1|False
 Hardcoded|-TARGET_DEFINITION 0
 Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
 ParameterNumber|USER_SIZE|Cellsize|None|None|100.0
-OutputRaster|USER_GRID|Grid
+OutputRaster|USER_GRID|Triangulated
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging(Global).txt b/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging(Global).txt
index 95f5928..e17cb94 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging(Global).txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging(Global).txt
@@ -20,5 +20,5 @@ ParameterSelection|INTERPOL|Grid Interpolation|[0] Nearest Neighbor;[1] Bilinear
 ParameterNumber|USER_CELL_SIZE|Grid Size|0|None|1.0
 ParameterBoolean|USER_FIT_EXTENT        |Fit Extent|True
 Extent USER_X_EXTENT_MIN USER_X_EXTENT_MAX USER_Y_EXTENT_MIN USER_Y_EXTENT_MIN
-OutputRaster|GRID|Grid
+OutputRaster|GRID|Universal kriging global
 OutputRaster|VARIANCE|Variance
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging.txt b/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging.txt
index 0b860da..ee759c7 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/UniversalKriging.txt
@@ -22,5 +22,5 @@ ParameterNumber|NPOINTS_MAX|Max. Number of m_Points|None|None|20
 ParameterNumber|MAXRADIUS|Maximum Search Radius (map units)|None|None|1000.0
 ParameterNumber|USER_CELL_SIZE|Grid Size|0|None|1.0
 Extent USER_X_EXTENT_MIN USER_X_EXTENT_MAX USER_Y_EXTENT_MIN USER_Y_EXTENT_MIN
-OutputRaster|GRID|Grid
+OutputRaster|GRID|Universal kriging
 OutputRaster|VARIANCE|Variance
diff --git a/python/plugins/processing/algs/saga/description/2.1.3/VectorisingGridClasses.txt b/python/plugins/processing/algs/saga/description/2.1.3/VectorisingGridClasses.txt
index e59b150..0057f58 100644
--- a/python/plugins/processing/algs/saga/description/2.1.3/VectorisingGridClasses.txt
+++ b/python/plugins/processing/algs/saga/description/2.1.3/VectorisingGridClasses.txt
@@ -1,7 +1,7 @@
 Vectorising Grid Classes
 shapes_grid
 ParameterRaster|GRID|Grid|False
-ParameterSelection|CLASS_ALL|Class Selection|[0] one single class specified by class identifier;[1] all classes
+ParameterSelection|CLASS_ALL|Class Selection|[0] one single class specified by class identifier;[1] all classes|1
 ParameterNumber|CLASS_ID|Class Identifier|None|None|0
-ParameterSelection|SPLIT|Vectorised class as...|[0] one single (multi-)polygon object;[1] each island as separated polygon
-OutputVector|POLYGONS|Polygons
+ParameterSelection|SPLIT|Vectorised class as...|[0] one single (multi-)polygon object;[1] each island as separated polygon|1
+OutputVector|POLYGONS|Vectorized
diff --git a/python/plugins/processing/algs/taudem/CMakeLists.txt b/python/plugins/processing/algs/taudem/CMakeLists.txt
index 7bde62d..ac667d4 100644
--- a/python/plugins/processing/algs/taudem/CMakeLists.txt
+++ b/python/plugins/processing/algs/taudem/CMakeLists.txt
@@ -1,5 +1,7 @@
 FILE(GLOB PY_FILES *.py)
-FILE(GLOB DESCR_FILES description/*.txt)
+FILE(GLOB SINGLE_DESCR_FILES description/single/*.txt)
+FILE(GLOB MULTI_DESCR_FILES description/multi/*.txt)
 
 PLUGIN_INSTALL(processing algs/taudem ${PY_FILES})
-PLUGIN_INSTALL(processing algs/taudem/description ${DESCR_FILES})
+PLUGIN_INSTALL(processing algs/taudem/description/single ${SINGLE_DESCR_FILES})
+PLUGIN_INSTALL(processing algs/taudem/description/multi ${MULTI_DESCR_FILES})
diff --git a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py b/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
index 8dc61c0..33a6912 100644
--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
+++ b/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
@@ -27,18 +27,21 @@ __revision__ = '$Format:%H$'
 
 import os
 from PyQt4.QtGui import QIcon
+
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingLog import ProcessingLog
 from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.GeoAlgorithmExecutionException import \
     GeoAlgorithmExecutionException
-from processing.core.parameters import getParameterFromString
+
 from processing.core.parameters import ParameterRaster
 from processing.core.parameters import ParameterVector
 from processing.core.parameters import ParameterBoolean
 from processing.core.parameters import ParameterString
 from processing.core.parameters import ParameterNumber
+from processing.core.parameters import getParameterFromString
 from processing.core.outputs import getOutputFromString
+
 from TauDEMUtils import TauDEMUtils
 
 
@@ -106,7 +109,7 @@ class TauDEMAlgorithm(GeoAlgorithm):
                 commands.append(param.name)
                 commands.append(param.value)
             elif isinstance(param, ParameterBoolean):
-                if param.value and str(param.value).lower() == 'false':
+                if not param.value:
                     commands.append(param.name)
             elif isinstance(param, ParameterString):
                 commands.append(param.name)
diff --git a/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py b/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py
index de3a58e..2d41ebf 100644
--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py
+++ b/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py
@@ -30,11 +30,13 @@ import os
 from PyQt4.QtGui import QIcon
 
 from processing.core.AlgorithmProvider import AlgorithmProvider
-from processing.core.ProcessingConfig import ProcessingConfig
-from processing.core.ProcessingConfig import Setting
+from processing.core.ProcessingConfig import ProcessingConfig, Setting
 from processing.core.ProcessingLog import ProcessingLog
+
 from TauDEMAlgorithm import TauDEMAlgorithm
+from TauDEMMultifileAlgorithm import TauDEMMultifileAlgorithm
 from TauDEMUtils import TauDEMUtils
+
 from peukerdouglas import PeukerDouglas
 from slopearea import SlopeArea
 from lengtharea import LengthArea
@@ -45,13 +47,22 @@ from gridnet import GridNet
 from dinftranslimaccum import DinfTransLimAccum
 from dinftranslimaccum2 import DinfTransLimAccum2
 
+from peukerdouglas_multi import PeukerDouglasMulti
+from slopearea_multi import SlopeAreaMulti
+from lengtharea_multi import LengthAreaMulti
+from dropanalysis_multi import DropAnalysisMulti
+from dinfdistdown_multi import DinfDistDownMulti
+from dinfdistup_multi import DinfDistUpMulti
+from gridnet_multi import GridNetMulti
+from dinftranslimaccum_multi import DinfTransLimAccumMulti
+from dinftranslimaccum2_multi import DinfTransLimAccum2Multi
+
 
 class TauDEMAlgorithmProvider(AlgorithmProvider):
 
     def __init__(self):
         AlgorithmProvider.__init__(self)
         self.activate = False
-        self.createAlgsList()
 
     def getDescription(self):
         return self.tr('TauDEM (hydrologic analysis)')
@@ -64,11 +75,22 @@ class TauDEMAlgorithmProvider(AlgorithmProvider):
 
     def initializeSettings(self):
         AlgorithmProvider.initializeSettings(self)
+
         ProcessingConfig.addSetting(Setting(self.getDescription(),
             TauDEMUtils.TAUDEM_FOLDER,
             self.tr('TauDEM command line tools folder'),
             TauDEMUtils.taudemPath()))
         ProcessingConfig.addSetting(Setting(self.getDescription(),
+            TauDEMUtils.TAUDEM_MULTIFILE_FOLDER,
+            self.tr('TauDEM multifile command line tools folder'),
+            TauDEMUtils.taudemMultifilePath()))
+        ProcessingConfig.addSetting(Setting(self.getDescription(),
+            TauDEMUtils.TAUDEM_USE_SINGLEFILE,
+            self.tr('Enable singlefile TauDEM tools'), True))
+        ProcessingConfig.addSetting(Setting(self.getDescription(),
+            TauDEMUtils.TAUDEM_USE_MULTIFILE,
+            self.tr('Enable multifile TauDEM tools'), False))
+        ProcessingConfig.addSetting(Setting(self.getDescription(),
             TauDEMUtils.MPIEXEC_FOLDER,
             self.tr('MPICH2/OpenMPI bin directory'),
             TauDEMUtils.mpiexecPath()))
@@ -78,36 +100,65 @@ class TauDEMAlgorithmProvider(AlgorithmProvider):
 
     def unload(self):
         AlgorithmProvider.unload(self)
+
         ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_FOLDER)
+        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_MULTIFILE_FOLDER)
+        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_USE_SINGLEFILE)
+        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_USE_MULTIFILE)
         ProcessingConfig.removeSetting(TauDEMUtils.MPIEXEC_FOLDER)
         ProcessingConfig.removeSetting(TauDEMUtils.MPI_PROCESSES)
 
     def _loadAlgorithms(self):
-        self.algs = self.preloadedAlgs
-
-    def createAlgsList(self):
-        self.preloadedAlgs = []
-        folder = TauDEMUtils.taudemDescriptionPath()
-        for descriptionFile in os.listdir(folder):
-            if descriptionFile.endswith('txt'):
-                try:
-                    alg = TauDEMAlgorithm(os.path.join(folder,
-                            descriptionFile))
-                    if alg.name.strip() != '':
-                        self.preloadedAlgs.append(alg)
-                    else:
-                        ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
-                            self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
-                except Exception, e:
-                    ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
-                        self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
-
-        self.preloadedAlgs.append(PeukerDouglas())
-        self.preloadedAlgs.append(SlopeArea())
-        self.preloadedAlgs.append(LengthArea())
-        self.preloadedAlgs.append(DropAnalysis())
-        self.preloadedAlgs.append(DinfDistDown())
-        self.preloadedAlgs.append(DinfDistUp())
-        self.preloadedAlgs.append(GridNet())
-        self.preloadedAlgs.append(DinfTransLimAccum())
-        self.preloadedAlgs.append(DinfTransLimAccum2())
+        self.algs = []
+        basePath = TauDEMUtils.taudemDescriptionPath()
+
+        if ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_USE_SINGLEFILE):
+            folder = os.path.join(basePath, 'single')
+
+            for descriptionFile in os.listdir(folder):
+                if descriptionFile.endswith('txt'):
+                    descriptionFile = os.path.join(folder, descriptionFile)
+                    self._algFromDescription(descriptionFile)
+
+            self.algs.append(PeukerDouglas())
+            self.algs.append(SlopeArea())
+            self.algs.append(LengthArea())
+            self.algs.append(DropAnalysis())
+            self.algs.append(DinfDistDown())
+            self.algs.append(DinfDistUp())
+            self.algs.append(GridNet())
+            self.algs.append(DinfTransLimAccum())
+            self.algs.append(DinfTransLimAccum2())
+
+        if ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_USE_MULTIFILE):
+            folder = os.path.join(basePath, 'multi')
+
+            for descriptionFile in os.listdir(folder):
+                if descriptionFile.endswith('txt'):
+                    descriptionFile = os.path.join(folder, descriptionFile)
+                    self._algFromDescription(descriptionFile, True)
+
+            self.algs.append(PeukerDouglasMulti())
+            self.algs.append(SlopeAreaMulti())
+            self.algs.append(LengthAreaMulti())
+            self.algs.append(DropAnalysisMulti())
+            self.algs.append(DinfDistDownMulti())
+            self.algs.append(DinfDistUpMulti())
+            self.algs.append(GridNetMulti())
+            self.algs.append(DinfTransLimAccumMulti())
+            self.algs.append(DinfTransLimAccum2Multi())
+
+    def _algFromDescription(self, descriptionFile, multifile=False):
+        try:
+            if multifile:
+                alg = TauDEMMultifileAlgorithm(descriptionFile)
+            else:
+                alg = TauDEMAlgorithm(descriptionFile)
+            if alg.name.strip() != '':
+                self.algs.append(alg)
+            else:
+                ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
+                    self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
+        except Exception, e:
+            ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
+                self.tr('Could not open TauDEM algorithm %s:\n%s' % (descriptionFile, str(e))))
diff --git a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py b/python/plugins/processing/algs/taudem/TauDEMMultifileAlgorithm.py
similarity index 90%
copy from python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
copy to python/plugins/processing/algs/taudem/TauDEMMultifileAlgorithm.py
index 8dc61c0..fd54b5b 100644
--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
+++ b/python/plugins/processing/algs/taudem/TauDEMMultifileAlgorithm.py
@@ -2,9 +2,9 @@
 
 """
 ***************************************************************************
-    TauDEMAlgorithm.py
+    TauDEMMultifileAlgorithm.py
     ---------------------
-    Date                 : October 2012
+    Date                 : March 2015
     Copyright            : (C) 2012 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -27,22 +27,25 @@ __revision__ = '$Format:%H$'
 
 import os
 from PyQt4.QtGui import QIcon
+
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingLog import ProcessingLog
 from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.GeoAlgorithmExecutionException import \
     GeoAlgorithmExecutionException
-from processing.core.parameters import getParameterFromString
-from processing.core.parameters import ParameterRaster
+
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterVector
 from processing.core.parameters import ParameterBoolean
 from processing.core.parameters import ParameterString
 from processing.core.parameters import ParameterNumber
+from processing.core.parameters import getParameterFromString
 from processing.core.outputs import getOutputFromString
+
 from TauDEMUtils import TauDEMUtils
 
 
-class TauDEMAlgorithm(GeoAlgorithm):
+class TauDEMMultifileAlgorithm(GeoAlgorithm):
 
     def __init__(self, descriptionfile):
         GeoAlgorithm.__init__(self)
@@ -50,7 +53,7 @@ class TauDEMAlgorithm(GeoAlgorithm):
         self.defineCharacteristicsFromFile()
 
     def getCopy(self):
-        newone = TauDEMAlgorithm(self.descriptionFile)
+        newone = TauDEMMultifileAlgorithm(self.descriptionFile)
         newone.provider = self.provider
         return newone
 
@@ -94,7 +97,7 @@ class TauDEMAlgorithm(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
 
         for param in self.parameters:
             if param.value is None or param.value == '':
@@ -102,7 +105,7 @@ class TauDEMAlgorithm(GeoAlgorithm):
             if isinstance(param, ParameterNumber):
                 commands.append(param.name)
                 commands.append(str(param.value))
-            if isinstance(param, (ParameterRaster, ParameterVector)):
+            if isinstance(param, (ParameterFile, ParameterVector)):
                 commands.append(param.name)
                 commands.append(param.value)
             elif isinstance(param, ParameterBoolean):
diff --git a/python/plugins/processing/algs/taudem/TauDEMUtils.py b/python/plugins/processing/algs/taudem/TauDEMUtils.py
index dc3789a..48150ce 100644
--- a/python/plugins/processing/algs/taudem/TauDEMUtils.py
+++ b/python/plugins/processing/algs/taudem/TauDEMUtils.py
@@ -26,18 +26,22 @@ __copyright__ = '(C) 2012, Alexander Bruy'
 __revision__ = '$Format:%H$'
 
 import os
-from qgis.core import QgsApplication
 import subprocess
 
+from PyQt4.QtCore import QCoreApplication
+from qgis.core import QgsApplication
+
 from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.ProcessingLog import ProcessingLog
 from processing.tools.system import isMac
-from PyQt4.QtCore import QCoreApplication
 
 
 class TauDEMUtils:
 
     TAUDEM_FOLDER = 'TAUDEM_FOLDER'
+    TAUDEM_MULTIFILE_FOLDER = 'TAUDEM_MULTIFILE_FOLDER'
+    TAUDEM_USE_SINGLEFILE = 'TAUDEM_USE_SINGLEFILE'
+    TAUDEM_USE_MULTIFILE = 'TAUDEM_USE_MULTIFILE'
     MPIEXEC_FOLDER = 'MPIEXEC_FOLDER'
     MPI_PROCESSES = 'MPI_PROCESSES'
 
@@ -58,6 +62,22 @@ class TauDEMUtils:
         return folder
 
     @staticmethod
+    def taudemMultifilePath():
+        folder = ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_MULTIFILE_FOLDER)
+        if folder is None:
+            folder = ''
+
+        if isMac():
+            testfolder = os.path.join(QgsApplication.prefixPath(), 'bin')
+            if os.path.exists(os.path.join(testfolder, 'slopearea')):
+                folder = testfolder
+            else:
+                testfolder = '/usr/local/bin'
+                if os.path.exists(os.path.join(testfolder, 'slopearea')):
+                    folder = testfolder
+        return folder
+
+    @staticmethod
     def mpiexecPath():
         folder = ProcessingConfig.getSetting(TauDEMUtils.MPIEXEC_FOLDER)
         if folder is None:
@@ -75,8 +95,8 @@ class TauDEMUtils:
 
     @staticmethod
     def taudemDescriptionPath():
-        return os.path.normpath(os.path.join(os.path.dirname(__file__),
-                                'description'))
+        return os.path.normpath(
+            os.path.join(os.path.dirname(__file__), 'description'))
 
     @staticmethod
     def executeTauDEM(command, progress):
diff --git a/python/plugins/processing/algs/taudem/description/multi/aread8.txt b/python/plugins/processing/algs/taudem/description/multi/aread8.txt
new file mode 100644
index 0000000..b2cb730
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/aread8.txt
@@ -0,0 +1,8 @@
+D8 Contributing Area (multifile)
+aread8
+Basic Grid Analysis tools
+ParameterFile|-p|D8 Flow Direction Grid|True|False
+ParameterVector|-o|Outlets Shapefile|0|True
+ParameterFile|-wg|Weight Grid|True|True
+ParameterBoolean|-nc|Check for edge contamination|True
+OutputDirectory|-ad8|D8 Contributing Area Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/areadinf.txt b/python/plugins/processing/algs/taudem/description/multi/areadinf.txt
new file mode 100644
index 0000000..de64be2
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/areadinf.txt
@@ -0,0 +1,8 @@
+D-Infinity Contributing Area (multifile)
+areadinf
+Basic Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterVector|-o|Outlets Shapefile|0|True
+ParameterFile|-wg|Weight Grid|True|True
+ParameterBoolean|-nc|Check for edge contamination|True
+OutputDirectory|-sca|D-Infinity Specific Catchment Area Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/d8flowdir.txt b/python/plugins/processing/algs/taudem/description/multi/d8flowdir.txt
new file mode 100644
index 0000000..96666a7
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/d8flowdir.txt
@@ -0,0 +1,6 @@
+D8 Flow Directions (multifile)
+d8flowdir
+Basic Grid Analysis tools
+ParameterFile|-fel|Pit Filled Elevation Grid|True|False
+OutputDirectory|-p|D8 Flow Direction Grid
+OutputDirectory|-sd8|D8 Slope Grid
diff --git a/python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt b/python/plugins/processing/algs/taudem/description/multi/d8flowpathextremeup.txt
similarity index 51%
copy from python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt
copy to python/plugins/processing/algs/taudem/description/multi/d8flowpathextremeup.txt
index 34ef50b..91da812 100644
--- a/python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt
+++ b/python/plugins/processing/algs/taudem/description/multi/d8flowpathextremeup.txt
@@ -1,9 +1,9 @@
-D8 Extreme Upslope Value
+D8 Extreme Upslope Value (multifile)
 d8flowpathextremeup
 Stream Network Analysis tools
-ParameterRaster|-p|D8 Flow Directions Grid|False
-ParameterRaster|-sa|Upslope Values Grid|False
+ParameterFile|-p|D8 Flow Directions Grid|True|False
+ParameterFile|-sa|Upslope Values Grid|True|False
 ParameterVector|-o|Outlets Shapefile|0|True
 ParameterBoolean|-nc|Check for edge contamination|True
 ParameterBoolean|-min|Use max upslope value|True
-OutputRaster|-ssa|Extereme Upslope Values Grid
+OutputDirectory|-ssa|Extereme Upslope Values Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/d8hdisttostrm.txt b/python/plugins/processing/algs/taudem/description/multi/d8hdisttostrm.txt
new file mode 100644
index 0000000..9b7fe53
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/d8hdisttostrm.txt
@@ -0,0 +1,7 @@
+D8 Distance To Streams (multifile)
+d8hdisttostrm
+Specialized Grid Analysis tools
+ParameterFile|-p|D8 Flow Direction Grid|True|False
+ParameterFile|-src|Stream Raster Grid|True|False
+ParameterNumber|-thresh|Threshold|1|500|50
+OutputDirectory|-dist|Output Distance to Streams
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfavalanche.txt b/python/plugins/processing/algs/taudem/description/multi/dinfavalanche.txt
new file mode 100644
index 0000000..1697513
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfavalanche.txt
@@ -0,0 +1,11 @@
+D-Infinity Avalanche Runout (multifile)
+dinfavalanche
+Specialized Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterFile|-fel|Pit Filled Elevation Grid|True|False
+ParameterFile|-ass|Avalanche Source Site Grid|True|False
+ParameterNumber|-thresh|Proportion Threshold|0.00001|10.0|0.2
+ParameterNumber|-alpha|Alpha Angle Threshold|0|360|18
+ParameterBoolean|-direct|Measure distance along flow path|True
+OutputDirectory|-rz|Runout Zone Grid
+OutputDirectory|-dfs|Path Distance Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfconclimaccum.txt b/python/plugins/processing/algs/taudem/description/multi/dinfconclimaccum.txt
new file mode 100644
index 0000000..a543770
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfconclimaccum.txt
@@ -0,0 +1,11 @@
+D-Infinity Concentration Limited Accumulation (multifile)
+dinfconclimaccum
+Specialized Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterFile|-dg|Disturbance Indicator Grid|True|False
+ParameterFile|-dm|Decay Multiplier Grid|True|False
+ParameterFile|-q|Effective Runoff Weight Grid|True|False
+ParameterVector|-o|Outlets shapefile|0|True
+ParameterNumber|-csol|Concentration Threshold|1.0|100.0|1.0
+ParameterBoolean|-nc|Check for edge contamination|True
+OutputDirectory|-ctpt|Concentration Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfdecayaccum.txt b/python/plugins/processing/algs/taudem/description/multi/dinfdecayaccum.txt
new file mode 100644
index 0000000..26552f3
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfdecayaccum.txt
@@ -0,0 +1,9 @@
+D-Infinity Decaying Accumulation
+dinfdecayaccum
+Specialized Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterFile|-dm|Decay Multiplier Grid|True|False
+ParameterFile|-wg|Weight Grid|True|True
+ParameterVector|-o|Outlets Shapefile|0|True
+ParameterBoolean|-nc|Check for edge contamination|True
+OutputDirectory|-dsca|Decayed Specific Catchment Area Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfflowdir.txt b/python/plugins/processing/algs/taudem/description/multi/dinfflowdir.txt
new file mode 100644
index 0000000..738e77d
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfflowdir.txt
@@ -0,0 +1,6 @@
+D-Infinity Flow Directions (multifile)
+dinfflowdir
+Basic Grid Analysis tools
+ParameterFile|-fel|Pit Filled Elevation Grid|True|False
+OutputDirectory|-ang|D-Infinity Flow Directions Grid
+OutputDirectory|-slp|D-Infinity Slope Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfrevaccum.txt b/python/plugins/processing/algs/taudem/description/multi/dinfrevaccum.txt
new file mode 100644
index 0000000..06b6424
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfrevaccum.txt
@@ -0,0 +1,7 @@
+D-Infinity Reverse Accumulation (multifile)
+dinfrevaccum
+Specialized Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterFile|-wg|Weight Grid|True|False
+OutputDirectory|-racc|Reverse Accumulation Grid
+OutputDirectory|-dmax|Maximum Downslope Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/dinfupdependence.txt b/python/plugins/processing/algs/taudem/description/multi/dinfupdependence.txt
new file mode 100644
index 0000000..5ec65a3
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/dinfupdependence.txt
@@ -0,0 +1,6 @@
+D-Infinity Upslope Dependence (multifile)
+dinfupdependence
+Specialized Grid Analysis tools
+ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
+ParameterFile|-dg|Destination Grid|True|False
+OutputDirectory|-dep|Output Upslope Dependence Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/gagewatershed.txt b/python/plugins/processing/algs/taudem/description/multi/gagewatershed.txt
new file mode 100644
index 0000000..1f44c32
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/gagewatershed.txt
@@ -0,0 +1,6 @@
+Gage Watershed (multifile)
+gagewatershed
+Stream Network Analysis tools
+ParameterRaster|-p|D8 Flow Directions Grid|False
+ParameterVector|-o|Gages Shapefile|0|False
+OutputRaster|-gw|Gage Watershed Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/gagewatershed2.txt b/python/plugins/processing/algs/taudem/description/multi/gagewatershed2.txt
new file mode 100644
index 0000000..9a91300
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/gagewatershed2.txt
@@ -0,0 +1,7 @@
+Gage Watershed - 2 (multifile)
+gagewatershed
+Stream Network Analysis tools
+ParameterRaster|-p|D8 Flow Directions Grid|False
+ParameterVector|-o|Gages Shapefile|0|False
+OutputRaster|-gw|Gage Watershed Grid
+OutputFile|-id|Downstream Identifiers File
diff --git a/python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt b/python/plugins/processing/algs/taudem/description/multi/moveoutletstostrm.txt
similarity index 60%
copy from python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt
copy to python/plugins/processing/algs/taudem/description/multi/moveoutletstostrm.txt
index fe61898..07f3483 100644
--- a/python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt
+++ b/python/plugins/processing/algs/taudem/description/multi/moveoutletstostrm.txt
@@ -1,8 +1,8 @@
-Move Outlets To Streams
+Move Outlets To Streams (multifile)
 moveoutletstostrm
 Stream Network Analysis tools
-ParameterRaster|-p|D8 Flow Direction Grid|False
-ParameterRaster|-src|Stream Raster Grid|False
+ParameterFile|-p|D8 Flow Direction Grid|True|False
+ParameterFile|-src|Stream Raster Grid|True|False
 ParameterVector|-o|Outlets Shapefile|0|False
 ParameterNumber|-md|Maximum Number of Grid Cells to traverse|1|500|50
 OutputVector|-om|Output Outlet Shapefile
diff --git a/python/plugins/processing/algs/taudem/description/multi/pitremove.txt b/python/plugins/processing/algs/taudem/description/multi/pitremove.txt
new file mode 100644
index 0000000..2eedd40
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/pitremove.txt
@@ -0,0 +1,5 @@
+Pit Remove (multifile)
+pitremove
+Basic Grid Analysis tools
+ParameterFile|-z|Elevation Grid|True|False
+OutputDirectory|-fel|Pit Removed Elevation Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/selectgtthreshold.txt b/python/plugins/processing/algs/taudem/description/multi/selectgtthreshold.txt
new file mode 100644
index 0000000..ade45da
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/selectgtthreshold.txt
@@ -0,0 +1,6 @@
+Select GT Threshold (multifile)
+selectgtthreshold
+Basic Grid Analysis tools
+ParameterRaster|-z|Elevation Grid|False
+ParameterNumber|-thresh|Threshold|0.0|999999.999999|0.0
+OutputRaster|-t|Output Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/slopearearatio.txt b/python/plugins/processing/algs/taudem/description/multi/slopearearatio.txt
new file mode 100644
index 0000000..ecfcd1c
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/slopearearatio.txt
@@ -0,0 +1,6 @@
+Slope Over Area Ratio (multifile)
+slopearearatio
+Specialized Grid Analysis tools
+ParameterFile|-slp|Slope Grid|True|False
+ParameterFile|-sca|Specific Catchment Area Grid|True|False
+OutputDirectory|-sar|Slope Divided By Area Ratio Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/slopeavedown.txt b/python/plugins/processing/algs/taudem/description/multi/slopeavedown.txt
new file mode 100644
index 0000000..4ccbb93
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/slopeavedown.txt
@@ -0,0 +1,7 @@
+Slope Average Down (multifile)
+slopeavedown
+Specialized Grid Analysis tools
+ParameterFile|-p|D8 Flow Direction Grid|True|False
+ParameterFile|-fel|Pit Filled Elevation Grid|True|False
+ParameterNumber|-dn|Downslope Distance|1|500|50
+OutputDirectory|-slpd|Slope Average Down Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/streamnet.txt b/python/plugins/processing/algs/taudem/description/multi/streamnet.txt
new file mode 100644
index 0000000..ff6360f
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/streamnet.txt
@@ -0,0 +1,14 @@
+Stream Reach and Watershed (multifile)
+streamnet
+Stream Network Analysis tools
+ParameterFile|-fel|Pit Filled Elevation Grid|True|False
+ParameterFile|-p|D8 Flow Direction Grid|True|False
+ParameterFile|-ad8|D8 Drainage Area|True|False
+ParameterFile|-src|Stream Raster Grid|True|False
+ParameterVector|-o|Outlets Shapefile as Network Nodes|0|True
+ParameterBoolean|-sw|Delineate Single Watershed|False
+OutputDirectory|-ord|Stream Order Grid
+OutputDirectory|-w|Watershed Grid
+OutputVector|-net|Stream Reach Shapefile
+OutputFile|-tree|Network Connectivity Tree
+OutputFile|-coord|Network Coordinates
diff --git a/python/plugins/processing/algs/taudem/description/multi/threshold.txt b/python/plugins/processing/algs/taudem/description/multi/threshold.txt
new file mode 100644
index 0000000..02ea9d5
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/threshold.txt
@@ -0,0 +1,7 @@
+Stream Definition By Threshold (multifile)
+threshold
+Stream Network Analysis tools
+ParameterFile|-ssa|Accumulated Stream Source Grid|True|False
+ParameterNumber|-thresh|Threshold|1|None|100
+ParameterFile|-mask|Mask Grid|True|True
+OutputDirectory|-src|Stream Raster Grid
diff --git a/python/plugins/processing/algs/taudem/description/multi/twi.txt b/python/plugins/processing/algs/taudem/description/multi/twi.txt
new file mode 100644
index 0000000..47f2545
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/multi/twi.txt
@@ -0,0 +1,6 @@
+Topographic Wetness Index (multifile)
+twi
+Stream Network Analysis tools
+ParameterRaster|-sca|D-Infinity Specific Catchment Area Grid|False
+ParameterRaster|-slp|D-Infinity Slope Grid|False
+OutputRaster|-twi|Topographic Wetness Index Grid
diff --git a/python/plugins/processing/algs/taudem/description/aread8.txt b/python/plugins/processing/algs/taudem/description/single/aread8.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/aread8.txt
rename to python/plugins/processing/algs/taudem/description/single/aread8.txt
diff --git a/python/plugins/processing/algs/taudem/description/areadinf.txt b/python/plugins/processing/algs/taudem/description/single/areadinf.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/areadinf.txt
rename to python/plugins/processing/algs/taudem/description/single/areadinf.txt
diff --git a/python/plugins/processing/algs/taudem/description/d8flowdir.txt b/python/plugins/processing/algs/taudem/description/single/d8flowdir.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/d8flowdir.txt
rename to python/plugins/processing/algs/taudem/description/single/d8flowdir.txt
diff --git a/python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt b/python/plugins/processing/algs/taudem/description/single/d8flowpathextremeup.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt
rename to python/plugins/processing/algs/taudem/description/single/d8flowpathextremeup.txt
diff --git a/python/plugins/processing/algs/taudem/description/d8hdisttostrm.txt b/python/plugins/processing/algs/taudem/description/single/d8hdisttostrm.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/d8hdisttostrm.txt
rename to python/plugins/processing/algs/taudem/description/single/d8hdisttostrm.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfavalanche.txt b/python/plugins/processing/algs/taudem/description/single/dinfavalanche.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfavalanche.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfavalanche.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfconclimaccum.txt b/python/plugins/processing/algs/taudem/description/single/dinfconclimaccum.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfconclimaccum.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfconclimaccum.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfdecayaccum.txt b/python/plugins/processing/algs/taudem/description/single/dinfdecayaccum.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfdecayaccum.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfdecayaccum.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfflowdir.txt b/python/plugins/processing/algs/taudem/description/single/dinfflowdir.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfflowdir.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfflowdir.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfrevaccum.txt b/python/plugins/processing/algs/taudem/description/single/dinfrevaccum.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfrevaccum.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfrevaccum.txt
diff --git a/python/plugins/processing/algs/taudem/description/dinfupdependence.txt b/python/plugins/processing/algs/taudem/description/single/dinfupdependence.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/dinfupdependence.txt
rename to python/plugins/processing/algs/taudem/description/single/dinfupdependence.txt
diff --git a/python/plugins/processing/algs/taudem/description/single/gagewatershed.txt b/python/plugins/processing/algs/taudem/description/single/gagewatershed.txt
new file mode 100644
index 0000000..cc9e3d9
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/single/gagewatershed.txt
@@ -0,0 +1,6 @@
+Gage Watershed
+gagewatershed
+Stream Network Analysis tools
+ParameterRaster|-p|D8 Flow Directions Grid|False
+ParameterVector|-o|Gages Shapefile|0|False
+OutputRaster|-gw|Gage Watershed Grid
diff --git a/python/plugins/processing/algs/taudem/description/single/gagewatershed2.txt b/python/plugins/processing/algs/taudem/description/single/gagewatershed2.txt
new file mode 100644
index 0000000..224f137
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/single/gagewatershed2.txt
@@ -0,0 +1,7 @@
+Gage Watershed - 2
+gagewatershed
+Stream Network Analysis tools
+ParameterRaster|-p|D8 Flow Directions Grid|False
+ParameterVector|-o|Gages Shapefile|0|False
+OutputRaster|-gw|Gage Watershed Grid
+OutputFile|-id|Downstream Identifiers File
diff --git a/python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt b/python/plugins/processing/algs/taudem/description/single/moveoutletstostrm.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt
rename to python/plugins/processing/algs/taudem/description/single/moveoutletstostrm.txt
diff --git a/python/plugins/processing/algs/taudem/description/pitremove.txt b/python/plugins/processing/algs/taudem/description/single/pitremove.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/pitremove.txt
rename to python/plugins/processing/algs/taudem/description/single/pitremove.txt
diff --git a/python/plugins/processing/algs/taudem/description/single/selectgtthreshold.txt b/python/plugins/processing/algs/taudem/description/single/selectgtthreshold.txt
new file mode 100644
index 0000000..e3a307f
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/single/selectgtthreshold.txt
@@ -0,0 +1,6 @@
+Select GT Threshold
+selectgtthreshold
+Basic Grid Analysis tools
+ParameterRaster|-z|Elevation Grid|False
+ParameterNumber|-thresh|Threshold|0.0|999999.999999|0.0
+OutputRaster|-t|Output Grid
diff --git a/python/plugins/processing/algs/taudem/description/slopearearatio.txt b/python/plugins/processing/algs/taudem/description/single/slopearearatio.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/slopearearatio.txt
rename to python/plugins/processing/algs/taudem/description/single/slopearearatio.txt
diff --git a/python/plugins/processing/algs/taudem/description/slopeavedown.txt b/python/plugins/processing/algs/taudem/description/single/slopeavedown.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/slopeavedown.txt
rename to python/plugins/processing/algs/taudem/description/single/slopeavedown.txt
diff --git a/python/plugins/processing/algs/taudem/description/streamnet.txt b/python/plugins/processing/algs/taudem/description/single/streamnet.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/streamnet.txt
rename to python/plugins/processing/algs/taudem/description/single/streamnet.txt
diff --git a/python/plugins/processing/algs/taudem/description/threshold.txt b/python/plugins/processing/algs/taudem/description/single/threshold.txt
similarity index 100%
rename from python/plugins/processing/algs/taudem/description/threshold.txt
rename to python/plugins/processing/algs/taudem/description/single/threshold.txt
diff --git a/python/plugins/processing/algs/taudem/description/single/twi.txt b/python/plugins/processing/algs/taudem/description/single/twi.txt
new file mode 100644
index 0000000..e4f10d7
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/description/single/twi.txt
@@ -0,0 +1,6 @@
+Topographic Wetness Index
+twi
+Stream Network Analysis tools
+ParameterRaster|-sca|D-Infinity Specific Catchment Area Grid|False
+ParameterRaster|-slp|D-Infinity Slope Grid|False
+OutputRaster|-twi|Topographic Wetness Index Grid
diff --git a/python/plugins/processing/algs/taudem/dinfdistdown.py b/python/plugins/processing/algs/taudem/dinfdistdown.py
index 3bcc58e..3dee559 100644
--- a/python/plugins/processing/algs/taudem/dinfdistdown.py
+++ b/python/plugins/processing/algs/taudem/dinfdistdown.py
@@ -118,7 +118,7 @@ class DinfDistDown(GeoAlgorithm):
             self.STAT_METHOD)]))
         commands.append(str(self.DIST_DICT[self.getParameterValue(
             self.DIST_METHOD)]))
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
         commands.append('-dd')
         commands.append(self.getOutputValue(self.DIST_DOWN_GRID))
diff --git a/python/plugins/processing/algs/taudem/dinfdistdown.py b/python/plugins/processing/algs/taudem/dinfdistdown_multi.py
similarity index 77%
copy from python/plugins/processing/algs/taudem/dinfdistdown.py
copy to python/plugins/processing/algs/taudem/dinfdistdown_multi.py
index 3bcc58e..11f47ab 100644
--- a/python/plugins/processing/algs/taudem/dinfdistdown.py
+++ b/python/plugins/processing/algs/taudem/dinfdistdown_multi.py
@@ -2,10 +2,10 @@
 
 """
 ***************************************************************************
-    dinfdistdown.py
+    dinfdistdown_multi.py
     ---------------------
-    Date                 : October 2012
-    Copyright            : (C) 2012 by Alexander Bruy
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
 *                                                                         *
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -31,17 +31,18 @@ from PyQt4.QtGui import QIcon
 
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingConfig import ProcessingConfig
-from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
 
-from processing.core.parameters import ParameterRaster
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterBoolean
 from processing.core.parameters import ParameterSelection
-from processing.core.outputs import OutputRaster
+from processing.core.outputs import OutputDirectory
 
 from TauDEMUtils import TauDEMUtils
 
 
-class DinfDistDown(GeoAlgorithm):
+class DinfDistDownMulti(GeoAlgorithm):
 
     DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
     PIT_FILLED_GRID = 'PIT_FILLED_GRID'
@@ -68,18 +69,18 @@ class DinfDistDown(GeoAlgorithm):
         return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
 
     def defineCharacteristics(self):
-        self.name = 'D-Infinity Distance Down'
+        self.name = 'D-Infinity Distance Down (multifile)'
         self.cmdName = 'dinfdistdown'
         self.group = 'Specialized Grid Analysis tools'
 
-        self.addParameter(ParameterRaster(self.DINF_FLOW_DIR_GRID,
-            self.tr('D-Infinity Flow Direction Grid'), False))
-        self.addParameter(ParameterRaster(self.PIT_FILLED_GRID,
-            self.tr('Pit Filled Elevation Grid'), False))
-        self.addParameter(ParameterRaster(self.STREAM_GRID,
-            self.tr('Stream Raster Grid'), False))
-        self.addParameter(ParameterRaster(self.WEIGHT_PATH_GRID,
-            self.tr('Weight Path Grid'), True))
+        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
+            self.tr('D-Infinity Flow Direction Grid'), True, False))
+        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
+            self.tr('Pit Filled Elevation Grid'), True, False))
+        self.addParameter(ParameterFile(self.STREAM_GRID,
+            self.tr('Stream Raster Grid'), True, False))
+        self.addParameter(ParameterFile(self.WEIGHT_PATH_GRID,
+            self.tr('Weight Path Grid'), True, True))
         self.addParameter(ParameterSelection(self.STAT_METHOD,
             self.tr('Statistical Method'), self.STATISTICS, 2))
         self.addParameter(ParameterSelection(self.DIST_METHOD,
@@ -87,7 +88,7 @@ class DinfDistDown(GeoAlgorithm):
         self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
             self.tr('Check for edge contamination'), True))
 
-        self.addOutput(OutputRaster(self.DIST_DOWN_GRID,
+        self.addOutput(OutputDirectory(self.DIST_DOWN_GRID,
             self.tr('D-Infinity Drop to Stream Grid')))
 
     def processAlgorithm(self, progress):
@@ -102,7 +103,7 @@ class DinfDistDown(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
         commands.append('-ang')
         commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
         commands.append('-fel')
@@ -118,7 +119,7 @@ class DinfDistDown(GeoAlgorithm):
             self.STAT_METHOD)]))
         commands.append(str(self.DIST_DICT[self.getParameterValue(
             self.DIST_METHOD)]))
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
         commands.append('-dd')
         commands.append(self.getOutputValue(self.DIST_DOWN_GRID))
diff --git a/python/plugins/processing/algs/taudem/dinfdistup.py b/python/plugins/processing/algs/taudem/dinfdistup.py
index f9fd611..258983e 100644
--- a/python/plugins/processing/algs/taudem/dinfdistup.py
+++ b/python/plugins/processing/algs/taudem/dinfdistup.py
@@ -115,7 +115,7 @@ class DinfDistUp(GeoAlgorithm):
             self.DIST_METHOD)]))
         commands.append('-thresh')
         commands.append(str(self.getParameterValue(self.THRESHOLD)))
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
         commands.append('-du')
         commands.append(self.getOutputValue(self.DIST_UP_GRID))
diff --git a/python/plugins/processing/algs/taudem/dinfdistup.py b/python/plugins/processing/algs/taudem/dinfdistup_multi.py
similarity index 79%
copy from python/plugins/processing/algs/taudem/dinfdistup.py
copy to python/plugins/processing/algs/taudem/dinfdistup_multi.py
index f9fd611..38124ce 100644
--- a/python/plugins/processing/algs/taudem/dinfdistup.py
+++ b/python/plugins/processing/algs/taudem/dinfdistup_multi.py
@@ -2,10 +2,10 @@
 
 """
 ***************************************************************************
-    dinfdistup.py
+    dinfdistup_multi.py
     ---------------------
-    Date                 : October 2012
-    Copyright            : (C) 2012 by Alexander Bruy
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
 *                                                                         *
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -31,18 +31,19 @@ from PyQt4.QtGui import QIcon
 
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingConfig import ProcessingConfig
-from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
 
-from processing.core.parameters import ParameterRaster
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterNumber
 from processing.core.parameters import ParameterBoolean
 from processing.core.parameters import ParameterSelection
-from processing.core.outputs import OutputRaster
+from processing.core.outputs import OutputDirectory
 
 from TauDEMUtils import TauDEMUtils
 
 
-class DinfDistUp(GeoAlgorithm):
+class DinfDistUpMulti(GeoAlgorithm):
 
     DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
     PIT_FILLED_GRID = 'PIT_FILLED_GRID'
@@ -69,16 +70,16 @@ class DinfDistUp(GeoAlgorithm):
         return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
 
     def defineCharacteristics(self):
-        self.name = 'D-Infinity Distance Up'
+        self.name = 'D-Infinity Distance Up (multifile)'
         self.cmdName = 'dinfdistup'
         self.group = 'Specialized Grid Analysis tools'
 
-        self.addParameter(ParameterRaster(self.DINF_FLOW_DIR_GRID,
-            self.tr('D-Infinity Flow Direction Grid'), False))
-        self.addParameter(ParameterRaster(self.PIT_FILLED_GRID,
-            self.tr('Pit Filled Elevation Grid'), False))
-        self.addParameter(ParameterRaster(self.SLOPE_GRID,
-            self.tr('Slope Grid'), False))
+        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
+            self.tr('D-Infinity Flow Direction Grid'), True, False))
+        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
+            self.tr('Pit Filled Elevation Grid'), True, False))
+        self.addParameter(ParameterFile(self.SLOPE_GRID,
+            self.tr('Slope Grid'), True, False))
         self.addParameter(ParameterSelection(self.STAT_METHOD,
             self.tr('Statistical Method'), self.STATISTICS, 2))
         self.addParameter(ParameterSelection(self.DIST_METHOD,
@@ -88,7 +89,7 @@ class DinfDistUp(GeoAlgorithm):
         self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
             self.tr('Check for edge contamination'), True))
 
-        self.addOutput(OutputRaster(self.DIST_UP_GRID,
+        self.addOutput(OutputDirectory(self.DIST_UP_GRID,
             self.tr('D-Infinity Distance Up')))
 
     def processAlgorithm(self, progress):
@@ -103,7 +104,7 @@ class DinfDistUp(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
         commands.append('-ang')
         commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
         commands.append('-fel')
@@ -115,7 +116,7 @@ class DinfDistUp(GeoAlgorithm):
             self.DIST_METHOD)]))
         commands.append('-thresh')
         commands.append(str(self.getParameterValue(self.THRESHOLD)))
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
         commands.append('-du')
         commands.append(self.getOutputValue(self.DIST_UP_GRID))
diff --git a/python/plugins/processing/algs/taudem/dinftranslimaccum.py b/python/plugins/processing/algs/taudem/dinftranslimaccum.py
index 4b0face..00f2ab0 100644
--- a/python/plugins/processing/algs/taudem/dinftranslimaccum.py
+++ b/python/plugins/processing/algs/taudem/dinftranslimaccum.py
@@ -103,7 +103,7 @@ class DinfTransLimAccum(GeoAlgorithm):
         if param is not None:
             commands.append('-o')
             commands.append(param)
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
 
         commands.append('-tla')
diff --git a/python/plugins/processing/algs/taudem/dinftranslimaccum2.py b/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
index 64b14b7..dfef2a8 100644
--- a/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
+++ b/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
@@ -109,7 +109,7 @@ class DinfTransLimAccum2(GeoAlgorithm):
         if param is not None:
             commands.append('-o')
             commands.append(param)
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
 
         commands.append('-tla')
diff --git a/python/plugins/processing/algs/taudem/dinftranslimaccum2.py b/python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
similarity index 76%
copy from python/plugins/processing/algs/taudem/dinftranslimaccum2.py
copy to python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
index 64b14b7..4f780d0 100644
--- a/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
+++ b/python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
@@ -2,10 +2,10 @@
 
 """
 ***************************************************************************
-    dinftranslimaccum2.py
+    dinftranslimaccum2_multi.py
     ---------------------
-    Date                 : October 2012
-    Copyright            : (C) 2012 by Alexander Bruy
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
 *                                                                         *
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -34,15 +34,15 @@ from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.GeoAlgorithmExecutionException import \
     GeoAlgorithmExecutionException
 
-from processing.core.parameters import ParameterRaster
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterVector
 from processing.core.parameters import ParameterBoolean
-from processing.core.outputs import OutputRaster
+from processing.core.outputs import OutputDirectory
 
 from TauDEMUtils import TauDEMUtils
 
 
-class DinfTransLimAccum2(GeoAlgorithm):
+class DinfTransLimAccum2Multi(GeoAlgorithm):
 
     DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
     SUPPLY_GRID = 'SUPPLY_GRID'
@@ -59,29 +59,29 @@ class DinfTransLimAccum2(GeoAlgorithm):
         return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
 
     def defineCharacteristics(self):
-        self.name = 'D-Infinity Transport Limited Accumulation - 2'
+        self.name = 'D-Infinity Transport Limited Accumulation - 2 (multifile)'
         self.cmdName = 'dinftranslimaccum'
         self.group = 'Specialized Grid Analysis tools'
 
-        self.addParameter(ParameterRaster(self.DINF_FLOW_DIR_GRID,
-            self.tr('D-Infinity Flow Direction Grid'), False))
-        self.addParameter(ParameterRaster(self.SUPPLY_GRID,
-            self.tr('Supply Grid'), False))
-        self.addParameter(ParameterRaster(self.CAPACITY_GRID,
-            self.tr('Transport Capacity Grid'), False))
-        self.addParameter(ParameterRaster(self.IN_CONCENTR_GRID,
-            self.tr('Input Concentration Grid'), False))
+        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
+            self.tr('D-Infinity Flow Direction Grid'), True, False))
+        self.addParameter(ParameterFile(self.SUPPLY_GRID,
+            self.tr('Supply Grid'), True, False))
+        self.addParameter(ParameterFile(self.CAPACITY_GRID,
+            self.tr('Transport Capacity Grid'), True, False))
+        self.addParameter(ParameterFile(self.IN_CONCENTR_GRID,
+            self.tr('Input Concentration Grid'), True, False))
         self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
             self.tr('Outlets Shapefile'),
             [ParameterVector.VECTOR_TYPE_POINT], True))
         self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
             self.tr('Check for edge contamination'), True))
 
-        self.addOutput(OutputRaster(self.TRANSP_LIM_ACCUM_GRID,
+        self.addOutput(OutputDirectory(self.TRANSP_LIM_ACCUM_GRID,
             self.tr('Transport Limited Accumulation Grid')))
-        self.addOutput(OutputRaster(self.DEPOSITION_GRID,
+        self.addOutput(OutputDirectory(self.DEPOSITION_GRID,
             self.tr('Deposition Grid')))
-        self.addOutput(OutputRaster(self.OUT_CONCENTR_GRID,
+        self.addOutput(OutputDirectory(self.OUT_CONCENTR_GRID,
             self.tr('Output Concentration Grid')))
 
     def processAlgorithm(self, progress):
@@ -96,7 +96,7 @@ class DinfTransLimAccum2(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
         commands.append('-ang')
         commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
         commands.append('-tsup')
@@ -109,7 +109,7 @@ class DinfTransLimAccum2(GeoAlgorithm):
         if param is not None:
             commands.append('-o')
             commands.append(param)
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
 
         commands.append('-tla')
diff --git a/python/plugins/processing/algs/taudem/dinftranslimaccum.py b/python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
similarity index 77%
copy from python/plugins/processing/algs/taudem/dinftranslimaccum.py
copy to python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
index 4b0face..fef08c0 100644
--- a/python/plugins/processing/algs/taudem/dinftranslimaccum.py
+++ b/python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
@@ -2,10 +2,10 @@
 
 """
 ***************************************************************************
-    dinftranslimaccum.py
+    dinftranslimaccum_multi.py
     ---------------------
-    Date                 : October 2012
-    Copyright            : (C) 2012 by Alexander Bruy
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
 *                                                                         *
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -34,15 +34,15 @@ from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.GeoAlgorithmExecutionException import \
     GeoAlgorithmExecutionException
 
-from processing.core.parameters import ParameterRaster
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterVector
 from processing.core.parameters import ParameterBoolean
-from processing.core.outputs import OutputRaster
+from processing.core.outputs import OutputDirectory
 
 from TauDEMUtils import TauDEMUtils
 
 
-class DinfTransLimAccum(GeoAlgorithm):
+class DinfTransLimAccumMulti(GeoAlgorithm):
 
     DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
     SUPPLY_GRID = 'SUPPLY_GRID'
@@ -59,25 +59,25 @@ class DinfTransLimAccum(GeoAlgorithm):
         return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
 
     def defineCharacteristics(self):
-        self.name = 'D-Infinity Transport Limited Accumulation'
+        self.name = 'D-Infinity Transport Limited Accumulation (multifile)'
         self.cmdName = 'dinftranslimaccum'
         self.group = 'Specialized Grid Analysis tools'
 
-        self.addParameter(ParameterRaster(self.DINF_FLOW_DIR_GRID,
-            self.tr('D-Infinity Flow Direction Grid'), False))
-        self.addParameter(ParameterRaster(self.SUPPLY_GRID,
-            self.tr('Supply Grid'), False))
-        self.addParameter(ParameterRaster(self.CAPACITY_GRID,
-            self.tr('Transport Capacity Grid'), False))
+        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
+            self.tr('D-Infinity Flow Direction Grid'), True, False))
+        self.addParameter(ParameterFile(self.SUPPLY_GRID,
+            self.tr('Supply Grid'), True, False))
+        self.addParameter(ParameterFile(self.CAPACITY_GRID,
+            self.tr('Transport Capacity Grid'), True, False))
         self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
             self.tr('Outlets Shapefile'),
             [ParameterVector.VECTOR_TYPE_POINT], True))
         self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
             self.tr('Check for edge contamination'), True))
 
-        self.addOutput(OutputRaster(self.TRANSP_LIM_ACCUM_GRID,
+        self.addOutput(OutputDirectory(self.TRANSP_LIM_ACCUM_GRID,
             self.tr('Transport Limited Accumulation Grid')))
-        self.addOutput(OutputRaster(self.DEPOSITION_GRID,
+        self.addOutput(OutputDirectory(self.DEPOSITION_GRID,
             self.tr('Deposition Grid')))
 
     def processAlgorithm(self, progress):
@@ -92,7 +92,7 @@ class DinfTransLimAccum(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
         commands.append('-ang')
         commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
         commands.append('-tsup')
@@ -103,7 +103,7 @@ class DinfTransLimAccum(GeoAlgorithm):
         if param is not None:
             commands.append('-o')
             commands.append(param)
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
+        if not self.getParameterValue(self.EDGE_CONTAM):
             commands.append('-nc')
 
         commands.append('-tla')
diff --git a/python/plugins/processing/algs/taudem/dropanalysis_multi.py b/python/plugins/processing/algs/taudem/dropanalysis_multi.py
new file mode 100644
index 0000000..07ca940
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/dropanalysis_multi.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    dropanalysis_multi.py
+    ---------------------
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
+    Email                : alexander dot bruy 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__ = 'Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
+
+# This will get replaced with a git SHA1 when you do a git archive
+
+__revision__ = '$Format:%H$'
+
+import os
+
+from PyQt4.QtGui import QIcon
+
+from processing.core.GeoAlgorithm import GeoAlgorithm
+from processing.core.ProcessingConfig import ProcessingConfig
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
+
+from processing.core.parameters import ParameterFile
+from processing.core.parameters import ParameterVector
+from processing.core.parameters import ParameterNumber
+from processing.core.parameters import ParameterSelection
+from processing.core.outputs import OutputFile
+
+from TauDEMUtils import TauDEMUtils
+
+
+class DropAnalysisMulti(GeoAlgorithm):
+
+    PIT_FILLED_GRID = 'PIT_FILLED_GRID'
+    D8_CONTRIB_AREA_GRID = 'D8_CONTRIB_AREA_GRID'
+    D8_FLOW_DIR_GRID = 'D8_FLOW_DIR_GRID'
+    ACCUM_STREAM_SOURCE_GRID = 'ACCUM_STREAM_SOURCE_GRID'
+    OUTLETS_SHAPE = 'OUTLETS_SHAPE'
+    MIN_TRESHOLD = 'MIN_TRESHOLD'
+    MAX_THRESHOLD = 'MAX_THRESHOLD'
+    TRESHOLD_NUM = 'TRESHOLD_NUM'
+    STEP_TYPE = 'STEP_TYPE'
+
+    DROP_ANALYSIS_FILE = 'DROP_ANALYSIS_FILE'
+
+    STEPS = ['Logarithmic', 'Linear']
+
+    def getIcon(self):
+        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
+
+    def defineCharacteristics(self):
+        self.name = 'Stream Drop Analysis (multifile)'
+        self.cmdName = 'dropanalysis'
+        self.group = 'Stream Network Analysis tools'
+
+        self.addParameter(ParameterFile(self.D8_CONTRIB_AREA_GRID,
+            self.tr('D8 Contributing Area Grid'), True, False))
+        self.addParameter(ParameterFile(self.D8_FLOW_DIR_GRID,
+            self.tr('D8 Flow Direction Grid'), True, False))
+        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
+            self.tr('Pit Filled Elevation Grid'), True, False))
+        self.addParameter(ParameterFile(self.ACCUM_STREAM_SOURCE_GRID,
+            self.tr('Accumulated Stream Source Grid'), True, False))
+        self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
+            self.tr('Outlets Shapefile'),
+            [ParameterVector.VECTOR_TYPE_POINT], False))
+        self.addParameter(ParameterNumber(self.MIN_TRESHOLD,
+            self.tr('Minimum Threshold'), 0, None, 5))
+        self.addParameter(ParameterNumber(self.MAX_THRESHOLD,
+            self.tr('Maximum Threshold'), 0, None, 500))
+        self.addParameter(ParameterNumber(self.TRESHOLD_NUM,
+            self.tr('Number of Threshold Values'), 0, None, 10))
+        self.addParameter(ParameterSelection(self.STEP_TYPE,
+            self.tr('Spacing for Threshold Values'), self.STEPS, 0))
+
+        self.addOutput(OutputFile(self.DROP_ANALYSIS_FILE,
+            self.tr('D-Infinity Drop to Stream Grid')))
+
+    def processAlgorithm(self, progress):
+        commands = []
+        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
+
+        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
+        if processNum <= 0:
+            raise GeoAlgorithmExecutionException(
+                self.tr('Wrong number of MPI processes used. Please set '
+                        'correct number before running TauDEM algorithms.'))
+
+        commands.append('-n')
+        commands.append(str(processNum))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
+        commands.append('-ad8')
+        commands.append(self.getParameterValue(self.D8_CONTRIB_AREA_GRID))
+        commands.append('-p')
+        commands.append(self.getParameterValue(self.D8_FLOW_DIR_GRID))
+        commands.append('-fel')
+        commands.append(self.getParameterValue(self.PIT_FILLED_GRID))
+        commands.append('-ssa')
+        commands.append(self.getParameterValue(self.ACCUM_STREAM_SOURCE_GRID))
+        commands.append('-o')
+        commands.append(self.getParameterValue(self.OUTLETS_SHAPE))
+        commands.append('-par')
+        commands.append(str(self.getParameterValue(self.MIN_TRESHOLD)))
+        commands.append(str(self.getParameterValue(self.MAX_THRESHOLD)))
+        commands.append(str(self.getParameterValue(self.TRESHOLD_NUM)))
+        commands.append(str(self.getParameterValue(self.STEPS)))
+        commands.append('-drp')
+        commands.append(self.getOutputValue(self.DROP_ANALYSIS_FILE))
+
+        TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/python/plugins/processing/algs/taudem/dinftranslimaccum.py b/python/plugins/processing/algs/taudem/gridnet_multi.py
similarity index 51%
copy from python/plugins/processing/algs/taudem/dinftranslimaccum.py
copy to python/plugins/processing/algs/taudem/gridnet_multi.py
index 4b0face..6397073 100644
--- a/python/plugins/processing/algs/taudem/dinftranslimaccum.py
+++ b/python/plugins/processing/algs/taudem/gridnet_multi.py
@@ -2,10 +2,10 @@
 
 """
 ***************************************************************************
-    dinftranslimaccum.py
+    gridnet_multi.py
     ---------------------
-    Date                 : October 2012
-    Copyright            : (C) 2012 by Alexander Bruy
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
     Email                : alexander dot bruy at gmail dot com
 ***************************************************************************
 *                                                                         *
@@ -18,8 +18,8 @@
 """
 
 __author__ = 'Alexander Bruy'
-__date__ = 'October 2012'
-__copyright__ = '(C) 2012, Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
 
 # This will get replaced with a git SHA1 when you do a git archive
 
@@ -34,51 +34,49 @@ from processing.core.ProcessingConfig import ProcessingConfig
 from processing.core.GeoAlgorithmExecutionException import \
     GeoAlgorithmExecutionException
 
-from processing.core.parameters import ParameterRaster
+from processing.core.parameters import ParameterFile
 from processing.core.parameters import ParameterVector
-from processing.core.parameters import ParameterBoolean
-from processing.core.outputs import OutputRaster
+from processing.core.parameters import ParameterNumber
+from processing.core.outputs import OutputDirectory
 
 from TauDEMUtils import TauDEMUtils
 
 
-class DinfTransLimAccum(GeoAlgorithm):
+class GridNetMulti(GeoAlgorithm):
 
-    DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
-    SUPPLY_GRID = 'SUPPLY_GRID'
-    CAPACITY_GRID = 'CAPACITY_GRID'
-    IN_CONCENTR_GRID = 'IN_CONCENTR_GRID'
+    D8_FLOW_DIR_GRID = 'D8_FLOW_DIR_GRID'
     OUTLETS_SHAPE = 'OUTLETS_SHAPE'
-    EDGE_CONTAM = 'EDGE_CONTAM'
+    MASK_GRID = 'MASK_GRID'
+    THRESHOLD = 'THRESHOLD'
 
-    TRANSP_LIM_ACCUM_GRID = 'TRANSP_LIM_ACCUM_GRID'
-    DEPOSITION_GRID = 'DEPOSITION_GRID'
-    OUT_CONCENTR_GRID = 'OUT_CONCENTR_GRID'
+    LONGEST_LEN_GRID = 'LONGEST_LEN_GRID'
+    TOTAL_LEN_GRID = 'TOTAL_LEN_GRID'
+    STRAHLER_GRID = 'STRAHLER_GRID'
 
     def getIcon(self):
         return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
 
     def defineCharacteristics(self):
-        self.name = 'D-Infinity Transport Limited Accumulation'
-        self.cmdName = 'dinftranslimaccum'
-        self.group = 'Specialized Grid Analysis tools'
-
-        self.addParameter(ParameterRaster(self.DINF_FLOW_DIR_GRID,
-            self.tr('D-Infinity Flow Direction Grid'), False))
-        self.addParameter(ParameterRaster(self.SUPPLY_GRID,
-            self.tr('Supply Grid'), False))
-        self.addParameter(ParameterRaster(self.CAPACITY_GRID,
-            self.tr('Transport Capacity Grid'), False))
+        self.name = 'Grid Network (multifile)'
+        self.cmdName = 'gridnet'
+        self.group = 'Basic Grid Analysis tools'
+
+        self.addParameter(ParameterFile(self.D8_FLOW_DIR_GRID,
+            self.tr('D8 Flow Direction Grid'), True, False))
         self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
             self.tr('Outlets Shapefile'),
             [ParameterVector.VECTOR_TYPE_POINT], True))
-        self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
-            self.tr('Check for edge contamination'), True))
-
-        self.addOutput(OutputRaster(self.TRANSP_LIM_ACCUM_GRID,
-            self.tr('Transport Limited Accumulation Grid')))
-        self.addOutput(OutputRaster(self.DEPOSITION_GRID,
-            self.tr('Deposition Grid')))
+        self.addParameter(ParameterFile(self.MASK_GRID,
+            self.tr('Mask Grid'), True, True))
+        self.addParameter(ParameterNumber(self.THRESHOLD,
+            self.tr('Mask Threshold'), 0, None, 100))
+
+        self.addOutput(OutputDirectory(self.LONGEST_LEN_GRID,
+            self.tr('Longest Upslope Length Grid')))
+        self.addOutput(OutputDirectory(self.TOTAL_LEN_GRID,
+            self.tr('Total Upslope Length Grid')))
+        self.addOutput(OutputDirectory(self.STRAHLER_GRID,
+            self.tr('Strahler Network Order Grid')))
 
     def processAlgorithm(self, progress):
         commands = []
@@ -92,23 +90,25 @@ class DinfTransLimAccum(GeoAlgorithm):
 
         commands.append('-n')
         commands.append(str(processNum))
-        commands.append(os.path.join(TauDEMUtils.taudemPath(), self.cmdName))
-        commands.append('-ang')
-        commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
-        commands.append('-tsup')
-        commands.append(self.getParameterValue(self.SUPPLY_GRID))
-        commands.append('-tc')
-        commands.append(self.getParameterValue(self.CAPACITY_GRID))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
+        commands.append('-p')
+        commands.append(self.getParameterValue(self.D8_FLOW_DIR_GRID))
         param = self.getParameterValue(self.OUTLETS_SHAPE)
         if param is not None:
             commands.append('-o')
             commands.append(param)
-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
-            commands.append('-nc')
-
-        commands.append('-tla')
-        commands.append(self.getOutputValue(self.TRANSP_LIM_ACCUM_GRID))
-        commands.append('-tdep')
-        commands.append(self.getOutputValue(self.DEPOSITION_GRID))
+        param = self.getParameterValue(self.MASK_GRID)
+        if param is not None:
+            commands.append('-mask')
+            commands.append(param)
+            commands.append('-thresh')
+            commands.append(self.getParameterValue(self.THRESHOLD))
+
+        commands.append('-plen')
+        commands.append(self.getOutputValue(self.LONGEST_LEN_GRID))
+        commands.append('-tlen')
+        commands.append(self.getOutputValue(self.TOTAL_LEN_GRID))
+        commands.append('-gord')
+        commands.append(self.getOutputValue(self.STRAHLER_GRID))
 
         TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/python/plugins/processing/algs/taudem/lengtharea_multi.py b/python/plugins/processing/algs/taudem/lengtharea_multi.py
new file mode 100644
index 0000000..b8d53c8
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/lengtharea_multi.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    lengtharea_multi.py
+    ---------------------
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
+    Email                : alexander dot bruy 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__ = 'Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
+
+# This will get replaced with a git SHA1 when you do a git archive
+
+__revision__ = '$Format:%H$'
+
+import os
+
+from PyQt4.QtGui import QIcon
+
+from processing.core.GeoAlgorithm import GeoAlgorithm
+from processing.core.ProcessingConfig import ProcessingConfig
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
+
+from processing.core.parameters import ParameterFile
+from processing.core.parameters import ParameterNumber
+from processing.core.outputs import OutputDirectory
+
+from TauDEMUtils import TauDEMUtils
+
+
+class LengthAreaMulti(GeoAlgorithm):
+
+    LENGTH_GRID = 'LENGTH_GRID'
+    CONTRIB_AREA_GRID = 'CONTRIB_AREA_GRID'
+    THRESHOLD = 'THRESHOLD'
+    EXPONENT = 'EXPONENT'
+
+    STREAM_SOURCE_GRID = 'STREAM_SOURCE_GRID'
+
+    def getIcon(self):
+        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
+
+    def defineCharacteristics(self):
+        self.name = 'Length Area Stream Source (multifile)'
+        self.cmdName = 'lengtharea'
+        self.group = 'Stream Network Analysis tools'
+
+        self.addParameter(ParameterFile(self.LENGTH_GRID,
+            self.tr('Length Grid'), True, False))
+        self.addParameter(ParameterFile(self.CONTRIB_AREA_GRID,
+            self.tr('Contributing Area Grid'), True, False))
+        self.addParameter(ParameterNumber(self.THRESHOLD,
+            self.tr('Threshold'), 0, None, 0.03))
+        self.addParameter(ParameterNumber(self.EXPONENT,
+            self.tr('Exponent'), 0, None, 1.3))
+
+        self.addOutput(OutputDirectory(self.STREAM_SOURCE_GRID,
+            self.tr('Stream Source Grid')))
+
+    def processAlgorithm(self, progress):
+        commands = []
+        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
+
+        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
+        if processNum <= 0:
+            raise GeoAlgorithmExecutionException(
+                self.tr('Wrong number of MPI processes used. Please set '
+                        'correct number before running TauDEM algorithms.'))
+
+        commands.append('-n')
+        commands.append(str(processNum))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
+        commands.append('-plen')
+        commands.append(self.getParameterValue(self.LENGTH_GRID))
+        commands.append('-ad8')
+        commands.append(self.getParameterValue(self.CONTRIB_AREA_GRID))
+        commands.append('-par')
+        commands.append(str(self.getParameterValue(self.THRESHOLD)))
+        commands.append(str(self.getParameterValue(self.EXPONENT)))
+        commands.append('-ss')
+        commands.append(self.getOutputValue(self.STREAM_SOURCE_GRID))
+
+        TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/python/plugins/processing/algs/taudem/peukerdouglas_multi.py b/python/plugins/processing/algs/taudem/peukerdouglas_multi.py
new file mode 100644
index 0000000..5ed60e2
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/peukerdouglas_multi.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    peukerdouglas_multi.py
+    ---------------------
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
+    Email                : alexander dot bruy 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__ = 'Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
+
+# This will get replaced with a git SHA1 when you do a git archive
+
+__revision__ = '$Format:%H$'
+
+import os
+from PyQt4.QtGui import QIcon
+
+from processing.core.GeoAlgorithm import GeoAlgorithm
+from processing.core.ProcessingConfig import ProcessingConfig
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
+
+from processing.core.parameters import ParameterFile
+from processing.core.parameters import ParameterNumber
+from processing.core.outputs import OutputDirectory
+
+from TauDEMUtils import TauDEMUtils
+
+
+class PeukerDouglasMulti(GeoAlgorithm):
+
+    ELEVATION_GRID = 'ELEVATION_GRID'
+    CENTER_WEIGHT = 'CENTER_WEIGHT'
+    SIDE_WEIGHT = 'SIDE_WEIGHT'
+    DIAGONAL_WEIGHT = 'DIAGONAL_WEIGHT'
+
+    STREAM_SOURCE_GRID = 'STREAM_SOURCE_GRID'
+
+    def getIcon(self):
+        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
+
+    def defineCharacteristics(self):
+        self.name = 'Peuker Douglas (multifile)'
+        self.cmdName = 'peukerdouglas'
+        self.group = 'Stream Network Analysis tools'
+
+        self.addParameter(ParameterFile(self.ELEVATION_GRID,
+            self.tr('Elevation Grid'), True, False))
+        self.addParameter(ParameterNumber(self.CENTER_WEIGHT,
+            self.tr('Center Smoothing Weight'), 0, None, 0.4))
+        self.addParameter(ParameterNumber(self.SIDE_WEIGHT,
+            self.tr('Side Smoothing Weight'), 0, None, 0.1))
+        self.addParameter(ParameterNumber(self.DIAGONAL_WEIGHT,
+            self.tr('Diagonal Smoothing Weight'), 0, None, 0.05))
+
+        self.addOutput(OutputDirectory(self.STREAM_SOURCE_GRID,
+            self.tr('Stream Source Grid')))
+
+    def processAlgorithm(self, progress):
+        commands = []
+        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
+
+        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
+        if processNum <= 0:
+            raise GeoAlgorithmExecutionException(
+                self.tr('Wrong number of MPI processes used. Please set '
+                        'correct number before running TauDEM algorithms.'))
+
+        commands.append('-n')
+        commands.append(str(processNum))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
+        commands.append('-fel')
+        commands.append(self.getParameterValue(self.ELEVATION_GRID))
+        commands.append('-par')
+        commands.append(str(self.getParameterValue(self.CENTER_WEIGHT)))
+        commands.append(str(self.getParameterValue(self.SIDE_WEIGHT)))
+        commands.append(str(self.getParameterValue(self.DIAGONAL_WEIGHT)))
+        commands.append('-ss')
+        commands.append(self.getOutputValue(self.STREAM_SOURCE_GRID))
+
+        TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/python/plugins/processing/algs/taudem/slopearea_multi.py b/python/plugins/processing/algs/taudem/slopearea_multi.py
new file mode 100644
index 0000000..7139878
--- /dev/null
+++ b/python/plugins/processing/algs/taudem/slopearea_multi.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    slopearea_multi.py
+    ---------------------
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Alexander Bruy
+    Email                : alexander dot bruy 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__ = 'Alexander Bruy'
+__date__ = 'March 2015'
+__copyright__ = '(C) 2015, Alexander Bruy'
+
+# This will get replaced with a git SHA1 when you do a git archive
+
+__revision__ = '$Format:%H$'
+
+import os
+
+from PyQt4.QtGui import QIcon
+
+from processing.core.GeoAlgorithm import GeoAlgorithm
+from processing.core.ProcessingConfig import ProcessingConfig
+from processing.core.GeoAlgorithmExecutionException import \
+    GeoAlgorithmExecutionException
+
+from processing.core.parameters import ParameterFile
+from processing.core.parameters import ParameterNumber
+from processing.core.outputs import OutputDirectory
+
+from TauDEMUtils import TauDEMUtils
+
+
+class SlopeAreaMulti(GeoAlgorithm):
+
+    SLOPE_GRID = 'SLOPE_GRID'
+    AREA_GRID = 'AREA_GRID'
+    SLOPE_EXPONENT = 'SLOPE_EXPONENT'
+    AREA_EXPONENT = 'AREA_EXPONENT'
+
+    SLOPE_AREA_GRID = 'SLOPE_AREA_GRID'
+
+    def getIcon(self):
+        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
+
+    def defineCharacteristics(self):
+        self.name = 'Slope Area Combination (multifile)'
+        self.cmdName = 'slopearea'
+        self.group = 'Stream Network Analysis tools'
+
+        self.addParameter(ParameterFile(self.SLOPE_GRID,
+            self.tr('Slope Grid'), True, False))
+        self.addParameter(ParameterFile(self.AREA_GRID,
+            self.tr('Contributing Area Grid'), True, False))
+        self.addParameter(ParameterNumber(self.SLOPE_EXPONENT,
+            self.tr('Slope Exponent'), 0, None, 2))
+        self.addParameter(ParameterNumber(self.AREA_EXPONENT,
+            self.tr('Area Exponent'), 0, None, 1))
+
+        self.addOutput(OutputDirectory(self.SLOPE_AREA_GRID,
+            self.tr('Slope Area Grid')))
+
+    def processAlgorithm(self, progress):
+        commands = []
+        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
+
+        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
+        if processNum <= 0:
+            raise GeoAlgorithmExecutionException(
+                self.tr('Wrong number of MPI processes used. Please set '
+                        'correct number before running TauDEM algorithms.'))
+
+        commands.append('-n')
+        commands.append(str(processNum))
+        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
+        commands.append('-slp')
+        commands.append(self.getParameterValue(self.SLOPE_GRID))
+        commands.append('-sca')
+        commands.append(self.getParameterValue(self.AREA_GRID))
+        commands.append('-par')
+        commands.append(str(self.getParameterValue(self.SLOPE_EXPONENT)))
+        commands.append(str(self.getParameterValue(self.AREA_EXPONENT)))
+        commands.append('-sa')
+        commands.append(self.getOutputValue(self.SLOPE_AREA_GRID))
+
+        TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/python/plugins/processing/gui/BatchPanel.py b/python/plugins/processing/gui/BatchPanel.py
index 751285e..37eecf3 100644
--- a/python/plugins/processing/gui/BatchPanel.py
+++ b/python/plugins/processing/gui/BatchPanel.py
@@ -62,7 +62,7 @@ class BatchPanel(QWidget, Ui_Form):
 
         # Set icons
         self.btnAdd.setIcon(QgsApplication.getThemeIcon('/mActionSignPlus.png'))
-        self.btnRemove.setIcon(QgsApplication.getThemeIcon('/mActionSignMinus.png'))
+        self.btnRemove.setIcon(QgsApplication.getThemeIcon('/symbologyRemove.png'))
         self.btnAdvanced.setIcon(QIcon(':/processing/images/alg.png'))
 
         self.alg = alg
diff --git a/python/plugins/processing/gui/MultipleFileInputDialog.py b/python/plugins/processing/gui/MultipleFileInputDialog.py
index 8802565..1981e52 100644
--- a/python/plugins/processing/gui/MultipleFileInputDialog.py
+++ b/python/plugins/processing/gui/MultipleFileInputDialog.py
@@ -91,6 +91,9 @@ class MultipleFileInputDialog(QDialog, Ui_DlgMultipleSelection):
         files = QFileDialog.getOpenFileNames(self,
             self.tr('Select file(s)'), path, self.tr('All files (*.*)'))
 
+        if len(files) == 0:
+            return
+
         model = self.lstLayers.model()
         for filePath in files:
             item = QStandardItem(filePath)
diff --git a/python/plugins/processing/modeler/AddModelFromFileAction.py b/python/plugins/processing/modeler/AddModelFromFileAction.py
index 05e07b6..23d53c4 100644
--- a/python/plugins/processing/modeler/AddModelFromFileAction.py
+++ b/python/plugins/processing/modeler/AddModelFromFileAction.py
@@ -28,6 +28,7 @@ __revision__ = '$Format:%H$'
 import os
 import shutil
 from PyQt4.QtGui import QIcon, QFileDialog, QMessageBox
+from PyQt4.QtCore import QSettings, QFileInfo
 from processing.gui.ToolboxAction import ToolboxAction
 from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
 from processing.modeler.WrongModelException import WrongModelException
@@ -43,11 +44,16 @@ class AddModelFromFileAction(ToolboxAction):
         return QIcon(os.path.dirname(__file__) + '/../images/model.png')
 
     def execute(self):
+        settings = QSettings()
+        lastDir = settings.value('Processing/lastModelsDir', '')
         filename = QFileDialog.getOpenFileName(self.toolbox,
-            self.tr('Open model', 'AddModelFromFileAction'), None,
+            self.tr('Open model', 'AddModelFromFileAction'), lastDir,
             self.tr('Processing model files (*.model *.MODEL)', 'AddModelFromFileAction'))
         if filename:
             try:
+                settings.setValue('Processing/lastModelsDir',
+                    QFileInfo(fileName).absoluteDir().absolutePath())
+
                 ModelerAlgorithm.fromFile(filename)
             except WrongModelException:
                 QMessageBox.warning(
diff --git a/python/plugins/processing/script/AddScriptFromFileAction.py b/python/plugins/processing/script/AddScriptFromFileAction.py
index 16d1a6a..2a9e765 100644
--- a/python/plugins/processing/script/AddScriptFromFileAction.py
+++ b/python/plugins/processing/script/AddScriptFromFileAction.py
@@ -42,12 +42,16 @@ class AddScriptFromFileAction(ToolboxAction):
         return QIcon(':/processing/images/script.png')
 
     def execute(self):
+        settings = QSettings()
+        lastDir = settings.value('Processing/lastScriptsDir', '')
         filename = QFileDialog.getOpenFileName(self.toolbox,
             self.tr('Script files', 'AddScriptFromFileAction'), None,
-            self.tr('Script files (*.py *.PY)', 'AddScriptFromFileAction')
-        )
+            self.tr('Script files (*.py *.PY)', 'AddScriptFromFileAction'))
         if filename:
             try:
+                settings.setValue('Processing/lastScriptsDir',
+                    QFileInfo(fileName).absoluteDir().absolutePath())
+
                 script = ScriptAlgorithm(filename)
             except WrongScriptException:
                 QMessageBox.warning(self.toolbox,
diff --git a/resources/customization.xml b/resources/customization.xml
index 6ab11dc..406a426 100644
--- a/resources/customization.xml
+++ b/resources/customization.xml
@@ -391,7 +391,6 @@
     <widget objectName="btnAddCategory" class="QPushButton" label="Add"/>
     <widget objectName="btnDeleteCategories" class="QPushButton" label="Delete"/>
     <widget objectName="btnDeleteAllCategories" class="QPushButton" label="Delete all"/>
-    <widget objectName="btnJoinCategories" class="QPushButton" label="Join"/>
     <widget objectName="btnAdvanced" class="QPushButton" label="Advanced"/>
   </widget>
   <widget objectName="QgsTileScaleWidget" class="QWidget" label="">
diff --git a/scripts/tsstat.pl b/scripts/tsstat.pl
index 2f8116a..d32bcab 100755
--- a/scripts/tsstat.pl
+++ b/scripts/tsstat.pl
@@ -49,7 +49,7 @@ my $translators= {
 	'eu' => 'Asier Sarasua Garmendia, Irantzu Alvarez',
 	'fa' => 'Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan',
 	'fi' => 'Kari Salovaara, Marko Järvenpää',
-	'fr' => 'Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu',
+	'fr' => 'Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu, Marie Silvestre, Vincent Picavet',
 	'gl' => 'Xan Vieiro',
 	'hi' => 'Harish Kumar Solanki',
 	'hu' => 'Zoltan Siki',
@@ -79,7 +79,7 @@ my $translators= {
 	'sq' => '',
 	'sr at latin' => 'Goran Ivanković',
 	'sr' => 'Goran Ivanković',
-	'sv' => 'Lars Luthman, Magnus Homann, Victor Axbom',
+	'sv' => 'Victor Axbom, Lars Luthman, Magnus Homann, Klas Karlsson, Isabelle J Wigren, Daniel Rosander, Anders Ekwall, Magnus Nilsson, Jonas Svensson, Christian Brinkenberg',
 	'sw' => '',
 	'ta' => '',
 	'te' => '',
diff --git a/scripts/update_ts.sh b/scripts/update_ts.sh
index 4f00d87..d75a2d5 100755
--- a/scripts/update_ts.sh
+++ b/scripts/update_ts.sh
@@ -107,7 +107,7 @@ echo Creating qmake project file
 $QMAKE -project -o qgis_ts.pro -nopwd src python i18n
 
 echo Updating translations
-$LUPDATE -locations none -verbose qgis_ts.pro
+$LUPDATE -locations absolute -verbose qgis_ts.pro
 
 if [ $1 = push ]; then
 	echo Pushing translation...
diff --git a/src/analysis/raster/qgsrastermatrix.cpp b/src/analysis/raster/qgsrastermatrix.cpp
index a88999f..cdde262 100644
--- a/src/analysis/raster/qgsrastermatrix.cpp
+++ b/src/analysis/raster/qgsrastermatrix.cpp
@@ -550,7 +550,7 @@ bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op, const QgsRasterMa
 
 bool QgsRasterMatrix::testPowerValidity( double base, double power )
 {
-  if (( base == 0 && power < 0 ) || ( power < 0 && ( power - floor( power ) ) > 0 ) )
+  if (( base == 0 && power < 0 ) || ( base < 0 && ( power - floor( power ) ) > 0 ) )
   {
     return false;
   }
diff --git a/src/app/composer/qgscomposerattributetablewidget.cpp b/src/app/composer/qgscomposerattributetablewidget.cpp
index e6c02fe..dcb950b 100644
--- a/src/app/composer/qgscomposerattributetablewidget.cpp
+++ b/src/app/composer/qgscomposerattributetablewidget.cpp
@@ -286,7 +286,7 @@ void QgsComposerAttributeTableWidget::on_mHeaderFontPushButton_clicked()
 
   bool ok;
   QFont newFont = QgisGui::getFont( ok, mComposerTable->headerFont(), tr( "Select Font" ) );
-  if ( !ok )
+  if ( ok )
   {
     QgsComposition *composition = mComposerTable->composition();
     if ( composition )
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 78545ad..a214118 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -682,6 +682,24 @@ int main( int argc, char *argv[] )
   {
     setenv( "GDAL_DRIVER_PATH", gdalPlugins.toUtf8(), 1 );
   }
+
+  // Point GDAL_DATA at any GDAL share directory embedded in the app bundle
+  if ( !getenv( "GDAL_DATA" ) )
+  {
+    QStringList gdalShares;
+    QString appResources( QDir::cleanPath( QgsApplication::pkgDataPath() ) );
+    gdalShares << QCoreApplication::applicationDirPath().append( "/share/gdal" )
+    << appResources.append( "/share/gdal" )
+    << appResources.append( "/gdal" );
+    Q_FOREACH ( const QString& gdalShare, gdalShares )
+    {
+      if ( QFile::exists( gdalShare ) )
+      {
+        setenv( "GDAL_DATA", gdalShare.toUtf8().constData(), 1 );
+        break;
+      }
+    }
+  }
 #endif
 
   QSettings mySettings;
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index 062d7ba..68e2181 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -5022,6 +5022,9 @@ void QgisApp::saveAsRasterFile()
                                 this );
   if ( d.exec() == QDialog::Accepted )
   {
+    QSettings settings;
+    settings.setValue( "/UI/lastRasterFileDir", QFileInfo( d.outputFileName() ).absolutePath() );
+
     QgsRasterFileWriter fileWriter( d.outputFileName() );
     if ( d.tileMode() )
     {
@@ -5651,7 +5654,7 @@ bool QgisApp::loadComposersFromProject( const QDomDocument& doc )
 void QgisApp::deletePrintComposers()
 {
   QSet<QgsComposer*>::iterator it = mPrintComposers.begin();
-  for ( ; it != mPrintComposers.end(); ++it )
+  while ( it != mPrintComposers.end() )
   {
     emit composerWillBeRemoved(( *it )->view() );
 
@@ -5667,8 +5670,8 @@ void QgisApp::deletePrintComposers()
     {
       delete composition;
     }
+    it = mPrintComposers.erase( it );
   }
-  mPrintComposers.clear();
   mLastComposerId = 0;
   markDirty();
 }
@@ -9992,11 +9995,15 @@ void QgisApp::projectChanged( const QDomDocument &doc )
 
   QString expr;
   if ( !prevProjectDir.isNull() )
-    expr = QString( "sys.path.remove('%1'); " ).arg( prevProjectDir );
+  {
+    QString prev = prevProjectDir;
+    expr = QString( "sys.path.remove('%1'); " ).arg( prev.replace( "'", "\\'" ) );
+  }
 
   prevProjectDir = fi.canonicalPath();
 
-  expr += QString( "sys.path.append('%1')" ).arg( prevProjectDir );
+  QString prev = prevProjectDir;
+  expr += QString( "sys.path.append('%1')" ).arg( prev.replace( "'", "\\'" ) );
 
   QgsPythonRunner::run( expr );
 }
diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp
index 57ce5bb..7fac260 100644
--- a/src/app/qgsattributetabledialog.cpp
+++ b/src/app/qgsattributetabledialog.cpp
@@ -90,7 +90,8 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
   context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() );
 
   QgsFeatureRequest r;
-  if ( settings.value( "/qgis/attributeTableBehaviour", QgsAttributeTableFilterModel::ShowAll ).toInt() == QgsAttributeTableFilterModel::ShowVisible )
+  if ( mLayer->geometryType() != QGis::NoGeometry &&
+       settings.value( "/qgis/attributeTableBehaviour", QgsAttributeTableFilterModel::ShowAll ).toInt() == QgsAttributeTableFilterModel::ShowVisible )
   {
     QgsMapCanvas *mc = QgisApp::instance()->mapCanvas();
     QgsRectangle extent( mc->mapSettings().mapToLayerCoordinates( theLayer, mc->extent() ) );
@@ -100,6 +101,8 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
     mRubberBand = new QgsRubberBand( mc, true );
     mRubberBand->setToGeometry( g, theLayer );
     delete g;
+
+    mActionShowAllFilter->setText( tr( "Show All Features In Initial Canvas Extent" ) );
   }
 
   // Initialize dual view
@@ -236,11 +239,12 @@ QgsAttributeTableDialog::~QgsAttributeTableDialog()
 void QgsAttributeTableDialog::updateTitle()
 {
   QWidget *w = mDock ? qobject_cast<QWidget*>( mDock ) : qobject_cast<QWidget*>( this );
-  w->setWindowTitle( tr( "Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4" )
+  w->setWindowTitle( tr( "Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5" )
                      .arg( mLayer->name() )
                      .arg( mMainView->featureCount() )
                      .arg( mMainView->filteredFeatureCount() )
                      .arg( mLayer->selectedFeatureCount() )
+                     .arg( mRubberBand ? tr( ", spatially limited" ) : "" )
                    );
 
   if ( mMainView->filterMode() == QgsAttributeTableFilterModel::ShowAll )
diff --git a/src/app/qgsdecorationgriddialog.cpp b/src/app/qgsdecorationgriddialog.cpp
index 3d92375..2c99ba1 100644
--- a/src/app/qgsdecorationgriddialog.cpp
+++ b/src/app/qgsdecorationgriddialog.cpp
@@ -79,6 +79,7 @@ void QgsDecorationGridDialog::updateGuiElements()
   mAnnotationDirectionComboBox->setCurrentIndex(( int ) mDeco.gridAnnotationDirection() );
   mCoordinatePrecisionSpinBox->setValue( mDeco.gridAnnotationPrecision() );
 
+  mDistanceToMapFrameSpinBox->setValue( mDeco.annotationFrameDistance() );
   // QPen gridPen = mDeco.gridPen();
   // mLineWidthSpinBox->setValue( gridPen.widthF() );
   // mLineColorButton->setColor( gridPen.color() );
diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp
index 743c1c2..c2ba279 100644
--- a/src/app/qgsfieldcalculator.cpp
+++ b/src/app/qgsfieldcalculator.cpp
@@ -158,7 +158,11 @@ void QgsFieldCalculator::accept()
     return;
   }
 
-  if ( mNewFieldGroupBox->isChecked() && mCreateVirtualFieldCheckbox->isChecked() )
+  // Test for creating expression field based on ! mUpdateExistingGroupBox checked rather
+  // than on mNewFieldGroupBox checked, as if the provider does not support adding attributes
+  // then mUpdateExistingGroupBox is set to not checkable, and hence is not checked.  This
+  // is a minimum fix to resolve this - better would be some GUI redesign...
+  if ( ! mUpdateExistingGroupBox->isChecked() && mCreateVirtualFieldCheckbox->isChecked() )
   {
     mVectorLayer->addExpressionField( calcString, fieldDefinition() );
   }
diff --git a/src/app/qgslabelpropertydialog.cpp b/src/app/qgslabelpropertydialog.cpp
index 67333ca..ea16f6f 100644
--- a/src/app/qgslabelpropertydialog.cpp
+++ b/src/app/qgslabelpropertydialog.cpp
@@ -481,7 +481,7 @@ void QgsLabelPropertyDialog::on_mFontSizeSpinBox_valueChanged( double d )
 
 void QgsLabelPropertyDialog::on_mBufferSizeSpinBox_valueChanged( double d )
 {
-  insertChangedValue( QgsPalLayerSettings::PositionX, d );
+  insertChangedValue( QgsPalLayerSettings::BufferSize, d );
 }
 
 void QgsLabelPropertyDialog::on_mRotationSpinBox_valueChanged( double d )
diff --git a/src/app/qgsrasterlayerproperties.cpp b/src/app/qgsrasterlayerproperties.cpp
index f2d3378..5b90ef8 100644
--- a/src/app/qgsrasterlayerproperties.cpp
+++ b/src/app/qgsrasterlayerproperties.cpp
@@ -149,7 +149,7 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
 
   pbnAddValuesManually->setIcon( QgsApplication::getThemeIcon( "/mActionSignPlus.png" ) );
   pbnAddValuesFromDisplay->setIcon( QgsApplication::getThemeIcon( "/mActionContextHelp.png" ) );
-  pbnRemoveSelectedRow->setIcon( QgsApplication::getThemeIcon( "/mActionSignMinus.png" ) );
+  pbnRemoveSelectedRow->setIcon( QgsApplication::getThemeIcon( "/symbologyRemove.png" ) );
   pbnDefaultValues->setIcon( QgsApplication::getThemeIcon( "/mActionOpenTable.png" ) );
   pbnImportTransparentPixelValues->setIcon( QgsApplication::getThemeIcon( "/mActionFileOpen.svg" ) );
   pbnExportTransparentPixelValues->setIcon( QgsApplication::getThemeIcon( "/mActionFileSave.svg" ) );
diff --git a/src/browser/CMakeLists.txt b/src/browser/CMakeLists.txt
index 6c22d57..538e2a3 100644
--- a/src/browser/CMakeLists.txt
+++ b/src/browser/CMakeLists.txt
@@ -103,4 +103,6 @@ IF (APPLE)
   INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../../${QGIS_LIB_SUBDIR} \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/QGIS Browser.app/Contents/MacOS/lib\")")
   INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../${QGIS_PLUGIN_SUBDIR}/.. \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/QGIS Browser.app/Contents/Plugins\")")
   INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../${QGIS_DATA_SUBDIR} \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/QGIS Browser.app/Contents/Resources\")")
+  # may not exist, unless BundleUtilities are used
+  INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../../share \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/QGIS Browser.app/Contents/MacOS/share\")")
 ENDIF (APPLE)
diff --git a/src/browser/main.cpp b/src/browser/main.cpp
index 22b5a3a..23b385a 100644
--- a/src/browser/main.cpp
+++ b/src/browser/main.cpp
@@ -51,6 +51,34 @@ int main( int argc, char ** argv )
   QCoreApplication::setOrganizationDomain( "qgis.org" );
   QCoreApplication::setApplicationName( "QGIS2" );
 
+#ifdef Q_OS_MACX
+  // If the GDAL plugins are bundled with the application and GDAL_DRIVER_PATH
+  // is not already defined, use the GDAL plugins in the application bundle.
+  QString gdalPlugins( QCoreApplication::applicationDirPath().append( "/lib/gdalplugins" ) );
+  if ( QFile::exists( gdalPlugins ) && !getenv( "GDAL_DRIVER_PATH" ) )
+  {
+    setenv( "GDAL_DRIVER_PATH", gdalPlugins.toUtf8(), 1 );
+  }
+
+  // Point GDAL_DATA at any GDAL share directory embedded in the app bundle
+  if ( !getenv( "GDAL_DATA" ) )
+  {
+    QStringList gdalShares;
+    QString appResources( QDir::cleanPath( QgsApplication::pkgDataPath() ) );
+    gdalShares << QCoreApplication::applicationDirPath().append( "/share/gdal" )
+    << appResources.append( "/share/gdal" )
+    << appResources.append( "/gdal" );
+    Q_FOREACH ( const QString& gdalShare, gdalShares )
+    {
+      if ( QFile::exists( gdalShare ) )
+      {
+        setenv( "GDAL_DATA", gdalShare.toUtf8().constData(), 1 );
+        break;
+      }
+    }
+  }
+#endif
+
   QgsBrowser w;
 
   a.connect( &a, SIGNAL( aboutToQuit() ), &w, SLOT( saveWindowState() ) );
diff --git a/src/core/diagram/qgstextdiagram.cpp b/src/core/diagram/qgstextdiagram.cpp
index 5c3c120..64d4ff3 100644
--- a/src/core/diagram/qgstextdiagram.cpp
+++ b/src/core/diagram/qgstextdiagram.cpp
@@ -109,13 +109,6 @@ void QgsTextDiagram::renderDiagram( const QgsFeature& feature, QgsRenderContext&
     return;
   }
 
-  double scaleDenominator = c.rendererScale();
-  if (( s.minScaleDenominator != -1 && scaleDenominator < s.minScaleDenominator )
-      || ( s.maxScaleDenominator != -1 && scaleDenominator > s.maxScaleDenominator ) )
-  {
-    return;
-  }
-
   //convert from mm / map units to painter units
   QSizeF spu = sizePainterUnits( s.size, s, c );
   double w = spu.width();
diff --git a/src/core/dxf/qgsdxfexport.cpp b/src/core/dxf/qgsdxfexport.cpp
index bfc30eb..a3655c9 100644
--- a/src/core/dxf/qgsdxfexport.cpp
+++ b/src/core/dxf/qgsdxfexport.cpp
@@ -431,10 +431,10 @@ void QgsDxfExport::writeGroup( QColor color, int exactMatchCode, int rgbCode, in
     minDist = dist;
   }
 
-  writeGroup( exactMatchCode, minDistAt );
-  if ( minDist == 0 && color.alpha() == 255 )
+  if ( minDist == 0 && color.alpha() == 255 && minDistAt != 7 )
   {
-    // exact full opaque match
+    // exact full opaque match, not black/white
+    writeGroup( exactMatchCode, minDistAt );
     return;
   }
 
@@ -480,10 +480,8 @@ int QgsDxfExport::writeToFile( QIODevice* d, QString encoding )
   }
 
   mTextStream.setDevice( d );
-  QgsDebugMsg( "encoding:" + encoding );
   mTextStream.setCodec( encoding.toLocal8Bit() );
 
-  QgsDebugMsg( "dxfEncoding:" + dxfEncoding( encoding ) );
   writeHeader( dxfEncoding( encoding ) );
   writeTables();
   writeBlocks();
@@ -504,7 +502,7 @@ void QgsDxfExport::writeHeader( QString codepage )
   writeGroup( 9, "$ACADVER" );
   writeGroup( 1, "AC1015" );
 
-  QgsRectangle ext = dxfExtent();
+  QgsRectangle ext( mExtent.isEmpty() ? dxfExtent() : mExtent );
   if ( !ext.isEmpty() )
   {
     // EXTMIN
@@ -664,8 +662,7 @@ void QgsDxfExport::writeTables()
   writeHandle();
   writeGroup( 100, "AcDbSymbolTable" );
 
-#if 0
-  QgsRectangle ext( dxfExtent() );
+  QgsRectangle ext( mExtent.isEmpty() ? dxfExtent() : mExtent );
 
   writeGroup( 0, "VPORT" );
   writeHandle();
@@ -673,37 +670,36 @@ void QgsDxfExport::writeTables()
   writeGroup( 100, "AcDbViewportTableRecord" );
   writeGroup( 2, "*ACTIVE" );
   writeGroup( 70, 0 );  // flags
-  writeGroup( 0, QgsPoint( ext.xMinimum(), ext.yMinimum() ) ); // lower-left corner
-  writeGroup( 1, QgsPoint( ext.xMaximum(), ext.yMaximum() ) ); // upper right corner
-  writeGroup( 2, ext.center() );                       // view center point
-  writeGroup( 3, QgsPoint( 0.0, 0.0 ) );               // snap base point
-  writeGroup( 4, QgsPoint( 0.5, 0.5 ) );               // snap spacing x/y
-  writeGroup( 5, QgsPoint( 0.5, 0.5 ) );               // grid spacing x/y
-  writeGroup( 6, QgsPoint( 0.0, 0.0 ), 1.0, false );   // view direction from target point
-  writeGroup( 7, QgsPoint( 0.0, 0.0 ), 0.0, false );   // view target point
-  writeGroup( 40, 10.0 );                          // ?
-  writeGroup( 42, 50.0 );                              // lens length
-  writeGroup( 43, 0.0 );                               // front clipping plan
-  writeGroup( 44, 0.0 );                               // back clipping plan
-  writeGroup( 50, 0.0 );                               // snap rotation angle
-  writeGroup( 51, 0.0 );                               // view twist angle
-  writeGroup( 71, 0 );                                 // view mode
-  writeGroup( 72, 1000 );                              // circle sides
-  writeGroup( 73, 1 );                                 // ?
-  writeGroup( 74, 3 );                                 // UCSICON setting
-  writeGroup( 75, 0 );                                 // ?
-  writeGroup( 76, 0 );                                 // ?
-  writeGroup( 77, 0 );                                 // ?
-  writeGroup( 78, 0 );                                 // ?
-  writeGroup( 281, 0 );                                // Render mode (2D)
-  writeGroup( 100, QgsPoint( 0.0, 0.0 ), 0.0, false ); // UCS origin
-  writeGroup( 101, QgsPoint( 1.0, 0.0 ), 0.0, false ); // UCS x axis
-  writeGroup( 102, QgsPoint( 0.0, 1.0 ), 0.0, false ); // UCS y axis
-  writeGroup( 79, 0 );                                 // Orthographic type of UCS (not orthographic)
-  writeGroup( 146, 0.0 );                              // elevation
-  writeGroup( 60, 3 );                                 // ?
-  writeGroup( 61, 5 );                                 // major grid line
-#endif
+  writeGroup( 0, QgsPoint( 0.0, 0.0 ), 0.0, true ); // lower left
+  writeGroup( 1, QgsPoint( 1.0, 1.0 ), 0.0, true ); // upper right
+  writeGroup( 2, QgsPoint( 0.0, 0.0 ), 0.0, true ); // view center point
+  writeGroup( 3, QgsPoint( 0.0, 0.0 ), 0.0, true ); // snap base point
+  writeGroup( 4, QgsPoint( 1.0, 1.0 ), 0.0, true ); // snap spacing
+  writeGroup( 5, QgsPoint( 1.0, 1.0 ), 0.0, true ); // grid spacing
+  writeGroup( 6, QgsPoint( 0.0, 0.0 ), 1.0 );       // view direction from target point
+  writeGroup( 7, ext.center(), 0.0, true );         // view target point
+  writeGroup( 40, ext.height() );                   // view height
+  writeGroup( 41, ext.width() / ext.height() );     // view aspect ratio
+  writeGroup( 42, 50.0 );                           // lens length
+  writeGroup( 43, 0.0 );                            // front clipping plane
+  writeGroup( 44, 0.0 );                            // back clipping plane
+  writeGroup( 50, 0.0 );                            // snap rotation
+  writeGroup( 51, 0.0 );                            // view twist angle
+  writeGroup( 71, 0 );                              // view mode (0 = deactivates)
+  writeGroup( 72, 100 );                            // circle zoom percent
+  writeGroup( 73, 1 );                              // fast zoom setting
+  writeGroup( 74, 1 );                              // UCSICON setting
+  writeGroup( 75, 0 );                              // snapping off
+  writeGroup( 76, 0 );                              // grid off
+  writeGroup( 77, 0 );                              // snap style
+  writeGroup( 78, 0 );                              // snap isopair
+  writeGroup( 281, 0 );                             // render mode (0 = 2D optimized)
+  writeGroup( 65, 1 );                              // value of UCSVP for this viewport
+  writeGroup( 100, QgsPoint( 0.0, 0.0 ) );          // UCS origin
+  writeGroup( 101, QgsPoint( 1.0, 0.0 ) );          // UCS x axis
+  writeGroup( 102, QgsPoint( 0.0, 1.0 ) );          // UCS y axis
+  writeGroup( 79, 0 );                              // Orthographic type of UCS (0 = UCS is not orthographic)
+  writeGroup( 146, 0.0 );                           // Elevation
 
   writeGroup( 70, 0 );
   writeGroup( 0, "ENDTAB" );
@@ -3367,22 +3363,21 @@ void QgsDxfExport::writePolyline( const QgsPolyline& line, const QString& layer,
 
 void QgsDxfExport::writePolygon( const QgsPolygon& polygon, const QString& layer, const QString& hatchPattern, QColor color )
 {
-  writeGroup( 0, "HATCH" );                     // Entity type
+  writeGroup( 0, "HATCH" );         // Entity type
   writeHandle();
   writeGroup( 330, mModelSpaceBR );
   writeGroup( 100, "AcDbEntity" );
+  writeGroup( 8, layer );           // Layer name
+  writeGroup( color );              // Color
   writeGroup( 100, "AcDbHatch" );
 
-  writeGroup( 8, layer );   // Layer name
-  writeGroup( 0, QgsPoint( 0, 0 ) );  // Elevation point (in OCS)
+  writeGroup( 0, QgsPoint( 0, 0 ) ); // Elevation point (in OCS)
   writeGroup( 200, QgsPoint( 0, 0 ), 1.0 );
 
   writeGroup( 2, hatchPattern );  // Hatch pattern name
   writeGroup( 70, hatchPattern == "SOLID" ); // Solid fill flag (solid fill = 1; pattern fill = 0)
   writeGroup( 71, 0 );    // Associativity flag (associative = 1; non-associative = 0)
 
-  writeGroup( color );           // Color (0 by block, 256 by layer)
-
   writeGroup( 91, polygon.size() );  // Number of boundary paths (loops)
   for ( int i = 0; i < polygon.size(); ++i )
   {
@@ -3518,10 +3513,6 @@ void QgsDxfExport::writeMText( const QString& layer, const QString& text, const
 
   writeGroup( 0, pt );
 
-  QgsDebugMsg( QString( "text:%1" ).arg( text ) );
-  QgsDebugMsg( QString( "canEncode:%1" ).arg( mTextStream.codec()->canEncode( text ) ? "yes" : "no" ) );
-  QgsDebugMsg( QString( "fromUnicode:%1" ).arg( mTextStream.codec()->fromUnicode( text ).constData() ) );
-
   QString t( text );
   while ( t.length() > 250 )
   {
@@ -3694,7 +3685,7 @@ void QgsDxfExport::addFeature( const QgsSymbolV2RenderContext& ctx, const QStrin
       QgsPolygon::const_iterator polyIt = polygon.constBegin();
       for ( ; polyIt != polygon.constEnd(); ++polyIt ) // iterate over rings
       {
-        writePolyline( geom->asPolyline(), layer, lineStyleName, penColor, width, false );
+        writePolyline( *polyIt, layer, lineStyleName, penColor, width, false );
       }
 
       if ( offsetPolygon != geom )
diff --git a/src/core/dxf/qgsdxfpaintengine.cpp b/src/core/dxf/qgsdxfpaintengine.cpp
index 91e7a1f..7edaa5f 100644
--- a/src/core/dxf/qgsdxfpaintengine.cpp
+++ b/src/core/dxf/qgsdxfpaintengine.cpp
@@ -84,12 +84,19 @@ void QgsDxfPaintEngine::drawPolygon( const QPointF *points, int pointCount, Poly
     polyline[i] = toDxfCoordinates( points[i] );
   }
 
-  mDxf->writePolygon( polygon, mLayer, "SOLID", currentColor() );
+  if ( mode == QPaintEngine::PolylineMode )
+  {
+    mDxf->writePolyline( polyline, mLayer, "CONTINUOUS", mPen.color(), currentWidth(), true );
+  }
+  else
+  {
+    mDxf->writePolygon( polygon, mLayer, "SOLID", mBrush.color() );
+  }
 }
 
 void QgsDxfPaintEngine::drawRects( const QRectF* rects, int rectCount )
 {
-  if ( !mDxf || !mPaintDevice || !rects )
+  if ( !mDxf || !mPaintDevice || !rects || mBrush.style() == Qt::NoBrush )
   {
     return;
   }
@@ -104,7 +111,7 @@ void QgsDxfPaintEngine::drawRects( const QRectF* rects, int rectCount )
     QgsPoint pt2 = toDxfCoordinates( QPointF( right, bottom ) );
     QgsPoint pt3 = toDxfCoordinates( QPointF( left, top ) );
     QgsPoint pt4 = toDxfCoordinates( QPointF( right, top ) );
-    mDxf->writeSolid( mLayer, currentColor(), pt1, pt2, pt3, pt4 );
+    mDxf->writeSolid( mLayer, mBrush.color(), pt1, pt2, pt3, pt4 );
   }
 }
 
@@ -162,7 +169,10 @@ void QgsDxfPaintEngine::endPolygon()
 {
   if ( mCurrentPolygon.size() > 1 )
   {
-    drawPolygon( mCurrentPolygon.constData(), mCurrentPolygon.size(), QPaintEngine::OddEvenMode );
+    if ( mPen.style() != Qt::NoPen )
+      drawPolygon( mCurrentPolygon.constData(), mCurrentPolygon.size(), QPaintEngine::PolylineMode );
+    if ( mBrush.style() != Qt::NoBrush )
+      drawPolygon( mCurrentPolygon.constData(), mCurrentPolygon.size(), QPaintEngine::OddEvenMode );
   }
   mCurrentPolygon.clear();
 }
@@ -198,7 +208,7 @@ void QgsDxfPaintEngine::endCurve()
 
 void QgsDxfPaintEngine::drawLines( const QLineF* lines, int lineCount )
 {
-  if ( !mDxf || !mPaintDevice || !lines )
+  if ( !mDxf || !mPaintDevice || !lines || mPen.style() == Qt::NoPen )
   {
     return;
   }
@@ -207,7 +217,7 @@ void QgsDxfPaintEngine::drawLines( const QLineF* lines, int lineCount )
   {
     QgsPoint pt1 = toDxfCoordinates( lines[i].p1() );
     QgsPoint pt2 = toDxfCoordinates( lines[i].p2() );
-    mDxf->writeLine( pt1, pt2, mLayer, "CONTINUOUS", currentColor(), currentWidth() );
+    mDxf->writeLine( pt1, pt2, mLayer, "CONTINUOUS", mPen.color(), currentWidth() );
   }
 }
 
@@ -222,20 +232,6 @@ QgsPoint QgsDxfPaintEngine::toDxfCoordinates( const QPointF& pt ) const
   return QgsPoint( dxfPt.x(), dxfPt.y() );
 }
 
-QColor QgsDxfPaintEngine::currentColor() const
-{
-  if ( !mDxf )
-  {
-    return QColor();
-  }
-
-  QColor c = mPen.color();
-  if ( mPen.style() == Qt::NoPen )
-  {
-    c = mBrush.color();
-  }
-  return c;
-}
 
 double QgsDxfPaintEngine::currentWidth() const
 {
diff --git a/src/core/dxf/qgsdxfpaintengine.h b/src/core/dxf/qgsdxfpaintengine.h
index 0497458..a799005 100644
--- a/src/core/dxf/qgsdxfpaintengine.h
+++ b/src/core/dxf/qgsdxfpaintengine.h
@@ -61,7 +61,6 @@ class CORE_EXPORT QgsDxfPaintEngine: public QPaintEngine
     QList<QPointF> mCurrentCurve;
 
     QgsPoint toDxfCoordinates( const QPointF& pt ) const;
-    QColor currentColor() const;
     double currentWidth() const;
 
     void moveTo( double dx, double dy );
diff --git a/src/core/pal/feature.cpp b/src/core/pal/feature.cpp
index e7ff408..4a16fcc 100644
--- a/src/core/pal/feature.cpp
+++ b/src/core/pal/feature.cpp
@@ -279,7 +279,7 @@ namespace pal
   {
     Q_UNUSED( scale );
     Q_UNUSED( delta_width );
-    int nbp = 3;
+    int nbp = 1;
     *lPos = new LabelPosition *[nbp];
 
     // get from feature
@@ -349,15 +349,7 @@ namespace pal
     lx = x + xdiff;
     ly = y + ydiff;
 
-//    double offset = label_x / 4;
-    double offset = 0.0; // don't shift what is supposed to be fixed
-
-    // at the center
     ( *lPos )[0] = new LabelPosition( id, lx, ly, label_x, label_y, angle, cost, this );
-    // shifted to the sides - with higher cost
-    cost = 0.0021;
-    ( *lPos )[1] = new LabelPosition( id, lx + offset, ly, label_x, label_y, angle, cost, this );
-    ( *lPos )[2] = new LabelPosition( id, lx - offset, ly, label_x, label_y, angle, cost, this );
     return nbp;
   }
 
diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp
index e23d14c..dd5ace5 100644
--- a/src/core/qgsexpression.cpp
+++ b/src/core/qgsexpression.cpp
@@ -2252,6 +2252,10 @@ QVariant QgsExpression::NodeBinaryOperator::eval( QgsExpression* parent, const Q
         // both are integers - let's use integer arithmetics
         int iL = getIntValue( vL, parent ); ENSURE_NO_EVAL_ERROR;
         int iR = getIntValue( vR, parent ); ENSURE_NO_EVAL_ERROR;
+
+        if ( mOp == boMod && iR == 0 )
+          return QVariant();
+
         return QVariant( computeInt( iL, iR ) );
       }
       else if ( isDateTimeSafe( vL ) && isIntervalSafe( vR ) )
@@ -2270,7 +2274,7 @@ QVariant QgsExpression::NodeBinaryOperator::eval( QgsExpression* parent, const Q
         // general floating point arithmetic
         double fL = getDoubleValue( vL, parent ); ENSURE_NO_EVAL_ERROR;
         double fR = getDoubleValue( vR, parent ); ENSURE_NO_EVAL_ERROR;
-        if ( mOp == boDiv && fR == 0 )
+        if (( mOp == boDiv || mOp == boMod ) && fR == 0. )
           return QVariant(); // silently handle division by zero and return NULL
         return QVariant( computeDouble( fL, fR ) );
       }
@@ -2280,7 +2284,7 @@ QVariant QgsExpression::NodeBinaryOperator::eval( QgsExpression* parent, const Q
       //integer division
       double fL = getDoubleValue( vL, parent ); ENSURE_NO_EVAL_ERROR;
       double fR = getDoubleValue( vR, parent ); ENSURE_NO_EVAL_ERROR;
-      if ( fR == 0 )
+      if ( fR == 0. )
         return QVariant(); // silently handle division by zero and return NULL
       return QVariant( qFloor( fL / fR ) );
     }
diff --git a/src/core/qgsmimedatautils.cpp b/src/core/qgsmimedatautils.cpp
index 3fe0947..54963ef 100644
--- a/src/core/qgsmimedatautils.cpp
+++ b/src/core/qgsmimedatautils.cpp
@@ -44,6 +44,7 @@ QgsMimeDataUtils::Uri::Uri( QgsLayerItem* layerItem )
 
 QgsMimeDataUtils::Uri::Uri( QString& encData )
 {
+  QgsDebugMsg( "encData: " + encData );
   QStringList decoded = decode( encData );
   if ( decoded.size() < 4 )
     return;
@@ -119,6 +120,7 @@ QString QgsMimeDataUtils::encode( const QStringList& items )
   foreach ( const QString& item, items )
   {
     QString str = item;
+    str.replace( "\\", "\\\\" );
     str.replace( ":", "\\:" );
     encoded += str + ":";
   }
diff --git a/src/core/qgspallabeling.cpp b/src/core/qgspallabeling.cpp
index 768a511..309c8b3 100644
--- a/src/core/qgspallabeling.cpp
+++ b/src/core/qgspallabeling.cpp
@@ -3382,7 +3382,8 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QStringList& attrNames,
 
 int QgsPalLabeling::addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLayerSettings *s )
 {
-  Layer* l = mPal->addLayer( layer->id().append( "d" ).toUtf8().data(), -1, -1, pal::Arrangement( s->placement ), METER, s->priority, s->obstacle, true, true );
+  double priority = 1 - s->priority / 10.0; // convert 0..10 --> 1..0
+  Layer* l = mPal->addLayer( layer->id().append( "d" ).toUtf8().data(), -1, -1, pal::Arrangement( s->placement ), METER, priority, s->obstacle, true, true );
   l->setArrangementFlags( s->placementFlags );
 
   mActiveDiagramLayers.insert( layer->id(), *s );
@@ -3418,6 +3419,26 @@ void QgsPalLabeling::registerDiagramFeature( const QString& layerID, QgsFeature&
     return;
   }
 
+  QgsDiagramRendererV2* dr = layerIt.value().renderer;
+  if ( dr )
+  {
+    QList<QgsDiagramSettings> settingList = dr->diagramSettings();
+    if ( settingList.size() > 0 )
+    {
+      double minScale = settingList.at( 0 ).minScaleDenominator;
+      if ( minScale > 0 && context.rendererScale() < minScale )
+      {
+        return;
+      }
+
+      double maxScale = settingList.at( 0 ).maxScaleDenominator;
+      if ( maxScale > 0 && context.rendererScale() > maxScale )
+      {
+        return;
+      }
+    }
+  }
+
   //convert geom to geos
   QgsGeometry* geom = feat.geometry();
 
@@ -3456,7 +3477,6 @@ void QgsPalLabeling::registerDiagramFeature( const QString& layerID, QgsFeature&
 
   double diagramWidth = 0;
   double diagramHeight = 0;
-  QgsDiagramRendererV2* dr = layerIt.value().renderer;
   if ( dr )
   {
     QSizeF diagSize = dr->sizeMapUnits( feat, context );
@@ -4004,7 +4024,7 @@ void QgsPalLabeling::drawLabeling( QgsRenderContext& context )
           feature.setFields( &dit.value().fields );
           palGeometry->feature( feature );
           QgsPoint outPt = xform.transform(( *it )->getX(), ( *it )->getY() );
-          dit.value().renderer->renderDiagram( feature, context, QPointF( outPt.x(), outPt.y() ) );
+          dit.value().renderer->renderDiagram( feature, context, outPt.toQPointF() );
         }
       }
 
diff --git a/src/core/qgspointlocator.cpp b/src/core/qgspointlocator.cpp
index 534e7da..931c4bb 100644
--- a/src/core/qgspointlocator.cpp
+++ b/src/core/qgspointlocator.cpp
@@ -631,7 +631,14 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
   {
     QgsRectangle rect = *mExtent;
     if ( mTransform )
-      rect = mTransform->transformBoundingBox( rect, QgsCoordinateTransform::ReverseTransform );
+    {
+      try {
+        rect = mTransform->transformBoundingBox( rect, QgsCoordinateTransform::ReverseTransform );
+      } catch (const QgsException& e) {
+        // See http://hub.qgis.org/issues/12634
+        QgsDebugMsg( QString("could not transform bounding box to map, skipping the snap filter (%1)").arg(e.what()) );
+      }
+    }
     request.setFilterRect( rect );
   }
   QgsFeatureIterator fi = mLayer->getFeatures( request );
@@ -642,7 +649,15 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
       continue;
 
     if ( mTransform )
-      f.geometry()->transform( *mTransform );
+    {
+      try {
+        f.geometry()->transform( *mTransform );
+      } catch (const QgsException& e) {
+        // See http://hub.qgis.org/issues/12634
+        QgsDebugMsg( QString("could not transform geometry to map, skipping the snap for it (%1)").arg(e.what()) );
+        continue;
+      }
+    }
 
     SpatialIndex::Region r( rect2region( f.geometry()->boundingBox() ) );
     dataList << new RTree::Data( 0, 0, r, f.id() );
@@ -706,7 +721,15 @@ void QgsPointLocator::onFeatureAdded( QgsFeatureId fid )
       return;
 
     if ( mTransform )
-      f.geometry()->transform( *mTransform );
+    {
+      try {
+        f.geometry()->transform( *mTransform );
+      } catch (const QgsException& e) {
+        // See http://hub.qgis.org/issues/12634
+        QgsDebugMsg( QString("could not transform geometry to map, skipping the snap for it (%1)").arg(e.what()) );
+        return;
+      }
+    }
 
     SpatialIndex::Region r( rect2region( f.geometry()->boundingBox() ) );
     mRTree->insertData( 0, 0, r, f.id() );
diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp
index 15137d6..5b075f2 100644
--- a/src/core/qgsvectorlayer.cpp
+++ b/src/core/qgsvectorlayer.cpp
@@ -179,9 +179,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
   }
 
   connect( this, SIGNAL( selectionChanged( QgsFeatureIds, QgsFeatureIds, bool ) ), this, SIGNAL( selectionChanged() ) );
-
   connect( this, SIGNAL( selectionChanged( QgsFeatureIds, QgsFeatureIds, bool ) ), this, SIGNAL( repaintRequested() ) );
-
   connect( QgsProject::instance()->relationManager(), SIGNAL( relationsLoaded() ), this, SLOT( onRelationsLoaded() ) );
 
   // Default simplify drawing settings
@@ -1250,9 +1248,22 @@ bool QgsVectorLayer::startEditing()
   connect( mEditBuffer, SIGNAL( attributeValueChanged( QgsFeatureId, int, QVariant ) ), this, SIGNAL( attributeValueChanged( QgsFeatureId, int, QVariant ) ) );
   connect( mEditBuffer, SIGNAL( attributeAdded( int ) ), this, SIGNAL( attributeAdded( int ) ) );
   connect( mEditBuffer, SIGNAL( attributeDeleted( int ) ), this, SIGNAL( attributeDeleted( int ) ) );
+
+  connect( mEditBuffer, SIGNAL( committedAttributesDeleted( const QString &, const QgsAttributeList & ) ),
+           this, SIGNAL( committedAttributesDeleted( const QString &, const QgsAttributeList & ) ) );
+
+  connect( mEditBuffer, SIGNAL( committedAttributesAdded( const QString &, const QList<QgsField> & ) ),
+           this, SIGNAL( committedAttributesAdded( const QString &, const QList<QgsField> & ) ) );
+
   connect( mEditBuffer, SIGNAL( committedFeaturesAdded( QString, QgsFeatureList ) ), this, SIGNAL( committedFeaturesAdded( QString, QgsFeatureList ) ) );
   connect( mEditBuffer, SIGNAL( committedFeaturesRemoved( QString, QgsFeatureIds ) ), this, SIGNAL( committedFeaturesRemoved( QString, QgsFeatureIds ) ) );
 
+  connect( mEditBuffer, SIGNAL( committedAttributeValuesChanges( const QString &, const QgsChangedAttributesMap & ) ),
+           this, SIGNAL( committedAttributeValuesChanges( const QString &, const QgsChangedAttributesMap & ) ) );
+
+  connect( mEditBuffer, SIGNAL( committedGeometriesChanges( const QString &, const QgsGeometryMap & ) ),
+           this, SIGNAL( committedGeometriesChanges( const QString &, const QgsGeometryMap & ) ) );
+
   updateFields();
 
   emit editingStarted();
diff --git a/src/core/symbology-ng/qgsheatmaprenderer.cpp b/src/core/symbology-ng/qgsheatmaprenderer.cpp
index 177c73e..c30e5a8 100644
--- a/src/core/symbology-ng/qgsheatmaprenderer.cpp
+++ b/src/core/symbology-ng/qgsheatmaprenderer.cpp
@@ -107,8 +107,7 @@ bool QgsHeatmapRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& c
     return false;
   }
 
-  QgsGeometry* geom = feature.geometry();
-  if ( geom->type() != QGis::Point )
+  if ( !feature.geometry() || feature.geometry()->type() != QGis::Point )
   {
     //can only render point type
     return false;
@@ -139,8 +138,28 @@ bool QgsHeatmapRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& c
   int width = context.painter()->device()->width() / mRenderQuality;
   int height = context.painter()->device()->height() / mRenderQuality;
 
+  //transform geometry if required
+  QgsGeometry* geom;
+  bool createdGeom = false;
+  const QgsCoordinateTransform* xform = context.coordinateTransform();
+  if ( xform )
+  {
+    geom = new QgsGeometry( *feature.geometry() );
+    createdGeom = true;
+    geom->transform( *xform );
+  }
+  else
+  {
+    geom = feature.geometry();
+  }
+
   //convert point to multipoint
   QgsMultiPoint multiPoint = convertToMultipoint( geom );
+  if ( createdGeom )
+  {
+    delete geom;
+  }
+  geom = 0;
 
   //loop through all points in multipoint
   for ( QgsMultiPoint::const_iterator pointIt = multiPoint.constBegin(); pointIt != multiPoint.constEnd(); ++pointIt )
diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
index a163383..13e3b4d 100644
--- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
@@ -884,7 +884,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
     bc = QgsSymbolLayerV2Utils::decodeColor( colorExpression->evaluate( *f ).toString() );
   }
 
-  QgsExpression* outlinecolorExpression = expression( "outline_color" );
+  QgsExpression* outlinecolorExpression = expression( "color_border" );
   if ( outlinecolorExpression )
   {
     pc = QgsSymbolLayerV2Utils::decodeColor( outlinecolorExpression->evaluate( *f ).toString() );
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetfactory.h b/src/gui/editorwidgets/core/qgseditorwidgetfactory.h
index 97f3c76..56fd7ed 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetfactory.h
+++ b/src/gui/editorwidgets/core/qgseditorwidgetfactory.h
@@ -136,7 +136,6 @@ class GUI_EXPORT QgsEditorWidgetFactory
      */
     virtual QVariant createCache( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config );
 
-  private:
     /**
      * Read the config from an XML file and map it to a proper {@link QgsEditorWidgetConfig}.
      *
@@ -148,6 +147,7 @@ class GUI_EXPORT QgsEditorWidgetFactory
      */
     virtual QgsEditorWidgetConfig readConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx );
 
+  private:
     /**
      * This method allows disabling this editor widget type for a certain field.
      * By default, it returns true for all fields.
diff --git a/src/gui/qgsattributedialog.cpp b/src/gui/qgsattributedialog.cpp
index 0b245e0..f1f8c66 100644
--- a/src/gui/qgsattributedialog.cpp
+++ b/src/gui/qgsattributedialog.cpp
@@ -108,6 +108,7 @@ void QgsAttributeDialog::init( QgsVectorLayer* layer, QgsFeature* feature, const
   QDialogButtonBox* buttonBox = mAttributeForm->findChild<QDialogButtonBox*>();
   connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) );
   connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) );
+  connect( layer, SIGNAL( layerDeleted() ), this, SLOT( close() ) );
 
   QgsActionMenu* menu = new QgsActionMenu( layer, &mAttributeForm->feature(), this );
   if ( menu->actions().size() > 0 )
diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp
index f7182f5..49a434d 100644
--- a/src/gui/qgsexpressionbuilderwidget.cpp
+++ b/src/gui/qgsexpressionbuilderwidget.cpp
@@ -149,7 +149,7 @@ void QgsExpressionBuilderWidget::saveFunctionFile( QString fileName )
 
   fileName = mFunctionsPath + QDir::separator() + fileName;
   QFile myFile( fileName );
-  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
+  if ( myFile.open( QIODevice::WriteOnly ) )
   {
     QTextStream myFileStream( &myFile );
     myFileStream << txtPython->text() << endl;
diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp
index 3d549c6..ec09d3a 100644
--- a/src/gui/qgsmapcanvas.cpp
+++ b/src/gui/qgsmapcanvas.cpp
@@ -418,6 +418,7 @@ void QgsMapCanvas::setLayerSet( QList<QgsMapCanvasLayer> &layers )
       if ( !currentLayer )
         continue;
       disconnect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( refresh() ) );
+      disconnect( currentLayer, SIGNAL( layerCrsChanged() ), this, SLOT( layerCrsChange() ) );
       QgsVectorLayer *isVectLyr = qobject_cast<QgsVectorLayer *>( currentLayer );
       if ( isVectLyr )
       {
@@ -433,6 +434,7 @@ void QgsMapCanvas::setLayerSet( QList<QgsMapCanvasLayer> &layers )
       // Ticket #811 - racicot
       QgsMapLayer *currentLayer = layer( i );
       connect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( refresh() ) );
+      connect( currentLayer, SIGNAL( layerCrsChanged() ), this, SLOT( layerCrsChange() ) );
       QgsVectorLayer *isVectLyr = qobject_cast<QgsVectorLayer *>( currentLayer );
       if ( isVectLyr )
       {
@@ -1579,6 +1581,15 @@ void QgsMapCanvas::layerStateChange()
 
 } // layerStateChange
 
+void QgsMapCanvas::layerCrsChange()
+{
+  // called when a layer's CRS has been changed
+  QObject *theSender = sender();
+  QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( theSender );
+  QString destAuthId = mSettings.destinationCrs().authid();
+  getDatumTransformInfo( layer, layer->crs().authid(), destAuthId );
+
+} // layerCrsChange
 
 
 void QgsMapCanvas::freeze( bool frz )
diff --git a/src/gui/qgsmapcanvas.h b/src/gui/qgsmapcanvas.h
index 47ef209..5561ea5 100644
--- a/src/gui/qgsmapcanvas.h
+++ b/src/gui/qgsmapcanvas.h
@@ -410,6 +410,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
     //! This slot is connected to the visibility change of one or more layers
     void layerStateChange();
 
+    //! This slot is connected to the layer's CRS change
+    void layerCrsChange();
+
     //! Whether to suppress rendering or not
     void setRenderFlag( bool theFlag );
     //! State of render suppression flag
diff --git a/src/gui/qgsrasterlayersaveasdialog.cpp b/src/gui/qgsrasterlayersaveasdialog.cpp
index 7875760..33d6086 100644
--- a/src/gui/qgsrasterlayersaveasdialog.cpp
+++ b/src/gui/qgsrasterlayersaveasdialog.cpp
@@ -155,12 +155,16 @@ QgsRasterLayerSaveAsDialog::~QgsRasterLayerSaveAsDialog()
 void QgsRasterLayerSaveAsDialog::on_mBrowseButton_clicked()
 {
   QString fileName;
+
+  QSettings settings;
+  QString dirName = mSaveAsLineEdit->text().isEmpty() ? settings.value( "/UI/lastRasterFileDir", "." ).toString() : mSaveAsLineEdit->text();
+
   if ( mTileModeCheckBox->isChecked() )
   {
     while ( true )
     {
       // TODO: would not it be better to select .vrt file instead of directory?
-      fileName = QFileDialog::getExistingDirectory( this, tr( "Select output directory" ) );
+      fileName = QFileDialog::getExistingDirectory( this, tr( "Select output directory" ), dirName );
       //fileName = QFileDialog::getSaveFileName( this, tr( "Select output file" ), QString(), tr( "VRT" ) + " (*.vrt *.VRT)" );
 
       if ( fileName.isEmpty() ) break; // canceled
@@ -194,7 +198,7 @@ void QgsRasterLayerSaveAsDialog::on_mBrowseButton_clicked()
   }
   else
   {
-    fileName = QFileDialog::getSaveFileName( this, tr( "Select output file" ), QString(), tr( "GeoTIFF" ) + " (*.tif *.tiff *.TIF *.TIFF)" );
+    fileName = QFileDialog::getSaveFileName( this, tr( "Select output file" ), dirName, tr( "GeoTIFF" ) + " (*.tif *.tiff *.TIF *.TIFF)" );
   }
 
   if ( !fileName.isEmpty() )
diff --git a/src/gui/qgsrubberband.cpp b/src/gui/qgsrubberband.cpp
index 7cc1e18..d9ede04 100644
--- a/src/gui/qgsrubberband.cpp
+++ b/src/gui/qgsrubberband.cpp
@@ -182,6 +182,7 @@ void QgsRubberBand::addPoint( const QgsPoint & p, bool doUpdate /* = true */, in
 
   if ( doUpdate )
   {
+    setVisible( true );
     updateRect();
     update();
   }
@@ -418,6 +419,7 @@ void QgsRubberBand::addGeometry( QgsGeometry* geom, QgsVectorLayer* layer )
       return;
   }
 
+  setVisible( true );
   updateRect();
   update();
 }
@@ -535,7 +537,8 @@ void QgsRubberBand::updateRect()
 
   const QgsMapToPixel& m2p = *( mMapCanvas->getCoordinateTransform() );
 
-  qreal w = ( mIconSize - 1 ) / 2 + mPen.width();
+  qreal res = m2p.mapUnitsPerPixel();
+  qreal w = ( ( mIconSize - 1 ) / 2 + mPen.width() ) / res;
 
   QgsRectangle r;
   for ( int i = 0; i < mPoints.size(); ++i )
@@ -547,23 +550,35 @@ void QgsRubberBand::updateRect()
       QgsPoint p( it->x() + mTranslationOffsetX, it->y() + mTranslationOffsetY );
       p = m2p.transform( p );
       QgsRectangle rect( p.x() - w, p.y() - w, p.x() + w, p.y() + w );
-      r.combineExtentWith( &rect );
+
+      if ( r.isEmpty() )
+      {
+        // Get rectangle of the first point
+        r = rect;
+      }
+      else
+      {
+        r.combineExtentWith( &rect );
+      }
     }
   }
 
   // This is an hack to pass QgsMapCanvasItem::setRect what it
   // expects (encoding of position and size of the item)
   QgsPoint topLeft = m2p.toMapPoint( r.xMinimum(), r.yMinimum() );
-  double res = m2p.mapUnitsPerPixel();
   QgsRectangle rect( topLeft.x(), topLeft.y(), topLeft.x() + r.width()*res, topLeft.y() - r.height()*res );
 
   setRect( rect );
-  setVisible( true );
 }
 
 void QgsRubberBand::updatePosition( )
 {
-  // nothing to do here...
+  // re-compute rectangle
+  // See http://hub.qgis.org/issues/12392
+  // NOTE: could be optimized by saving map-extent
+  //       of rubberband and simply re-projecting
+  //       that to device-rectange on "updatePosition"
+  updateRect();
 }
 
 void QgsRubberBand::setTranslationOffset( double dx, double dy )
diff --git a/src/gui/raster/qgsrasterhistogramwidget.cpp b/src/gui/raster/qgsrasterhistogramwidget.cpp
index bb9c58f..5459542 100644
--- a/src/gui/raster/qgsrasterhistogramwidget.cpp
+++ b/src/gui/raster/qgsrasterhistogramwidget.cpp
@@ -1025,7 +1025,7 @@ void QgsRasterHistogramWidget::on_btnHistoMin_toggled()
       QApplication::setOverrideCursor( Qt::PointingHandCursor );
     }
     if ( mHistoZoomer != NULL )
-      mHistoZoomer->setEnabled( ! btnHistoMax->isChecked() );
+      mHistoZoomer->setEnabled( ! btnHistoMin->isChecked() );
     mHistoPicker->setEnabled( btnHistoMin->isChecked() );
   }
   updateHistoMarkers();
diff --git a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
index dffadba..ec13c36 100644
--- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
+++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
@@ -800,8 +800,8 @@ QVariant QgsRuleBasedRendererV2Model::data( const QModelIndex &index, int role )
     {
       case 0: return rule->label();
       case 1: return rule->filterExpression();
-      case 2: return rule->scaleMinDenom();
-      case 3: return rule->scaleMaxDenom();
+      case 2: return rule->scaleMaxDenom();
+      case 3: return rule->scaleMinDenom();
       default: return QVariant();
     }
   }
@@ -906,10 +906,10 @@ bool QgsRuleBasedRendererV2Model::setData( const QModelIndex & index, const QVar
       rule->setFilterExpression( value.toString() );
       break;
     case 2: // scale min
-      rule->setScaleMinDenom( value.toInt() );
+      rule->setScaleMaxDenom( value.toInt() );
       break;
     case 3: // scale max
-      rule->setScaleMaxDenom( value.toInt() );
+      rule->setScaleMinDenom( value.toInt() );
       break;
     default:
       return false;
diff --git a/src/plugins/grass/qgsgrassnewmapset.cpp b/src/plugins/grass/qgsgrassnewmapset.cpp
index d82795e..aa6c079 100644
--- a/src/plugins/grass/qgsgrassnewmapset.cpp
+++ b/src/plugins/grass/qgsgrassnewmapset.cpp
@@ -1263,12 +1263,7 @@ void QgsGrassNewMapset::createMapset()
 
     // TODO: add QgsGrass::setLocation or G_make_location with
     //       database path
-    if ( !QgsGrass::activeMode() ) // because it calls private QgsGrass::init()
-    {
-      QMessageBox::warning( this, tr( "Create mapset" ),
-                            tr( "Cannot activate grass" ) );
-      return;
-    }
+    QgsGrass::activeMode(); // because it calls private QgsGrass::init()
 
 #if defined(WIN32)
     G__setenv(( char * ) "GISDBASE", QgsGrass::shortPath( mDatabaseLineEdit->text() ).toUtf8().data() );
diff --git a/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp b/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
index 2e4ff77..9c73cb7 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
+++ b/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
@@ -447,7 +447,7 @@ void QgsDelimitedTextFeatureIterator::fetchAttribute( QgsFeature& feature, int f
 
 QgsDelimitedTextFeatureSource::QgsDelimitedTextFeatureSource( const QgsDelimitedTextProvider* p )
     : mGeomRep( p->mGeomRep )
-    , mSubsetExpression( p->mSubsetExpression )
+    , mSubsetExpression( p->mSubsetExpression ? new QgsExpression(p->mSubsetExpression->expression()) : 0 )
     , mExtent( p->mExtent )
     , mUseSpatialIndex( p->mUseSpatialIndex )
     , mSpatialIndex( p->mSpatialIndex ? new QgsSpatialIndex( *p->mSpatialIndex ) : 0 )
@@ -472,6 +472,7 @@ QgsDelimitedTextFeatureSource::QgsDelimitedTextFeatureSource( const QgsDelimited
 
 QgsDelimitedTextFeatureSource::~QgsDelimitedTextFeatureSource()
 {
+  delete mSubsetExpression;
   delete mSpatialIndex;
   delete mFile;
 }
diff --git a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
index 7ce9ba4..aea13ce 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
+++ b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
@@ -84,7 +84,13 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
     , mBuildSpatialIndex( false )
     , mSpatialIndex( 0 )
 {
-  QgsDebugMsg( "Delimited text file uri is " + uri );
+  mNativeTypes
+  << QgsVectorDataProvider::NativeType( tr( "Whole number (integer)" ), "integer", QVariant::Int, 0, 10 )
+  << QgsVectorDataProvider::NativeType( tr( "Decimal number (double)" ), "double precision", QVariant::Double, -1, -1, -1, -1 )
+  << QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (text)" ), "text", QVariant::String, -1, -1, -1, -1 )
+  ;
+
+ QgsDebugMsg( "Delimited text file uri is " + uri );
 
   QUrl url = QUrl::fromEncoded( uri.toAscii() );
   mFile = new QgsDelimitedTextFile();
diff --git a/src/providers/gdal/qgsgdalprovider.cpp b/src/providers/gdal/qgsgdalprovider.cpp
index eea2df2..956d2d7 100644
--- a/src/providers/gdal/qgsgdalprovider.cpp
+++ b/src/providers/gdal/qgsgdalprovider.cpp
@@ -1091,9 +1091,9 @@ QGis::DataType QgsGdalProvider::srcDataType( int bandNo ) const
   // define if the band has scale and offset to apply
   double myScale = bandScale( bandNo );
   double myOffset = bandOffset( bandNo );
-  if ( myScale != 1.0 && myOffset != 0.0 )
+  if ( myScale != 1.0 || myOffset != 0.0 )
   {
-    // if the band has scale and offset to apply change dataType
+    // if the band has scale or offset to apply change dataType
     switch ( myDataType )
     {
       case QGis::UnknownDataType:
@@ -2486,7 +2486,7 @@ void QgsGdalProvider::initBaseDataset()
     }
     else
     {
-      hasGeoTransform = GDALGetGeoTransform( mGdalDataset, mGeoTransform );
+      hasGeoTransform = GDALGetGeoTransform( mGdalDataset, mGeoTransform ) == CE_None;
     }
   }
   else
@@ -2650,9 +2650,9 @@ void QgsGdalProvider::initBaseDataset()
     // define if the band has scale and offset to apply
     double myScale = bandScale( i );
     double myOffset = bandOffset( i );
-    if ( myScale != 1.0 && myOffset != 0.0 )
+    if ( !qgsDoubleNear( myScale, 1.0 ) || !qgsDoubleNear( myOffset, 0.0 ) )
     {
-      // if the band has scale and offset to apply change dataType
+      // if the band has scale or offset to apply change dataType
       switch ( myGdalDataType )
       {
         case GDT_Unknown:
diff --git a/src/providers/grass/qgsgrass.cpp b/src/providers/grass/qgsgrass.cpp
index 339a4c0..bb97873 100644
--- a/src/providers/grass/qgsgrass.cpp
+++ b/src/providers/grass/qgsgrass.cpp
@@ -50,15 +50,6 @@ extern "C"
 #endif
 }
 
-#if GRASS_VERSION_MAJOR >= 7
-#define G_suppress_masking Rast_suppress_masking
-#define BOUND_BOX bound_box
-#endif
-
-#if GRASS_VERSION_MAJOR > 7 || (GRASS_VERSION_MAJOR == 7 && GRASS_VERSION_MINOR >= 1)
-#define G_available_mapsets G_get_available_mapsets
-#endif
-
 #if !defined(GRASS_VERSION_MAJOR) || \
     !defined(GRASS_VERSION_MINOR) || \
     GRASS_VERSION_MAJOR<6 || \
@@ -66,6 +57,9 @@ extern "C"
 #define G__setenv(name,value) G__setenv( ( char * ) (name), (char *) (value) )
 #endif
 
+#define GRASS_LOCK sMutex.lock();
+#define GRASS_UNLOCK sMutex.unlock();
+
 #ifdef Q_OS_WIN
 #include <windows.h>
 QString GRASS_LIB_EXPORT QgsGrass::shortPath( const QString &path )
@@ -420,6 +414,8 @@ QString QgsGrass::mMapsetLock;
 QString QgsGrass::mGisrc;
 QString QgsGrass::mTmp;
 
+QMutex QgsGrass::sMutex;
+
 int QgsGrass::error_routine( char *msg, int fatal )
 {
   return error_routine(( const char* ) msg, fatal );
@@ -427,6 +423,9 @@ int QgsGrass::error_routine( char *msg, int fatal )
 
 int QgsGrass::error_routine( const char *msg, int fatal )
 {
+  // G_fatal_error obviously is not thread safe (everything static in GRASS, especially fatal_jmp_buf)
+  // it means that anything which may end up with G_fatal_error must use mutex
+
   // Unfortunately the exceptions thrown here can only be caught if GRASS libraries are compiled
   // with -fexception option on Linux (works on Windows)
   // GRASS developers are reluctant to add -fexception by default
@@ -442,13 +441,8 @@ int QgsGrass::error_routine( const char *msg, int fatal )
     //throw QgsGrass::Exception( QString::fromUtf8( msg ) );
     lastError = FATAL;
 
-#if (GRASS_VERSION_MAJOR == 7) && (GRASS_VERSION_MINOR == 0)
-    // G_fatal_error in GRASS 7.0.0beta1 always exits the second time it is called. This was fixed in 7.1.
-    QMessageBox::warning( 0, QObject::tr( "Warning" ), QObject::tr( "Fatal error occurred in GRASS library. QGIS gets over the error but any next fatal error will cause QGIS exit without warning. This is a problem of GRASS 7.0.0beta1 but it is fixed in GRASS 7.1 and higher. Error message: %1" ).arg( msg ) );
-#endif
-
-#if (GRASS_VERSION_MAJOR < 7) || (GRASS_VERSION_MAJOR == 7 && GRASS_VERSION_MINOR == 0)
-    // longjump() is called by G_fatal_error in GRASS >= 7.1
+#if (GRASS_VERSION_MAJOR < 7)
+    // longjump() is called by G_fatal_error in GRASS >= 7
     longjmp( QgsGrass::jumper, 1 );
 #endif
   }
@@ -816,6 +810,7 @@ QStringList GRASS_LIB_EXPORT QgsGrass::vectors( QString mapsetPath )
 QStringList GRASS_LIB_EXPORT QgsGrass::vectorLayers( QString gisdbase,
     QString location, QString mapset, QString mapName )
 {
+  GRASS_LOCK
   QgsDebugMsg( QString( "gisdbase = %1 location = %2 mapset = %3 mapName = %4" ).arg( gisdbase ).arg( location ).arg( mapset ).arg( mapName ) );
   QStringList list;
 
@@ -840,6 +835,7 @@ QStringList GRASS_LIB_EXPORT QgsGrass::vectorLayers( QString gisdbase,
   {
     Q_UNUSED( e );
     QgsDebugMsg( QString( "Cannot open GRASS vector: %1" ).arg( e.what() ) );
+    GRASS_UNLOCK
     return list;
   }
 
@@ -853,12 +849,14 @@ QStringList GRASS_LIB_EXPORT QgsGrass::vectorLayers( QString gisdbase,
 #ifndef Q_OS_WIN
     Vect_close( &map );
 #endif
+    GRASS_UNLOCK
     return list;
   }
   else if ( level < 1 )
   {
     QgsDebugMsg( "Cannot open vector" );
     QMessageBox::warning( 0, QObject::tr( "Warning" ), QObject::tr( "Cannot open vector %1 in mapset %2" ).arg( mapName ).arg( mapset ) );
+    GRASS_UNLOCK
     return list;
   }
 
@@ -940,6 +938,7 @@ QStringList GRASS_LIB_EXPORT QgsGrass::vectorLayers( QString gisdbase,
 
   Vect_close( &map );
 
+  GRASS_UNLOCK
   return list;
 }
 
diff --git a/src/providers/grass/qgsgrass.h b/src/providers/grass/qgsgrass.h
index d02911f..f893cea 100644
--- a/src/providers/grass/qgsgrass.h
+++ b/src/providers/grass/qgsgrass.h
@@ -16,6 +16,8 @@
 #ifndef QGSGRASS_H
 #define QGSGRASS_H
 
+#include <QMutex>
+
 #include <setjmp.h>
 
 // GRASS header files
@@ -42,13 +44,23 @@ class QgsRectangle;
 #define EXPAND(x) STR(x)
 #define GRASS_VERSION_RELEASE_STRING EXPAND( GRASS_VERSION_RELEASE )
 
-#if (GRASS_VERSION_MAJOR < 7) || (GRASS_VERSION_MAJOR == 7 && GRASS_VERSION_MINOR == 0)
+#if (GRASS_VERSION_MAJOR < 7)
 #define G_TRY try { if( !setjmp( QgsGrass::jumper ) )
 #else
 #define G_TRY try { if( !setjmp(*G_fatal_longjmp(1)) )
 #endif
 #define G_CATCH else { throw QgsGrass::Exception( QgsGrass::errorMessage() ); } } catch
 
+#if GRASS_VERSION_MAJOR >= 7
+#define G_available_mapsets G_get_available_mapsets
+#define G__mapset_permissions2 G_mapset_permissions2
+#define G_suppress_masking Rast_suppress_masking
+#define G__get_window G_get_element_window
+#define G__getenv G_getenv_nofatal
+#define G__setenv G_setenv_nogisrc
+#define BOUND_BOX bound_box
+#endif
+
 /*!
    Methods for C library initialization and error handling.
 */
@@ -298,6 +310,8 @@ class QgsGrass
     static QString mGisrc;
     // Temporary directory where GISRC and sockets are stored
     static QString mTmp;
+    // Mutex for common locking when calling GRASS functions which are mostly non thread safe
+    static QMutex sMutex;
 };
 
 #endif // QGSGRASS_H
diff --git a/src/providers/oracle/ocispatial/qsql_ocispatial.cpp b/src/providers/oracle/ocispatial/qsql_ocispatial.cpp
index 1402b6b..329d1a1 100644
--- a/src/providers/oracle/ocispatial/qsql_ocispatial.cpp
+++ b/src/providers/oracle/ocispatial/qsql_ocispatial.cpp
@@ -3449,10 +3449,16 @@ bool QOCISpatialDriver::open( const QString & db,
     setLastError( qMakeError( tr( "Unable to logon" ), QSqlError::ConnectionError, d->err ) );
     setOpenError( true );
     if ( d->authp )
+    {
+      OCISessionEnd( d->svc, d->err, d->authp, OCI_DEFAULT );
       OCIHandleFree( d->authp, OCI_HTYPE_SESSION );
+    }
     d->authp = 0;
     if ( d->srvhp )
+    {
+      OCIServerDetach( d->srvhp, d->err, OCI_DEFAULT );
       OCIHandleFree( d->srvhp, OCI_HTYPE_SERVER );
+    }
     d->srvhp = 0;
     return false;
   }
diff --git a/src/providers/oracle/qgsoracleconn.cpp b/src/providers/oracle/qgsoracleconn.cpp
index 353c1f8..d081bd4 100644
--- a/src/providers/oracle/qgsoracleconn.cpp
+++ b/src/providers/oracle/qgsoracleconn.cpp
@@ -464,7 +464,7 @@ void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, b
       layerProperty.types << detectedType;
     }
 
-    int srid = detectedSrid != -1 ? detectedSrid : ( qry.value( idx ).isNull() ? -1 : qry.value( idx ).toInt() );
+    int srid = detectedSrid > 0 ? detectedSrid : ( qry.value( idx ).isNull() ? -1 : qry.value( idx ).toInt() );
     layerProperty.srids << srid;
     srids << srid;
   }
diff --git a/src/providers/oracle/qgsoraclefeatureiterator.cpp b/src/providers/oracle/qgsoraclefeatureiterator.cpp
index 3549e89..39318bf 100644
--- a/src/providers/oracle/qgsoraclefeatureiterator.cpp
+++ b/src/providers/oracle/qgsoraclefeatureiterator.cpp
@@ -66,14 +66,13 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource* sour
                        .arg( qgsDoubleToString( rect.yMaximum() ) );
 
         whereClause = QString( "sdo_filter(%1,%2)='TRUE'" ).arg( QgsOracleProvider::quotedIdentifier( mSource->mGeometryColumn ) ).arg( bbox );
-#if 0
-        if ( mRequest.flags() & QgsFeatureRequest::ExactIntersect )
+
+        if ( mRequest.flags() & QgsFeatureRequest::ExactIntersect && mConnection->hasSpatial() )
         {
           whereClause += QString( " AND sdo_relate(%1,%2,'mask=ANYINTERACT')='TRUE'" )
-                         .arg( quotedIdentifier( P->mGeometryColumn ) )
+                         .arg( QgsOracleProvider::quotedIdentifier( mSource->mGeometryColumn ) )
                          .arg( bbox );
         }
-#endif
       }
       break;
 
diff --git a/src/providers/oracle/qgsoraclenewconnection.cpp b/src/providers/oracle/qgsoraclenewconnection.cpp
index 1d991a1..7bca5df 100644
--- a/src/providers/oracle/qgsoraclenewconnection.cpp
+++ b/src/providers/oracle/qgsoraclenewconnection.cpp
@@ -157,7 +157,7 @@ void QgsOracleNewConnection::on_btnConnect_clicked()
   {
     QMessageBox::information( this,
                               tr( "Test connection" ),
-                              tr( "Connection failed - Check settings and try again.\n\n" ) );
+                              tr( "Connection failed - consult message log for details.\n\n" ) );
   }
 }
 
diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp
index 7ae2351..5f4c36c 100644
--- a/src/providers/oracle/qgsoracleprovider.cpp
+++ b/src/providers/oracle/qgsoracleprovider.cpp
@@ -461,7 +461,7 @@ QString QgsOracleUtils::whereClause( QgsFeatureIds featureIds, const QgsFields &
   {
     whereClauses << whereClause( featureId, fields, primaryKeyType, primaryKeyAttrs, sharedData );
   }
-  return whereClauses.join( " AND " );
+  return whereClauses.isEmpty() ? "" : whereClauses.join( " OR " ).prepend( "(" ).append( ")" );
 }
 
 
diff --git a/src/providers/postgres/qgspgnewconnection.cpp b/src/providers/postgres/qgspgnewconnection.cpp
index 5e169a9..083dd95 100644
--- a/src/providers/postgres/qgspgnewconnection.cpp
+++ b/src/providers/postgres/qgspgnewconnection.cpp
@@ -197,6 +197,6 @@ void QgsPgNewConnection::testConnection()
   {
     QMessageBox::information( this,
                               tr( "Test connection" ),
-                              tr( "Connection failed - Check settings and try again.\n\n" ) );
+                              tr( "Connection failed - consult message log for details.\n\n" ) );
   }
 }
diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp
index 5e11bf2..2ab4f14 100644
--- a/src/providers/postgres/qgspostgresconn.cpp
+++ b/src/providers/postgres/qgspostgresconn.cpp
@@ -321,7 +321,7 @@ void QgsPostgresConn::addColumnInfo( QgsPostgresLayerProperty& layerProperty, co
   // TODO: optimize this query when pk candidates aren't needed
   //       could use array_agg() and count()
   //       array output would look like this: "{One,tWo}"
-  QString sql = QString( "SELECT attname, CASE WHEN typname = ANY(ARRAY['geometry','geography','topogeometry']) THEN 1 ELSE null END AS isSpatial FROM pg_attribute JOIN pg_type ON atttypid=pg_type.oid WHERE attrelid=regclass('%1.%2')" )
+  QString sql = QString( "SELECT attname, CASE WHEN typname = ANY(ARRAY['geometry','geography','topogeometry']) THEN 1 ELSE null END AS isSpatial FROM pg_attribute JOIN pg_type ON atttypid=pg_type.oid WHERE attrelid=regclass('%1.%2') AND attnum>0" )
                 .arg( quotedIdentifier( schemaName ) )
                 .arg( quotedIdentifier( viewName ) );
   //QgsDebugMsg( sql );
@@ -454,13 +454,15 @@ bool QgsPostgresConn::getTableInfo( bool searchGeometryColumnsOnly, bool searchP
         srid = INT_MIN;
       }
 
-      /*QgsDebugMsg( QString( "%1 : %2.%3.%4: %5 %6 %7 %8" )
+#if 0
+      QgsDebugMsg( QString( "%1 : %2.%3.%4: %5 %6 %7 %8" )
                    .arg( gtableName )
                    .arg( schemaName ).arg( tableName ).arg( column )
                    .arg( type )
                    .arg( srid )
                    .arg( relkind )
-                   .arg( dim ) );*/
+                   .arg( dim ) );
+#endif
 
       layerProperty.schemaName = schemaName;
       layerProperty.tableName = tableName;
@@ -469,7 +471,12 @@ bool QgsPostgresConn::getTableInfo( bool searchGeometryColumnsOnly, bool searchP
       layerProperty.types = QList<QGis::WkbType>() << ( QgsPostgresConn::wkbTypeFromPostgis( type ) );
       layerProperty.srids = QList<int>() << srid;
       layerProperty.sql = "";
-      layerProperty.force2d = dim == 4;
+      /*
+       * force2d may get a false negative value
+       * (dim == 2 but is not really constrained)
+       * http://trac.osgeo.org/postgis/ticket/3068
+       */
+      layerProperty.force2d = dim > 3;
       addColumnInfo( layerProperty, schemaName, tableName, isView );
 
       if ( isView && layerProperty.pkCols.empty() )
@@ -1170,34 +1177,35 @@ qint64 QgsPostgresConn::getBinaryInt( QgsPostgresResult &queryResult, int row, i
   return oid;
 }
 
-QString QgsPostgresConn::fieldExpression( const QgsField &fld )
+QString QgsPostgresConn::fieldExpression( const QgsField &fld, QString expr )
 {
   const QString &type = fld.typeName();
+  expr = expr.arg( quotedIdentifier( fld.name() ) );
   if ( type == "money" )
   {
-    return QString( "cash_out(%1)" ).arg( quotedIdentifier( fld.name() ) );
+    return QString( "cash_out(%1)::text" ).arg( expr );
   }
   else if ( type.startsWith( "_" ) )
   {
-    return QString( "array_out(%1)" ).arg( quotedIdentifier( fld.name() ) );
+    return QString( "array_out(%1)::text" ).arg( expr );
   }
   else if ( type == "bool" )
   {
-    return QString( "boolout(%1)" ).arg( quotedIdentifier( fld.name() ) );
+    return QString( "boolout(%1)::text" ).arg( expr );
   }
   else if ( type == "geometry" )
   {
     return QString( "%1(%2)" )
            .arg( majorVersion() < 2 ? "asewkt" : "st_asewkt" )
-           .arg( quotedIdentifier( fld.name() ) );
+           .arg( expr );
   }
   else if ( type == "geography" )
   {
-    return QString( "st_astext(%1)" ).arg( quotedIdentifier( fld.name() ) );
+    return QString( "st_astext(%1)" ).arg( expr );
   }
   else
   {
-    return quotedIdentifier( fld.name() ) + "::text";
+    return expr + "::text";
   }
 }
 
@@ -1298,9 +1306,17 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
       query += QString::number( srid );
     }
 
+    if ( !layerProperty.force2d )
+    {
+      query += QString( ",%1(%2%3)" )
+               .arg( majorVersion() < 2 ? "ndims" : "st_ndims" )
+               .arg( quotedIdentifier( layerProperty.geometryColName ) )
+               .arg( layerProperty.geometryColType == sctGeography ? "::geometry" : "" );
+    }
+
     query += " FROM " + table;
 
-    //QgsDebugMsg( "Retrieving geometry types: " + query );
+    //QgsDebugMsg( "Retrieving geometry types,srids and dims: " + query );
 
     QgsPostgresResult gresult = PQexec( query );
 
@@ -1310,6 +1326,12 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
       {
         QString type = gresult.PQgetvalue( i, 0 );
         QString srid = gresult.PQgetvalue( i, 1 );
+
+        if ( !layerProperty.force2d && gresult.PQgetvalue( i, 2 ).toInt() > 3 )
+        {
+          layerProperty.force2d = true;
+        }
+
         if ( type.isEmpty() )
           continue;
 
diff --git a/src/providers/postgres/qgspostgresconn.h b/src/providers/postgres/qgspostgresconn.h
index e99aed8..08d54db 100644
--- a/src/providers/postgres/qgspostgresconn.h
+++ b/src/providers/postgres/qgspostgresconn.h
@@ -285,7 +285,7 @@ class QgsPostgresConn : public QObject
 
     qint64 getBinaryInt( QgsPostgresResult &queryResult, int row, int col );
 
-    QString fieldExpression( const QgsField &fld );
+    QString fieldExpression( const QgsField &fld, QString expr = "%1" );
 
     QString connInfo() const { return mConnInfo; }
 
diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp
index 446b03f..34228b2 100644
--- a/src/providers/postgres/qgspostgresdataitems.cpp
+++ b/src/providers/postgres/qgspostgresdataitems.cpp
@@ -263,8 +263,9 @@ QString QgsPGLayerItem::createUri()
 
   QgsDataSourceURI uri( QgsPostgresConn::connUri( connItem->name() ).connectionInfo() );
   uri.setDataSource( mLayerProperty.schemaName, mLayerProperty.tableName, mLayerProperty.geometryColName, mLayerProperty.sql, pkColName );
-  uri.setSrid( QString::number( mLayerProperty.srids[0] ) );
   uri.setWkbType( mLayerProperty.types[0] );
+  if ( uri.wkbType() != QGis::WKBNoGeometry )
+    uri.setSrid( QString::number( mLayerProperty.srids[0] ) );
   QgsDebugMsg( QString( "layer uri: %1" ).arg( uri.uri() ) );
   return uri.uri();
 }
diff --git a/src/providers/postgres/qgspostgresfeatureiterator.cpp b/src/providers/postgres/qgspostgresfeatureiterator.cpp
index 7604b54..3d3509b 100644
--- a/src/providers/postgres/qgspostgresfeatureiterator.cpp
+++ b/src/providers/postgres/qgspostgresfeatureiterator.cpp
@@ -322,7 +322,12 @@ bool QgsPostgresFeatureIterator::declareCursor( const QString& whereClause )
     if ( mSource->mForce2d )
     {
       geom = QString( "%1(%2)" )
-             .arg( mConn->majorVersion() < 2 ? "force_2d" : "st_force_2d" )
+                   // Force_2D before 2.0
+             .arg( mConn->majorVersion() < 2 ? "force_2d"
+                   // ST_Force2D since 2.1.0
+                   : mConn->majorVersion() > 2 || mConn->minorVersion() > 0 ? "st_force2d"
+                   // ST_Force_2D in 2.0.x
+                   : "st_force_2d" )
              .arg( geom );
     }
 
@@ -564,7 +569,6 @@ void QgsPostgresFeatureIterator::getFeatureAttribute( int idx, QgsPostgresResult
 QgsPostgresFeatureSource::QgsPostgresFeatureSource( const QgsPostgresProvider* p )
     : mConnInfo( p->mUri.connectionInfo() )
     , mGeometryColumn( p->mGeometryColumn )
-    , mSqlWhereClause( p->mSqlWhereClause )
     , mFields( p->mAttributeFields )
     , mSpatialColType( p->mSpatialColType )
     , mRequestedSrid( p->mRequestedSrid )
@@ -577,6 +581,11 @@ QgsPostgresFeatureSource::QgsPostgresFeatureSource( const QgsPostgresProvider* p
     , mQuery( p->mQuery )
     , mShared( p->mShared )
 {
+  mSqlWhereClause = p->filterWhereClause();
+
+  if ( mSqlWhereClause.startsWith( " WHERE " ) )
+    mSqlWhereClause = mSqlWhereClause.mid( 7 );
+
   if ( p->mTransaction )
   {
     mTransactionConnection = p->mTransaction->connection();
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index ddc4888..f82b378 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -545,7 +545,7 @@ QString QgsPostgresUtils::whereClause( QgsFeatureIds featureIds, const QgsFields
     whereClauses << whereClause( featureId, fields, conn, pkType, pkAttrs, sharedData );
   }
 
-  return whereClauses.join( " OR " );
+  return whereClauses.isEmpty() ? "" : whereClauses.join( " OR " ).prepend( "(" ).append( ")" );
 }
 
 QString QgsPostgresProvider::filterWhereClause() const
@@ -1234,8 +1234,8 @@ QVariant QgsPostgresProvider::minimumValue( int index )
   {
     // get the field name
     const QgsField &fld = field( index );
-    QString sql = QString( "SELECT min(%1) FROM %2" )
-                  .arg( connectionRO()->fieldExpression( fld ) )
+    QString sql = QString( "SELECT %1 FROM %2" )
+                  .arg( connectionRO()->fieldExpression( fld, "min(%1)" ) )
                   .arg( mQuery );
 
     if ( !mSqlWhereClause.isEmpty() )
@@ -1270,8 +1270,7 @@ void QgsPostgresProvider::uniqueValues( int index, QList<QVariant> &uniqueValues
       sql += QString( " WHERE %1" ).arg( mSqlWhereClause );
     }
 
-    sql +=  QString( " ORDER BY %1" )
-            .arg( quotedIdentifier( fld.name() ) );
+    sql +=  QString( " ORDER BY %1" ).arg( connectionRO()->fieldExpression( fld ) );
 
     if ( limit >= 0 )
     {
@@ -1407,8 +1406,8 @@ QVariant QgsPostgresProvider::maximumValue( int index )
   {
     // get the field name
     const QgsField &fld = field( index );
-    QString sql = QString( "SELECT max(%1) FROM %2" )
-                  .arg( connectionRO()->fieldExpression( fld ) )
+    QString sql = QString( "SELECT %1 FROM %2" )
+                  .arg( connectionRO()->fieldExpression( fld, "max(%1)" ) )
                   .arg( mQuery );
 
     if ( !mSqlWhereClause.isEmpty() )
@@ -2969,7 +2968,7 @@ QgsVectorLayerImport::ImportError QgsPostgresProvider::createEmptyLayer(
       {
         // it already exists, try again with a new name
         primaryKey = QString( "%1_%2" ).arg( pk ).arg( index++ );
-        fldIdx = 0;
+        fldIdx = -1; // it is incremented in the for loop, i.e. restarts at 0
       }
     }
   }
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
index a14d6b4..988b646 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
@@ -44,6 +44,11 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
     whereClause += whereClauseFid();
   }
 
+  if ( request.filterType() == QgsFeatureRequest::FilterFids )
+  {
+    whereClause += whereClauseFids();
+  }
+
   if ( !mSource->mSubsetString.isEmpty() )
   {
     if ( !whereClause.isEmpty() )
@@ -196,6 +201,16 @@ QString QgsSpatiaLiteFeatureIterator::whereClauseFid()
   return QString( "%1=%2" ).arg( quotedPrimaryKey() ).arg( mRequest.filterFid() );
 }
 
+QString QgsSpatiaLiteFeatureIterator::whereClauseFids()
+{
+  QStringList whereClauses;
+  foreach ( const QgsFeatureId featureId, mRequest.filterFids() )
+  {
+    whereClauses << QString( "%1=%2" ).arg( quotedPrimaryKey() ).arg( featureId );
+  }
+  return whereClauses.isEmpty() ? "" : whereClauses.join( " OR " ).prepend( "(" ).append( ")" );
+}
+
 QString QgsSpatiaLiteFeatureIterator::whereClauseRect()
 {
   QgsRectangle rect = mRequest.filterRect();
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.h b/src/providers/spatialite/qgsspatialitefeatureiterator.h
index 702d289..21a50a9 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.h
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.h
@@ -71,6 +71,7 @@ class QgsSpatiaLiteFeatureIterator : public QgsAbstractFeatureIteratorFromSource
 
     QString whereClauseRect();
     QString whereClauseFid();
+    QString whereClauseFids();
     QString mbr( const QgsRectangle& rect );
     bool prepareStatement( QString whereClause );
     QString quotedPrimaryKey();
diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp
index 9dd6e5a..58c1492 100644
--- a/src/providers/spatialite/qgsspatialiteprovider.cpp
+++ b/src/providers/spatialite/qgsspatialiteprovider.cpp
@@ -157,7 +157,7 @@ QgsSpatiaLiteProvider::createEmptyLayer(
         {
           // it already exists, try again with a new name
           primaryKey = QString( "%1_%2" ).arg( pk ).arg( index++ );
-          fldIdx = 0;
+          fldIdx = -1; // it is incremented in the for loop, i.e. restarts at 0
         }
       }
     }
diff --git a/src/providers/wms/qgswmscapabilities.h b/src/providers/wms/qgswmscapabilities.h
index 93d1db7..4915674 100644
--- a/src/providers/wms/qgswmscapabilities.h
+++ b/src/providers/wms/qgswmscapabilities.h
@@ -420,7 +420,7 @@ enum QgsWmsDpiMode
   dpiQGIS = 1,
   dpiUMN = 2,
   dpiGeoServer = 4,
-  dpiAll = dpiQGIS | dpiUMN | dpiUMN,
+  dpiAll = dpiQGIS | dpiUMN | dpiGeoServer,
 };
 
 
diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp
index 580c2da..8fa0970 100644
--- a/src/providers/wms/qgswmsprovider.cpp
+++ b/src/providers/wms/qgswmsprovider.cpp
@@ -123,7 +123,8 @@ QgsWmsProvider::QgsWmsProvider( QString const& uri, const QgsWmsCapabilities* ca
     return;
   }
 
-  addLayers();
+  if ( !addLayers() )
+    return;
 
   // if there are already parsed capabilities, use them!
   if ( capabilities )
@@ -265,15 +266,14 @@ QString QgsWmsProvider::getLegendGraphicUrl() const
   return url.isEmpty() ? url : prepareUri( url );
 }
 
-void QgsWmsProvider::addLayers()
+bool QgsWmsProvider::addLayers()
 {
   QgsDebugMsg( "Entering: layers:" + mSettings.mActiveSubLayers.join( ", " ) + ", styles:" + mSettings.mActiveSubStyles.join( ", " ) );
 
   if ( mSettings.mActiveSubLayers.size() != mSettings.mActiveSubStyles.size() )
   {
     QgsMessageLog::logMessage( tr( "Number of layers and styles don't match" ), tr( "WMS" ) );
-    mValid = false;
-    return;
+    return false;
   }
 
   // Set the visibility of these new layers on by default
@@ -290,6 +290,8 @@ void QgsWmsProvider::addLayers()
     mTileLayer = 0;
 
   QgsDebugMsg( "Exiting." );
+
+  return true;
 }
 
 void QgsWmsProvider::setConnectionName( QString const &connName )
diff --git a/src/providers/wms/qgswmsprovider.h b/src/providers/wms/qgswmsprovider.h
index 7ea52da..51bce92 100644
--- a/src/providers/wms/qgswmsprovider.h
+++ b/src/providers/wms/qgswmsprovider.h
@@ -385,7 +385,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
     /**
      * Add the list of WMS layer names to be rendered by this server
      */
-    void addLayers();
+    bool addLayers();
 
     /**
      * Set the image projection (in WMS CRS format) used in the transfer from the WMS server
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
index fe0bec1..d68385d 100644
--- a/src/server/CMakeLists.txt
+++ b/src/server/CMakeLists.txt
@@ -109,6 +109,10 @@ TARGET_LINK_LIBRARIES(qgis_server
   ${GDAL_LIBRARY}
 )
 
+IF (APPLE)
+  SET_TARGET_PROPERTIES(qgis_server PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE)
+ENDIF (APPLE)
+
 IF (WITH_SERVER_PLUGINS)
 # install
 
diff --git a/src/server/qgis_map_serv.cpp b/src/server/qgis_map_serv.cpp
index e1c1770..89e7251 100644
--- a/src/server/qgis_map_serv.cpp
+++ b/src/server/qgis_map_serv.cpp
@@ -392,6 +392,16 @@ int main( int argc, char * argv[] )
     //Service parameter
     QString serviceString = theRequestHandler->parameter( "SERVICE" );
 
+    if ( serviceString.isEmpty() )
+    {
+      // SERVICE not mandatory for WMS 1.3.0 GetMap & GetFeatureInfo
+      QString requestString = theRequestHandler->parameter( "REQUEST" );
+      if ( requestString == "GetMap" || requestString == "GetFeatureInfo" )
+      {
+        serviceString = "WMS";
+      }
+    }
+
     // Enter core services main switch
     if ( !theRequestHandler->exceptionRaised() )
     {
diff --git a/src/server/qgshttprequesthandler.cpp b/src/server/qgshttprequesthandler.cpp
index fdc9ad2..7d13d46 100644
--- a/src/server/qgshttprequesthandler.cpp
+++ b/src/server/qgshttprequesthandler.cpp
@@ -505,7 +505,7 @@ void QgsHttpRequestHandler::requestStringToParameterMap( const QString& request,
   parameters.clear();
 
 
-  //insert key and value into the map (parameters are separated by &
+  //insert key and value into the map (parameters are separated by &)
   foreach ( QString element, request.split( "&" ) )
   {
     int sepidx = element.indexOf( "=", 0, Qt::CaseSensitive );
@@ -515,10 +515,11 @@ void QgsHttpRequestHandler::requestStringToParameterMap( const QString& request,
     }
 
     QString key = element.left( sepidx );
+    key = QUrl::fromPercentEncoding( key.toLocal8Bit() ); //replace encoded special characters and utf-8 encodings
+
     QString value = element.mid( sepidx + 1 );
     value.replace( "+", " " );
-    value = QUrl::fromPercentEncoding( value.toLocal8Bit() ); //replace encoded special caracters and utf-8 encodings
-    key = QUrl::fromPercentEncoding( key.toLocal8Bit() ); //replace encoded special caracters and utf-8 encodings
+    value = QUrl::fromPercentEncoding( value.toLocal8Bit() ); //replace encoded special characters and utf-8 encodings
 
     if ( key.compare( "SLD_BODY", Qt::CaseInsensitive ) == 0 )
     {
diff --git a/src/server/qgsserverprojectparser.cpp b/src/server/qgsserverprojectparser.cpp
index 958b590..80378bc 100644
--- a/src/server/qgsserverprojectparser.cpp
+++ b/src/server/qgsserverprojectparser.cpp
@@ -63,6 +63,18 @@ QgsServerProjectParser::QgsServerProjectParser( QDomDocument* xmlDoc, const QStr
 
     mRestrictedLayers = findRestrictedLayers();
     mUseLayerIDs = findUseLayerIDs();
+
+    mCustomLayerOrder.clear();
+
+    QDomElement customOrder = mXMLDoc->documentElement().firstChildElement( "layer-tree-canvas" ).firstChildElement( "custom-order" );
+    if ( customOrder.attribute( "enabled" ) == "1" )
+    {
+      QDomNodeList items = customOrder.childNodes();
+      for ( int i = 0; i < items.size(); ++i )
+      {
+        mCustomLayerOrder << items.item( i ).toElement().text();
+      }
+    }
   }
 }
 
@@ -349,7 +361,7 @@ int QgsServerProjectParser::numberOfLayers() const
 
 bool QgsServerProjectParser::updateLegendDrawingOrder() const
 {
-  return legendElem().attribute( "updateDrawingOrder", "true" ).compare( "true", Qt::CaseInsensitive ) == 0;
+  return !mCustomLayerOrder.isEmpty();
 }
 
 void QgsServerProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocument& doc, const QString& service, bool sia2045 ) const
@@ -1069,7 +1081,7 @@ bool QgsServerProjectParser::findUseLayerIDs() const
 void QgsServerProjectParser::layerFromLegendLayer( const QDomElement& legendLayerElem, QMap< int, QgsMapLayer*>& layers, bool useCache ) const
 {
   QString id = legendLayerElem.firstChild().firstChild().toElement().attribute( "layerid" );
-  int drawingOrder = updateLegendDrawingOrder() ? -1 : legendLayerElem.attribute( "drawingOrder", "-1" ).toInt();
+  int drawingOrder = updateLegendDrawingOrder() ? -1 : mCustomLayerOrder.indexOf( id );
 
   QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById.find( id );
   if ( layerIt != mProjectLayerElementsById.constEnd() )
@@ -1349,11 +1361,6 @@ void QgsServerProjectParser::addJoinLayersForElement( const QDomElement& layerEl
   }
 
   QDomNodeList joinNodeList = vectorJoinsElem.elementsByTagName( "join" );
-  if ( joinNodeList.size() > 1 )
-  {
-    return;
-  }
-
   for ( int i = 0; i < joinNodeList.size(); ++i )
   {
     QString id = joinNodeList.at( i ).toElement().attribute( "joinLayerId" );
diff --git a/src/server/qgsserverprojectparser.h b/src/server/qgsserverprojectparser.h
index bbb7520..ef4bcbc 100644
--- a/src/server/qgsserverprojectparser.h
+++ b/src/server/qgsserverprojectparser.h
@@ -126,6 +126,8 @@ class QgsServerProjectParser
 
     void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc, const QString& service, bool sia2045 = false ) const;
 
+    QStringList customLayerOrder() const { return mCustomLayerOrder; }
+
   private:
 
     /**Content of project file*/
@@ -156,6 +158,8 @@ class QgsServerProjectParser
     /**Returns a complete string set with all the restricted layer names (layers/groups that are not to be published)*/
     QSet<QString> findRestrictedLayers() const;
 
+    QStringList mCustomLayerOrder;
+
     bool findUseLayerIDs() const;
 
     /**Adds sublayers of an embedded group to layer set*/
diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp
index 5cb3408..373bb34 100644
--- a/src/server/qgswfsserver.cpp
+++ b/src/server/qgswfsserver.cpp
@@ -463,10 +463,12 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
 
         QgsFeature feature;
         QgsAttributeMap featureAttributes;
-        const QgsFields& fields = provider->fields();
+        //const QgsFields& fields = provider->fields();
+        const QgsFields& fields = layer->pendingFields();
 
         mWithGeom = true;
-        QgsAttributeList attrIndexes = provider->attributeIndexes();
+        //QgsAttributeList attrIndexes = provider->attributeIndexes();
+        QgsAttributeList attrIndexes = layer->pendingAllAttributesList();
 
         QDomNodeList queryChildNodes = queryElem.childNodes();
         if ( queryChildNodes.size() )
@@ -804,12 +806,14 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
 
       QgsFeature feature;
       QgsAttributeMap featureAttributes;
-      const QgsFields& fields = provider->fields();
+      //const QgsFields& fields = provider->fields();
+      const QgsFields& fields = layer->pendingFields();
 
       //map extent
       searchRect = layer->extent();
 
-      QgsAttributeList attrIndexes = provider->attributeIndexes();
+      //QgsAttributeList attrIndexes = provider->attributeIndexes();
+      QgsAttributeList attrIndexes = layer->pendingAllAttributesList();
       if ( mPropertyName != "*" )
       {
         QStringList attrList = mPropertyName.split( "," );
diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp
index b39d2ff..ed89bf0 100644
--- a/src/server/qgswmsprojectparser.cpp
+++ b/src/server/qgswmsprojectparser.cpp
@@ -72,11 +72,6 @@ void QgsWMSProjectParser::layersAndStylesCapabilities( QDomElement& parentElemen
     return;
   }
 
-  if ( fullProjectSettings )
-  {
-    addDrawingOrder( parentElement, doc );
-  }
-
   QMap<QString, QgsMapLayer *> layerMap;
   mProjectParser->projectLayerMap( layerMap );
 
@@ -96,10 +91,18 @@ void QgsWMSProjectParser::layersAndStylesCapabilities( QDomElement& parentElemen
 
   QDomElement legendElem = mProjectParser->legendElem();
 
-  addLayers( doc, layerParentElem, legendElem, layerMap, nonIdentifiableLayers, version, fullProjectSettings );
+  QHash<QString, QString> idNameMap;
+  QStringList layerIDList;
+
+  addLayers( doc, layerParentElem, legendElem, layerMap, nonIdentifiableLayers, version, fullProjectSettings, idNameMap, layerIDList );
 
   parentElement.appendChild( layerParentElem );
   mProjectParser->combineExtentAndCrsOfGroupChildren( layerParentElem, doc, true );
+
+  if ( fullProjectSettings )
+  {
+    addDrawingOrder( parentElement, doc, idNameMap, layerIDList );
+  }
 }
 
 QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool useCache ) const
@@ -734,177 +737,46 @@ QStringList QgsWMSProjectParser::identifyDisabledLayers() const
   return disabledList;
 }
 
-void QgsWMSProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const
+void QgsWMSProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc, const QHash<QString, QString> &idNameMap, const QStringList &layerIDList ) const
 {
-  const QDomDocument* projectDoc = mProjectParser->xmlDocument();
-  if ( !projectDoc )
-  {
-    return;
-  }
-
-  //find legend section
-  QDomElement legendElement = projectDoc->documentElement().firstChildElement( "legend" );
-  if ( legendElement.isNull() )
-  {
-    return;
-  }
-
-  bool useDrawingOrder = legendElement.attribute( "updateDrawingOrder" ) == "false";
-  QMap<int, QString> orderedLayerNames;
-
-  QDomNodeList legendChildren = legendElement.childNodes();
-  QDomElement childElem;
-  for ( int i = 0; i < legendChildren.size(); ++i )
-  {
-    addDrawingOrder( legendChildren.at( i ).toElement(), useDrawingOrder, orderedLayerNames );
-  }
-
-  QStringList layerList;
-  QMap<int, QString>::const_iterator nameIt = orderedLayerNames.constBegin();
-  for ( ; nameIt != orderedLayerNames.constEnd(); ++nameIt )
-  {
-    layerList.prepend( nameIt.value() );
-  }
-
-  QDomElement layerDrawingOrderElem = doc.createElement( "LayerDrawingOrder" );
-  QDomText drawingOrderText = doc.createTextNode( layerList.join( "," ) );
-  layerDrawingOrderElem.appendChild( drawingOrderText );
-  parentElem.appendChild( layerDrawingOrderElem );
-}
-
-void QgsWMSProjectParser::addDrawingOrderEmbeddedGroup( QDomElement groupElem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const
-{
-  if ( groupElem.isNull() )
-  {
-    return;
-  }
-
-  QString project = mProjectParser->convertToAbsolutePath( groupElem.attribute( "project" ) );
-  if ( project.isEmpty() )
-  {
-    return;
-  }
-
-  int embedDrawingOrder = groupElem.attribute( "drawingOrder", "-1" ).toInt();
-  QgsWMSProjectParser* p = dynamic_cast<QgsWMSProjectParser*>( QgsConfigCache::instance()->wmsConfiguration( project ) );
-  if ( !p )
-  {
-    return;
-  }
-
-  const QDomDocument* doc = p->mProjectParser->xmlDocument();
-  if ( !doc )
-  {
-    return;
-  }
-
-  //find requested group
-  QString groupName = groupElem.attribute( "name" );
-  QDomElement embeddedGroupElem; //group element in source project file
-  QDomNodeList groupList = doc->elementsByTagName( "legendgroup" );
-  for ( int i = 0; i < groupList.size(); ++i )
-  {
-    if ( groupList.at( i ).toElement().attribute( "name" ) == groupName )
-    {
-      embeddedGroupElem = groupList.at( i ).toElement();
-      break;
-    }
-  }
-
-  if ( embeddedGroupElem.isNull() ) //group does not exist in project file
-  {
-    return;
-  }
+  QStringList layerList( mProjectParser->customLayerOrder() );
 
-  //legend or custom drawing order in embedded project?
-  bool updateDrawingOrder = true;
-  QDomNodeList legendNode = doc->elementsByTagName( "legend" );
-  if ( legendNode.size() > 0 )
+  if ( layerList.isEmpty() )
   {
-    updateDrawingOrder = ( legendNode.at( 0 ).toElement().attribute( "updateDrawingOrder" ) == "true" );
+    layerList = layerIDList;
   }
 
-  QDomNodeList layerNodeList = embeddedGroupElem.elementsByTagName( "legendlayer" );
-  QDomElement layerElem;
-  QMap<int, QString > layerNames;
-  QString layerName;
-  for ( int i = 0; i < layerNodeList.size(); ++i )
+  if ( !mProjectParser->useLayerIDs() )
   {
-    layerElem = layerNodeList.at( i ).toElement();
-    layerName = mProjectParser->useLayerIDs() ? layerElem.attribute( "id" ) : layerElem.attribute( "name" );
-
-    int layerDrawingOrder = updateDrawingOrder ? -1 : layerElem.attribute( "drawingOrder", "-1" ).toInt();
-    if ( layerDrawingOrder == -1 )
-    {
-      layerNames.insert( layerNames.size(), layerName );
-    }
-    else
+    int i = 0;
+    while ( i < layerList.size() )
     {
-      orderedLayerList.insert( orderedLayerList.size(), layerName );
-    }
-  }
-
-  if ( useDrawingOrder )
-  {
-    QMapIterator<int, QString > layerNamesIt( layerNames );
-    layerNamesIt.toBack();
-    while ( layerNamesIt.hasPrevious() )
-    {
-      layerNamesIt.previous();
-      orderedLayerList.insertMulti( embedDrawingOrder, layerNamesIt.value() );
-    }
-  }
-  else
-  {
-    QMap<int, QString >::const_iterator layerNamesIt = layerNames.constBegin();
-    for ( ; layerNamesIt != layerNames.constEnd(); ++layerNamesIt )
-    {
-      orderedLayerList.insert( orderedLayerList.size(), layerNamesIt.value() );
-    }
-  }
-}
-
-void QgsWMSProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const
-{
-  if ( elem.isNull() )
-  {
-    return;
-  }
-
-  if ( elem.tagName() == "legendgroup" )
-  {
-    if ( elem.attribute( "embedded" ) == "1" )
-    {
-      addDrawingOrderEmbeddedGroup( elem, useDrawingOrder, orderedLayerList );
-    }
-    else
-    {
-      QDomNodeList groupChildren = elem.childNodes();
-      for ( int i = 0; i < groupChildren.size(); ++i )
+      if ( idNameMap.contains( layerList[i] ) )
+      {
+        layerList[i] = idNameMap[ layerList[i] ];
+        ++i;
+      }
+      else
       {
-        addDrawingOrder( groupChildren.at( i ).toElement(), useDrawingOrder, orderedLayerList );
+        QgsDebugMsg( "layer not found" );
+        layerList.removeAt( i );
       }
     }
   }
-  else if ( elem.tagName() == "legendlayer" )
+
+  if ( !layerList.isEmpty() )
   {
-    QString layerName = mProjectParser->useLayerIDs()
-                        ? mProjectParser->layerIdFromLegendLayer( elem )
-                        : elem.attribute( "name" );
+    QStringList reversedList;
+    for ( int i = layerList.size() - 1; i >= 0; --i )
+      reversedList << layerList[ i ];
 
-    if ( useDrawingOrder )
-    {
-      int drawingOrder = elem.attribute( "drawingOrder", "-1" ).toInt();
-      orderedLayerList.insert( drawingOrder, layerName );
-    }
-    else
-    {
-      orderedLayerList.insert( orderedLayerList.size(), layerName );
-    }
+    QDomElement layerDrawingOrderElem = doc.createElement( "LayerDrawingOrder" );
+    QDomText drawingOrderText = doc.createTextNode( reversedList.join( "," ) );
+    layerDrawingOrderElem.appendChild( drawingOrderText );
+    parentElem.appendChild( layerDrawingOrderElem );
   }
 }
 
-
 void QgsWMSProjectParser::addLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem, const QString& version ) const
 {
   foreach ( QString styleName, currentLayer->styleManager()->styles() )
@@ -996,7 +868,9 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
                                      const QMap<QString, QgsMapLayer *> &layerMap,
                                      const QStringList &nonIdentifiableLayers,
                                      QString version, //1.1.1 or 1.3.0
-                                     bool fullProjectSettings ) const
+                                     bool fullProjectSettings,
+                                     QHash<QString, QString> &idNameMap,
+                                     QStringList &layerIDList ) const
 {
   QDomNodeList legendChildren = legendElem.childNodes();
   for ( int i = 0; i < legendChildren.size(); ++i )
@@ -1005,10 +879,9 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
     QDomElement layerElem = doc.createElement( "Layer" );
     if ( fullProjectSettings )
     {
-      layerElem.setAttribute( "visible", !( currentChildElem.attribute( "checked" ) == "Qt::Unchecked" ) );
+      layerElem.setAttribute( "visible", currentChildElem.attribute( "checked" ) != "Qt::Unchecked" );
     }
 
-
     if ( currentChildElem.tagName() == "legendgroup" )
     {
       layerElem.setAttribute( "queryable", "1" );
@@ -1058,12 +931,12 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
             pLayerMap.insert( pp->layerId( elem ), pp->createLayerFromElement( elem ) );
           }
 
-          p->addLayers( doc, layerElem, embeddedGroupElem, pLayerMap, pIdDisabled, version, fullProjectSettings );
+          p->addLayers( doc, layerElem, embeddedGroupElem, pLayerMap, pIdDisabled, version, fullProjectSettings, idNameMap, layerIDList );
         }
       }
       else //normal (not embedded) legend group
       {
-        addLayers( doc, layerElem, currentChildElem, layerMap, nonIdentifiableLayers, version, fullProjectSettings );
+        addLayers( doc, layerElem, currentChildElem, layerMap, nonIdentifiableLayers, version, fullProjectSettings, idNameMap, layerIDList );
       }
 
       // combine bounding boxes of children (groups/layers)
@@ -1075,7 +948,7 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
 
       if ( !layerMap.contains( id ) )
       {
-        QgsDebugMsg( QString( "layer %1 not found in map - layer cache to small?" ).arg( id ) );
+        QgsDebugMsg( QString( "layer %1 not found in map - layer cache too small?" ).arg( id ) );
         continue;
       }
 
@@ -1107,6 +980,9 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
       nameElem.appendChild( nameText );
       layerElem.appendChild( nameElem );
 
+      layerIDList << id;
+      idNameMap.insert( id, currentLayer->name() );
+
       QDomElement titleElem = doc.createElement( "Title" );
       QString titleName = currentLayer->title();
       if ( titleName.isEmpty() )
@@ -1321,7 +1197,6 @@ void QgsWMSProjectParser::addOWSLayerStyles( QgsMapLayer* currentLayer, QDomDocu
 }
 
 
-
 void QgsWMSProjectParser::addOWSLayers( QDomDocument &doc,
                                         QDomElement &parentElem,
                                         const QDomElement &legendElem,
diff --git a/src/server/qgswmsprojectparser.h b/src/server/qgswmsprojectparser.h
index e498ec3..209f9d4 100644
--- a/src/server/qgswmsprojectparser.h
+++ b/src/server/qgswmsprojectparser.h
@@ -127,13 +127,7 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
     virtual QStringList identifyDisabledLayers() const override;
 
     /**Reads layer drawing order from the legend section of the project file and appends it to the parent elemen (usually the <Capability> element)*/
-    void addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const;
-
-    /**Adds drawing order info from layer element or group element (recursive)*/
-    void addDrawingOrder( QDomElement groupElem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const;
-
-    /**Adds drawing order info from embedded layer element or embedded group element (recursive)*/
-    void addDrawingOrderEmbeddedGroup( QDomElement groupElem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const;
+    void addDrawingOrder( QDomElement& parentElem, QDomDocument& doc, const QHash<QString, QString> &idNameMap, const QStringList &layerIDList ) const;
 
     void addLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem, const QString& version ) const;
 
@@ -143,7 +137,9 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
                     const QMap<QString, QgsMapLayer *> &layerMap,
                     const QStringList &nonIdentifiableLayers,
                     QString version, //1.1.1 or 1.3.0
-                    bool fullProjectSettings = false ) const;
+                    bool fullProjectSettings,
+                    QHash<QString, QString> &idNameMap,
+                    QStringList &layerIDList ) const;
 
     void addOWSLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem ) const;
 
diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp
index ca9ab0f..dda39fd 100644
--- a/src/server/qgswmsserver.cpp
+++ b/src/server/qgswmsserver.cpp
@@ -112,6 +112,8 @@ void QgsWMSServer::executeRequest()
   {
     QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." );
     mRequestHandler->setServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) );
+    cleanupAfterRequest();
+    return;
   }
 
   //version
@@ -593,29 +595,26 @@ static QgsLayerTreeModelLegendNode* _findLegendNodeForRule( QgsLayerTreeModel* l
 }
 
 
-static QgsRectangle _parseBBOX( const QString& bboxStr, bool* ok )
+static QgsRectangle _parseBBOX( const QString &bboxStr, bool &ok )
 {
-  *ok = false;
-  QgsRectangle bbox;
+  ok = false;
 
   QStringList lst = bboxStr.split( "," );
   if ( lst.count() != 4 )
-    return bbox;
-
-  bool convOk;
-  bbox.setXMinimum( lst[0].toDouble( &convOk ) );
-  if ( !convOk ) return bbox;
-  bbox.setYMinimum( lst[1].toDouble( &convOk ) );
-  if ( !convOk ) return bbox;
-  bbox.setXMaximum( lst[2].toDouble( &convOk ) );
-  if ( !convOk ) return bbox;
-  bbox.setYMaximum( lst[3].toDouble( &convOk ) );
-  if ( !convOk ) return bbox;
-
-  if ( bbox.isEmpty() ) return bbox;
-
-  *ok = true;
-  return bbox;
+    return QgsRectangle();
+
+  double d[4];
+  for ( int i = 0; i < 4; i++ )
+  {
+    bool ok;
+    lst[i].replace( " ", "+" );
+    d[i] = lst[i].toDouble( &ok );
+    if ( !ok )
+      return QgsRectangle();
+  }
+
+  ok = true;
+  return QgsRectangle( d[0], d[1], d[2], d[3] );
 }
 
 
@@ -642,8 +641,8 @@ QImage* QgsWMSServer::getLegendGraphics()
     contentBasedLegend = true;
 
     bool bboxOk;
-    contentBasedLegendExtent = _parseBBOX( mParameters["BBOX"], &bboxOk );
-    if ( !bboxOk )
+    contentBasedLegendExtent = _parseBBOX( mParameters["BBOX"], bboxOk );
+    if ( !bboxOk || contentBasedLegendExtent.isEmpty() )
       throw QgsMapServiceException( "InvalidParameterValue", "Invalid BBOX parameter" );
 
     if ( mParameters.contains( "RULE" ) )
@@ -1765,24 +1764,8 @@ int QgsWMSServer::configureMapRender( const QPaintDevice* paintDevice ) const
   mMapRenderer->setOutputSize( QSize( paintDevice->width(), paintDevice->height() ), paintDevice->logicalDpiX() );
 
   //map extent
-  bool conversionSuccess;
-  double minx, miny, maxx, maxy;
-  QString bbString = mParameters.value( "BBOX", "0,0,0,0" );
-
-  bool bboxOk = true;
-  minx = bbString.section( ",", 0, 0 ).toDouble( &conversionSuccess );
-  if ( !conversionSuccess )
-    bboxOk = false;
-  miny = bbString.section( ",", 1, 1 ).toDouble( &conversionSuccess );
-  if ( !conversionSuccess )
-    bboxOk = false;
-  maxx = bbString.section( ",", 2, 2 ).toDouble( &conversionSuccess );
-  if ( !conversionSuccess )
-    bboxOk = false;
-  maxy = bbString.section( ",", 3, 3 ).toDouble( &conversionSuccess );
-  if ( !conversionSuccess )
-    bboxOk = false;
-
+  bool bboxOk;
+  QgsRectangle mapExtent = _parseBBOX( mParameters.value( "BBOX", "0,0,0,0" ), bboxOk );
   if ( !bboxOk )
   {
     //throw a service exception
@@ -1838,15 +1821,9 @@ int QgsWMSServer::configureMapRender( const QPaintDevice* paintDevice ) const
   QString version = mParameters.value( "VERSION", "1.3.0" );
   if ( version != "1.1.1" && outputCRS.axisInverted() )
   {
-    //switch coordinates of extent
-    double tmp;
-    tmp = minx;
-    minx = miny; miny = tmp;
-    tmp = maxx;
-    maxx = maxy; maxy = tmp;
+    mapExtent.invert();
   }
 
-  QgsRectangle mapExtent( minx, miny, maxx, maxy );
   mMapRenderer->setExtent( mapExtent );
 
   if ( mConfigParser )
diff --git a/src/ui/qgsattributetabledialog.ui b/src/ui/qgsattributetabledialog.ui
index d6eee05..0282fe9 100644
--- a/src/ui/qgsattributetabledialog.ui
+++ b/src/ui/qgsattributetabledialog.ui
@@ -14,16 +14,7 @@
    <string>Attribute Table</string>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
+   <property name="margin">
     <number>0</number>
    </property>
    <property name="spacing">
@@ -97,7 +88,7 @@
         </size>
        </property>
        <property name="shortcut">
-        <string>Ctrl+E</string>
+        <string>Ctrl+S</string>
        </property>
        <property name="checkable">
         <bool>false</bool>
@@ -263,7 +254,7 @@
         </size>
        </property>
        <property name="shortcut">
-        <string>Ctrl+S</string>
+        <string>Ctrl+R</string>
        </property>
        <property name="autoRaise">
         <bool>true</bool>
@@ -730,6 +721,11 @@
  </widget>
  <customwidgets>
   <customwidget>
+   <class>QgsFieldExpressionWidget</class>
+   <extends>QWidget</extends>
+   <header>qgsfieldexpressionwidget.h</header>
+  </customwidget>
+  <customwidget>
    <class>QgsFilterLineEdit</class>
    <extends>QLineEdit</extends>
    <header>qgsfilterlineedit.h</header>
@@ -740,11 +736,6 @@
    <header>qgsdualview.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>QgsFieldExpressionWidget</class>
-   <extends>QWidget</extends>
-   <header location="global">qgsfieldexpressionwidget.h</header>
-  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>mRemoveSelectionButton</tabstop>
diff --git a/src/ui/qgscategorizedsymbolrendererv2widget.ui b/src/ui/qgscategorizedsymbolrendererv2widget.ui
index 8d75ecc..382f712 100644
--- a/src/ui/qgscategorizedsymbolrendererv2widget.ui
+++ b/src/ui/qgscategorizedsymbolrendererv2widget.ui
@@ -177,16 +177,6 @@
       </spacer>
      </item>
      <item>
-      <widget class="QPushButton" name="btnJoinCategories">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="text">
-        <string>Join</string>
-       </property>
-      </widget>
-     </item>
-     <item>
       <widget class="QPushButton" name="btnAdvanced">
        <property name="text">
         <string>Advanced</string>
@@ -219,7 +209,6 @@
   <tabstop>btnAddCategory</tabstop>
   <tabstop>btnDeleteCategories</tabstop>
   <tabstop>btnDeleteAllCategories</tabstop>
-  <tabstop>btnJoinCategories</tabstop>
   <tabstop>btnAdvanced</tabstop>
  </tabstops>
  <resources/>
diff --git a/src/ui/qgscolordialog.ui b/src/ui/qgscolordialog.ui
index 243bc62..fb7455e 100755
--- a/src/ui/qgscolordialog.ui
+++ b/src/ui/qgscolordialog.ui
@@ -626,7 +626,7 @@
              </property>
              <property name="icon">
               <iconset resource="../../images/images.qrc">
-               <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+               <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
              </property>
             </widget>
            </item>
diff --git a/src/ui/qgscomposerlegendwidgetbase.ui b/src/ui/qgscomposerlegendwidgetbase.ui
index ba8201b..788ee3e 100644
--- a/src/ui/qgscomposerlegendwidgetbase.ui
+++ b/src/ui/qgscomposerlegendwidgetbase.ui
@@ -307,7 +307,7 @@
               </property>
               <property name="icon">
                <iconset resource="../../images/images.qrc">
-                <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+                <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
               </property>
               <property name="iconSize">
                <size>
diff --git a/src/ui/qgsfieldspropertiesbase.ui b/src/ui/qgsfieldspropertiesbase.ui
index e626ecd..c43ca07 100644
--- a/src/ui/qgsfieldspropertiesbase.ui
+++ b/src/ui/qgsfieldspropertiesbase.ui
@@ -356,7 +356,7 @@ MyForms.py must live on PYTHONPATH, .qgis/python, or inside the project folder.<
              </property>
              <property name="icon">
               <iconset resource="../../images/images.qrc">
-               <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+               <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
              </property>
             </widget>
            </item>
diff --git a/src/ui/qgsoptionsbase.ui b/src/ui/qgsoptionsbase.ui
index bbe4cfb..3f60bce 100644
--- a/src/ui/qgsoptionsbase.ui
+++ b/src/ui/qgsoptionsbase.ui
@@ -3102,7 +3102,7 @@
                       </property>
                       <property name="icon">
                        <iconset resource="../../images/images.qrc">
-                        <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+                        <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
                       </property>
                      </widget>
                     </item>
diff --git a/src/ui/qgsprojectpropertiesbase.ui b/src/ui/qgsprojectpropertiesbase.ui
index 3b53b19..049d9ba 100644
--- a/src/ui/qgsprojectpropertiesbase.ui
+++ b/src/ui/qgsprojectpropertiesbase.ui
@@ -717,7 +717,7 @@
                       </property>
                       <property name="icon">
                        <iconset resource="../../images/images.qrc">
-                        <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+                        <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
                       </property>
                      </widget>
                     </item>
diff --git a/src/ui/qgsrasterlayerpropertiesbase.ui b/src/ui/qgsrasterlayerpropertiesbase.ui
index 183b132..b1829ae 100644
--- a/src/ui/qgsrasterlayerpropertiesbase.ui
+++ b/src/ui/qgsrasterlayerpropertiesbase.ui
@@ -1330,7 +1330,7 @@
                       </property>
                       <property name="icon">
                        <iconset resource="../../images/images.qrc">
-                        <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+                        <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
                       </property>
                      </widget>
                     </item>
diff --git a/src/ui/qgsrelationmanagerdialogbase.ui b/src/ui/qgsrelationmanagerdialogbase.ui
index d45c35e..7eadb66 100644
--- a/src/ui/qgsrelationmanagerdialogbase.ui
+++ b/src/ui/qgsrelationmanagerdialogbase.ui
@@ -81,7 +81,7 @@
        </property>
        <property name="icon">
         <iconset resource="../../images/images.qrc">
-         <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+         <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
        </property>
       </widget>
      </item>
diff --git a/src/ui/qgsrulebasedrendererv2widget.ui b/src/ui/qgsrulebasedrendererv2widget.ui
index fb1b2bd..e0fc6ac 100644
--- a/src/ui/qgsrulebasedrendererv2widget.ui
+++ b/src/ui/qgsrulebasedrendererv2widget.ui
@@ -85,7 +85,7 @@
        </property>
        <property name="icon">
         <iconset resource="../../images/images.qrc">
-         <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+         <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
        </property>
       </widget>
      </item>
diff --git a/src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui b/src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui
index fdb7076..f97bf9c 100644
--- a/src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui
+++ b/src/ui/qgssinglebandpseudocolorrendererwidgetbase.ui
@@ -66,7 +66,7 @@
          </property>
          <property name="icon">
           <iconset resource="../../images/images.qrc">
-           <normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
+           <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
          </property>
         </widget>
        </item>
diff --git a/tests/bench/CMakeLists.txt b/tests/bench/CMakeLists.txt
index 18bfe0f..4d0a790 100644
--- a/tests/bench/CMakeLists.txt
+++ b/tests/bench/CMakeLists.txt
@@ -53,5 +53,11 @@ INSTALL (TARGETS qgis_bench
 )
 IF (APPLE)
   INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../${QGIS_FW_SUBDIR} \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_bench.app/Contents/Frameworks\")")
+  INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../../${QGIS_LIB_SUBDIR} \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_bench.app/Contents/MacOS/lib\")")
+  INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../${QGIS_PLUGIN_SUBDIR}/.. \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_bench.app/Contents/Plugins\")")
+  INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../${QGIS_DATA_SUBDIR} \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_bench.app/Contents/Resources\")")
+  # may not exist, unless BundleUtilities are used
+  INSTALL (CODE "EXECUTE_PROCESS(COMMAND ln -sfh ../../../../share \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_bench.app/Contents/MacOS/share\")")
+
 ENDIF (APPLE)
 
diff --git a/tests/bench/main.cpp b/tests/bench/main.cpp
index a78a6cf..8ab3da7 100644
--- a/tests/bench/main.cpp
+++ b/tests/bench/main.cpp
@@ -407,6 +407,24 @@ int main( int argc, char *argv[] )
   {
     setenv( "GDAL_DRIVER_PATH", gdalPlugins.toUtf8(), 1 );
   }
+
+  // Point GDAL_DATA at any GDAL share directory embedded in the app bundle
+  if ( !getenv( "GDAL_DATA" ) )
+  {
+    QStringList gdalShares;
+    QString appResources( QDir::cleanPath( QgsApplication::pkgDataPath() ) );
+    gdalShares << QCoreApplication::applicationDirPath().append( "/share/gdal" )
+    << appResources.append( "/share/gdal" )
+    << appResources.append( "/gdal" );
+    Q_FOREACH ( const QString& gdalShare, gdalShares )
+    {
+      if ( QFile::exists( gdalShare ) )
+      {
+        setenv( "GDAL_DATA", gdalShare.toUtf8().constData(), 1 );
+        break;
+      }
+    }
+  }
 #endif
 
   QSettings mySettings;
diff --git a/tests/src/gui/testqgsrubberband.cpp b/tests/src/gui/testqgsrubberband.cpp
index 04528dc..64a72d7 100644
--- a/tests/src/gui/testqgsrubberband.cpp
+++ b/tests/src/gui/testqgsrubberband.cpp
@@ -45,6 +45,8 @@ class TestQgsRubberband : public QObject
     void cleanup(); // will be called after every testfunction.
 
     void testAddSingleMultiGeometries(); //test for #7728
+    void testBoundingRect(); //test for #12392
+    void testVisibility(); //test for #12486
 
   private:
     QgsMapCanvas* mCanvas;
@@ -107,10 +109,93 @@ void TestQgsRubberband::testAddSingleMultiGeometries()
   QVERIFY( mRubberband->numberOfVertices() == 15 );
 }
 
-QTEST_MAIN( TestQgsRubberband )
-#include "testqgsrubberband.moc"
 
+void TestQgsRubberband::testBoundingRect()
+{
+  QSizeF mapSize = mCanvas->mapSettings().outputSize();
+
+  // Set extent to match canvas size.
+  // This is to ensure a 1:1 scale
+  mCanvas->setExtent( QgsRectangle( QRectF(
+      QPointF(0,0), mapSize
+  ) ) );
+  QCOMPARE( mCanvas->mapUnitsPerPixel (), 1.0 );
+
+  // Polygon extent is 10,10 to 30,30
+  QSharedPointer<QgsGeometry> geom( QgsGeometry::fromWkt(
+      "POLYGON((10 10,10 30,30 30,30 10,10 10))"
+  ) );
+  mRubberband = new QgsRubberBand( mCanvas, mPolygonLayer->geometryType() );
+  mRubberband->setIconSize( 5 ); // default, but better be explicit
+  mRubberband->setWidth( 1 );    // default, but better be explicit
+  mRubberband->addGeometry( geom.data(), mPolygonLayer );
+
+  // 20 pixels for the extent + 3 for pen & icon per side + 2 of padding
+  QCOMPARE( mRubberband->boundingRect(), QRectF(QPointF(-1,-1),QSizeF(28,28)) );
+  QCOMPARE( mRubberband->pos(), QPointF(
+    // 10 for extent minx - 3 for pen & icon
+    7,
+    // 30 for extent maxy - 3 for pen & icon
+    mapSize.height() - 30 - 3
+  ) );
+
+  mCanvas->setExtent( QgsRectangle( QRectF(
+      QPointF(0,0), mapSize/2
+  ) ) );
+
+  // 40 pixels for the extent + 6 for pen & icon per side + 2 of padding
+  QCOMPARE( mRubberband->boundingRect(), QRectF(QPointF(-1,-1),QSizeF(54,54)) );
+  QCOMPARE( mRubberband->pos(), QPointF(
+    // 10 for extent minx - 3 for pen & icon
+    7 * 2,
+    // 30 for extent maxy - 3 for pen & icon
+    mapSize.height() - ( 30 + 3 ) * 2
+  ) );
+
+}
+
+void TestQgsRubberband::testVisibility()
+{
+  mRubberband = new QgsRubberBand( mCanvas, mPolygonLayer->geometryType() );
+
+  // Visibility is set to false by default
+  QCOMPARE( mRubberband->isVisible(), false );
 
+  // Check visibility after setting to empty geometry
+  QSharedPointer<QgsGeometry> emptyGeom( new QgsGeometry );
+  mRubberband->setToGeometry( emptyGeom.data(), mPolygonLayer );
+  QCOMPARE( mRubberband->isVisible(), false );
 
+  // Check that visibility changes
+  mRubberband->setVisible( true );
+  mRubberband->setToGeometry( emptyGeom.data(), mPolygonLayer );
+  QCOMPARE( mRubberband->isVisible(), false );
+
+  // Check visibility after setting to valid geometry
+  QSharedPointer<QgsGeometry> geom( QgsGeometry::fromWkt(
+      "POLYGON((10 10,10 30,30 30,30 10,10 10))"
+  ) );
+  mRubberband->setToGeometry( geom.data(), mPolygonLayer );
+  QCOMPARE( mRubberband->isVisible(), true );
+
+  // Add point without update
+  mRubberband->reset( true );
+  mRubberband->addPoint( QgsPoint( 10, 10 ), false );
+  QCOMPARE( mRubberband->isVisible(), false );
+
+  // Add point with update
+  mRubberband->addPoint( QgsPoint( 20, 20 ), true );
+  QCOMPARE( mRubberband->isVisible(), true );
+
+  // Check visibility after zoom (should not be changed)
+  mRubberband->setVisible( false );
+  mCanvas->zoomIn();
+  QCOMPARE( mRubberband->isVisible(), false );
+
+}
+
+
+QTEST_MAIN( TestQgsRubberband )
+#include "testqgsrubberband.moc"
 
 
diff --git a/tests/src/providers/CMakeLists.txt b/tests/src/providers/CMakeLists.txt
index 9cd7e5c..58376ac 100644
--- a/tests/src/providers/CMakeLists.txt
+++ b/tests/src/providers/CMakeLists.txt
@@ -74,6 +74,7 @@ ENDMACRO (ADD_QGIS_TEST)
 # Tests:
 
 ADD_QGIS_TEST(wcsprovidertest testqgswcsprovider.cpp)
+ADD_QGIS_TEST(gdalprovidertest testqgsgdalprovider.cpp)
 
 #############################################################
 # WCS public servers test:
diff --git a/tests/src/providers/testqgsgdalprovider.cpp b/tests/src/providers/testqgsgdalprovider.cpp
new file mode 100644
index 0000000..42bb858
--- /dev/null
+++ b/tests/src/providers/testqgsgdalprovider.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+     testqgsgdalprovider.cpp
+     --------------------------------------
+    Date                 : March 2015
+    Copyright            : (C) 2015 by Nyall Dawson
+    Email                : nyall.dawson at gmail.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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+#include <QtTest/QtTest>
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QObject>
+#include <QApplication>
+#include <QFileInfo>
+#include <QDir>
+
+//qgis includes...
+#include <qgis.h>
+#include <qgsapplication.h>
+#include <qgsproviderregistry.h>
+#include <qgsrasterdataprovider.h>
+#include <qgsrectangle.h>
+
+/** \ingroup UnitTests
+ * This is a unit test for the gdal provider
+ */
+class TestQgsGdalProvider : public QObject
+{
+    Q_OBJECT
+
+  private slots:
+    void initTestCase();// will be called before the first testfunction is executed.
+    void cleanupTestCase();// will be called after the last testfunction was executed.
+    void init() {}// will be called before each testfunction is executed.
+    void cleanup() {}// will be called after every testfunction.
+
+    void scaleDataType(); //test resultant data types for int raster with float scale (#11573)
+    void warpedVrt(); //test loading raster which requires a warped vrt
+
+  private:
+    QString mTestDataDir;
+    QString mReport;
+};
+
+//runs before all tests
+void TestQgsGdalProvider::initTestCase()
+{
+  // init QGIS's paths - true means that all path will be inited from prefix
+  QgsApplication::init();
+  QgsApplication::initQgis();
+
+  mTestDataDir = QString( TEST_DATA_DIR ) + QDir::separator(); //defined in CmakeLists.txt
+  mReport = "<h1>GDAL Provider Tests</h1>\n";
+}
+
+//runs after all tests
+void TestQgsGdalProvider::cleanupTestCase()
+{
+  QgsApplication::exitQgis();
+  QString myReportFile = QDir::tempPath() + QDir::separator() + "qgistest.html";
+  QFile myFile( myReportFile );
+  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
+  {
+    QTextStream myQTextStream( &myFile );
+    myQTextStream << mReport;
+    myFile.close();
+  }
+}
+
+void TestQgsGdalProvider::scaleDataType()
+{
+  QString rasterWithOffset = QString( TEST_DATA_DIR ) + QDir::separator() +  "int_raster_with_scale.tif";
+  QgsDataProvider* provider = QgsProviderRegistry::instance()->provider( "gdal", rasterWithOffset );
+  QgsRasterDataProvider* rp = dynamic_cast< QgsRasterDataProvider* >( provider );
+  QVERIFY( rp );
+  //raster is an integer data type, but has a scale < 1, so data type must be float
+  QCOMPARE( rp->dataType( 1 ), QGis::Float32 );
+  QCOMPARE( rp->srcDataType( 1 ), QGis::Float32 );
+}
+
+void TestQgsGdalProvider::warpedVrt()
+{
+  QString raster = QString( TEST_DATA_DIR ) + QDir::separator() +  "requires_warped_vrt.tif";
+  QgsDataProvider* provider = QgsProviderRegistry::instance()->provider( "gdal", raster );
+  QgsRasterDataProvider* rp = dynamic_cast< QgsRasterDataProvider* >( provider );
+  QVERIFY( rp );
+
+  qDebug() << "x min: " << rp->extent().xMinimum();
+  qDebug() << "x max: " << rp->extent().xMaximum();
+  qDebug() << "y min: " << rp->extent().yMinimum();
+  qDebug() << "y max: " << rp->extent().yMaximum();
+
+  QVERIFY( qgsDoubleNear( rp->extent().xMinimum(), 2058589, 1 ) );
+  QVERIFY( qgsDoubleNear( rp->extent().xMaximum(), 3118999, 1 ) );
+  QVERIFY( qgsDoubleNear( rp->extent().yMinimum(), 2281355, 1 ) );
+  QVERIFY( qgsDoubleNear( rp->extent().yMaximum(), 3129683, 1 ) );
+}
+
+QTEST_MAIN( TestQgsGdalProvider )
+#include "testqgsgdalprovider.moc"
diff --git a/tests/testdata/int_raster_with_scale.tif b/tests/testdata/int_raster_with_scale.tif
new file mode 100644
index 0000000..7be3cbe
Binary files /dev/null and b/tests/testdata/int_raster_with_scale.tif differ
diff --git a/tests/testdata/int_raster_with_scale.tif.aux.xml b/tests/testdata/int_raster_with_scale.tif.aux.xml
new file mode 100644
index 0000000..0bdf0c2
--- /dev/null
+++ b/tests/testdata/int_raster_with_scale.tif.aux.xml
@@ -0,0 +1,30 @@
+<PAMDataset>
+  <Metadata>
+    <MDI key="AOD Source">MODIS (MOD08_D3)</MDI>
+    <MDI key="AOD Value">0.069</MDI>
+    <MDI key="GIPPY Version">1.0.2</MDI>
+    <MDI key="GIPS Version">0.7.1</MDI>
+    <MDI key="GIPS-landsat Version">0.9.0</MDI>
+  </Metadata>
+  <PAMRasterBand band="1">
+    <Description>ndvi</Description>
+    <UnitType>other</UnitType>
+    <Scale>9.999999747378752e-05</Scale>
+    <Histograms>
+      <HistItem>
+        <HistMin>7091</HistMin>
+        <HistMax>8573</HistMax>
+        <BucketCount>2</BucketCount>
+        <IncludeOutOfRange>0</IncludeOutOfRange>
+        <Approximate>0</Approximate>
+        <HistCounts>23|33</HistCounts>
+      </HistItem>
+    </Histograms>
+    <Metadata>
+      <MDI key="STATISTICS_MAXIMUM">8326</MDI>
+      <MDI key="STATISTICS_MEAN">7873.3214285714</MDI>
+      <MDI key="STATISTICS_MINIMUM">7338</MDI>
+      <MDI key="STATISTICS_STDDEV">261.16183455194</MDI>
+    </Metadata>
+  </PAMRasterBand>
+</PAMDataset>
diff --git a/tests/testdata/requires_warped_vrt.tif b/tests/testdata/requires_warped_vrt.tif
new file mode 100644
index 0000000..3777f41
Binary files /dev/null and b/tests/testdata/requires_warped_vrt.tif 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