[qgis] 01/07: Imported Upstream version 2.8.3+dfsg

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Thu Jul 30 01:54:15 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 b3f56c4b265ade381d7d97ec83a9568c99fa4b34
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Thu Jul 30 01:28:31 2015 +0200

    Imported Upstream version 2.8.3+dfsg
---
 CMakeLists.txt                                     |   12 +-
 ChangeLog                                          |  951 +++
 cmake/FindSPATIALITE.cmake                         |    1 +
 debian/changelog                                   |   10 +-
 doc/CONTRIBUTORS                                   |    1 +
 doc/TRANSLATORS                                    |   88 +-
 doc/contributors.json                              |    6 +-
 doc/developersmap.html                             |   11 +-
 i18n/qgis_de.ts                                    | 8738 +++++++++++---------
 i18n/qgis_en.ts                                    |  397 +-
 i18n/qgis_ja.ts                                    |  996 ++-
 images/svg/shopping/shopping_alcohol.svg           |    4 -
 images/svg/shopping/shopping_fish.svg              |    4 -
 mac/app.info.plist.in                              |    2 +-
 mac/browser.info.plist.in                          |    2 +-
 python/core/composer/qgscomposermap.sip            |   16 +-
 python/core/dxf/qgsdxfexport.sip                   |   20 +-
 .../core/layertree/qgslayertreemodellegendnode.sip |    2 +-
 python/core/qgsfeature.sip                         |    8 +-
 python/core/qgspallabeling.sip                     |    9 +
 python/core/qgsvectorlayer.sip                     |    2 +-
 python/core/raster/qgsrasterblock.sip              |   17 +
 python/core/symbology-ng/qgsfillsymbollayerv2.sip  |    2 +
 python/core/symbology-ng/qgslinesymbollayerv2.sip  |    2 +
 .../core/symbology-ng/qgsmarkersymbollayerv2.sip   |    1 +
 python/core/symbology-ng/qgssvgcache.sip           |    4 +
 python/ext-libs/pyspatialite/src/connection.c      |   16 +-
 python/ext-libs/pyspatialite/src/connection.h      |    3 +-
 .../db_manager/db_plugins/postgis/plugin.py        |    4 +-
 .../postgis/plugins/qgis_topoview/__init__.py      |   16 +-
 python/plugins/db_manager/dlg_sql_window.py        |   24 +-
 .../processing/algs/grass7/Grass7Algorithm.py      |   10 +-
 python/plugins/processing/algs/qgis/ConvexHull.py  |   13 +-
 .../processing/algs/qgis/SelectByAttribute.py      |    7 +-
 .../processing/algs/qgis/VectorLayerScatterplot.py |    4 +-
 .../algs/qgis/scripts/Create_points_along_lines.py |    2 +-
 .../scripts/Number_of_unique_values_in_classes.py  |    4 +
 .../algs/qgis/ui/FieldsCalculatorDialog.py         |    3 +-
 python/plugins/processing/algs/saga/CMakeLists.txt |    2 +-
 python/plugins/processing/algs/saga/SagaUtils.py   |    5 +-
 .../processing/script/AddScriptFromFileAction.py   |    7 +-
 python/user.py                                     |   14 +-
 resources/function_help/NULL                       |   14 +
 scripts/update_ts.sh                               |    2 +-
 src/analysis/network/CMakeLists.txt                |    4 +
 src/analysis/openstreetmap/qgsosmdatabase.cpp      |   13 +-
 src/analysis/openstreetmap/qgsosmimport.cpp        |   10 +-
 src/analysis/vector/qgszonalstatistics.cpp         |   31 +-
 src/analysis/vector/qgszonalstatistics.h           |    4 +
 src/app/composer/qgscomposer.cpp                   |   78 +-
 src/app/composer/qgscomposer.h                     |   12 +-
 src/app/gps/qgsgpsinformationwidget.cpp            |    5 +-
 src/app/nodetool/qgsmaptoolnodetool.cpp            |   87 +-
 src/app/qgisapp.cpp                                |   69 +-
 src/app/qgsadvanceddigitizingdockwidget.cpp        |   77 +-
 src/app/qgsadvanceddigitizingdockwidget.h          |    1 -
 src/app/qgsapplayertreeviewmenuprovider.cpp        |   34 +-
 src/app/qgsbookmarks.cpp                           |    6 +-
 src/app/qgsdxfexportdialog.cpp                     |   15 +-
 src/app/qgsloadstylefromdbdialog.cpp               |   35 +-
 src/app/qgsloadstylefromdbdialog.h                 |    1 -
 src/app/qgsnewspatialitelayerdialog.cpp            |   24 +-
 src/app/qgsoptions.cpp                             |    4 +-
 src/app/qgsprojectlayergroupdialog.cpp             |    5 +
 src/app/qgsprojectlayergroupdialog.h               |    2 +
 src/app/qgstipgui.cpp                              |    2 +-
 src/browser/main.cpp                               |   35 +-
 src/core/CMakeLists.txt                            |    3 +
 src/core/composer/qgscomposermap.cpp               |   13 +-
 src/core/composer/qgscomposermap.h                 |   15 +-
 src/core/composer/qgscomposermapgrid.cpp           |   12 +
 src/core/dxf/qgsdxfexport.cpp                      |  181 +-
 src/core/dxf/qgsdxfexport.h                        |   17 +-
 src/core/dxf/qgsdxfpaintengine.cpp                 |  106 +-
 src/core/dxf/qgsdxfpaintengine.h                   |    5 +-
 src/core/dxf/qgsdxfpallabeling.cpp                 |    3 +-
 src/core/gps/qgsgpsdetector.cpp                    |    8 +-
 src/core/layertree/qgslayertreemodellegendnode.cpp |    7 +-
 src/core/layertree/qgslayertreemodellegendnode.h   |    3 +-
 src/core/qgis.h                                    |    5 +-
 src/core/qgscolorscheme.h                          |    6 +-
 src/core/qgscoordinatereferencesystem.cpp          |   15 +-
 src/core/qgsdataitem.cpp                           |    6 +-
 src/core/qgsdataitem.h                             |    3 +-
 src/core/qgsdistancearea.cpp                       |    3 +-
 src/core/qgsexpression.cpp                         |   15 +-
 src/core/qgsfeature.h                              |   45 +-
 src/core/qgsfield.cpp                              |    6 +-
 src/core/qgsgeometry.h                             |    2 +-
 src/core/qgsgeometryvalidator.cpp                  |    4 +-
 src/core/qgsgml.cpp                                |    1 +
 src/core/qgslayerdefinition.cpp                    |    2 +-
 src/core/qgslocalec.cpp                            |   43 +
 .../qgspostgresconnpool.cpp => core/qgslocalec.h}  |   40 +-
 src/core/qgsmaplayer.cpp                           |  144 +-
 src/core/qgsofflineediting.cpp                     |   13 +-
 src/core/qgspalgeometry.h                          |   51 +-
 src/core/qgspallabeling.cpp                        |   48 +-
 src/core/qgspallabeling.h                          |    9 +
 src/core/qgspoint.cpp                              |   20 +-
 src/core/qgspointlocator.cpp                       |   41 +-
 src/core/qgsproject.cpp                            |    2 +-
 src/core/qgsrectangle.cpp                          |    3 +
 src/core/qgsrenderchecker.cpp                      |   22 +-
 src/core/qgsslconnect.cpp                          |   89 +
 src/core/qgsslconnect.h                            |   39 +
 src/core/qgsvectorfilewriter.cpp                   |   38 +-
 src/core/qgsvectorlayer.cpp                        |   45 +-
 src/core/qgsvectorlayer.h                          |    2 +-
 src/core/qgsvectorlayereditbuffer.cpp              |   12 +-
 src/core/qgsvectorlayerfeatureiterator.cpp         |    5 +-
 src/core/qgsvectorlayerjoinbuffer.cpp              |    3 +-
 src/core/raster/qgsrasterblock.cpp                 |   27 +
 src/core/raster/qgsrasterblock.h                   |   17 +
 src/core/raster/qgsrasterlayer.cpp                 |   14 +-
 src/core/raster/qgsrasterprojector.cpp             |    1 +
 src/core/raster/qgssinglebandcolordatarenderer.cpp |   12 +-
 src/core/symbology-ng/qgsellipsesymbollayerv2.cpp  |   74 +-
 src/core/symbology-ng/qgsfillsymbollayerv2.cpp     |    8 +
 src/core/symbology-ng/qgsfillsymbollayerv2.h       |    2 +
 src/core/symbology-ng/qgslinesymbollayerv2.cpp     |    8 +
 src/core/symbology-ng/qgslinesymbollayerv2.h       |    2 +
 src/core/symbology-ng/qgsmarkersymbollayerv2.cpp   |  228 +-
 src/core/symbology-ng/qgsmarkersymbollayerv2.h     |    3 +-
 .../symbology-ng/qgspointdisplacementrenderer.cpp  |   19 +-
 .../symbology-ng/qgspointdisplacementrenderer.h    |    2 +-
 src/core/symbology-ng/qgssvgcache.cpp              |   50 +-
 src/core/symbology-ng/qgssvgcache.h                |    4 +
 .../qgsattributetablefiltermodel.cpp               |    4 +-
 src/gui/attributetable/qgsattributetableview.cpp   |   23 -
 src/gui/attributetable/qgsdualview.cpp             |    1 +
 src/gui/editorwidgets/qgsdatetimeedit.cpp          |    1 +
 src/gui/editorwidgets/qgsrangeconfigdlg.cpp        |   24 +-
 src/gui/editorwidgets/qgsrangewidgetfactory.cpp    |   12 +-
 src/gui/editorwidgets/qgsrangewidgetwrapper.cpp    |   67 +-
 src/gui/editorwidgets/qgsrangewidgetwrapper.h      |    5 +
 src/gui/editorwidgets/qgstexteditwrapper.cpp       |   22 +-
 src/gui/layertree/qgslayertreemapcanvasbridge.cpp  |   25 +-
 src/gui/qgsattributeform.cpp                       |   19 +-
 src/gui/qgsattributeform.h                         |    5 +
 src/gui/qgsattributeformlegacyinterface.cpp        |    3 +-
 src/gui/qgscomposerruler.cpp                       |    4 +-
 src/gui/qgsdatumtransformdialog.cpp                |    3 +
 src/gui/qgsdial.cpp                                |  119 +-
 src/gui/qgsdial.h                                  |   41 +-
 src/gui/qgsexpressionbuilderwidget.cpp             |   26 +-
 src/gui/qgsexpressionbuilderwidget.h               |    8 +
 src/gui/qgsmapcanvas.cpp                           |    6 +
 src/gui/qgsmapcanvassnapper.cpp                    |   14 +-
 src/gui/qgsmaptoolzoom.cpp                         |    6 +-
 src/gui/qgsnewhttpconnection.cpp                   |    3 +-
 src/gui/qgsrasterlayersaveasdialog.cpp             |    5 +
 src/gui/qgsslider.cpp                              |  119 +-
 src/gui/qgsslider.h                                |   41 +-
 src/gui/qgssublayersdialog.cpp                     |   14 +-
 src/gui/symbology-ng/characterwidget.cpp           |    6 +
 src/gui/symbology-ng/characterwidget.h             |    1 +
 src/gui/symbology-ng/qgssymbollayerv2widget.cpp    |    8 +-
 .../qgsvectorfieldsymbollayerwidget.cpp            |   16 +-
 .../symbology-ng/qgsvectorfieldsymbollayerwidget.h |    2 +-
 src/plugins/grass/qgsgrassnewmapset.cpp            |   11 +-
 src/plugins/grass/qgsgrassplugin.cpp               |    8 +-
 src/plugins/spatialquery/qgsspatialquerydialog.cpp |    6 +-
 src/providers/gdal/qgsgdaldataitems.cpp            |   21 +-
 src/providers/grass/qgsgrass.cpp                   |   43 +-
 src/providers/mssql/qgsmssqlgeometryparser.cpp     |    4 +-
 src/providers/mssql/qgsmssqlnewconnection.cpp      |   16 +-
 src/providers/mssql/qgsmssqlprovider.cpp           |   48 +-
 src/providers/mssql/qgsmssqlsourceselect.cpp       |   27 +-
 src/providers/ogr/qgsogrdataitems.cpp              |  116 +-
 src/providers/ogr/qgsogrprovider.cpp               |   55 +-
 src/providers/ogr/qgsogrprovider.h                 |    6 +-
 src/providers/oracle/qgsoraclefeatureiterator.cpp  |    2 +-
 src/providers/oracle/qgsoraclenewconnection.cpp    |    7 +-
 src/providers/oracle/qgsoracleprovider.cpp         |   47 +-
 src/providers/ows/qgsowsdataitems.cpp              |    2 +-
 src/providers/postgres/qgspgnewconnection.cpp      |    4 +-
 src/providers/postgres/qgspgtablemodel.cpp         |   15 +-
 src/providers/postgres/qgspostgresconnpool.cpp     |    3 +-
 src/providers/postgres/qgspostgresconnpool.h       |    3 +-
 src/providers/postgres/qgspostgresdataitems.cpp    |   16 +-
 src/providers/postgres/qgspostgresprovider.cpp     |   20 +-
 src/providers/spatialite/CMakeLists.txt            |    8 -
 .../spatialite/qgsspatialiteconnection.cpp         |   16 +-
 src/providers/spatialite/qgsspatialiteconnection.h |    2 -
 src/providers/spatialite/qgsspatialiteconnpool.cpp |    2 +-
 src/providers/spatialite/qgsspatialiteconnpool.h   |    3 +-
 .../spatialite/qgsspatialitedataitems.cpp          |   16 +-
 .../spatialite/qgsspatialitefeatureiterator.cpp    |   12 +-
 src/providers/spatialite/qgsspatialiteprovider.cpp |   58 +-
 .../spatialite/qspatialite/CMakeLists.txt          |    1 +
 .../spatialite/qspatialite/qsql_spatialite.cpp     |    8 +-
 src/providers/wcs/qgswcsprovider.cpp               |    6 +
 src/providers/wcs/qgswcsprovider.h                 |    2 +
 src/providers/wms/qgswmscapabilities.cpp           |   14 +
 src/providers/wms/qgswmscapabilities.h             |    7 +-
 src/providers/wms/qgswmsdataitems.cpp              |   38 +-
 src/providers/wms/qgswmsprovider.cpp               |   31 +-
 src/providers/wms/qgswmsprovider.h                 |   26 +-
 src/providers/wms/qgswmssourceselect.cpp           |    2 +
 src/server/qgsconfigcache.cpp                      |    5 +-
 src/server/qgshttprequesthandler.cpp               |    2 +-
 src/server/qgsserverprojectparser.cpp              |    2 +-
 src/server/qgsserverprojectparser.h                |    2 +-
 src/server/qgswfsserver.cpp                        |    2 +-
 src/server/qgswmsprojectparser.cpp                 |   41 +-
 src/server/qgswmsserver.cpp                        |    5 +
 src/ui/symbollayer/widget_vectorfield.ui           |   22 +-
 tests/src/core/CMakeLists.txt                      |    2 +
 tests/src/core/testqgsexpression.cpp               |    7 +
 tests/src/core/testqgsfields.cpp                   |  404 +
 tests/src/core/testqgspallabeling.cpp              |   67 +
 tests/src/core/testqgspoint.cpp                    |   36 +-
 tests/src/python/test_qgsfeature.py                |   11 +-
 214 files changed, 9625 insertions(+), 6004 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 26f46b9..f80b672 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 "2")
+SET(CPACK_PACKAGE_VERSION_PATCH "3")
 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+
@@ -199,6 +199,16 @@ ENDIF (WITH_POSTGRESQL)
 
 FIND_PACKAGE(SPATIALITE REQUIRED)
 
+IF(SPATIALITE_VERSION_GE_4_0_0)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_GE_4_0_0")
+ENDIF(SPATIALITE_VERSION_GE_4_0_0)
+IF(SPATIALITE_VERSION_G_4_1_1)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_G_4_1_1")
+ENDIF(SPATIALITE_VERSION_G_4_1_1)
+IF(SPATIALITE_HAS_INIT_EX)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_HAS_INIT_EX")
+ENDIF(SPATIALITE_HAS_INIT_EX)
+
 IF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
   MESSAGE (SEND_ERROR "Some dependencies were not found!")
 ENDIF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
diff --git a/ChangeLog b/ChangeLog
index ebfe747..bf26463 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,950 @@
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-22
+
+    Fix 'nan'='nan' evaluates to false in expressions
+
+    Also fix 'nan' and 'inf' being treated as doubles rather than
+    strings.
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-22
+
+    [labeling] Fix incorrect handling of word spacing for curved labels
+
+Juergen E. Fischer <jef at norbit.de>	2015-07-14
+
+    fix doxygen warning
+
+Juergen E. Fischer <jef at norbit.de>	2015-07-14
+
+    fix windows build
+
+    (cherry picked from commit 5a9009118f4f695087de97856d325535faa3767e)
+
+Juergen E. Fischer <jef at norbit.de>	2015-07-13
+
+    german translation update
+
+Merge: b180dec 1edcf3c
+Salvatore Larosa <lrssvtml at gmail.com>	2015-07-13
+
+    Merge pull request #2112 from slarosa/release-2_8
+
+    Backporting to 2.8.3
+
+Salvatore Larosa <lrssvtml at gmail.com>	2015-06-03
+
+    Fix #6099 - Save as... for raster: missing extension on Gnome3
+
+    (cherry-picked from 2125f6a)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-31
+
+    include user.py in translations
+
+    Conflicts:
+python/core/qgspallabeling.sip
+
+    (cherry-picked from 2ab8a0b)
+
+Salvatore Larosa <lrssvtml at gmail.com>	2015-06-17
+
+    [expression] autoselect first item in function list
+
+    (cherry-picked from 395d630)
+
+Salvatore Larosa <lrssvtml at gmail.com>	2015-05-27
+
+    Fix for function editor:
+    when running the script the entries "Fields and values" and "Recent"
+    into the functions list of the expression builder disappear.
+    (cherry-picked from 89477af)
+
+Salvatore Larosa <lrssvtml at gmail.com>	2015-05-27
+
+    [bookmark] use the same key for settings to store the last used directory: folloup 94f9ae2
+    (cherry-picked from 1cbbf59)
+
+Matthias Kuhn <matthias at opengis.ch>	2015-07-11
+
+    Add QgsAttributes::operator== that takes care of NULL variants
+
+    Fixes an issue that the postgres provider would return multiple subsequent
+    features whose attributes only differ only in 0 vs. NULL.
+
+Matthias Kuhn <matthias at opengis.ch>	2015-07-10
+
+    Add test to check if QgsFeature.setAttributes handles 0 vs NULL correctly
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-11
+
+    Fix diagrams incorrectly enabled when opening project from >= 2.10
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-11
+
+    Fix zoom last needs two clicks to reset view for zoom tool
+    (fix #13095)
+
+    (cherry-picked from b50c603e47bb330b1ea69efaef4a747a8def5389)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    Fix infinite loop when painting grid with bad parameters
+
+    Credit to @m-kuhn
+
+    Cherry-picked from 4876c6572ca9b0930a1e1451e76728755e1b666a
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    Call QgsComposer::restoreComposerMapStates in QgsComposer:changeEvent,
+    not in showEvent (latter does not work reliably with some window
+    managers, such as openbox) (fix #6085)
+
+    Cherry-picked from cc9f2a6270b59143000e30f41db1f57e8d900534
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    [labels] Fix null data defined value was not ignored in some cases
+
+    Cherry-picked from eb6279ac5a64f14208d07c305d64e28a354629bb
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    Include NULL in expression builder available functions list
+
+    Cherry-picked from 7b18f676628b59932df69fd5b98a4432ff0f3d69
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    [composer] Don't redraw map if layers change and map is set to cached
+
+    Previously map was being redrawn every time a layer was added or
+    removed from the registry, which blocked the ui until the map
+    redraw is complete.
+
+    Now the map will only be redrawn as a result of layer changes
+    if it's set to Render mode.
+
+    Possible fix for 12234 and 12125. (refs #12234, #12125)
+
+    (cherry-picked from 837c7ee8d3ecacfce45ac0a299eb20c8a76f983b)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-07-09
+
+    Avoid hang on WMS legends with missing graphics (fix #12234)
+
+    (Cherry-picked from 4f29c58e4357fad505c82459e97c17449bf4891b)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-19
+
+    Fix SAGA detection on some Debian/Ubuntu systems (fixes #12335)
+
+    (cherry picked from commit eaf17e56c2ff6c74eb43319096a177fc301d5a39)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-18
+
+    Fix transparency for WMS layers (fixes #12300)
+
+    (cherry picked from commit dbfbc692838e768b13c970c7d777829883b4b841)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-18
+
+    Fix shifted joined attributes when join field is repeated (fixes #12589)
+
+    (cherry picked from commit 78708159b28bcbfa94e53f8b93f91790fa43ec02)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-18
+
+    Make QgsMapCanvas.snapToCurrentLayer() work again (fixes #12631)
+
+    The snapper was called with screen coords instead of map coords
+    (due to implicit conversion QPoint->QgsPoint)
+
+    (cherry picked from commit e6466477136a440125108cbe2406cbf971ceff19)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-18
+
+    Fix locking logic with X,Y locked and soft locks to angle (fixes #12940)
+
+    (cherry picked from commit 646b445bf799daf4bc2a09b88bc6b6f2dc51d545)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-06-18
+
+    Fixed fish and alcohol SVG files (fixes #12948)
+
+    Both SVGs had an extra path out of specified bounds which was getting
+    clipped out when rendering to canvas, but not in other places.
+
+    (cherry picked from commit b81933ee56ff94a764bd3b9027dbfaa190ae2f35)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    fix build on precise
+
+    (cherry picked from commit ffd2f26dd076256f6cf45dba7bf1c178098982b0)
+
+Sandro Santilli <strk at keybit.net>	2015-07-03
+
+    DBManager TopoViewer: zoom on topology if first load
+
+    Fixes #13064
+
+    (backport of b9b6257eb7b6d475c4f9e0a5a540c9267aa87c95)
+
+Juergen E. Fischer <jef at norbit.de>	2015-07-02
+
+    fix reordering of render order (followup 78c60a2)
+
+    (cherry picked from commit df4a41f7800083db5be4bb9ba152209f1e57f575)
+
+Juergen E. Fischer <jef at norbit.de>	2015-07-02
+
+    dxf export:
+    * add missing marker types (fixes #13062)
+    * add missing support for data-defined marker names (fixes #13063)
+
+    (backported from b28c484)
+
+Sandro Santilli <strk at keybit.net>	2015-07-02
+
+    DBManager topoviewer: don't be fooled by srid=-1 in topology.topology
+
+    Fixes #12802
+
+Merge: 7bbb5b3 10d421e
+Werner Macho <werner.macho at gmail.com>	2015-06-30
+
+    Merge pull request #2187 from minorua/ts_backports
+
+    [2.8] japanese translation update
+
+Minoru Akagi <akaginch at gmail.com>	2015-07-01
+
+    japanese translation update
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-30
+
+    german translation update
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-29
+
+    wms provider: recover the possibility to configure the feature count in WMS requests
+
+    (cherry picked from commit 1dfe005e67162bd1950397940de4f0008512f9c0)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-15
+
+    backported dxf fixes:
+    * fix crash when not enabled layers are exported
+    * fix handing of areas with holes when exporting SVGs
+    * fix block, hatch and polyline ownership
+    * fix support for data-defined properties in SVG export
+    * remove drawRects and let it fallback to drawPath and drawPolygon
+    * close arcs
+    * replace writeSolid with writePolygon
+
+    (backported b4fc413, 2798ab0, b3c2bd7 and 7031cfb)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-26
+
+    processing: fix installation of saga 2.1.3 descriptions
+
+    (cherry picked from commit 2d87a706090349b4a0f03a0feeef6d2f8cd40e8d)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-24
+
+    add postgres layer: enforce selection of primary key for views (refs #11317)
+
+    (cherry picked from commit a54c2d02cf580cbc90df2dbfe21bd160442528fc)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-24
+
+    handle ogr sublayers with colon
+
+    (cherry picked from commit 2b703e3 & d875011)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-23
+
+    geometry validator: fix touching lines check (followup b9b9bc3, fixes #12730)
+
+    (cherry picked from commit 3eef29ab1bd4cc007b7db5012dad23d9c39e2249)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-23
+
+    invalidate first crs on project load (fixes #13011)
+
+    (cherry picked from commit fd4b38c55a368d7a04888d785fc873ca86528150)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-19
+
+    handle 64bit feature ids in selections (fixes #13001)
+
+    (cherry picked from commit 1a6aee18f03614addbc0a104e38ec0c476890569)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-19
+
+    browser: add i18n
+
+    (cherry picked from commit 35f383835cc2193b5ecd9d51c2454d2d3b00ec7e)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-19
+
+    oracle provider: fix ExactIntersect check if spatial extension is available and there is no spatial index (fixes #13005)
+
+    (cherry-picked from dfc2cf0 & 318137a)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-17
+
+    oracle provider: reassign feature id after inserting new features (fixes #12690)
+
+    (cherry picked from commit d3df4edaedc9542830dba1a99ce1b20d2bdc5773)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-15
+
+    use class to temporary override locale to C
+
+    (cherry picked from commit 0ecef35d247d6ca76cd7353349225f99a4feb7d1)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    ogr provider: increase width by one for decimal point if precision is given
+    (fixes #11755, fixes #12985)
+
+    (cherry picked from commit 2fcbc8b and 513cfad)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-14
+
+    save spatialite as: create integer column from qlonglong if it fits (fixes #12325; followup b736317)
+
+    (cherry picked from commit 6e55fbe1495e5a3d2a1ba3181a71543e026edc1a)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-14
+
+    node tool: show rubberband when moving (fixes #12959)
+
+    (cherry picked from commit c54013c4cd2931142a81c0e6ec72eef4c7ae3c93)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-14
+
+    postgres provider: fix feature count on delete (fixes #12957)
+
+    (cherry picked from commit 37ed83905f3b81ecd778c5abb1703805ce34666b)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-13
+
+    fix some crash on invalid layers
+
+    (cherry picked from commit 34488f8 & 8fbee12)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    fix renaming of db/http connections (fixes #10632)
+
+    (cherry picked from commit 5bf316fec6ab3b727e7ed4c97cda2c6cfc52f623)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    attribute: also put selected item on top if sorting descending (fixes #12434)
+
+    (cherry picked from commit d3c4da0b66f70efdf0b2fcff4075395686f72203)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    handle bad layers when custom layer order is set (fixes #12733)
+
+    (cherry picked from commit 78c60a297c64f87b2c7fd15801a3c62d8af92cb0)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    vector file writer: support QVariant::UInt, ::ULongLong and ::Time (fixes #12841)
+
+    (cherry picked from commit 8d0c28117641c6d9826bf31ce614994ffdb00287)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-11
+
+    edit widgets: don't truncate double ranges and also support them in sliders and
+    dials (fixes #12421)
+
+    (cherry picked from commit 91e44ea and c6996ac)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    layer context menu: disable CRS related menu entries from table layers (fixes #12654)
+
+    (cherry picked from commit 3d193e3026922620d1461eaa41336b49a3dcca77)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    spatialite provider: load 64bit integers (fixes #12785)
+
+    (cherry picked from commit b736317005c2417ffc037bbc3969a2b180c49dd7)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    gps information widget:
+    * fix crash when satellite markers are remove (fixes #12393)
+    * also fixes serial port detection on unix
+
+    (cherry picked from commit 014f0703fef04c63cb1f46bca52562e85d28ce96)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    feature iterator: include attributes required by virtual fields first so that
+    they trigger joins if necessary (fixes #11545)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    fix primary key search (fixes #11997)
+
+    (cherry picked from commit 3646e35827da5b6e1e03a9375aa2845fb013bdaa)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-09
+
+    Move information about strict provider geometry type check on point shapefiles
+    to OGR provider and make use of it when pasting & merging features
+    (fixes #12488, refs #10672, refs #10747)
+
+    TODO: check if other OGR drivers have similar restrictions.
+    (cherry picked from commit 8289891b78953581f22e944565e0e1c9678a09c3)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-08
+
+    date edit widget: show date if null is allowed
+
+    (cherry picked from commit 558f0b2808b6a0a4f90f967090acf62200c2f923)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-08
+
+    mssql provider: improve datetime support (fixes #12461)
+
+    (cherry-picked from 018cdd25)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-08
+
+    vector layer: changing of attributes and geometry of new features doesn't require ChangeGeometry/ChangeAttributeValues capabilities (fixes #12909)
+
+    (cherry-picked from 77bf10b)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-08
+
+    ows data items: population of children already runs in a thread - don't use subthreads for each provider (fixes #12507)
+
+    (cherry picked from commit 402df0323e81b53c81d472b8376b6a0c8fb57eed)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-05
+
+    wmts: also accept extents in WGS84BoundingBox (fixes #12432)
+
+    (cherry picked from commit 7aae459fa9db730df51ae51fc1c144794058eef7)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-04
+
+    fix crash attribute table crash when attributes are added/removed bypassing vector layer (fixes #12477)
+
+    (cherry picked from commit 316210d62255729600edfe0ab8b3b43312725be5)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-04
+
+    also copy vector provider encoding when duplicating layers (fixes #11687)
+
+    (cherry picked from commit c22ad17cee5b12f9f10764107d3b006ced88bec9)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-03
+
+    fix style selection when loading from database (fixes #12863)
+
+    (cherry picked from commit d53d30d29023be261ca6cd9bce9cfaac60d6ef78)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-03
+
+    don't crash on geometryless wfs features
+
+    (cherry picked from commit 6a019ada8aa9cd4286ac7a157383cc300b46d0fd)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-02
+
+    datum transformation selection: fix crash on 'hide deprecated' (fixes #12719)
+
+    (cherry picked from commit 1bd3776392d59456ff1bf8159ad9f86e4153f68b)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-02
+
+    ogr provider: only reset feature id of added feature, if OGR assigned one (fixes #12648)
+
+    (cherry picked from commit ae11a731ae406def333cc85dd2dcbc46429320d9)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-01
+
+    expression: validate places value of format_number (fixes #12796)
+
+    (cherry picked from commit 518072e9b319fa15848237b2a42a472421a40627)
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-01
+
+    gdal/ogr data items: reenable SetCrs capabilities (fixes #12505)
+
+    (cherry picked from commit 78ecddb65d6b3aba6b8b6126b1d45f8129756b59)
+
+Salvatore Larosa <lrssvtml at gmail.com>	2015-05-30
+
+    [user expression] Fix crash and add a log message when the expression is not valid, fixes #12852
+
+    (cherry picked from commit f7401c9b272f12fd543c36fe8c2e3217dcede791)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-31
+
+    make initialization of connection pool thread save on MSVC
+
+    (cherry picked from commit c550af2 and 1e96813)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-28
+
+    postgres connection pool: fix race when a connection is already acquired while pool is still being constructed
+
+    (cherry picked from commit 1e9681313284537d40fdec9039e8da9b755d0a60)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-28
+
+    validate attribute index in editor widget calls
+
+    (cherry picked from commit ecbe0e43f45a9a68f5724f826319f34d02459f4c)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-06-09
+
+    Fix bug causing raster blocks to be cleared when reprojecting
+
+    If a QgsRasterBlock had no nodata value set, then reprojecting
+    the raster using QgsRasterProjector would result in the entire
+    block being set to nodata.
+
+    Cherry-picked from 920f2ebe560bb3a5ec1a160e788ec1de6bb2b354
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-06-08
+
+    Add confirmation prompt before deleting PostGIS and Spatialite
+    tables through the browser. Also add confirmation before dropping
+    connections (fix #12853).
+
+    Cherry-picked from aeda9554bac432c485c8694fd5c6185732ef01ce
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-06-01
+
+    [labeling] Fix broken repeat distance in map units (fix #11937)
+
+    Cherry-picked from 15ba0064088559124741a04ae4603048f6b8ccb6
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-30
+
+    Fix broken rendering of curved labels for scripts which use >1 char
+    graphemes (fix #6883)
+
+    Cherry-picked from 2dc5d95f00770c602497f633612a6dabb8be4962
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-30
+
+    Correctly emit composerRemoved signal after removing composer
+    from print composers list, fixes composer manager showing
+    invalid old compositions when loading new project (fix #12612)
+
+    Cherry-picked from 3530e4c205b4cc3f426e16dde7636fb89e9b73d7
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-29
+
+    Fix memory leaks in QgsMapCanvasSnapper
+
+    Cherry-picked from 8b6abacc9988df9e209fbd9405bd267f95bcca2f
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-28
+
+    Fix zoom tool doesn't work from bottom right to top left (fix #12614)
+
+    Cherry-picked from bfa9f1cf6a712709fd89dd23e314211cc13a240a
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-28
+
+    Fix server crashes when .qgs file replaced (refs #12411)
+
+    Cherry-picked from 232565db96da05d871ca49f0457921a908e7df5a
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-28
+
+    Fix composer map frame/annotations not showing on OSX (refs #12747)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-23
+
+    Fix untranslatable strings (fix #11765)
+
+    cherry-picked from df7e07bcf7889c79297eb5ff25ca6244ec71c82b
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-20
+
+    Possible fix for slow loading projects when the project contains
+    print compositions and there is network issues with connections
+    to installed printers. (workaround QTBUG-3033)
+
+    (refs #12234)
+
+    cherry-picked from 06732f137357ff1f3c2a55a3253037d8df85596b
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-20
+
+    Fix point displacement renderer not ignoring features with no symbol
+
+    Previously, the renderer would incorrectly draw circles and
+    displace features which were proximal to features with no symbols.
+    This caused issues with the rule based renderer, were some
+    features should not be drawn.
+
+    cherry-picked from 81f4e4471f696215113bb67f91d114cecde029bd
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-04
+
+    Fix legend text not customisable for QgsSimpleLegendNode items
+
+    cherry-picked from 4a9a9361aa4a1750900b9772f978b088294598cd
+
+rldhont <rldhont at gmail.com>	2015-06-19
+
+    [BUGFIX][QGIS-Server] Add all layers for fixed legend in GetPrint
+
+    If a legend is not linked to a map, it's a fixed legend and does not depend on
+     layers parameter. This bugfix loads all layers needed by legend and update it.
+
+Hugo Mercier <hugo.mercier at oslandia.com>	2015-06-02
+
+    Wait for the current rendering to finish before touching the cache
+
+Nathan Woodrow <nathan.woodrow at mapsolutions.com.au>	2015-06-19
+
+    Fix #12881 - Fix loading of QLR files with the same layers
+
+    Using just date stamps wasn't fine enough
+
+    Funded By TechnologyOne, Australia
+
+    - Backported to 2.8.3
+    - Cherry-picked from a316290ada9e3141358d
+
+Nathan Woodrow <madmanwoo at gmail.com>	2015-06-19
+
+    Fix #12254 - Fix lookup of SRID for SQL Server layers
+
+    Funded by TechnoglogyOne, Australia
+
+    - Backported to 2.8.3
+    - Cherry-picked from 9c73a22af52f3eec3959f2ed0e6953a6443d875b
+
+Nathan Woodrow <madmanwoo at gmail.com>	2015-06-18
+
+    Fix #11971 - Fix display of MS SQL layers with z and m values
+
+    Funded by TechnoglogyOne, Australia
+
+    - Backported to 2.8.3
+    - Cherry-picked from 012f322d96969e8d8db3514bc85bad51246c7a0d
+
+Nathan Woodrow <madmanwoo at gmail.com>	2015-06-16
+
+    MSSQL: Show message if geometry_columns not found
+
+    Funded by TechnologyOne, Australia
+
+    - Backported to 2.8.3
+    - Cherry-picked from 9f0ea0c2fd33a97d7a078e26cda381e7daf70490
+
+Larry Shaffer <larrys at dakotacarto.com>	2015-06-16
+
+    Update GetInfo dates in app and browser plists for Mac
+
+    - Cherry-picked from 538969960bc8a8d43a2bd22158f8592d0dd2eadc
+    - Backported to 2.8.3
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-06-12
+
+    qgsDoubleToString: Don't remove trailing zeros when integer
+
+    Fix #12947
+
+    cherry-picked from ac38b21380
+
+    Backported to 2.8.3
+
+Juergen E. Fischer <jef at norbit.de>	2015-06-10
+
+    reenable tips for new minor releases
+
+    (cherry picked from commit 765d1a98b5521724ccbfd3c25e7516794cad5ae0)
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-05-27
+
+    Fix developers map background loading
+
+    Fix #12831
+    Backported to 2.8.3
+
+    Workaround for https://github.com/Leaflet/Leaflet/issues/2021
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-06-05
+
+    Fix crash on startup when python support is not present
+
+    Adds a safety check for mActionShowPythonDialog before accessing it
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-06-05
+
+    Use full height on attribute form with drag and drop layout
+
+Larry Shaffer <larrys at dakotacarto.com>	2015-06-04
+
+    Fix single band gray with alpha raster type not recognized (fix #4159)
+
+    - Add band color interpretation for WCS provider (from GDAL provider)
+
+    Backported to 2.8.3
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-06-04
+
+    Don't crash when deleting last vertex
+
+    Fix #12867
+
+    Backported to 2.8.3
+
+    Also preserves NULL rectangles in QgsRectangle::normalize()
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-06-02
+
+    Advanced digitizing: Create new MessageBarItem for every item shown
+
+    The QgsMessageBar takes ownership
+    Fix #12849
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-29
+
+    german translation update
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-05-26
+
+    Fix windows build (followup d7ca190)
+
+    (cherry picked from commit 5f0d1b4bf1a6680603fe4f6f66e03aa279a14021)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-26
+
+    adopt 'new' spatialite initialization scheme via thin wrapper around sqlite3_open and sqlite3_close (fixes #12771)
+
+    (cherry picked from commit 252aaab, 23ef9da, d4b72a2, c7cb963 and e255d6c)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-20
+
+    dxf export: fix circle marker
+
+    (cherry picked from commit 9a32c282add6bc6ce295bc94499819de2987788e)
+
+volaya <volayaf at gmail.com>	2015-05-21
+
+    [processing] fixed ‘add script from file’ tool
+
+    (cherry picked from commit 4d62566db702843f78154e76d0d3bc3e65c8556c)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-26
+
+    fix relative path support for gdal layers (fixes #12823)
+    (merged 47cb75dd and e2e8c87)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-25
+
+    avoid warning about not created test difference image
+
+    (cherry picked from commit d40d481bd33db7fb3277a145eb36dda2fee47d3c)
+
+Martin Dobias <wonder.sk at gmail.com>	2015-05-21
+
+    Avoid crash if no project file is selected and OK is clicked
+
+    (cherry picked from commit 6318f67bfc62d9c124eae620aecb4987d758582b)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-09
+
+    grass: fix relative path support for working database and vector layers (fixes #12725)
+
+    (cherry picked from commit e5dbd186d8f185174ac5fc8fd152e586aa9925f0)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-09
+
+    ogr provider: limit mysql driver to requested layer
+
+    (cherry picked from commit 536135a3f4f453d9a93dc2e83a1c2c5278e3bfd3)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-11
+
+    dxf export: fix detection of closed polylines
+
+    (backport of 74f10b9)
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-10
+
+    postgres provider: cast result of a subquery in min/max/uniqueValue(s) (fixes #12630; followup bf56457 ff)
+
+    (cherry picked from commit e509fc53ce5cfdb64b984177c5279a6cf7d8644c)
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-05-27
+
+    Fix crash if multiple multiline text edtit widgets for the same field are shown
+
+    Fix #11813
+
+Merge: 5d5229e fd817ec
+Giuseppe Sucameli <brush.tyler at gmail.com>	2015-05-27
+
+    Merge pull request #2000 from Gustry/fix-selected-query-backport
+
+    [db_manager] backport 2.8.2 fix #12429 run only the selected query
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-05-26
+
+    Fixup ae242f5
+
+    In QGIS 2.8 QgsField is not yet implicitly shared...
+
+arnaud.morvan at camptocamp.com <arnaud.morvan at camptocamp.com>	2015-05-22
+
+    Update QgsFields nameToIndex hash on field removed
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    show correct coordinates in status bar when projected CRS used and
+    canvas units set to degrees (fix #12395)
+
+    Tests for latitude wrapping included
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-22
+
+    Correctly restore font and character for font marker widget
+
+rldhont <rldhont at gmail.com>	2015-05-22
+
+    [BUGFIX][SERVER][WFS] Remove extra line after header
+
+rldhont <rldhont at gmail.com>	2015-05-22
+
+    Revert "[BUGFIX] Remove extra line after header"
+
+    This reverts commit a2e538e35474ec6affc4ab387b81b88f83c2986c.
+
+rldhont <rldhont at gmail.com>	2015-05-22
+
+    [BUGFIX] Remove extra line after header
+
+rldhont <rldhont at gmail.com>	2015-05-21
+
+    [BUGFIX] GetFeatureInfo STYLES and FILTER used together
+
+    In GetFeatureInfo WMS Request, if STYLES and FILTER are used together, it's
+     like FILTER is not applied.
+
+    To fix it, we check in the QgsMapLayerRegistry if the layers associated to
+     QUERY_LAYERS has already created.
+
+Martin Dobias <wonder.sk at gmail.com>	2015-05-21
+
+    Fix #12406 (measured area is wrong when computed on ellipsoid)
+
+    Introduced in e568493
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-21
+
+    Fix multiple overlaps of curved labels (fix #12792)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix axis orientation in the Vector Scatterplot alg (fix #12705)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix Points along lines alg (fix #12768)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix Number of unique values in classes alg (fix #12731)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix Select by Attribute algorithm (fix #12289)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix handling of the HTML output from the  GRASS7
+    algorithms (fix #12710)
+
+    Conflicts:
+python/plugins/processing/algs/grass7/Grass7Algorithm.py
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] add recent expressions to Fields Calculator algorithm (fix #12587)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2015-05-20
+
+    [processing] fix Convex Hull algorithm (fix #12643)
+
+Sandro Santilli <strk at keybit.net>	2015-05-19
+
+    Fix drag & drop for PG rasters in DB Manager
+
+    (backport of 431dc14269bf24ce32001046d021b7f9312fc61c from master)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-19
+
+    Fix attributes from some symbols were not available for data defined
+    symbology (line marker, line pattern)
+
+Sandro Santilli <strk at keybit.net>	2015-05-19
+
+    Fix typo in comment
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-17
+
+    Truncate expression preview result in builder widget if too long
+
+    Prevents window from resizing to extreme widths (fix #12433)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-19
+
+    [labeling] Fix setting a wrap character conflicts with newlines
+    in label text (fix #12750)
+
+Matthias Kuhn <matthias.kuhn at gmx.ch>	2015-05-13
+
+    Generate unique variable names for python init form
+
+    Fix #12676
+    Fix #12711
+    Fix #12729
+
+rldhont <rldhont at gmail.com>	2015-04-30
+
+    [BUGFIX] Relative path for GDAL subdataset
+
+    For some raster layer, the datasource is not stored in the project as relative.
+     It's the case for NETCDF, HDF4, HDF5, NITF and RADARSAT2 raster format.
+
+    This patch keeps the datasource structure but updates the path part.
+
+    It will be interesting to backport it to 2.8 branch.
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-04-16
+
+    Fix calculation of zonal stats when source contains nodata or nan
+    pixels (fix #11135)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-05-07
+
+    Fix missing map units in vector field widget
+
+Juergen E. Fischer <jef at norbit.de>	2015-05-09
+
+    Release of 2.8.2
+
 Juergen E. Fischer <jef at norbit.de>	2015-05-06
 
     postgres provider: ignore system columns
@@ -103,6 +1050,10 @@ Radim Blazek <radim.blazek at gmail.com>	2015-04-23
 
     QgsMimeDataUtils::encode fix (escape also backslash)
 
+Etienne Trimaille <etienne.trimaille at gmail.com>	2015-04-21
+
+    fix selected query
+
 Juergen E. Fischer <jef at norbit.de>	2015-04-19
 
     german translation update
diff --git a/cmake/FindSPATIALITE.cmake b/cmake/FindSPATIALITE.cmake
index a359267..6750a8d 100644
--- a/cmake/FindSPATIALITE.cmake
+++ b/cmake/FindSPATIALITE.cmake
@@ -70,6 +70,7 @@ IF (SPATIALITE_FOUND)
    ENDIF(APPLE)
    check_library_exists("${SPATIALITE_LIBRARY}" gaiaDropTable "" SPATIALITE_VERSION_GE_4_0_0)
    check_library_exists("${SPATIALITE_LIBRARY}" gaiaStatisticsInvalidate "" SPATIALITE_VERSION_G_4_1_1)
+   check_library_exists("${SPATIALITE_LIBRARY}" spatialite_init_ex "" SPATIALITE_HAS_INIT_EX)
 
 ELSE (SPATIALITE_FOUND)
 
diff --git a/debian/changelog b/debian/changelog
index 2fedf49..37ab519 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.8.2) UNRELEASED; urgency=medium
+qgis (2.8.3) UNRELEASED; urgency=medium
+
+  * Release of 2.8.3
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Tue, 28 Jul 2015 14:00:12 +0200
+
+qgis (2.8.2) unstable; urgency=medium
 
   * Release of 2.8.2
 
- -- Jürgen E. Fischer <jef at norbit.de>  Sat, 09 May 2015 22:02:02 +0200
+ -- Jürgen E. Fischer <jef at norbit.de>  Tue, 28 Jul 2015 14:00:12 +0200
 
 qgis (2.8.1) unstable; urgency=medium
 
diff --git a/doc/CONTRIBUTORS b/doc/CONTRIBUTORS
index 4bef3f9..37adcf5 100644
--- a/doc/CONTRIBUTORS
+++ b/doc/CONTRIBUTORS
@@ -17,6 +17,7 @@ Carlos Dávila
 Carson J. Q. Farmer
 Christian Ferreira
 Cédric Möri
+Daniel Vaz
 Denis Rouzaud
 Diego Moreira
 Duarte Carreira
diff --git a/doc/TRANSLATORS b/doc/TRANSLATORS
index 619640b..ffd5ddc 100644
--- a/doc/TRANSLATORS
+++ b/doc/TRANSLATORS
@@ -1,46 +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: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>
+<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:13266 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:13127 unfinished:97 untranslated:43" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13127 unfinished:95 untranslated:45" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13127 unfinished:94 untranslated:46" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13127 unfinished:94 untranslated:46" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13127 unfinished:89 untranslated:51" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13123 unfinished:94 untranslated:50" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13127 unfinished:85 untranslated:55" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13125 unfinished:85 untranslated:57" class="bartodo"><div class="bardone" style="width:99px">99.3</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:13111 unfinished:90 untranslated:66" class="bartodo"><div class="bardone" style="width:99px">99.2</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:13109 unfinished:82 untranslated:76" class="bartodo"><div class="bardone" style="width:99px">99.1</div></div></td><td>Kari Salovaara, Marko Järvenpää</td></tr>
+<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:13057 unfinished:3 untranslated:207" 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/eu.png"></td><td>Basque</td><td><div title="finished:12975 unfinished:94 untranslated:198" class="bartodo"><div class="bardone" style="width:98px">98.2</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
+<tr><td><img src="qrc:/images/flags/pl.png"></td><td>Polish</td><td><div title="finished:12660 unfinished:39 untranslated:568" class="bartodo"><div class="bardone" style="width:95px">95.6</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:12356 unfinished:64 untranslated:847" class="bartodo"><div class="bardone" style="width:93px">93.4</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:12265 unfinished:67 untranslated:935" class="bartodo"><div class="bardone" style="width:92px">92.7</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:12232 unfinished:32 untranslated:1003" class="bartodo"><div class="bardone" style="width:92px">92.3</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:12153 unfinished:45 untranslated:1069" class="bartodo"><div class="bardone" style="width:91px">91.8</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:12139 unfinished:44 untranslated:1084" class="bartodo"><div class="bardone" style="width:91px">91.7</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:12046 unfinished:18 untranslated:1203" class="bartodo"><div class="bardone" style="width:90px">90.9</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:12005 unfinished:51 untranslated:1211" class="bartodo"><div class="bardone" style="width:90px">90.7</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:12005 unfinished:33 untranslated:1229" class="bartodo"><div class="bardone" style="width:90px">90.6</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:11954 unfinished:34 untranslated:1279" class="bartodo"><div class="bardone" style="width:90px">90.2</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:11808 unfinished:37 untranslated:1422" class="bartodo"><div class="bardone" style="width:89px">89.1</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:11334 unfinished:23 untranslated:1910" class="bartodo"><div class="bardone" style="width:85px">85.5</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:10738 unfinished:48 untranslated:2481" class="bartodo"><div class="bardone" style="width:81px">81.1</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:10722 unfinished:72 untranslated:2473" class="bartodo"><div class="bardone" style="width:81px">81.1</div></div></td><td>Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa</td></tr>
+<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:10482 unfinished:31 untranslated:2754" class="bartodo"><div class="bardone" style="width:79px">79.1</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:9347 unfinished:24 untranslated:3896" class="bartodo"><div class="bardone" style="width:70px">70.5</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:9004 unfinished:25 untranslated:4238" class="bartodo"><div class="bardone" style="width:67px">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:8866 unfinished:64 untranslated:4337" class="bartodo"><div class="bardone" style="width:67px">67.1</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:8854 unfinished:47 untranslated:4366" class="bartodo"><div class="bardone" style="width:66px">66.9</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:8779 unfinished:49 untranslated:4439" 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:28 untranslated:5818" class="bartodo"><div class="bardone" style="width:56px">56.0</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:6808 unfinished:22 untranslated:6437" class="bartodo"><div class="bardone" style="width:51px">51.4</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:5925 unfinished:963 untranslated:6379" 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:50 untranslated:7001" class="bartodo"><div class="bardone" style="width:47px">47.0</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:6154 unfinished:21 untranslated:7092" 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:7256" 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:5123 unfinished:33 untranslated:8111" class="bartodo"><div class="bardone" style="width:38px">38.7</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:36 untranslated:8188" class="bartodo"><div class="bardone" style="width:38px">38.1</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:5009 unfinished:43 untranslated:8215" class="bartodo"><div class="bardone" style="width:37px">37.9</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:34 untranslated:8342" class="bartodo"><div class="bardone" style="width:36px">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:4806 unfinished:30 untranslated:8431" class="bartodo"><div class="bardone" style="width:36px">36.3</div></div></td><td>Alexander Bruy</td></tr></table>
diff --git a/doc/contributors.json b/doc/contributors.json
index af80a3b..d9c1a55 100644
--- a/doc/contributors.json
+++ b/doc/contributors.json
@@ -294,13 +294,13 @@
         "Committer": "Yes",
         "First Commit Message": "Add backbuffering option to resolve flickering on X11 systems",
         "First Commit Date": "07-08-2012",
-        "GIT Nickname": "matthias-kuhn"
+        "GIT Nickname": "m-kuhn"
       },
       "geometry": {
         "type": "Point",
         "coordinates": [
-          8.740423321723938,
-          47.4989812888759
+          7.6256,
+          46.7542
         ]
       }
     },
diff --git a/doc/developersmap.html b/doc/developersmap.html
index fadae1f..b9e0d1e 100644
--- a/doc/developersmap.html
+++ b/doc/developersmap.html
@@ -1,11 +1,14 @@
+<!DOCTYPE html>
 <html>
 <head>
-  <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
+  <title>Developers Map</title>
+  <meta charset="UTF-8">
+  <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
   <style type="text/css">
   body {  padding: 0; margin: 0;  }
   html, body, #developers-map {  height: 100%;  }
   </style>
-  <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
+  <script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
   <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
   <link rel="points" type="application/json" href="contributors.json">
 </head>
@@ -27,7 +30,9 @@
     var map = L.map('developers-map').fitBounds(geojson.getBounds());
     developersMapTiles.addTo(map);
     geojson.addTo(map);
-    map.setZoom(1);
+     setTimeout(function() {
+       map.setZoom(1);
+     }, 0);
   });
   </script>
 </body>
diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts
index 9e12fbf..37bf8e6 100644
--- a/i18n/qgis_de.ts
+++ b/i18n/qgis_de.ts
@@ -631,10 +631,6 @@ Zum Überprüfen Ergebnisdialog öffnen.</translation>
         <translation>Weitere Erzeugungsparameter</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <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>
@@ -743,10 +739,6 @@ Zum Überprüfen Ergebnisdialog öffnen.</translation>
         <translation>Zuordnungsmodus</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Color relief</source>
         <translation>Farbrelief</translation>
     </message>
@@ -7014,10 +7006,6 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <translation>Vertikaler Abstand</translation>
     </message>
     <message>
-        <source>Output</source>
-        <translation type="obsolete">Ausgabe</translation>
-    </message>
-    <message>
         <source>Invalid grid spacing: %s/%s</source>
         <translation>Ungültiger Gitterabstand: %s/%s</translation>
     </message>
@@ -7069,10 +7057,6 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Average</source>
         <translation>Gemittelt</translation>
     </message>
@@ -7116,10 +7100,6 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Interpolated metrics</source>
         <translation>Interpolierte Maße</translation>
     </message>
@@ -7167,10 +7147,6 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Smoothing</source>
         <translation>Glättung</translation>
     </message>
@@ -7253,10 +7229,6 @@ Bitte installieren bevor GRASS-Algorithmen ausgeführt werden.</translation>
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Interpolated nearest neighbor</source>
         <translation>Interpolierter nächster Nachbar</translation>
     </message>
@@ -14448,10 +14420,6 @@ Antwort war:
         <translation>Legende</translation>
     </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 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>
         <translation>Rasterbildfüllung</translation>
     </message>
@@ -14467,6 +14435,42 @@ Antwort war:
         <source>NOTICE: %1</source>
         <translation>HINWEIS: %1</translation>
     </message>
+    <message>
+        <source>Recent colors</source>
+        <translation>Kürzliche Farben</translation>
+    </message>
+    <message>
+        <source>Standard colors</source>
+        <translation>Standardfarben</translation>
+    </message>
+    <message>
+        <source>Project colors</source>
+        <translation>Projektfarben</translation>
+    </message>
+    <message>
+        <source>Number of places must be positive</source>
+        <translation>Anzahl der Stellen muß positiv sein</translation>
+    </message>
+    <message>
+        <source>Delete Connection</source>
+        <translation>Verbindung löschen</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete the connection to %1?</source>
+        <translation>Soll Verbindung %1 wirklich gelöscht werden?</translation>
+    </message>
+    <message>
+        <source>Delete Object</source>
+        <translation>Objekt löschen</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1.%2?</source>
+        <translation>Soll %1.%2 wirklich gelöscht werden?</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1?</source>
+        <translation>Soll %1 wirklich gelöscht werden?</translation>
+    </message>
 </context>
 <context>
     <name>QSpatiaLiteDriver</name>
@@ -16960,10 +16964,6 @@ Ausdruckfehler:
         <translation>Auswertungsfehler</translation>
     </message>
     <message>
-        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</source>
-        <translation type="obsolete">Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4</translation>
-    </message>
-    <message>
         <source>Update Filtered</source>
         <translation>Aktualisierung gefiltert</translation>
     </message>
@@ -17626,10 +17626,6 @@ Datenbank: %2</translation>
         <translation>Alle löschen</translation>
     </message>
     <message>
-        <source>Join</source>
-        <translation type="obsolete">Verbinden</translation>
-    </message>
-    <message>
         <source>Advanced</source>
         <translation>Erweitert</translation>
     </message>
@@ -23213,7 +23209,7 @@ und aktuelle Datei ist [%3]</translation>
     <name>QgsCustomColorScheme</name>
     <message>
         <source>Standard colors</source>
-        <translation>Standardfarben</translation>
+        <translation type="obsolete">Standardfarben</translation>
     </message>
 </context>
 <context>
@@ -25816,6 +25812,10 @@ p, li { white-space: pre-wrap; }
         <source>Load all unique values</source>
         <translation>Alle eindeutigen Werte laden</translation>
     </message>
+    <message>
+        <source>%1...</source>
+        <translation>%1...</translation>
+    </message>
 </context>
 <context>
     <name>QgsExpressionBuilderWidgetBase</name>
@@ -29948,10 +29948,6 @@ in Zeile %2, Spalte %3</translation>
         <source>New mapset successfully created and set as current working mapset.</source>
         <translation>Mapset erfolgreich erzeugt und als aktuelle Arbeitsumgebung eingestellt.</translation>
     </message>
-    <message>
-        <source>Cannot activate grass</source>
-        <translation type="obsolete">Kann GRASS nicht aktivieren</translation>
-    </message>
 </context>
 <context>
     <name>QgsGrassNewMapsetBase</name>
@@ -37357,18 +37353,10 @@ Fehler:%2
         <translation>Verbindung zu %1 war erfolgreich</translation>
     </message>
     <message>
-        <source>Connection failed - Check settings and try again.
-
-</source>
-        <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>Verbindung fehlgeschlagen - bitte das Protokoll für Details konsultieren.
 </translation>
     </message>
 </context>
@@ -37879,6 +37867,14 @@ Error: %2</source>
         <translation>Oracle-Fehler: %1
 Fehler: %2</translation>
     </message>
+    <message>
+        <source>Could not prepare get feature id statement</source>
+        <translation>Konnte Objektkennungsabfrage nicht vorbereiten</translation>
+    </message>
+    <message>
+        <source>Could not retrieve feature id %1</source>
+        <translation>Konnte Objektkennung %1 nicht laden</translation>
+    </message>
 </context>
 <context>
     <name>QgsOracleRootItem</name>
@@ -38138,12 +38134,16 @@ Fehler: %2</translation>
     <name>QgsPGLayerItem</name>
     <message>
         <source>Delete layer</source>
-        <translation>Layer löschen</translation>
+        <translation type="obsolete">Layer löschen</translation>
     </message>
     <message>
         <source>Layer deleted successfully.</source>
         <translation>Layer erfolgreich gelöscht.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation>Layer löschen</translation>
+    </message>
 </context>
 <context>
     <name>QgsPGRootItem</name>
@@ -38318,14 +38318,6 @@ Fehler: %2</translation>
         <translation>Verbindung zu %1 war erfolgreich</translation>
     </message>
     <message>
-        <source>Connection failed - Check settings and try again.
-
-</source>
-        <translation type="obsolete">Verbindung gescheitert - Einstellungen überprüfen und wiederholen.
-
-</translation>
-    </message>
-    <message>
         <source>Connection failed - consult message log for details.
 
 </source>
@@ -39997,7 +39989,7 @@ Choose ignore to continue loading without the missing layers. Choose cancel to r
     <name>QgsProjectColorScheme</name>
     <message>
         <source>Project colors</source>
-        <translation>Projektfarben</translation>
+        <translation type="obsolete">Projektfarben</translation>
     </message>
 </context>
 <context>
@@ -42799,7 +42791,7 @@ standard deviation ×</source>
     <name>QgsRecentColorScheme</name>
     <message>
         <source>Recent colors</source>
-        <translation>Kürzliche Farben</translation>
+        <translation type="obsolete">Kürzliche Farben</translation>
     </message>
 </context>
 <context>
@@ -43405,12 +43397,16 @@ standard deviation ×</source>
     <name>QgsSLLayerItem</name>
     <message>
         <source>Delete layer</source>
-        <translation>Layer löschen</translation>
+        <translation type="obsolete">Layer löschen</translation>
     </message>
     <message>
         <source>Layer deleted successfully.</source>
         <translation>Layer erfolgreich gelöscht.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation>Layer löschen</translation>
+    </message>
 </context>
 <context>
     <name>QgsSLRootItem</name>
@@ -46752,6 +46748,14 @@ Fehler war:%2</translation>
         <source>Height attribute</source>
         <translation>Höhenattribut</translation>
     </message>
+    <message>
+        <source>Millimeter</source>
+        <translation>Millimeter</translation>
+    </message>
+    <message>
+        <source>Map unit</source>
+        <translation>Karteneinheiten</translation>
+    </message>
 </context>
 <context>
     <name>QgsVectorGradientColorRampV2Dialog</name>
@@ -50866,29 +50870,6 @@ Fehler in Zeile %d</translation>
     </message>
 </context>
 <context>
-    <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>
@@ -52398,10 +52379,6 @@ Fehler in Zeile %d</translation>
         <translation>Unterschiedliche Projektionen zulassen</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Virtual</source>
         <translation>Virtuell</translation>
     </message>
@@ -54075,912 +54052,361 @@ Diese Erweiterung unterstützt grundlegende HTML-Hervorhebungstags zur Textforma
 </translation>
     </message>
     <message>
-        <source><h3>Delimited Text File Layer</h3>
-Loads and displays delimited text files
+        <source><h3>Create a New SpatiaLite Layer</h3>
+You can use this dialog to create a new SpatiaLite database and/or an empty SpatiaLite layer for editing. See below for an explanation of the dialog inputs.
+<h4>Database</h4>
+Choose the database from the drop-down list. This list is created from your saved SpatiaLite connections. If you don't have a saved connection or want to create a new database, click on the button (<label>...</label>) to the right of the drop-down.
+<h4>Layer name</h4>
+Enter a name for the layer you want to create. The name should be one word. You can use underscores in the name if you like.
+<h4>Geometry column</h4>
+Enter a name for the geometry column or accept the default.
+<h4>Type</h4>
+Choose the type of layer you want to create. 
+<h4>EPSG SRID</h4>
+Enter the EPSG number for the spatial reference id (SRID). By default the SRID for WGS 84 is filled in for you. Click on <label>Find SRID</label> button to change the coordinate reference system of the layer if needed. The SRID must exist within the spatial_ref_sys in your SpatiaLite database. You can search for the SRID using partial matches on both name and SRID.
+<h4>Create an auto-incrementing Primary Key</h4>
+Clicking this check box will add a primary key to the new layer. This key field will be auto-incrementing, meaning you don't have to enter a value for it when adding features to the attribute table of the layer.
+<h4>New attribute</h4>
+Add the desired attributes by clicking on the <label>Add to attributes list</label> button after you have specified a name and type for the attribute. Only real, integer, and string attributes are supported.<br/>
+Width and precision are irrelevant in a SpatiaLite database so you do not have to specify these.
+<h4>Attributes list</h4>
+In this section you can see the list of attributes. To delete one of them, click on it and choose <label>Remove selected attribute</label> button.
+
 <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>
+Click on <label>OK</label> to create the layer and close the dialog.
+<label>Cancel</label> will close the layer without further changes.
+</source>
+        <translation><h3>Einen neuen SpatiaLite-Layer erzeugen</h3>
+In diesem Dialog können Sie eine neue SpatiaLite-Datenbank und/oder einen leeren SpatiaLite Layer zur Bearbeitung erzeugen.  Unten werden die Eingabemöglichkeiten des Dialogs beschrieben.
+<h4>Datenbank</h4>
+Wählen Sie die Datenbank aus der Liste.  Diese Liste wird aus den gespeicherten SpatiaLite-Verbindungen erzeugt.  Wenn sie keine gespeicherten Verbindungen haben oder oder eine neue Datenbank erzeugen wollen Klicken Sie auf <label>...</label> rechts der Liste.
+<h4>Layername</h4>
+Geben Sie dem Layer, den Sie erzeugen wollen, einen Namen.  Der Name sollte nur ein Wort sein.  Wenn Sie wollen, können Sie auch Unterstriche verwenden
+<h4>Geometriespalte</h4>
+Geben Sie der Geometriespalte einen Namen oder übernehmen Sie die Voreinstellung.
+<h4>Typ</h4>
+Legen Sie den Layertyp fest, den Sie erzeugen wollen.
+<h4>EPSG-SRID</h4>
+Geben Sie einen EPSG-Code für die SRID (räumliche Bezugskennung) an.  Für die SRID wird Ihnen WGS 84 vorgeschlagen.  Klicken Sie auf den Knopf <label>SRID finden</label> um das Koordinatenbezugssystem ggf. zu ändern.  Die SRID muss in der Tabelle spatial_ref_sys in Ihre Datenbank existieren. Sie können SRIDs suchen indem Sie Suchbegriffe verwenden, die ganz oder teilweise zu Namen oder SRIDs passen.
+<h4>Einen automatisch inkrementierenden Primärschlüssel erzeugen</h4>
+Das Anwählen dieses Kontrollkästchen fügt dem Layer einen Primärschlüssel hinzu.  Diese Feld wird automatisch inkrementiert, sodass Sie keinen keinen Wert dafür beim Hinzufügen von Objekten zum Layer eingeben müssen.
+<h4>Neue Attribute</h4>
+Fügen Sie die gewünschten Attribute durch Klicken auf den Knopf <label>Attribute zur Liste hinzufügen</label> nachdem Sie Namen und Type des Attributes festgelegt haben.  Nur Fließkomma-, ganzzahlige und Zeichenkettenattribute werden unterstützt.<br/>
+Breite und Genauigkeit sind irrelevant in einer SpatiaLite-Datenbank, daher brauchen Sie sie nicht anzugeben.
+<h4>Attributliste</h4>
+In diesem Abschnitt sehen Sie die Attributliste.  Um eins davon zu löschen, klicken Sie auf den Knopf <label>Gewähltes Attribut löschen</label>.
 
-<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>
+Klicken Sie auf <label>OK</label> um den Layer anzulegen und den Dialog zu schließen.
+<label>Abbruch</label> schließt den Dialog ohne weitere Änderung.
+</translation>
+    </message>
+    <message>
+        <source><h3>Open Vector Layer Dialog</h3>
+
+The open vector layer dialog is used to add vector data to the QGIS map view. Vector data are spatial data described using geometries of points, lines and polygons (enclosed areas).</p>
+QGIS supports vector data in a number of formats, including those supported by the OGR library data provider plugin, such as ESRI shape files, MapInfo MIF (interchange format) and MapInfo TAB (native format).</p>
+QGIS supports PostGIS layers in a PostgreSQL database and SpatiaLite layers. Support for additional data types (eg. delimited text) is provided by additional data provider plugins. A list of OGR supported vector formats can be found in Appendix A.1 of the User Guide.</p>
+Detailed description how to proceed with vector data is described in chapter 5 'Working with Vector Data'.
+</source>
+        <translation><h3>Vektorlayer hinzufügen</h3>
+
+Der Dialog "Vektorlayer hinzufügen" wird zum Hinzufügen von Vektordaten zur QGIS-Karte benutzt. Vektordaten sind räumliche Daten, die durch Punkte, Linien oder Polygone (umschlossene Flächen) beschrieben werden.</p>
+QGIS unterstützt eine Reihen von Formaten, einschließlich deren der OGR-Datenanbietererweiterung.  Dies sind z.B. ESRI Shapedateien, MapInfo MIF- (Austauschformat) und MapInfo TAB-Dateien (natives Format).</p>
+QGIS unterstützt PostGIS-Layer in einer PostgreSQL-Datenbank und SpatiaLite-Layer.  Unterstützung für zusätzliche Datentypen (z.B. getrennter Text) wird durch weitere Datenlieferanten-Erweiterungen gestellt.  Eine Liste der durch OGR unterstützten Formate ist im Anhang A.1 des Benutzerhandbuchs zu finden.</p>
+Eine genaue Beschreibung wie mit Vektordaten umzugehen ist, steht im Kapitel 5 'Arbeiten mit Vektordaten'.
+</translation>
+    </message>
+    <message>
+        <source><h3>Create a New PostGIS Connection</h3>
+This dialog allows you to define the settings for a connection to a PostgreSQL/PostGIS database.
+<p>
+<ul>
+<li> <label>Name</label> A name to identify the connection settings.
+
+<li> <label>Service</label> A name of a service listed in the <a href="http://www.postgresql.org/docs/current/static/libpq-pgservice.html">Connection Service File</a>.
+
+<li> <label>Host</label> Name or IP address of the computer hosting the database server (leave blank for local connections or services).
+
+<li> <label>Port</label> IP port used by the database server (leave blank for local connections or to use default port 5432).
+
+<li> <label>Database</label> Name of the database (leave blank for default database).
+
+<li> <label>SSL mode</label> <a href="http://www.postgresql.org/docs/9.0/static/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS">SSL mode</a> of the connection
+
+<li> <label>Username</label> Database user name.
+<li> <label>Password</label> Database password.
+
+<li> <label>Save Username</label> Indicates whether to save the database user name in the connection configuration.
+
+<li> <label>Save Password</label> Indicates whether to save the database password in the connection settings.  <font color="red">Passwords are saved in <strong>clear text</strong> in the system configuration and in the project files!</font>
+
+<li> <label>Only look in the geometry_columns table</label> Indicates that only "listed" geometry columns should be used - opposed to scanning all tables for geometry columns.
+
+<li> <label>Only look in the 'public' schema</label> Indicates that only tables in the 'public' schema should be considers - opposed to all accessible tables.
+
+<li> <label>Also list tables with no geometry</label>  Indicates that tables without geometry should also be listed by default.
+
+<li> <label>Use estimated table metadata</label> When initializing layers, various queries may be needed to establish the characteristics of the geometries stored in the database table.  When this option is checked, these queries examine only a sample of the rows and use the table statistics, rather than the entire table.  This can drastically speed up operations on large datasets, but may result in incorrect characterization of layers (eg. the <font color="red& [...]
+
+</ul>
+</source>
+        <translation><h3>Neue PostGIS-Verbindung erstellen</h3>
+In diesem Dialog kann eine Verbindung zu einer PostgreSQL-Datenbank eingestellt werden.
+<p>
+<ul>
+<li> <label>Name</label> Ein Name um die Verbindung zu identifizieren.
+
+<li> <label>Dienst</label> Der Name eines Dienstes aus der <a href="http://www.postgresql.org/docs/current/static/libpq-pgservice.html">Connection Service Datei (englisch)</a>.
+
+<li> <label>Host</label> Name oder IP-Adresse des Computers, der den Datenbankserver beherbergt (für lokale Verbindungen und Dienste frei lassen).
+
+<li> <label>Port</label> IP-Port des Datenbankservers (für lokale Verbindungen oder den voreingestellten Port 5432 frei lassen).
+
+<li> <label>Datenbank</label> Name der Datenbank (für die voreingestellte Datenbank leer lassen).
+
+<li> <label>SSL-Modus</label> <a href="http://www.postgresql.org/docs/9.0/static/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS">SSL-Modus (englisch)</a> der Verbindung.
+
+<li> <label>Benutzername</label> Datenbankbenutzername.
+<li> <label>Passwort</label> Datenbankpasswort.
+
+<li> <label>Benutzername speichern</label> Legt fest, dass der Benutzername in der Verbindungseinstellungen gespeichert werden soll.
+
+<li> <label>Passwort speichern</label> Legt fest, dass das Passwort in den Verbindungseinstellungen gespeichert werden soll.  <font color="red">Passworte werden dann im <strong>Klartext</strong> in der Systemkonfiguration und Projektdateien gespeichert!</font>
+
+<li> <label>Nur in geometry_columns nachsehen</label> Legt fest, dass nur "gelistete" Geometriespalten benutzt werden sollen - statt alle Tabellen nach Geometriespalten zu durchsuchen.
+
+<li> <label>Nur im Schema 'public' nachsehen</label> Legt fest, dass nur das Schema 'public' berücksichtigt werden soll - statt alle zugänglichen Tabellen.
+
+<li> <label>Auch geometrielose Tabellen anzeigen</label>  Legt fest, dass normalerweise nicht nur Tabellen mit Geometrie, sondern alle Tabellen aufgelistet werden sollen.
+
+<li> <label>Geschätzte Tabellenmetadaten nutzen</label> Wenn die Layer initialisiert werden, können mehrere Abfragen nötig sein, um die Eigenschaften der Geometrien der Datenbanktabelle zu bestimmen.  Wenn diese Option gewählt ist werden die Abfragen nur einige Zeilen und die Tabellenstatistiken, statt der gesamten Tabelle, betrachten.  Dies beschleunigt die Benutzung Layer erheblich, kann aber auch zu falschen Ergebnissen führen (z.B. wird die <font color="red& [...]
+
+</ul>
+</translation>
+    </message>
+    <message>
+        <source><h3>Manage and install Plugins</h3>
+
+<p>
+Manage and install plugins.
 </p>
+
+
+<a href="#installedtab">Installed tab</a><br/>
+<a href="#getmoretab">Get more tab</a><br/>
+<a href="#newtab">New tab</a><br/>
+<a href="#upgradabletab">Upgradable tab</a><br/>
+<a href="#invalidtab">Invalid tab</a><br/>
+<a href="#settingstab">Settings tab</a><br/>
+
+<a name="installedtab">
+<h4>Installed tab</h4>
+</a>
 <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.
+This tab shows you the list of currently installed plugins on your system. Both
+python and C++ plugins are listed.
 </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.
+You can enable or disable them by clicking the checkbox in front of the name.<br/>
+Selecting an item show the plugin information in the detail pane.
 </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;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 in QGIS.
-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:
+There is a context menu (right click) available, to change the sorting on:
+name, number of downloads, votes and status.
 </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.  
+<a name="getmoretab">
+<h4>Get more tab</h4>
+</a>
+<p>
+This tab shows you the list of available plugins from the remote repositories.
+It is downloaded once if you start up. But you can change that in the Settings
 </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.
+Selecting an item shows you the plugin information in the detail pane.
 </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>
+<a name="newtab">
+<h4>New tab</h4>
+</a>
 <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).  
+This tab will be shown when a new plugin is made available! It will be shown
+just once.
 </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.
+
+<a name="upgradabletab">
+<h4>Upgradable tab</h4>
+</a>
+<p>
+This tab is only available if one of your installed plugins can be upgraded
+from the remote repositories.
 </p>
 
+<a name="Invalid tab">
+<h4>Invalid tab</h4>
+</a>
+<p>
+This tab is only available if there is a invalid plugin. Mostly caused by an error 
+during loading the plugin.
+</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>).
+<a name="settingstab">
+<h4>Settings tab</h4>
+</a>
+<p>
+In this tab you can change the Settings for the plugin manager.
 </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>
+It is possible to check how often QGIS will download the list and update information 
+from the available repositories.
 </p>
+<p>
+By checking the 'Show experimental plugins' checkbox, all plugins will be shown
+in the lists, even the ones that are considered 'experimental' by the author.
 
+<table border=1 width='95%' align='center'><tr><td>
+Note: Experimental plugins are generally unsuitable for production use. These plugins are in the early stages of development, and should be considered "incomplete" or "proof of concept" tools. The QGIS development team does not recommend installing these plugins unless you intend to use them for testing purposes.
+</td></tr></table>
 
-<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>
+</source>
+        <translation><h3>Erweiterungen verwalten und installieren</h3>
+
 <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.
+Erweiterungen verwalten und installieren.
 </p>
 
 
+<a href="#installedtab">Reiter Installierte</a><br/>
+<a href="#getmoretab">Reiter Mehr holen</a><br/>
+<a href="#newtab">Reiter Neu</a><br/>
+<a href="#upgradabletab">Reiter Aktualisierbar</a><br/>
+<a href="#invalidtab">Reiter Ungültig</a><br/>
+<a href="#settingstab">Reiter Einstellungen</a><br/>
 
-<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.
+<a name="installedtab">
+<h4>Reiter Installiert</h4>
+</a>
+<p>
+Dieser Reiter zeigt die derzeit installierten Erweiterungen ihres System an. Sowohl Python- als auch C++-Erweiterung werden angezeigt.
 </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.  
+Sie können durch das Kontrollkästchen vor ihrem Namen (de-)aktiviert werden.<br/>
+Die Auswahl eines Elements zeigt deren Informationen im Detailbereich an.
 </p>
 <p>
-Each attribute also has a data type, one of string (text), integer, 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 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
+Es gibt ein Kontextmenü (Rechtsklick) in dem Sie nach Name, Downloadanzahl, Stimmen und Status sortieren können.
 </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="obsolete"><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>
+<a name="getmoretab">
+<h4>Reiter Mehr holen</h4>
+</a>
 <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.
+Dieser Reiter zeigt die Liste alle verfügbaren Erweiterungen in fernen Repositorien an.
+Es wird beim Start geladen. Dies kann aber auch in den Einstellungen geändert werden.
 </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 [...]
+Die Auswahl eines Elements zeigt die Informationen im Detailbereich.
 </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>
+<a name="newtab">
+<h4>Reiter Neu</h4>
+</a>
 <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ß.
+In diesem Reiter wird angezeigt wenn eine neue Erweiterung verfügbar wird. Es wird nur einmal angezeigt.
 </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>
+<a name="upgradabletab">
+<h4>Reiter Aktualisierbar</h4>
+</a>
 <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.
+Dieser Reiter ist nur verfügbar, sobald es Aktualisierungen für installierte Erweiterungen in fernen Repositorien gibt.
 </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>
+<a name="Invalid tab">
+<h4>Reiter Ungültig</h4>
+</a>
 <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.
+Dieser Reiter ist nur verfügbar, wenn eine ungültige Erweiterung installiert ist. Mit anderen Worten, wenn es Fehler beim Laden der Erweiterung gab.
 </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>
+<a name="settingstab">
+<h4>Reiter Einstellungen</h4>
+</a>
 <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.  
+Auf diesem Reiter können die Einstellungen der Erweiterungsverwaltung geändert werden.
 </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.
+Es kann eingestellt werden wie oft QGIS die Erweiterungsliste und Aktualisierungsinformationen aus fernen Repositorien lädt.
 </p>
+<p>
+Mit dem Kontrollkästchen 'Experimentelle Erweiterungen anzeigen' werden alle Erweiterungen, also auch die durch den Autor als 'experimentell' markierten, angezeigt.
 
+<table border=1 width='95%' align='center'><tr><td>
+Hinweis: Experimentelle Erweiterungen sind grundsätzliche für den Produktiveinsatz ungeeignet. Diese Erweiterungen befinden sich in einer sehr frühen Entwicklungsphase und sollten als "unvollständig" oder "Machbarkeitsstudie" angesehen werden. Das QGIS-Entwicklungsteam rät von der Installation ab, es sei denn nur zu Testzwecken.
+</td></tr></table>
 
-<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>
-    <message>
-        <source><h3>Create a New SpatiaLite Layer</h3>
-You can use this dialog to create a new SpatiaLite database and/or an empty SpatiaLite layer for editing. See below for an explanation of the dialog inputs.
-<h4>Database</h4>
-Choose the database from the drop-down list. This list is created from your saved SpatiaLite connections. If you don't have a saved connection or want to create a new database, click on the button (<label>...</label>) to the right of the drop-down.
-<h4>Layer name</h4>
-Enter a name for the layer you want to create. The name should be one word. You can use underscores in the name if you like.
-<h4>Geometry column</h4>
-Enter a name for the geometry column or accept the default.
-<h4>Type</h4>
-Choose the type of layer you want to create. 
-<h4>EPSG SRID</h4>
-Enter the EPSG number for the spatial reference id (SRID). By default the SRID for WGS 84 is filled in for you. Click on <label>Find SRID</label> button to change the coordinate reference system of the layer if needed. The SRID must exist within the spatial_ref_sys in your SpatiaLite database. You can search for the SRID using partial matches on both name and SRID.
-<h4>Create an auto-incrementing Primary Key</h4>
-Clicking this check box will add a primary key to the new layer. This key field will be auto-incrementing, meaning you don't have to enter a value for it when adding features to the attribute table of the layer.
-<h4>New attribute</h4>
-Add the desired attributes by clicking on the <label>Add to attributes list</label> button after you have specified a name and type for the attribute. Only real, integer, and string attributes are supported.<br/>
-Width and precision are irrelevant in a SpatiaLite database so you do not have to specify these.
-<h4>Attributes list</h4>
-In this section you can see the list of attributes. To delete one of them, click on it and choose <label>Remove selected attribute</label> button.
-
-<p>
-Click on <label>OK</label> to create the layer and close the dialog.
-<label>Cancel</label> will close the layer without further changes.
-</source>
-        <translation><h3>Einen neuen SpatiaLite-Layer erzeugen</h3>
-In diesem Dialog können Sie eine neue SpatiaLite-Datenbank und/oder einen leeren SpatiaLite Layer zur Bearbeitung erzeugen.  Unten werden die Eingabemöglichkeiten des Dialogs beschrieben.
-<h4>Datenbank</h4>
-Wählen Sie die Datenbank aus der Liste.  Diese Liste wird aus den gespeicherten SpatiaLite-Verbindungen erzeugt.  Wenn sie keine gespeicherten Verbindungen haben oder oder eine neue Datenbank erzeugen wollen Klicken Sie auf <label>...</label> rechts der Liste.
-<h4>Layername</h4>
-Geben Sie dem Layer, den Sie erzeugen wollen, einen Namen.  Der Name sollte nur ein Wort sein.  Wenn Sie wollen, können Sie auch Unterstriche verwenden
-<h4>Geometriespalte</h4>
-Geben Sie der Geometriespalte einen Namen oder übernehmen Sie die Voreinstellung.
-<h4>Typ</h4>
-Legen Sie den Layertyp fest, den Sie erzeugen wollen.
-<h4>EPSG-SRID</h4>
-Geben Sie einen EPSG-Code für die SRID (räumliche Bezugskennung) an.  Für die SRID wird Ihnen WGS 84 vorgeschlagen.  Klicken Sie auf den Knopf <label>SRID finden</label> um das Koordinatenbezugssystem ggf. zu ändern.  Die SRID muss in der Tabelle spatial_ref_sys in Ihre Datenbank existieren. Sie können SRIDs suchen indem Sie Suchbegriffe verwenden, die ganz oder teilweise zu Namen oder SRIDs passen.
-<h4>Einen automatisch inkrementierenden Primärschlüssel erzeugen</h4>
-Das Anwählen dieses Kontrollkästchen fügt dem Layer einen Primärschlüssel hinzu.  Diese Feld wird automatisch inkrementiert, sodass Sie keinen keinen Wert dafür beim Hinzufügen von Objekten zum Layer eingeben müssen.
-<h4>Neue Attribute</h4>
-Fügen Sie die gewünschten Attribute durch Klicken auf den Knopf <label>Attribute zur Liste hinzufügen</label> nachdem Sie Namen und Type des Attributes festgelegt haben.  Nur Fließkomma-, ganzzahlige und Zeichenkettenattribute werden unterstützt.<br/>
-Breite und Genauigkeit sind irrelevant in einer SpatiaLite-Datenbank, daher brauchen Sie sie nicht anzugeben.
-<h4>Attributliste</h4>
-In diesem Abschnitt sehen Sie die Attributliste.  Um eins davon zu löschen, klicken Sie auf den Knopf <label>Gewähltes Attribut löschen</label>.
-
-<p>
-Klicken Sie auf <label>OK</label> um den Layer anzulegen und den Dialog zu schließen.
-<label>Abbruch</label> schließt den Dialog ohne weitere Änderung.
 </translation>
     </message>
     <message>
-        <source><h3>Open Vector Layer Dialog</h3>
-
-The open vector layer dialog is used to add vector data to the QGIS map view. Vector data are spatial data described using geometries of points, lines and polygons (enclosed areas).</p>
-QGIS supports vector data in a number of formats, including those supported by the OGR library data provider plugin, such as ESRI shape files, MapInfo MIF (interchange format) and MapInfo TAB (native format).</p>
-QGIS supports PostGIS layers in a PostgreSQL database and SpatiaLite layers. Support for additional data types (eg. delimited text) is provided by additional data provider plugins. A list of OGR supported vector formats can be found in Appendix A.1 of the User Guide.</p>
-Detailed description how to proceed with vector data is described in chapter 5 'Working with Vector Data'.
+        <source><h3>Style Manager</h3>
 </source>
-        <translation><h3>Vektorlayer hinzufügen</h3>
+        <translation><h3>Stilverwaltung</h3>
 
-Der Dialog "Vektorlayer hinzufügen" wird zum Hinzufügen von Vektordaten zur QGIS-Karte benutzt. Vektordaten sind räumliche Daten, die durch Punkte, Linien oder Polygone (umschlossene Flächen) beschrieben werden.</p>
-QGIS unterstützt eine Reihen von Formaten, einschließlich deren der OGR-Datenanbietererweiterung.  Dies sind z.B. ESRI Shapedateien, MapInfo MIF- (Austauschformat) und MapInfo TAB-Dateien (natives Format).</p>
-QGIS unterstützt PostGIS-Layer in einer PostgreSQL-Datenbank und SpatiaLite-Layer.  Unterstützung für zusätzliche Datentypen (z.B. getrennter Text) wird durch weitere Datenlieferanten-Erweiterungen gestellt.  Eine Liste der durch OGR unterstützten Formate ist im Anhang A.1 des Benutzerhandbuchs zu finden.</p>
-Eine genaue Beschreibung wie mit Vektordaten umzugehen ist, steht im Kapitel 5 'Arbeiten mit Vektordaten'.
 </translation>
     </message>
     <message>
-        <source><h3>Create a New PostGIS Connection</h3>
-This dialog allows you to define the settings for a connection to a PostgreSQL/PostGIS database.
+        <source><h3>Finding shortest path</h3>
+<p>Road graph is a C++ plugin for QGIS, that calculates the shortest path between two points on any line layer and plots this path over the road network. Before using the plugin to configure it. This can be done in the menu <label>Vector &rarr; Road graph &rarr; Settings</label></p>
 <p>
-<ul>
-<li> <label>Name</label> A name to identify the connection settings.
-
-<li> <label>Service</label> A name of a service listed in the <a href="http://www.postgresql.org/docs/current/static/libpq-pgservice.html">Connection Service File</a>.
-
-<li> <label>Host</label> Name or IP address of the computer hosting the database server (leave blank for local connections or services).
-
-<li> <label>Port</label> IP port used by the database server (leave blank for local connections or to use default port 5432).
-
-<li> <label>Database</label> Name of the database (leave blank for default database).
-
-<li> <label>SSL mode</label> <a href="http://www.postgresql.org/docs/9.0/static/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS">SSL mode</a> of the connection
-
-<li> <label>Username</label> Database user name.
-<li> <label>Password</label> Database password.
-
-<li> <label>Save Username</label> Indicates whether to save the database user name in the connection configuration.
-
-<li> <label>Save Password</label> Indicates whether to save the database password in the connection settings.  <font color="red">Passwords are saved in <strong>clear text</strong> in the system configuration and in the project files!</font>
-
-<li> <label>Only look in the geometry_columns table</label> Indicates that only "listed" geometry columns should be used - opposed to scanning all tables for geometry columns.
-
-<li> <label>Only look in the 'public' schema</label> Indicates that only tables in the 'public' schema should be considers - opposed to all accessible tables.
-
-<li> <label>Also list tables with no geometry</label>  Indicates that tables without geometry should also be listed by default.
+<a href="#howto">How to</a><br/>
+</p>
 
-<li> <label>Use estimated table metadata</label> When initializing layers, various queries may be needed to establish the characteristics of the geometries stored in the database table.  When this option is checked, these queries examine only a sample of the rows and use the table statistics, rather than the entire table.  This can drastically speed up operations on large datasets, but may result in incorrect characterization of layers (eg. the <font color="red& [...]
+<a name="howto">
+<h4>How to</h4>
+</a>
+<p>You can select start and end points with the select buttons next to the fields.
+Pressing the <label>Calculate</label> button will run the shortest path calculation using the optimization criterion selected in the <label>Criterion</label> combobox. The <label>Export</label> button allow you to export a calculated path to a new vector layer, and the button <label>Clear</label> will erase all fields and remove the points and calculated path from map canvas.</p>
 
-</ul>
+<h5>Note</h5>
+<p>In order to bind the start and stop points of the route to the road network Road graph selects the nearest point or arc of the graph. In fact it can bind to any part of the road network. Nevertheless, their route and its characteristics do not take into account the distance from the starting point to the road network and of the road network to the stopping point.</p>
 </source>
-        <translation><h3>Neue PostGIS-Verbindung erstellen</h3>
-In diesem Dialog kann eine Verbindung zu einer PostgreSQL-Datenbank eingestellt werden.
+        <translation><h3>Den kürzesten Weg finden</h3>
+<p>Straßengraph ist eine C++-Erweiterung für QGIS, die den kürzesten Weg zwischen zwei Punkten auf jedem Linienlayer bestimmt und über dem Straßennetz anzeigt. Bevor die Erweiterung genutzt werden kann, muß sie konfiguriert werden. Dies erfolgt unter <label>Erweiterungen &rarr; Straßengraph &rarr; Einstellungen</label></p>
 <p>
-<ul>
-<li> <label>Name</label> Ein Name um die Verbindung zu identifizieren.
-
-<li> <label>Dienst</label> Der Name eines Dienstes aus der <a href="http://www.postgresql.org/docs/current/static/libpq-pgservice.html">Connection Service Datei (englisch)</a>.
-
-<li> <label>Host</label> Name oder IP-Adresse des Computers, der den Datenbankserver beherbergt (für lokale Verbindungen und Dienste frei lassen).
-
-<li> <label>Port</label> IP-Port des Datenbankservers (für lokale Verbindungen oder den voreingestellten Port 5432 frei lassen).
-
-<li> <label>Datenbank</label> Name der Datenbank (für die voreingestellte Datenbank leer lassen).
-
-<li> <label>SSL-Modus</label> <a href="http://www.postgresql.org/docs/9.0/static/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS">SSL-Modus (englisch)</a> der Verbindung.
-
-<li> <label>Benutzername</label> Datenbankbenutzername.
-<li> <label>Passwort</label> Datenbankpasswort.
-
-<li> <label>Benutzername speichern</label> Legt fest, dass der Benutzername in der Verbindungseinstellungen gespeichert werden soll.
-
-<li> <label>Passwort speichern</label> Legt fest, dass das Passwort in den Verbindungseinstellungen gespeichert werden soll.  <font color="red">Passworte werden dann im <strong>Klartext</strong> in der Systemkonfiguration und Projektdateien gespeichert!</font>
-
-<li> <label>Nur in geometry_columns nachsehen</label> Legt fest, dass nur "gelistete" Geometriespalten benutzt werden sollen - statt alle Tabellen nach Geometriespalten zu durchsuchen.
-
-<li> <label>Nur im Schema 'public' nachsehen</label> Legt fest, dass nur das Schema 'public' berücksichtigt werden soll - statt alle zugänglichen Tabellen.
-
-<li> <label>Auch geometrielose Tabellen anzeigen</label>  Legt fest, dass normalerweise nicht nur Tabellen mit Geometrie, sondern alle Tabellen aufgelistet werden sollen.
+<a href="#howto">Wie's geht</a><br/>
+</p>
 
-<li> <label>Geschätzte Tabellenmetadaten nutzen</label> Wenn die Layer initialisiert werden, können mehrere Abfragen nötig sein, um die Eigenschaften der Geometrien der Datenbanktabelle zu bestimmen.  Wenn diese Option gewählt ist werden die Abfragen nur einige Zeilen und die Tabellenstatistiken, statt der gesamten Tabelle, betrachten.  Dies beschleunigt die Benutzung Layer erheblich, kann aber auch zu falschen Ergebnissen führen (z.B. wird die <font color="red& [...]
+<a name="howto">
+<h4>Wie's geht</h4>
+</a>
+<p>Sie können Start- und Endpunkt mit den Knöpfen neben <label>Start</label> und <label>Stopp</label> auswählen.
+Durch Klick auf <label>Berechnen</label> wird der kürzeste Weg mit dem Optimierungskriterium, das unter <label>Kriterium</label> gewählt ist, ausgeführt. Mit <label>Export</label> können Sie den berechneten Weg in einem neuen Vektorlayer speichern und mit <label>Löschen</label> alle Felder, die Punkte sowie den berechneten Weg aus der Karte löschen.</p>
 
-</ul>
+<h5>Hinweis</h5>
+<p>Um den Start- und Endpunkt der Route mit dem Straßennetz zu verbinden wählt die Erweiterung den nächsten Knoten oder die nächste Kante des Graphen. Sie können aber an jedem Punkt des Graphen beginnen. Allerdings wird der Abstand vom Start- bzw. Endpunkt zum Straßennetz nicht berücksichtigt.</p>
 </translation>
     </message>
     <message>
-        <source><h3>Manage and install Plugins</h3>
-
+        <source><h3>Options</h3>
+This dialog allows you to select some basic options for QGIS. There are eight tabs:
 <p>
-Manage and install plugins.
-</p>
 
+<a href="#general">General</a><br/>
+<a href="#ren">Rendering & SVG</a><br/>
+<a href="#map">Map tools</a><br/>
+<a href="#over">Overlay</a><br/>
+<a href="#digit">Digitizing</a><br/>
+<a href="#crs">CRS</a><br/>
+<a href="#loc">Locale</a><br/>
+<a href="#net">Network & Proxy</a><br/>
 
-<a href="#installedtab">Installed tab</a><br/>
-<a href="#getmoretab">Get more tab</a><br/>
-<a href="#newtab">New tab</a><br/>
-<a href="#upgradabletab">Upgradable tab</a><br/>
-<a href="#invalidtab">Invalid tab</a><br/>
-<a href="#settingstab">Settings tab</a><br/>
-
-<a name="installedtab">
-<h4>Installed tab</h4>
-</a>
-<p>
-This tab shows you the list of currently installed plugins on your system. Both
-python and C++ plugins are listed.
-</p>
-<p>
-You can enable or disable them by clicking the checkbox in front of the name.<br/>
-Selecting an item show the plugin information in the detail pane.
-</p>
-<p>
-There is a context menu (right click) available, to change the sorting on:
-name, number of downloads, votes and status.
-</p>
-
-
-<a name="getmoretab">
-<h4>Get more tab</h4>
-</a>
-<p>
-This tab shows you the list of available plugins from the remote repositories.
-It is downloaded once if you start up. But you can change that in the Settings
-</p>
-<p>
-Selecting an item shows you the plugin information in the detail pane.
-</p>
-
-<a name="newtab">
-<h4>New tab</h4>
-</a>
-<p>
-This tab will be shown when a new plugin is made available! It will be shown
-just once.
-</p>
-
-<a name="upgradabletab">
-<h4>Upgradable tab</h4>
-</a>
-<p>
-This tab is only available if one of your installed plugins can be upgraded
-from the remote repositories.
-</p>
-
-<a name="Invalid tab">
-<h4>Invalid tab</h4>
-</a>
-<p>
-This tab is only available if there is a invalid plugin. Mostly caused by an error 
-during loading the plugin.
-</p>
-
-<a name="settingstab">
-<h4>Settings tab</h4>
-</a>
-<p>
-In this tab you can change the Settings for the plugin manager.
-</p>
-<p>
-It is possible to check how often QGIS will download the list and update information 
-from the available repositories.
-</p>
-<p>
-By checking the 'Show experimental plugins' checkbox, all plugins will be shown
-in the lists, even the ones that are considered 'experimental' by the author.
-
-<table border=1 width='95%' align='center'><tr><td>
-Note: Experimental plugins are generally unsuitable for production use. These plugins are in the early stages of development, and should be considered "incomplete" or "proof of concept" tools. The QGIS development team does not recommend installing these plugins unless you intend to use them for testing purposes.
-</td></tr></table>
-
-</p>
-</source>
-        <translation><h3>Erweiterungen verwalten und installieren</h3>
-
-<p>
-Erweiterungen verwalten und installieren.
-</p>
-
-
-<a href="#installedtab">Reiter Installierte</a><br/>
-<a href="#getmoretab">Reiter Mehr holen</a><br/>
-<a href="#newtab">Reiter Neu</a><br/>
-<a href="#upgradabletab">Reiter Aktualisierbar</a><br/>
-<a href="#invalidtab">Reiter Ungültig</a><br/>
-<a href="#settingstab">Reiter Einstellungen</a><br/>
-
-<a name="installedtab">
-<h4>Reiter Installiert</h4>
-</a>
-<p>
-Dieser Reiter zeigt die derzeit installierten Erweiterungen ihres System an. Sowohl Python- als auch C++-Erweiterung werden angezeigt.
-</p>
-<p>
-Sie können durch das Kontrollkästchen vor ihrem Namen (de-)aktiviert werden.<br/>
-Die Auswahl eines Elements zeigt deren Informationen im Detailbereich an.
-</p>
-<p>
-Es gibt ein Kontextmenü (Rechtsklick) in dem Sie nach Name, Downloadanzahl, Stimmen und Status sortieren können.
-</p>
-
-
-<a name="getmoretab">
-<h4>Reiter Mehr holen</h4>
-</a>
-<p>
-Dieser Reiter zeigt die Liste alle verfügbaren Erweiterungen in fernen Repositorien an.
-Es wird beim Start geladen. Dies kann aber auch in den Einstellungen geändert werden.
-</p>
-<p>
-Die Auswahl eines Elements zeigt die Informationen im Detailbereich.
-</p>
-
-<a name="newtab">
-<h4>Reiter Neu</h4>
-</a>
-<p>
-In diesem Reiter wird angezeigt wenn eine neue Erweiterung verfügbar wird. Es wird nur einmal angezeigt.
-</p>
-
-<a name="upgradabletab">
-<h4>Reiter Aktualisierbar</h4>
-</a>
-<p>
-Dieser Reiter ist nur verfügbar, sobald es Aktualisierungen für installierte Erweiterungen in fernen Repositorien gibt.
-</p>
-
-<a name="Invalid tab">
-<h4>Reiter Ungültig</h4>
-</a>
-<p>
-Dieser Reiter ist nur verfügbar, wenn eine ungültige Erweiterung installiert ist. Mit anderen Worten, wenn es Fehler beim Laden der Erweiterung gab.
-</p>
-
-<a name="settingstab">
-<h4>Reiter Einstellungen</h4>
-</a>
-<p>
-Auf diesem Reiter können die Einstellungen der Erweiterungsverwaltung geändert werden.
-</p>
-<p>
-Es kann eingestellt werden wie oft QGIS die Erweiterungsliste und Aktualisierungsinformationen aus fernen Repositorien lädt.
-</p>
-<p>
-Mit dem Kontrollkästchen 'Experimentelle Erweiterungen anzeigen' werden alle Erweiterungen, also auch die durch den Autor als 'experimentell' markierten, angezeigt.
-
-<table border=1 width='95%' align='center'><tr><td>
-Hinweis: Experimentelle Erweiterungen sind grundsätzliche für den Produktiveinsatz ungeeignet. Diese Erweiterungen befinden sich in einer sehr frühen Entwicklungsphase und sollten als "unvollständig" oder "Machbarkeitsstudie" angesehen werden. Das QGIS-Entwicklungsteam rät von der Installation ab, es sei denn nur zu Testzwecken.
-</td></tr></table>
-
-</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>Style Manager</h3>
-</source>
-        <translation><h3>Stilverwaltung</h3>
-
-</translation>
-    </message>
-    <message>
-        <source><h3>Finding shortest path</h3>
-<p>Road graph is a C++ plugin for QGIS, that calculates the shortest path between two points on any line layer and plots this path over the road network. Before using the plugin to configure it. This can be done in the menu <label>Vector &rarr; Road graph &rarr; Settings</label></p>
-<p>
-<a href="#howto">How to</a><br/>
-</p>
-
-<a name="howto">
-<h4>How to</h4>
-</a>
-<p>You can select start and end points with the select buttons next to the fields.
-Pressing the <label>Calculate</label> button will run the shortest path calculation using the optimization criterion selected in the <label>Criterion</label> combobox. The <label>Export</label> button allow you to export a calculated path to a new vector layer, and the button <label>Clear</label> will erase all fields and remove the points and calculated path from map canvas.</p>
-
-<h5>Note</h5>
-<p>In order to bind the start and stop points of the route to the road network Road graph selects the nearest point or arc of the graph. In fact it can bind to any part of the road network. Nevertheless, their route and its characteristics do not take into account the distance from the starting point to the road network and of the road network to the stopping point.</p>
-</source>
-        <translation><h3>Den kürzesten Weg finden</h3>
-<p>Straßengraph ist eine C++-Erweiterung für QGIS, die den kürzesten Weg zwischen zwei Punkten auf jedem Linienlayer bestimmt und über dem Straßennetz anzeigt. Bevor die Erweiterung genutzt werden kann, muß sie konfiguriert werden. Dies erfolgt unter <label>Erweiterungen &rarr; Straßengraph &rarr; Einstellungen</label></p>
-<p>
-<a href="#howto">Wie's geht</a><br/>
-</p>
-
-<a name="howto">
-<h4>Wie's geht</h4>
-</a>
-<p>Sie können Start- und Endpunkt mit den Knöpfen neben <label>Start</label> und <label>Stopp</label> auswählen.
-Durch Klick auf <label>Berechnen</label> wird der kürzeste Weg mit dem Optimierungskriterium, das unter <label>Kriterium</label> gewählt ist, ausgeführt. Mit <label>Export</label> können Sie den berechneten Weg in einem neuen Vektorlayer speichern und mit <label>Löschen</label> alle Felder, die Punkte sowie den berechneten Weg aus der Karte löschen.</p>
-
-<h5>Hinweis</h5>
-<p>Um den Start- und Endpunkt der Route mit dem Straßennetz zu verbinden wählt die Erweiterung den nächsten Knoten oder die nächste Kante des Graphen. Sie können aber an jedem Punkt des Graphen beginnen. Allerdings wird der Abstand vom Start- bzw. Endpunkt zum Straßennetz nicht berücksichtigt.</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>Options</h3>
-This dialog allows you to select some basic options for QGIS. There are eight tabs:
-<p>
-
-<a href="#general">General</a><br/>
-<a href="#ren">Rendering & SVG</a><br/>
-<a href="#map">Map tools</a><br/>
-<a href="#over">Overlay</a><br/>
-<a href="#digit">Digitizing</a><br/>
-<a href="#crs">CRS</a><br/>
-<a href="#loc">Locale</a><br/>
-<a href="#net">Network & Proxy</a><br/>
-
-<a name="general">
-<h4>General</h4>
+<a name="general">
+<h4>General</h4>
 </a>
 On this tab you can set general options for project behavior on opening/saving, default map appearance, your favorite icon theme and many others.
 <a name="ren">
@@ -55321,8 +54747,7 @@ Für eine einfache Suche nach Attribute einer Spalte kann das <label>Suche
 </a>
 Der Knopf <label>Feldrechner</label> in der Attributtabelle ermöglicht Berechnungen auf mit vorhandenen Attributwerten oder definierten Funktionen.  Z.B.  kann die Länge oder Fläche von Geometrieobjekten berechnet werden.<br/>
 Die Ergebnisse können in eine neue Attributspalte geschrieben oder eine vorhandene Spalte damit überschrieben werden.<br/>
-Um den Feldrechner zu öffnen, müssen Sie den Vektorlayer zuvor in den Bearbeitungsmodus versetzen.
-</translation>
+Um den Feldrechner zu öffnen, müssen Sie den Vektorlayer zuvor in den Bearbeitungsmodus versetzen.<br></translation>
     </message>
     <message>
         <source><h3>Delimited Text File Layer</h3>
@@ -55643,7 +55068,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/>
@@ -55671,7 +55096,7 @@ Die Datensätze können räumlich entweder als durch X- und Y-Koordinaten defini
 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 [...]
+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&amp;Zeit). Datum, Zei [...]
 </p>
 
 <pre>
@@ -55878,283 +55303,833 @@ Die folgenden Optionen können verwendet werden
        <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>
-    <message>
-        <source>Input layer</source>
-        <translation>Eingabelayer</translation>
-    </message>
-    <message>
-        <source>Interval between contour lines</source>
-        <translation>Intervall zwischen Konturlinien</translation>
-    </message>
-    <message>
-        <source>Attribute name (if not set, no elevation attribute is attached)</source>
-        <translation>Attributname (wenn nicht angegeben, wird kein Höhenattribut zugefügt)</translation>
-    </message>
-    <message>
-        <source>Additional creation parameters</source>
-        <translation>Weitere Erzeugungsparameter</translation>
-    </message>
-    <message>
-        <source>Output file for contour lines (vector)</source>
-        <translation>Ausgabedatei für Konturlinien (Vektor)</translation>
-    </message>
-</context>
-<context>
-    <name>dxf2shpConverter</name>
-    <message>
-        <source>Converts DXF files in Shapefile format</source>
-        <translation>Konvertiert DXF-Dateien ins Shape-Format</translation>
-    </message>
-    <message>
-        <source>&Dxf2Shp</source>
-        <translation>&Dxf2Shp</translation>
-    </message>
-</context>
-<context>
-    <name>dxf2shpConverterGui</name>
-    <message>
-        <source>Dxf Importer</source>
-        <translation>DXF-Importer</translation>
-    </message>
-    <message>
-        <source>Input and output</source>
-        <translation>Ein- und Ausgabe</translation>
-    </message>
-    <message>
-        <source>Input DXF file</source>
-        <translation>Eingabe-DXF-Datei</translation>
-    </message>
-    <message>
-        <source>...</source>
-        <translation>...</translation>
-    </message>
-    <message>
-        <source>Output file</source>
-        <translation>Ausgabedatei</translation>
-    </message>
-    <message>
-        <source>Export text labels</source>
-        <translation>Beschriftungen exportieren</translation>
-    </message>
-    <message>
-        <source>Output file type</source>
-        <translation>Ausgabedateityp</translation>
-    </message>
-    <message>
-        <source>Polyline</source>
-        <translation>Polylinie</translation>
-    </message>
-    <message>
-        <source>Polygon</source>
-        <translation>Polygon</translation>
-    </message>
-    <message>
-        <source>Point</source>
-        <translation>Punkt</translation>
-    </message>
-    <message>
-        <source>Warning</source>
-        <translation>Warnung</translation>
-    </message>
-    <message>
-        <source>Please specify a file to convert.</source>
-        <translation>Bitte Datei zur Konvertierung angeben.</translation>
-    </message>
-    <message>
-        <source>Please specify an output file</source>
-        <translation>Bitte Ausgabedatei angeben</translation>
-    </message>
     <message>
-        <source>Fields description:
-* Input DXF file: path to the DXF file to be converted
-* Output Shp file: desired name of the shape file to be created
-* Shp output file type: specifies the type of the output shape file
-* Export text labels checkbox: if checked, an additional shp points layer will be created, and the associated dbf table will contain information about the "TEXT" fields found in the dxf file, and the text strings themselves
+        <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>
 
----
-Developed by Paolo L. Scala, Barbara Rita Barricelli, Marco Padula
-CNR, Milan Unit (Information Technology), Construction Technologies Institute.
-For support send a mail to scala at itc.cnr.it
-</source>
-        <translation>Feldbeschreibung:
-* DXF-Eingabedatei: Pfad zur zu konvertierenden DXF-Datei
-* Ausgabe-Shape-Datei: Gewünschter Name der zu erzeugenden Shapedatei
-* Typ der Ausgabe-Shape-Datei: gibt den Typ der Ausgabe-Shape-Datei
-* Beschriftungen exportieren: Es wird ein zusätzlicher Shapepunkt-Layer erzeugt, dessen zugehörige DBF-Tabelle Informationen über das "TEXT"-Feld der DXF-Datei und die Zeichenketten selbst enthält.
+<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;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 in QGIS.
+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>
 
----
-Entwickelt von Paolo L. Scala, Barbara Rita Barricelli, Marco Padula
-CNR, Milan Unit (Information Technology), Construction Technologies Institute.
-Unterstützung unter scala at itc.cnr.it</translation>
-    </message>
-    <message>
-        <source>Choose a DXF file to open</source>
-        <translation>DXF-Datei wählen</translation>
-    </message>
-    <message>
-        <source>DXF files</source>
-        <translation>DXF-Dateien</translation>
-    </message>
-    <message>
-        <source>Choose a file name to save to</source>
-        <translation>Dateiname zum Speichern wählen</translation>
-    </message>
-    <message>
-        <source>Shapefile</source>
-        <translation>Shapedateien</translation>
-    </message>
-</context>
-<context>
-    <name>eVis</name>
-    <message>
-        <source>eVis Database Connection</source>
-        <translation>eVis-Datenbankverbindung</translation>
-    </message>
-    <message>
-        <source>eVis Event Id Tool</source>
-        <translation>eVis-Ereignis-ID-Werkzeug</translation>
-    </message>
-    <message>
-        <source>eVis Event Browser</source>
-        <translation>eVis-Ereignisbrowser</translation>
-    </message>
-    <message>
-        <source>Create layer from a database query</source>
-        <translation>Layer aus einer Datenbankabfrage erzeugen</translation>
-    </message>
-    <message>
-        <source>Open an Event Browers and display the selected feature</source>
-        <translation>Einen Ereignisbrowser öffnen und gewählte Objekte anzeigen</translation>
-    </message>
-    <message>
-        <source>Open an Event Browser to explore the current layer's features</source>
-        <translation>Einen Ereignisbrowser öffnen, um die Objekte des aktuellen Layers zu erforschen</translation>
-    </message>
-</context>
-<context>
-    <name>eVisDatabaseConnectionGui</name>
-    <message>
-        <source>Undefined</source>
-        <translation>Undefiniert</translation>
-    </message>
-    <message>
-        <source>No predefined queries loaded</source>
-        <translation>Keine verdefinierten Abfragen geladen</translation>
-    </message>
-    <message>
-        <source>Open File</source>
-        <translation>Datei öffnen</translation>
-    </message>
-    <message>
-        <source>New Database connection requested...</source>
-        <translation>Neue Datenbankverbindung angefordert...</translation>
-    </message>
-    <message>
-        <source>Error: You must select a database type</source>
-        <translation>Fehler: Sie müssen einen Datenbanktyp auswählen</translation>
-    </message>
-    <message>
-        <source>Error: No host name entered</source>
-        <translation>Fehler: Kein Hostname eingegeben</translation>
-    </message>
-    <message>
-        <source>Error: No database name entered</source>
-        <translation>Fehler: Kein Datenbankname eingegeben</translation>
-    </message>
-    <message>
-        <source>Connection to [%1.%2] established</source>
-        <translation>Verbindung zu [%1.%2] aufgebaut</translation>
-    </message>
-    <message>
-        <source>connected</source>
-        <translation>verbunden</translation>
-    </message>
-    <message>
-        <source>Tables</source>
-        <translation>Tabellen</translation>
-    </message>
-    <message>
-        <source>Connection to [%1.%2] failed: %3</source>
-        <translation>Verbindung zu [%1.%2] gescheitert: %3</translation>
-    </message>
-    <message>
-        <source>Error: Parse error at line %1, column %2: %3</source>
-        <translation>Fehler: Parserfehler in Zeile %1, Spalte %2: %3</translation>
-    </message>
-    <message>
-        <source>Error: Unabled to open file [%1]</source>
-        <translation>Fehler: Konnte Datei nicht öffnen [%1]</translation>
-    </message>
-    <message>
-        <source>Error: Query failed: %1</source>
-        <translation>Fehler: Abfrage gescheitert: %1</translation>
-    </message>
-    <message>
-        <source>Error: Could not create temporary file, process halted</source>
-        <translation>Fehler: Konnte Temporärdatei nicht erzeugen, Prozess angehalten</translation>
-    </message>
-    <message>
-        <source>Error: A database connection is not currently established</source>
-        <translation>Fehler: Es besteht derzeit keine Datenbankverbindung</translation>
-    </message>
-</context>
-<context>
-    <name>eVisDatabaseConnectionGuiBase</name>
-    <message>
-        <source>Database Connection</source>
-        <translation>Datenbankverbindung</translation>
-    </message>
-    <message>
-        <source>Predefined Queries</source>
-        <translation>Vordefinierte Abfragen</translation>
-    </message>
-    <message>
-        <source>Load predefined queries</source>
-        <translation>Vordefinierte Abfragen laden</translation>
-    </message>
-    <message>
-        <source>Loads an XML file with predefined queries. Use the Open File window to locate the XML file that contains one or more predefined queries using the format described in the user guide.</source>
-        <translation>Lädt eine XML-Datei mit vordefinierten Abfragen. Nutzen Sie das Datei öffnen-Fenster, um die XML-Datei aufzufinden, die eine oder mehrere vordefinierte Abfragen in dem im Benutzerhandbuch definierten Format enthält.</translation>
-    </message>
-    <message>
-        <source>The description of the selected query.</source>
-        <translation>Die Beschreibung der gewählten Abfrage.</translation>
-    </message>
-    <message>
-        <source>Select the predefined query you want to use from the drop-down list containing queries identified from the file loaded using the Open File icon above. To run the query you need to click on the SQL Query tab. The query will be automatically entered in the query window.</source>
-        <translation>Wählen Sie die gewünschte vordefinierte Abfragen aus der Drop-Down-Liste mit den Abfragen, die über Datei öffnen  geladen wurden. Um die Abfrage auszuführen müssen Sie auf die SQL-Abfrage-Reiter klicken. Die Abfrage wird automatisch in das Abfragefenster übernommen.</translation>
-    </message>
-    <message>
-        <source>not connected</source>
-        <translation>Nicht verbunden</translation>
-    </message>
-    <message>
-        <source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Connection Status: </span></p></body></html></source>
-        <translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Verbindungsstatus: </span></p></body></html></translation>
-    </message>
-    <message>
-        <source>Database Host</source>
-        <translation>Datenbank-Host</translation>
-    </message>
-    <message utf8="true">
-        <source>Enter the database host. If the database resides on your desktop you should enter ¨localhost¨. If you selected ¨MSAccess¨ as the database type this option will not be available. </source>
-        <translation>Einen Datenbank-Host eingeben. Wenn die Datenbank sich auf Ihrer Arbeitsstation befindet sollten Sie "localhost" eingeben. Wenn Sie "MSAccess" als Datenbanktyp gewählt haben, ist diese Option nicht verfügbar. </translation>
-    </message>
-    <message>
-        <source>Password to access the database.</source>
-        <translation>Passwort zum Zugriff auf die Datenbank.</translation>
-    </message>
-    <message>
-        <source>Enter the name of the database.</source>
+<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, 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 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&amp;Zeit). Datum, Zei [...]
+</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>
+    <message>
+        <source>Input layer</source>
+        <translation>Eingabelayer</translation>
+    </message>
+    <message>
+        <source>Interval between contour lines</source>
+        <translation>Intervall zwischen Konturlinien</translation>
+    </message>
+    <message>
+        <source>Attribute name (if not set, no elevation attribute is attached)</source>
+        <translation>Attributname (wenn nicht angegeben, wird kein Höhenattribut zugefügt)</translation>
+    </message>
+    <message>
+        <source>Additional creation parameters</source>
+        <translation>Weitere Erzeugungsparameter</translation>
+    </message>
+    <message>
+        <source>Output file for contour lines (vector)</source>
+        <translation>Ausgabedatei für Konturlinien (Vektor)</translation>
+    </message>
+</context>
+<context>
+    <name>dxf2shpConverter</name>
+    <message>
+        <source>Converts DXF files in Shapefile format</source>
+        <translation>Konvertiert DXF-Dateien ins Shape-Format</translation>
+    </message>
+    <message>
+        <source>&Dxf2Shp</source>
+        <translation>&Dxf2Shp</translation>
+    </message>
+</context>
+<context>
+    <name>dxf2shpConverterGui</name>
+    <message>
+        <source>Dxf Importer</source>
+        <translation>DXF-Importer</translation>
+    </message>
+    <message>
+        <source>Input and output</source>
+        <translation>Ein- und Ausgabe</translation>
+    </message>
+    <message>
+        <source>Input DXF file</source>
+        <translation>Eingabe-DXF-Datei</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>Output file</source>
+        <translation>Ausgabedatei</translation>
+    </message>
+    <message>
+        <source>Export text labels</source>
+        <translation>Beschriftungen exportieren</translation>
+    </message>
+    <message>
+        <source>Output file type</source>
+        <translation>Ausgabedateityp</translation>
+    </message>
+    <message>
+        <source>Polyline</source>
+        <translation>Polylinie</translation>
+    </message>
+    <message>
+        <source>Polygon</source>
+        <translation>Polygon</translation>
+    </message>
+    <message>
+        <source>Point</source>
+        <translation>Punkt</translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation>Warnung</translation>
+    </message>
+    <message>
+        <source>Please specify a file to convert.</source>
+        <translation>Bitte Datei zur Konvertierung angeben.</translation>
+    </message>
+    <message>
+        <source>Please specify an output file</source>
+        <translation>Bitte Ausgabedatei angeben</translation>
+    </message>
+    <message>
+        <source>Fields description:
+* Input DXF file: path to the DXF file to be converted
+* Output Shp file: desired name of the shape file to be created
+* Shp output file type: specifies the type of the output shape file
+* Export text labels checkbox: if checked, an additional shp points layer will be created, and the associated dbf table will contain information about the "TEXT" fields found in the dxf file, and the text strings themselves
+
+---
+Developed by Paolo L. Scala, Barbara Rita Barricelli, Marco Padula
+CNR, Milan Unit (Information Technology), Construction Technologies Institute.
+For support send a mail to scala at itc.cnr.it
+</source>
+        <translation>Feldbeschreibung:
+* DXF-Eingabedatei: Pfad zur zu konvertierenden DXF-Datei
+* Ausgabe-Shape-Datei: Gewünschter Name der zu erzeugenden Shapedatei
+* Typ der Ausgabe-Shape-Datei: gibt den Typ der Ausgabe-Shape-Datei
+* Beschriftungen exportieren: Es wird ein zusätzlicher Shapepunkt-Layer erzeugt, dessen zugehörige DBF-Tabelle Informationen über das "TEXT"-Feld der DXF-Datei und die Zeichenketten selbst enthält.
+
+---
+Entwickelt von Paolo L. Scala, Barbara Rita Barricelli, Marco Padula
+CNR, Milan Unit (Information Technology), Construction Technologies Institute.
+Unterstützung unter scala at itc.cnr.it</translation>
+    </message>
+    <message>
+        <source>Choose a DXF file to open</source>
+        <translation>DXF-Datei wählen</translation>
+    </message>
+    <message>
+        <source>DXF files</source>
+        <translation>DXF-Dateien</translation>
+    </message>
+    <message>
+        <source>Choose a file name to save to</source>
+        <translation>Dateiname zum Speichern wählen</translation>
+    </message>
+    <message>
+        <source>Shapefile</source>
+        <translation>Shapedateien</translation>
+    </message>
+</context>
+<context>
+    <name>eVis</name>
+    <message>
+        <source>eVis Database Connection</source>
+        <translation>eVis-Datenbankverbindung</translation>
+    </message>
+    <message>
+        <source>eVis Event Id Tool</source>
+        <translation>eVis-Ereignis-ID-Werkzeug</translation>
+    </message>
+    <message>
+        <source>eVis Event Browser</source>
+        <translation>eVis-Ereignisbrowser</translation>
+    </message>
+    <message>
+        <source>Create layer from a database query</source>
+        <translation>Layer aus einer Datenbankabfrage erzeugen</translation>
+    </message>
+    <message>
+        <source>Open an Event Browers and display the selected feature</source>
+        <translation>Einen Ereignisbrowser öffnen und gewählte Objekte anzeigen</translation>
+    </message>
+    <message>
+        <source>Open an Event Browser to explore the current layer's features</source>
+        <translation>Einen Ereignisbrowser öffnen, um die Objekte des aktuellen Layers zu erforschen</translation>
+    </message>
+</context>
+<context>
+    <name>eVisDatabaseConnectionGui</name>
+    <message>
+        <source>Undefined</source>
+        <translation>Undefiniert</translation>
+    </message>
+    <message>
+        <source>No predefined queries loaded</source>
+        <translation>Keine verdefinierten Abfragen geladen</translation>
+    </message>
+    <message>
+        <source>Open File</source>
+        <translation>Datei öffnen</translation>
+    </message>
+    <message>
+        <source>New Database connection requested...</source>
+        <translation>Neue Datenbankverbindung angefordert...</translation>
+    </message>
+    <message>
+        <source>Error: You must select a database type</source>
+        <translation>Fehler: Sie müssen einen Datenbanktyp auswählen</translation>
+    </message>
+    <message>
+        <source>Error: No host name entered</source>
+        <translation>Fehler: Kein Hostname eingegeben</translation>
+    </message>
+    <message>
+        <source>Error: No database name entered</source>
+        <translation>Fehler: Kein Datenbankname eingegeben</translation>
+    </message>
+    <message>
+        <source>Connection to [%1.%2] established</source>
+        <translation>Verbindung zu [%1.%2] aufgebaut</translation>
+    </message>
+    <message>
+        <source>connected</source>
+        <translation>verbunden</translation>
+    </message>
+    <message>
+        <source>Tables</source>
+        <translation>Tabellen</translation>
+    </message>
+    <message>
+        <source>Connection to [%1.%2] failed: %3</source>
+        <translation>Verbindung zu [%1.%2] gescheitert: %3</translation>
+    </message>
+    <message>
+        <source>Error: Parse error at line %1, column %2: %3</source>
+        <translation>Fehler: Parserfehler in Zeile %1, Spalte %2: %3</translation>
+    </message>
+    <message>
+        <source>Error: Unabled to open file [%1]</source>
+        <translation>Fehler: Konnte Datei nicht öffnen [%1]</translation>
+    </message>
+    <message>
+        <source>Error: Query failed: %1</source>
+        <translation>Fehler: Abfrage gescheitert: %1</translation>
+    </message>
+    <message>
+        <source>Error: Could not create temporary file, process halted</source>
+        <translation>Fehler: Konnte Temporärdatei nicht erzeugen, Prozess angehalten</translation>
+    </message>
+    <message>
+        <source>Error: A database connection is not currently established</source>
+        <translation>Fehler: Es besteht derzeit keine Datenbankverbindung</translation>
+    </message>
+</context>
+<context>
+    <name>eVisDatabaseConnectionGuiBase</name>
+    <message>
+        <source>Database Connection</source>
+        <translation>Datenbankverbindung</translation>
+    </message>
+    <message>
+        <source>Predefined Queries</source>
+        <translation>Vordefinierte Abfragen</translation>
+    </message>
+    <message>
+        <source>Load predefined queries</source>
+        <translation>Vordefinierte Abfragen laden</translation>
+    </message>
+    <message>
+        <source>Loads an XML file with predefined queries. Use the Open File window to locate the XML file that contains one or more predefined queries using the format described in the user guide.</source>
+        <translation>Lädt eine XML-Datei mit vordefinierten Abfragen. Nutzen Sie das Datei öffnen-Fenster, um die XML-Datei aufzufinden, die eine oder mehrere vordefinierte Abfragen in dem im Benutzerhandbuch definierten Format enthält.</translation>
+    </message>
+    <message>
+        <source>The description of the selected query.</source>
+        <translation>Die Beschreibung der gewählten Abfrage.</translation>
+    </message>
+    <message>
+        <source>Select the predefined query you want to use from the drop-down list containing queries identified from the file loaded using the Open File icon above. To run the query you need to click on the SQL Query tab. The query will be automatically entered in the query window.</source>
+        <translation>Wählen Sie die gewünschte vordefinierte Abfragen aus der Drop-Down-Liste mit den Abfragen, die über Datei öffnen  geladen wurden. Um die Abfrage auszuführen müssen Sie auf die SQL-Abfrage-Reiter klicken. Die Abfrage wird automatisch in das Abfragefenster übernommen.</translation>
+    </message>
+    <message>
+        <source>not connected</source>
+        <translation>Nicht verbunden</translation>
+    </message>
+    <message>
+        <source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Connection Status: </span></p></body></html></source>
+        <translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Verbindungsstatus: </span></p></body></html></translation>
+    </message>
+    <message>
+        <source>Database Host</source>
+        <translation>Datenbank-Host</translation>
+    </message>
+    <message utf8="true">
+        <source>Enter the database host. If the database resides on your desktop you should enter ¨localhost¨. If you selected ¨MSAccess¨ as the database type this option will not be available. </source>
+        <translation>Einen Datenbank-Host eingeben. Wenn die Datenbank sich auf Ihrer Arbeitsstation befindet sollten Sie "localhost" eingeben. Wenn Sie "MSAccess" als Datenbanktyp gewählt haben, ist diese Option nicht verfügbar. </translation>
+    </message>
+    <message>
+        <source>Password to access the database.</source>
+        <translation>Passwort zum Zugriff auf die Datenbank.</translation>
+    </message>
+    <message>
+        <source>Enter the name of the database.</source>
         <translation>Name der Datenbank eingeben.</translation>
     </message>
     <message>
@@ -56795,16 +56770,35 @@ Erweiterung wird nicht aktiviert.</translation>
         <translation>Voreinstellte Gültigkeitsmaske nicht verwenden</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
+        <source>Filled</source>
+        <translation>Gefüllt</translation>
+    </message>
+</context>
+<context>
+    <name>flightlinesToCHM</name>
+    <message>
+        <source>tile size (side length of square tile)</source>
+        <translation>Kachelgröße (Seitenlänge der Quadrate) </translation>
+    </message>
+    <message>
+        <source>buffer around each tile (avoids edge artifacts)</source>
+        <translation>Buffer um einzelne Kacheln (vermeidet Randartefakte)</translation>
+    </message>
+    <message>
+        <source>terrain type</source>
+        <translation>Geländetyp</translation>
+    </message>
+    <message>
+        <source>laser beam width (diameter of laser footprint)</source>
+        <translation>Laserstrahlbreite (Laserabdrucksdurchmesser)</translation>
     </message>
     <message>
-        <source>Filled</source>
-        <translation>Gefüllt</translation>
+        <source>tile base name (using 'sydney' creates sydney_274000_4714000...)</source>
+        <translation>Kachelbasisname ('sydney' erzeugt sydney_274000_4714000...)</translation>
     </message>
 </context>
 <context>
-    <name>flightlinesToCHM</name>
+    <name>flightlinesToDTMandDSM</name>
     <message>
         <source>tile size (side length of square tile)</source>
         <translation>Kachelgröße (Seitenlänge der Quadrate) </translation>
@@ -56818,16 +56812,12 @@ Erweiterung wird nicht aktiviert.</translation>
         <translation>Geländetyp</translation>
     </message>
     <message>
-        <source>laser beam width (diameter of laser footprint)</source>
-        <translation>Laserstrahlbreite (Laserabdrucksdurchmesser)</translation>
-    </message>
-    <message>
         <source>tile base name (using 'sydney' creates sydney_274000_4714000...)</source>
         <translation>Kachelbasisname ('sydney' erzeugt sydney_274000_4714000...)</translation>
     </message>
 </context>
 <context>
-    <name>flightlinesToDTMandDSM</name>
+    <name>flightlinesToSingleCHMpitFree</name>
     <message>
         <source>tile size (side length of square tile)</source>
         <translation>Kachelgröße (Seitenlänge der Quadrate) </translation>
@@ -56841,4654 +56831,5304 @@ Erweiterung wird nicht aktiviert.</translation>
         <translation>Geländetyp</translation>
     </message>
     <message>
-        <source>tile base name (using 'sydney' creates sydney_274000_4714000...)</source>
-        <translation>Kachelbasisname ('sydney' erzeugt sydney_274000_4714000...)</translation>
+        <source>laser beam width (diameter of laser footprint)</source>
+        <translation>Laserstrahlbreite (Laserabdrucksdurchmesser)</translation>
+    </message>
+</context>
+<context>
+    <name>function_help</name>
+    <message>
+        <source><h3>week() function</h3>
+Extract the week number from a date, or the number of weeks
+from a <code>Interval</code>
+
+<h4>Syntax</h4>
+<code>week(date)</code><br>
+<code>week(Interval)</code><br>
+
+<h4>Arguments</h4>
+<code>date</code> - is date or datetime. The date to extract the week from.
+<br>
+<code>Interval</code> - is Interval. The Interval to return the number of weeks from.
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>week('2012-05-12') &rarr; 19</code><br>
+<code>week(tointerval('3 weeks')) &rarr; 3</code><br>
+<code>week(age('2012-01-01','2010-01-01')) &rarr; 104.285...</code><br>
+
+</source>
+        <translation><h3>Funktion week()</h3>
+Bestimmt die Woche eines Datums oder die Anzahl der Wochen
+eines <code>Intervalls</code>
+
+<h4>Syntax</h4>
+<code>week(date)</code><br>
+<code>week(Interval)</code><br>
+
+<h4>Argumente</h4>
+<code>date</code> - ist date oder datetime. Das Datum dessen Woche zur&uuml;ckgegeben werden soll.
+<br>
+<code>Interval</code> - ist Interval. Das Intervall dessen L&auml;nge in Wochen zur&uuml;ckgegeben werden soll.
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>week('2012-05-12') &rarr; 19</code><br>
+<code>week(tointerval('3 weeks')) &rarr; 3</code><br>
+<code>week(age('2012-01-01','2010-01-01')) &rarr; 104.285...</code><br>
+
+</translation>
+    </message>
+    <message>
+        <source><h3>CASE expression</h3>
+A conditional expression that can be used to evaluate multiple expressions and
+return a result.
+
+<h4>Syntax</h4>
+<pre>
+     CASE
+        WHEN <i>condition</i> THEN <i>result</i>
+        [ ...n ]
+        [ ELSE <i>result</i> ]
+     END
+</pre>
+[ ] marks optional components
+
+<h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  WHEN condition</i> - The condition expression to evaluate. <br>
+<i>  THEN result</i> - If <i>condition</i> evaluates to True then <i>result</i> is evaluated and returned. <br>
+<i>  ELSE result</i> - If none of the above conditions evaluated to True then <i>result</i> is evaluated and returned. <br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<pre>
+    CASE
+        WHEN <i>"column" IS NULL</i> THEN <i>'None'</i>
+        ELSE <i>"column"</i>
+    END
+</pre>
+</source>
+        <translation><h3>CASE Ausdruck</h3>
+Ist ein bedingter Ausdruck mit dem mehrere Ausdr&uuml;cken ausgewertet und ein
+Ergebnis zur&uuml;ckgegeben werden kann.
+
+<h4>Syntax</h4>
+<pre>
+     CASE
+        WHEN <i>bedingung</i> THEN <i>ergebnis</i>
+        [ ...n ]
+        [ ELSE <i>ergebnis</i> ]
+     END
+</pre>
+[ ] markiert optionale Komponenten
+
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  WHEN bedingung</i> - Der Bedingungsausdruck. <br>
+<i>  THEN ergebnis</i> - Wenn die <i>bedingung</i> True ergibt, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
+<i>  ELSE ergebnis</i> - Wenn keine der Bedingungen erf&uuml;llt ist, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>
+    CASE
+        WHEN <i>"column" IS NULL</i> THEN <i>'Leer'</i>
+        ELSE <i>"column"</i>
+    END
+</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>right() function</h3>
+Returns a substring that contains the <i>n</i> rightmost characters of the string.
+
+<h4>Syntax</h4>
+<code>right(string, pos)</code><br>
+
+<h4>Arguments</h4>
+<code>string</code> - is string. The string.
+<br>
+<code>length</code> - is int. The number of characters from the right to return.
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>right('Hello World',5) &rarr; 'World'</code><br>
+
+</source>
+        <translation><h3>Funktion right()</h3>
+Ergibt letzten <i>n</i> Zeichen von rechts.
+
+<h4>Syntax</h4>
+<code>right(zeichenkette,laenge)</code><br>
+
+<h4>Argumente</h4>
+<code>string</code> - ist string. Die Zeichenkette.
+<br>
+<code>laenge</code> - ist int. Die Anzahl der von rechts zur&uuml;ckzugebenden Zeichen von rechts.
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>right('Hallo Welt',4) &rarr; 'Welt'</code><br>
+</translation>
+    </message>
+    <message>
+        <source>
+<h3>Color Group</h3>
+This group contains functions for manipulating colors
+</source>
+        <translation><h3>Farbgruppe</h3>
+Diese Gruppe enthält Funktionen zur Farbmanipulation
+</translation>
+    </message>
+    <message>
+        <source><h3>length() function</h3>
+Returns the length of a string.
+
+<p><h4>Syntax</h4>
+     length(<i>string</i>)</p>
+
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The String to count the length of.</p>
+
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     length('HELLO') &rarr; 5</p>
+</source>
+        <translation><h3>Funktion length()</h3>
+Liefert die L&auml;nge einer Zeichenkette.
+
+<p><h4>Syntax</h4>
+     length(<i>zeichenkette</i>)</p>
+
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette deren L&auml;nge zu bestimmen ist.</p>
+
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     length('HALLO') &rarr; 5</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>upper() function</h3>
+Converts a string to upper case letters.
+
+<p><h4>Syntax</h4>
+     upper(<i>string</i>)</p>
+
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The String to convert to upper case.</p>
+
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     upper('hello WOrld') &rarr; 'HELLO WORLD'</p>
+</source>
+        <translation><h3>Funktion upper()</h3>
+Wandelt eine Zeichenkette in Gro&szlig;buchstaben.
+
+<p><h4>Syntax</h4>
+     upper(<i>zeichenkette</i>)</p>
+
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, die in Gro&szlig;buchstaben umzuwandeln ist.</p>
+
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     upper('hello WOrld') &rarr; 'HELLO WORLD'</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>left() function</h3>
+Returns a substring that contains the <i>n</i> leftmost characters of the string.
+
+<h4>Syntax</h4>
+<code>left(string, length)</code><br>
+
+<h4>Arguments</h4>
+<code>string</code> - is string. The string.
+<br>
+<code>length</code> - is int. The number of characters from the left to return.
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>left('Hello World',5) &rarr; 'Hello'</code><br>
+
+</source>
+        <translation><h3>Funktion left()</h3>
+Ergibt ersten <i>n</i> Zeichen von links.
+
+<h4>Syntax</h4>
+<code>left(zeichenkette, laenge)</code><br>
+
+<h4>Argumente</h4>
+<code>zeichenkette</code> - ist eine Zeichenkette. Die Zeichenkette.
+<br>
+<code>laenge</code> - ist eine Zahl. Die Anzahl der zur&uuml;ckzugebenden Zeichen.
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>left('Hallo Welt',5) &rarr; 'Hallo'</code><br>
+
+</translation>
+    </message>
+    <message>
+        <source><h3>$scale function</h3>
+Returns the current scale of the map canvas.
+<br>
+Note: This function is only available in some contexts and will be 0 otherwise. 
+<h4>Syntax</h4>
+<code>$scale</code><br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>$scale &rarr; 10000</code><br>
+
+
+</source>
+        <translation><h3>Funktion $scale</h3>
+Liefert den aktuellen Ma&szlig;stab der Kartenanzeige.
+<br>
+Hinweis: Die Funktion ist nur in einigen Zusammenh&auml;ngen verf&uuml;gbar und sonst 0.
+<h4>Syntax</h4>
+<code>$scale</code><br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>$scale &rarr; 10000</code><br>
+
+
+</translation>
+    </message>
+    <message>
+        <source><h3>ceil() function</h3>
+Rounds a number upwards.
+
+<h4>Syntax</h4>
+<code>ceil(value)</code><br>
+
+<h4>Arguments</h4>
+<code>value</code> - a number.
+<br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>ceil(4.9) &rarr; 5</code><br>
+<code>ceil(-4.9) &rarr; -4</code><br>
+</source>
+        <translation><h3>Funktion ceil()</h3>
+Rundet eine Zahl auf.
+
+<h4>Syntax</h4>
+<code>ceil(wert)</code><br>
+
+<h4>Argumente</h4>
+<code>wert</code> - eine Zahl.
+<br>
+
+<h4>Beispiel</h4>
+<code>ceil(4.9) &rarr; 5</code><br>
+<code>ceil(-4.9) &rarr; -4</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>$numpages function</h3>
+Returns the total number of pages in the composition.
+
+<h4>Syntax</h4>
+<pre>$numpages</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre>$numpages &rarr; 42</pre>
+
+</source>
+        <translation><h3>Funktion $numpages</h3>
+Gibt die Gesamtseitenzahl einer Druckzusammenstellung aus.
+
+<h4>Syntax</h4>
+<pre>$numpages</pre>
+
+<h4>Argumente</h4>
+Keine
+
+<h4>Beispiel</h4>
+<pre>$numpages &rarr; 42</pre>
+
+</translation>
+    </message>
+    <message>
+        <source><h3>strpos() function</h3>
+Return the index of a regular expression in a string.
+
+<h4>Syntax</h4>
+     strpos(<i>haystack</i>, <i>needle</i>)
+<br><br>
+Returns -1 if the expression isn't found.
+
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  haystack</i> &rarr; is string.  The string that is to be searched.<br>
+<i>  needle</i> &rarr; is string.  The regular expression to look for.<br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+     strpos('HELLO WORLD','WORLD') &rarr; 6<br>
+     strpos('HELLO WORLD','GOODBYE') &rarr; -1<br>
+</source>
+        <translation><h3>Funktion strpos()</h3>
+Bestimmt die Position eines regul&auml;ren Ausdrucks in einer Zeichenkette.
+
+<h4>Syntax</h4>
+     strpos(<i>heuhaufen</i>,<i>nadel</i>)/i>)
+<br><br>
+Gibt -1 zur&uuml;ck, wenn der Ausdruck nicht gefunden wurde.
+
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  heuhaufen</i> &rarr; ist string.  Zeichenkette in der gesucht werden soll.<br>
+<i>  nadel</i> &rarr; ist string.  Der gesuchte regul&auml;re Ausdruck.<br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+     strpos('HELLO WORLD','WORLD') &rarr; 6<br>
+     strpos('HELLO WORLD','GOOD BYE') &rarr; -1<br>
+</translation>
+    </message>
+    <message>
+        <source><h3>rand() function</h3>
+Returns a random integer within the range specified by the minimum and 
+maximum argument (inclusive).
+<br>
+This function takes two arguments.
+<h4>Syntax</h4>
+<code>rand(min, max)</code><br>
+
+<h4>Arguments</h4>
+<code>min</code> - an integer representing the smallest possible random number desired.<br>
+<code>max</code> - an integer representing the largest possible random number desired.
+<br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>rand(1, 10) &rarr; 8</code><br>
+</source>
+        <translation><h3>Funktion rand()</h3>
+Liefert eine Zufallszahl zwischen den Argumenten zur&uuml;ck (inklusiv).
+<br>
+Dies Funktion hat zwei Argumente.
+<h4>Syntax</h4>
+<code>rand(min, max)</code><br>
+
+<h4>Argumente</h4>
+<code>min</code> - eine ganze Zahl, die die kleinste Zufallszahl angibt.<br>
+<code>max</code> - eine ganze Zahl, die die gr&ouml;&szlig;te Zufallszahl angibt.<br>
+<br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>rand(1, 10) &rarr; 8</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>$atlasgeometry function</h3>
+Returns the geometry of the current feature iterated in atlas.
+Can be used for rule based display of geometry when using atlas.
+For example to only show geometries of other layers when their geometry 
+intersects the iterated geometry of features using atlas.
+
+<h4>Syntax</h4>
+<pre>$atlasgeometry</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre> intersects(  $atlasgeometry,  $geometry ) </pre>
+
+</source>
+        <translation><h3>$atlasgeometry Funktion</h3>
+Gibt die Geometrie des in Atlas iterierten Objekts zurück.
+Wird verwendet für Regelbasierte Darstellung unter Benutzung von Atlas.
+Zum Beispiel um nur die Geometrien anderer Layer zu zeigen wenn deren 
+Geometrie den durch Atlas iterierten Layer in dessen Geomtrien schneidet.
+
+<h4>Syntax</h4>
+<pre>$atlasgeometry</pre>
+
+<h4>Argumente</h4>
+Kein
+
+<h4>Beispiel</h4>
+<pre> intersects(  $atlasgeometry,  $geometry ) </pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>$atlasfeatureid function</h3>
+Returns the feature id of the current row while using atlas.
+This enables you to use features of atlas in rules 
+and for example show or hide features based on their id.
+
+<h4>Syntax</h4>
+<pre>$atlasfeatureid</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre>$atlasfeatureid = $id</pre>
+
+</source>
+        <translation><h3>$atlasfeatureid Funktion</h3>
+Gibt die Objektid der aktuellen Zeile bei benutzung von Atlas zurück.
+Dies ermöglicht Objekte in Atlas regelbasiert zu wählen um zum 
+Beispiel Objekte anhand deren id anzuzeigen oder zu verstecken.
+
+<h4>Syntax</h4>
+<pre>$atlasfeatureid</pre>
+
+<h4>Argumente</h4>
+None
+
+<h4>Beispiel</h4>
+<pre>$atlasfeatureid = $id</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>bounds_width function</h3>
+Returns the width of the bounding box of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+
+<h4>Syntax</h4>
+<pre>bounds_width(geom)</pre>
+
+<h4>Arguments</h4>
+geom &rarr; a geometry
+
+<h4>Example</h4>
+<pre> bounds_width($geometry) &rarr; returns width of bounding box of $geometry</pre>
+
+</source>
+        <translation><h3>Funktion bounds_width</h3>
+Gibt die Breite der Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
+
+<h4>Syntax</h4>
+<pre>bounds_width(geom)</pre>
+
+<h4>Argumente</h4>
+geom &rarr; eine Geometrie
+
+<h4>Beispiel</h4>
+<pre> bounds_width($geometry) &rarr; ergibt die Breite der $geometry</pre>
+
+</translation>
+    </message>
+    <message>
+        <source><h3>floor() function</h3>
+Rounds a number downwards.
+
+<h4>Syntax</h4>
+<code>floor(value)</code><br>
+
+<h4>Arguments</h4>
+<code>value</code> - a number.
+<br>
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>floor(4.9) &rarr; 4</code><br>
+<code>floor(-4.9) &rarr; -5</code><br>
+</source>
+        <translation><h3>Funktion floor()</h3>
+Rundet eine Zahl ab.
+
+<h4>Syntax</h4>
+<code>floor(wert)</code><br>
+
+<h4>Argumente</h4>
+<code>wert</code> - eine Zahl.
+<br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>floor(4.9) &rarr; 4</code><br>
+<code>floor(-4.9) &rarr; -5</code><br>
+</translation>
     </message>
-</context>
-<context>
-    <name>flightlinesToSingleCHMpitFree</name>
     <message>
-        <source>tile size (side length of square tile)</source>
-        <translation>Kachelgröße (Seitenlänge der Quadrate) </translation>
+        <source><h3>bounds_height function</h3>
+Returns the height of the bounding box of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+
+<h4>Syntax</h4>
+<pre>bounds_height(geom)</pre>
+
+<h4>Arguments</h4>
+geom &rarr; a geometry
+
+<h4>Example</h4>
+<pre> bounds_height($geometry) &rarr; returns height of bounding box of $geometry</pre>
+
+</source>
+        <translation><h3>Funktion bounds_height</h3>
+Gibt die Höhe der Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
+
+<h4>Syntax</h4>
+<pre>bounds_height(geom)</pre>
+
+<h4>Argumente</h4>
+geom &rarr; eine Geometrie
+
+<h4>Beispiel</h4>
+<pre> bounds_height($geometry) &rarr; ergibt die Höhe der $geometry</pre>
+
+</translation>
     </message>
     <message>
-        <source>buffer around each tile (avoids edge artifacts)</source>
-        <translation>Buffer um einzelne Kacheln (vermeidet Randartefakte)</translation>
+        <source><h3>$rownum function</h3>
+Returns the number of the current row.
+
+<h4>Syntax</h4>
+<pre>$rownum</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre>$rownum &rarr; 4711</pre>
+
+</source>
+        <translation><h3>Funktion $rownum</h3>
+Ergibt die Zeilennummer des aktuellen Datensatzes
+
+<h4>Syntax</h4>
+<pre>$rownum</pre>
+
+<h4>Argumente</h4>
+Keine
+
+<h4>Beispiel</h4>
+<pre>$rownum &rarr; 4711</pre>
+</translation>
     </message>
     <message>
-        <source>terrain type</source>
-        <translation>Geländetyp</translation>
+        <source><h3>atan2() function</h3>
+Returns arcustangens of y/x using the signs of the two 
+arguments to determine the quadrant of the result
+
+
+
+<p><h4>Syntax</h4>
+     atan2(<i>real</i>, <i>real</i>)</p>
+
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; y coordinate difference<br>
+<i>real</i> &rarr; x coordinate difference</p>
+
+<p><h4>Example</h4>
+     atan2(1.0, 1.732) &rarr; 0.523611477769969</p>
+</source>
+        <translation><h3>Funktion atan2()</h3>
+Gibt den Arcustangens von y/x unter Ber&uuml;cksichtung der Vorzeichen der beiden
+Argumente zur&uuml;ck, um den den Quadranten des Ergebnisses zu bestimmen.
+
+<p><h4>Syntax</h4>
+     atan2(<i>dy</i>, <i>dx</i>)</p>
+
+<p><h4>Argumente</h4>
+<i>dy</i> &rarr; y Ordinatendifferenz<br>
+<i>dx</i> &rarr; x Ordinatendifferenz</p>
+
+<p><h4>Beispiel</h4>
+     atan2(1.0, 1.732) &rarr; 0.523611477769969</p>
+</translation>
     </message>
     <message>
-        <source>laser beam width (diameter of laser footprint)</source>
-        <translation>Laserstrahlbreite (Laserabdrucksdurchmesser)</translation>
+        <source><h3>sin() function</h3>
+Returns sinus of an angle.
+
+
+<p><h4>Syntax</h4>
+     sin(<i>real</i>)</p>
+
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; angle in radians.</p>
+
+<p><h4>Example</h4>
+     sin(1.571) &rarr; 0.999999682931835</p>
+</source>
+        <translation><h3>Funktion sin()</h3>
+Gibt den Sinus eines Winkels zur&uuml;ck.
+
+
+<p><h4>Syntax</h4>
+     sin(<i>winkel</i>)</p>
+
+<p><h4>Argumente</h4>
+<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
+
+<p><h4>Beispiel</h4>
+     sin(1.571) &rarr; 0.999999682931835</p>
+</translation>
     </message>
-</context>
-<context>
-    <name>function_help</name>
     <message>
-        <source><h3>week() function</h3>
-Extract the week number from a date, or the number of weeks
+        <source><h3>month() function</h3>
+Extract the month part from a date, or the number of months
 from a <code>Interval</code>
 
 <h4>Syntax</h4>
-<code>week(date)</code><br>
-<code>week(Interval)</code><br>
+<code>month(date)</code><br>
+<code>month(Interval)</code><br>
 
 <h4>Arguments</h4>
-<code>date</code> - is date or datetime. The date to extract the week from.
+<code>date</code> - is date or datetime. The date to extract the month from.
 <br>
-<code>Interval</code> - is Interval. The Interval to return the number of weeks from.
+<code>Interval</code> - is Interval. The Interval to return the number of months from.
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>week('2012-05-12') &rarr; 19</code><br>
-<code>week(tointerval('3 weeks')) &rarr; 3</code><br>
-<code>week(age('2012-01-01','2010-01-01')) &rarr; 104.285...</code><br>
+<code>month('2012-05-12') &rarr; 05</code><br>
+<code>month(tointerval('3 months')) &rarr; 3</code><br>
+<code>month(age('2012-01-01','2010-01-01')) &rarr; 4.033...</code><br>
 
 </source>
-        <translation><h3>Funktion week()</h3>
-Bestimmt die Woche eines Datums oder die Anzahl der Wochen
-eines <code>Intervalls</code>
+        <translation><h3>month() function</h3>
+Bestimmt den Monat eines Datums/Zeit oder die Anzahl der Monate
+aus einem <code>Intervall</code>
 
 <h4>Syntax</h4>
-<code>week(date)</code><br>
-<code>week(Interval)</code><br>
+<code>month(date)</code><br>
+<code>month(Intervall)</code><br>
 
 <h4>Argumente</h4>
-<code>date</code> - ist date oder datetime. Das Datum dessen Woche zur&uuml;ckgegeben werden soll.
-<br>
-<code>Interval</code> - ist Interval. Das Intervall dessen L&auml;nge in Wochen zur&uuml;ckgegeben werden soll.
+<code>date</code> - ist date oder datetime. Das Datum aus dem der Monat bestimmt werden soll.<br>
+<code>Interval</code> - ist Interval. Das Intervall dessen Monatsanzahl zur&uuml;ckgegeben werden soll.
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>week('2012-05-12') &rarr; 19</code><br>
-<code>week(tointerval('3 weeks')) &rarr; 3</code><br>
-<code>week(age('2012-01-01','2010-01-01')) &rarr; 104.285...</code><br>
+<code>month('2012-05-12') &rarr; 05</code><br>
+<code>month(tointerval('3 months')) &rarr; 3</code><br>
+<code>month(age('2012-01-01','2010-01-01')) &rarr; 4.033...</code><br>
 
 </translation>
     </message>
     <message>
-        <source><h3>CASE expression</h3>
-A conditional expression that can be used to evaluate multiple expressions and
-return a result.
+        <source><h3>$area function</h3>
+Returns the area size of the current feature.
 
 <h4>Syntax</h4>
-<pre>
-     CASE
-        WHEN <i>condition</i> THEN <i>result</i>
-        [ ...n ]
-        [ ELSE <i>result</i> ]
-     END
-</pre>
-[ ] marks optional components
+<pre>$area</pre>
 
 <h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  WHEN condition</i> - The condition expression to evaluate. <br>
-<i>  THEN result</i> - If <i>condition</i> evaluates to True then <i>result</i> is evaluated and returned. <br>
-<i>  ELSE result</i> - If none of the above conditions evaluated to True then <i>result</i> is evaluated and returned. <br>
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<pre>
-    CASE
-        WHEN <i>"column" IS NULL</i> THEN <i>'None'</i>
-        ELSE <i>"column"</i>
-    END
-</pre>
+<pre>$area &rarr; 42</pre>
+
 </source>
-        <translation><h3>CASE Ausdruck</h3>
-Ist ein bedingter Ausdruck mit dem mehrere Ausdr&uuml;cken ausgewertet und ein
-Ergebnis zur&uuml;ckgegeben werden kann.
+        <translation><h3>Funktion $area</h3>
+Liefert den Fl&auml;cheninhalt des aktuellen Objekts
 
 <h4>Syntax</h4>
-<pre>
-     CASE
-        WHEN <i>bedingung</i> THEN <i>ergebnis</i>
-        [ ...n ]
-        [ ELSE <i>ergebnis</i> ]
-     END
-</pre>
-[ ] markiert optionale Komponenten
+<pre>$area</pre>
 
 <h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  WHEN bedingung</i> - Der Bedingungsausdruck. <br>
-<i>  THEN ergebnis</i> - Wenn die <i>bedingung</i> True ergibt, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
-<i>  ELSE ergebnis</i> - Wenn keine der Bedingungen erf&uuml;llt ist, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<pre>
-    CASE
-        WHEN <i>"column" IS NULL</i> THEN <i>'Leer'</i>
-        ELSE <i>"column"</i>
-    END
-</pre>
+<pre>$area &rarr; 4711.42</pre>
+
 </translation>
     </message>
     <message>
-        <source><h3>right() function</h3>
-Returns a substring that contains the <i>n</i> rightmost characters of the string.
+        <source><h3>day() function</h3>
+Extract the day from a date, or the number of days
+from a <code>Interval</code>
 
 <h4>Syntax</h4>
-<code>right(string, pos)</code><br>
+<code>day(date)</code><br>
+<code>day(Interval)</code><br>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. The string.
+<code>date</code> - is date or datetime. The date to extract the day from.
 <br>
-<code>length</code> - is int. The number of characters from the right to return.
+<code>Interval</code> - is Interval. The Interval to return the number of days from.
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>right('Hello World',5) &rarr; 'World'</code><br>
+<code>day('2012-05-12') &rarr; 12</code><br>
+<code>day(tointerval('3 days')) &rarr; 3</code><br>
+<code>day(age('2012-01-01','2010-01-01')) &rarr; 730</code><br>
 
 </source>
-        <translation><h3>Funktion right()</h3>
-Ergibt letzten <i>n</i> Zeichen von rechts.
+        <translation><h3>Funktion day()</h3>
+Tag eines Datum oder Anzahl der Tage eines <code>Intervalls</code>.
 
 <h4>Syntax</h4>
-<code>right(zeichenkette,laenge)</code><br>
+<code>day(date)</code><br>
+<code>day(Intervall)</code><br>
 
 <h4>Argumente</h4>
-<code>string</code> - ist string. Die Zeichenkette.
+<code>date</code> - ist date oder datetime. Das Datum oder die Zeit dessen Tag bestimmt werden soll.
 <br>
-<code>laenge</code> - ist int. Die Anzahl der von rechts zur&uuml;ckzugebenden Zeichen von rechts.
+<code>Interval</code> - ist Interval. Das Interval aus dem die Anzahl der Tage bestimmt werden soll.
 
-<h4>Beispiel</h4>
+<h4>Beispiele</h4>
 <!-- Show example of function.-->
-<code>right('Hallo Welt',4) &rarr; 'Welt'</code><br>
+<code>day('2012-05-12') &rarr; 12</code><br>
+<code>day(tointerval('3 days')) &rarr; 3</code><br>
+<code>day(age('2012-01-01','2010-01-01')) &rarr; 730</code><br>
 </translation>
     </message>
     <message>
-        <source>
-<h3>Color Group</h3>
-This group contains functions for manipulating colors
+        <source><h3>lpad() function</h3>
+Returns a string with supplied width padded
+using the fill character.
+
+<h4>Syntax</h4>
+<code>lpad(string, length, fill)</code><br>
+
+<h4>Arguments</h4>
+<code>string</code> - is string. The string.
+<br>
+<code>length</code> - is int. The length of the new string.
+<br>
+<code>fill</code> - is char. The character to padd the remaining space with. 
+
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>lpad('Hello', 10, 'x') &rarr; 'Helloxxxxx'</code><br>
 </source>
-        <translation><h3>Farbgruppe</h3>
-Diese Gruppe enthält Funktionen zur Farbmanipulation
+        <translation><h3>Funktion lpad()</h3>
+Ergibt eine mit einem am Ende mit einem Zeichen auf eine bestimmte L&auml;nge aufgef&uuml;llte Zeichenkette.
+
+<h4>Syntax</h4>
+<code>lpad(zeichenkette, laenge, fuellzeichen)</code><br>
+
+<h4>Argumente</h4>
+<code>zeichenkette</code> - ist string. Die Zeichenkette.
+<br>
+<code>laenge</code> - ist int. Die L&auml;nge der neuen Zeichenkette.
+<br>
+<code>fuellzeichen</code> - ist char. Das Zeichen mit dem die Zeichenkette am Ende aufgef&uuml;llt werden soll. 
+
+<h4>Beispiel</h4>
+<code>lpad('Hallo', 10, 'x') &rarr; 'Halloxxxxx'</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>length() function</h3>
-Returns the length of a string.
+        <source><h3>acos() function</h3>
+Returns arcuscosinus of a value in radians.
+
 
 <p><h4>Syntax</h4>
-     length(<i>string</i>)</p>
+     acos(<i>real</i>)</p>
 
 <p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The String to count the length of.</p>
+<i>real</i> &rarr; cos of an angle.</p>
 
 <p><h4>Example</h4>
-<!-- Show example of function.-->
-     length('HELLO') &rarr; 5</p>
+     acos(0.5) &rarr; 1.0471975511966</p>
 </source>
-        <translation><h3>Funktion length()</h3>
-Liefert die L&auml;nge einer Zeichenkette.
+        <translation><h3>Funktion acos()</h3>
+Gibt den Arcuscosinus eines Werts im Bogenma&szlig; zur&uuml;ck.
+
 
 <p><h4>Syntax</h4>
-     length(<i>zeichenkette</i>)</p>
+     acos(<i>wert</i>)</p>
 
 <p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette deren L&auml;nge zu bestimmen ist.</p>
+<i>wert</i> &rarr; Cosinus eines Winkels.</p>
 
 <p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     length('HALLO') &rarr; 5</p>
+     acos(0.5) &rarr; 1.0471975511966</p>
 </translation>
     </message>
     <message>
-        <source><h3>upper() function</h3>
-Converts a string to upper case letters.
+        <source><h3>Fields and Values</h3>
+Contains a list of fields from the layer.  Sample values can also be accessed via right-click.
+<br><br>
+Select the field name from the list then right-click to access context menu with options to load sample values from the selected field.
 
-<p><h4>Syntax</h4>
-     upper(<i>string</i>)</p>
+<p><h4>Note:</h4>
+Loading field values from WFS layers isn't supported, before the layer is
+actually inserted, ie. when building queries.
+</p>
+</source>
+        <translation><h3>Felder und Werte</h3>
+Enth&auml;lt einen Feldliste des Layers.  Beispielwerte k&ouml;nnen per Rechtsklick geladen werden.
+<br><br>
+W&auml;hlen Sie ein Feld aus der Liste und klicken Sie dann rechts um in ein Kontextmen&uuml; zu gelangen
+in der Optionen zum Laden von Beispielwerten aus dem gew&auml;hlten Feld angeboten werden.
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The String to convert to upper case.</p>
+<p><h4>Hinweis:</h4>
+Feldwerte aus WFS-Layern zu laden bevor die Layer tatsächlich geladen wurde, wird nicht unterstützt, d.h bei der Eingabe von Abfragen.
+</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>log() function</h3>
+Returns the value of the logarithm of the passed value and base.
+<br>
+This function takes two arguments.
+<h4>Syntax</h4>
+<code>log(base, value)</code><br>
 
-<p><h4>Example</h4>
+<h4>Arguments</h4>
+<code>base</code> - any positive number.<br>
+<code>value</code> - any positive number.
+<br>
+
+<h4>Example</h4>
 <!-- Show example of function.-->
-     upper('hello WOrld') &rarr; 'HELLO WORLD'</p>
+<code>log(2, 32) &rarr; 5</code><br>
+<code>log(0.5, 32) &rarr; -5</code><br>
 </source>
-        <translation><h3>Funktion upper()</h3>
-Wandelt eine Zeichenkette in Gro&szlig;buchstaben.
-
-<p><h4>Syntax</h4>
-     upper(<i>zeichenkette</i>)</p>
+        <translation><h3>Funktion log()</h3>
+Gibt ist der Logarithmus von des &uuml;bergebenen Wertes zur &uuml;bergebenen Basis zur&uuml;ck.
+<br>
+Die Funktion akzeptiert zwei Werte.
+<h4>Syntax</h4>
+<code>log(basis, wert)</code><br>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, die in Gro&szlig;buchstaben umzuwandeln ist.</p>
+<h4>Argumente</h4>
+<code>basis</code> - eine positive Zahl.
+<code>wert</code> - eine positive Zahl.
+<br>
 
-<p><h4>Beispiel</h4>
+<h4>Beispiel</h4>
 <!-- Show example of function.-->
-     upper('hello WOrld') &rarr; 'HELLO WORLD'</p>
+<code>log(2, 32) &rarr; 5</code><br>
+<code>log(0.5, 32) &rarr; -5</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>bbox function</h3>
-Returns 1 if the geometries spatially intersect the bounding box defined and 0 if they don't.
+        <source><h3>Geometry Group</h3>
+This group contains functions that operate on geometry objects e.g length, area.
+</source>
+        <translation><h3>Gruppe Geometrie</h3>
+Dies Gruppe enth&auml;lt Funktionen f&uuml;r Geometrieobjekten (z.B. L&auml;nge und Fl&auml;cheninhalt).
+</translation>
+    </message>
+    <message>
+        <source><h3>Field</h3>
+Double click to add field name to expression string.
+<br><br>
+Right-Click on field name to open context menu sample value loading options.
+
+<p><h4>Note:</h4>
+Loading field values from WFS layers isn't supported, before the layer is
+actually inserted, ie. when building queries.
+</p>
+</source>
+        <translation>Klicken Sie den Feldnamen doppelt um ihn dem Ausdruck hinzuzufügen.
+<br><br>
+Per Rechtsklick auf den Feldnamen können Sie ein Kontextmenü mit Optionen zum Laden von Beispielwerten öffnen.
+
+<p><h4>Hinweis:</h4>
+Feldwerte aus WFS-Layern zu laden bevor die Layer tatsächlich geladen wurde, wird nicht unterstützt, d.h bei der Eingabe von Abfragen.
+</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>$page function</h3>
+Returns the current page number within a composition.
 
 <h4>Syntax</h4>
-<pre>bbox( a, b )</pre>
+<pre>$page</pre>
 
 <h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+None
 
 <h4>Example</h4>
-<pre>bbox( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; returns 1</pre>
-<pre>bbox( geomFromWKT( 'POINT(6 5)' ) , geomFromWKT( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; returns 0</pre>
+<pre>$page &rarr; 2</pre>
+
 </source>
-        <translation><h3>Funktion bbox</h3>
-Gibt 1 zurück, wenn sich die Ausmaße der beiden Geometrien räumlich überschneiden und anderenfalls 0 zurück.
+        <translation><h3>Funktion $page</h3>
+Gibt die aktuelle Seitennummer in einer Druckzusammenstellung aus.
 
 <h4>Syntax</h4>
-<pre>bbox( a, b )</pre>
+<pre>$page</pre>
 
 <h4>Argumente</h4>
-a &rarr; geometrie
-b &rarr; geometrie
+Keine
 
 <h4>Beispiel</h4>
-<pre>bbox( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; ergibt 1</pre>
-<pre>bbox( geomFromWKT( 'POINT(6 5)' ) , geomFromWKT( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; ergibt 0</pre</translation>
+<pre>$page &rarr; 2</pre>
+
+</translation>
     </message>
     <message>
-        <source><h3>left() function</h3>
-Returns a substring that contains the <i>n</i> leftmost characters of the string.
+        <source><h3>exp() function</h3>
+Returns exponential of an value.
+
+
+<p><h4>Syntax</h4>
+     exp(<i>real</i>)</p>
+
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; number.</p>
+
+<p><h4>Example</h4>
+     exp(1.0) &rarr; 2.71828182845905</p>
+</source>
+        <translation><h3>Funktion exp()</h3>
+Gibt die Exponentialfunktion eines Wert zur&uuml;ck.
+
+<p><h4>Syntax</h4>
+     exp(<i>zahl</i>)</p>
+
+<p><h4>Argumente</h4>
+<i>zahl</i> &rarr; Zahl.</p>
+
+<p><h4>Beispiel</h4>
+     exp(1.0) &rarr; 2.71828182845905</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>rpad() function</h3>
+Returns a string with supplied width padded
+using the fill character.
 
 <h4>Syntax</h4>
-<code>left(string, length)</code><br>
+<code>rpad(string, width, fill)</code><br>
 
 <h4>Arguments</h4>
 <code>string</code> - is string. The string.
 <br>
-<code>length</code> - is int. The number of characters from the left to return.
+<code>width</code> - is int. The length of the new string.
+<br>
+<code>fill</code> - is char. The character to padd the remaining space with. 
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>left('Hello World',5) &rarr; 'Hello'</code><br>
+<code>rpad('Hello', 10, 'x') &rarr; 'xxxxxHello'</code><br>
 
 </source>
-        <translation><h3>Funktion left()</h3>
-Ergibt ersten <i>n</i> Zeichen von links.
+        <translation><h3>Funktion rpad()</h3>
+Ergibt eine mit einem am Anfang mit einem Zeichen auf eine bestimmte L&auml;nge aufgef&uuml;llte Zeichenkette.
 
 <h4>Syntax</h4>
-<code>left(zeichenkette, laenge)</code><br>
+<code>rpad(zeichenkette, laenge, fuellzeichen)</code><br>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - ist eine Zeichenkette. Die Zeichenkette.
-<br>
-<code>laenge</code> - ist eine Zahl. Die Anzahl der zur&uuml;ckzugebenden Zeichen.
+<code>zeichenkette</code> - ist string. Die Zeichenkette.  <br>
+<code>laenge</code> - ist int. Die L&auml;nge der neuen Zeichenkette.  <br>
+<code>fuellzeichen</code> - ist char.  Das Zeichen mit dem die Zeichenkette aufgef&uuml;llt werden soll.
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>left('Hallo Welt',5) &rarr; 'Hallo'</code><br>
+<code>rpad('Hallo', 10, 'x') &rarr; 'xxxxxHallo'</code><br>
 
 </translation>
     </message>
     <message>
-        <source><h3>$scale function</h3>
-Returns the current scale of the map canvas.
+        <source><h3>round() function</h3>
+Rounds a number to number of decimal places.
 <br>
-Note: This function is only available in some contexts and will be 0 otherwise. 
+This function can take one or two arguments depending on what is needed.
 <h4>Syntax</h4>
-<code>$scale</code><br>
+<code>round(decimal,places)</code><br>
+<code>round(decimal)</code><br>
+
+<h4>Arguments</h4>
+<code>decimal</code> - is decimal. The decimal number to be rounded.
+<br>
+<code>places</code> - is int. The number of places to round decimal too. Can be negative.
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>$scale &rarr; 10000</code><br>
+<code>round(1234.567, 2 ) &rarr; 1234.57</code><br>
+use <code>round(decimal)</code> to round to the nearest integer<br>
+<code>round(1234.567) &rarr; 1235</code><br>
 
 
 </source>
-        <translation><h3>Funktion $scale</h3>
-Liefert den aktuellen Ma&szlig;stab der Kartenanzeige.
+        <translation><h3>Funktion round()</h3>
+Rundet eine Zahl auf eine gegebene Anzahl von Nachkommastellen.
 <br>
-Hinweis: Die Funktion ist nur in einigen Zusammenh&auml;ngen verf&uuml;gbar und sonst 0.
+Dies Funktion kann ein oder zwei Argumente haben.
 <h4>Syntax</h4>
-<code>$scale</code><br>
+<code>round(zahl,stellen)</code><br>
+<code>round(zahl)</code><br>
+
+<h4>Argumente</h4>
+<code>zahl</code> - ist eine Zahl. Die Zahl die gerundet werden soll.
+<br>
+<code>stellen</code> - ist Ganzahl. Die Anzahl der Nachkommastellen auf die gerundet werden soll. Kann negativ sein.
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>$scale &rarr; 10000</code><br>
+<code>round(1234.567, 2) &rarr; 1234.57</code><br>
+Um zur n&auml;chsten ganzen Zahl zu runden: <code>round(zahl)</code><br>
+<code>round(1234.567) &rarr; 1235</code><br>
 
 
 </translation>
     </message>
     <message>
-        <source><h3>ceil() function</h3>
-Rounds a number upwards.
+        <source><h3>color_hsl() function</h3>
+Returns a string representation of a color based on its hue, saturation, and lightness attributes
 
-<h4>Syntax</h4>
-<code>ceil(value)</code><br>
+<p><h4>Syntax</h4>
+     color_hsl(<i>hue, saturation, lightness</i>)</p>
 
-<h4>Arguments</h4>
-<code>value</code> - a number.
-<br>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
+<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
+<i>  lightness</i> &rarr; the lightness percentage of the color as an integer value from 0 to 100.<br>
 
-<h4>Example</h4>
+<p><h4>Example</h4>
 <!-- Show example of function.-->
-<code>ceil(4.9) &rarr; 5</code><br>
-<code>ceil(-4.9) &rarr; -4</code><br>
+     color_hsl(100,50,70) &rarr; '166,217,140'</p>
 </source>
-        <translation><h3>Funktion ceil()</h3>
-Rundet eine Zahl auf.
+        <translation><h3>Funktion color_hsl()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung und Helligkeit zur&uuml;ck.
 
-<h4>Syntax</h4>
-<code>ceil(wert)</code><br>
+<p><h4>Syntax</h4>
+     color_hsl(<i>farbton, s&auml;ttigung, helligkeit</i>)</p>
 
-<h4>Argumente</h4>
-<code>wert</code> - eine Zahl.
-<br>
+<p><h4>Argumente</h4>
+<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
+<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  helligkeit</i> &rarr; Die Helligkeit der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
 
-<h4>Beispiel</h4>
-<code>ceil(4.9) &rarr; 5</code><br>
-<code>ceil(-4.9) &rarr; -4</code><br>
-</translation>
+<p><h4>Beispiel</h4>
+     color_hsl(100,50,70) &rarr; '166,217,140'</p></translation>
     </message>
     <message>
-        <source><h3>toreal() function</h3>
-Converts a string to real number. Nothing changed if a value cannot be converted to real (e.g '123.56asd' is invalid). Numbers are rounded after saving changes if the precision is smaller than the result of the conversion.
+        <source><h3>scale_exp() function</h3>
+Transforms a given value from an input domain to an output range using an exponential curve. This function can be used to ease values in or out 
+of the specified output range.   
 
 <p><h4>Syntax</h4>
-     toreal(<i>string</i>)</p>
+     scale_exp(<i>val</i>,<i>domain_min</i>,<i>domain_max</i>,<i>range_min</i>,<i>range_max</i>,<i>exponent</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The String to convert to real number.</p>
+<i>  val</i> &rarr; is a value in the input domain. The function will return a corresponding scaled value in the output range.<br>
+<i>  domain_min, domain_max</i> &rarr; specify the input domain, the smallest and largest values the input <i>val</i> should take.<br>
+<i>  range_min, range_max</i> &rarr; specify the output range, the smallest and largest values which should be output by the function.<br>
+<i>  exponent</i> &rarr; a positive value (greater than 0), which dictates the way input values are mapped to the output range. Large exponents will cause the output values to 'ease in', starting slowly before
+accelerating as the input values approach the domain maximum. Smaller exponents (less than 1) will cause output values to 'ease out', where the mapping starts quickly but slows as it approaches the domain maximum.<br>
 
-<p><h4>Example</h4>
+<h4>Example</h4>
 <!-- Show example of function.-->
-     toreal('123.45') &rarr; 123.45</p>
+<b>Easing in, using an exponent of 2:</b><br>
+     scale_exp(5,0,10,0,100,2) &rarr; 25<br>
+     scale_exp(7.5,0,10,0,100,2) &rarr; 56.25<br>
+     scale_exp(9.5,0,10,0,100,2) &rarr; 90.25<br>               
+     <br>
+<b>Easing out, using an exponent of 0.5:</b><br>          
+     scale_exp(3,0,10,0,100,0.5) &rarr; 54.772<br>
+     scale_exp(6,0,10,0,100,0.5) &rarr; 77.459<br>
+     scale_exp(9,0,10,0,100,0.5) &rarr; 94.868<br>          
+     
+     
 </source>
-        <translation><h3>Funktion toreal()</h3>
-Wandelt eine Zeichenkette in eine Flie&szlig;kommazahl.  Nichts &auml;ndert sich, wenn die
-Zeichenkette nicht in eine Zahl umgewandelt werden kann (z.B. ist '123.56asd'
-ung&uuml;ltig).  Zahlen werden beim Speichern gerundet, wenn die Genauigkeit kleiner
-als des Umwandlungsergebnis ist.
-
+        <translation><h3>Funktion scale_linear()</h3>
+Formt einen gegebenen Wert aus einem Ausgangsbereich mittels einer exponentielle Kurve in einen Ausgabebereich um. Die Funktion kann verwendet um Werte in oder aus einem Ausgabebereichs einzupassen.
 <p><h4>Syntax</h4>
-     toreal(<i>zeichenkette</i>)</p>
+     scale_exp(<i>wert</i>,<i>quell_min</i>,<i>quell_max</i>,<i>ziel_min</i>,<i>ziel_max</i>,<i>exponent</i>)</p>
 
 <p><h4>Argumente</h4>
 <!-- List args for functions here-->
-<i>  zeichenkette</i> &larr; eine Zeichenkette.  Die Zeichenkette, die in eine Flie&szlig;kommazahl umgewandelt werden soll.</p>
+<i>  wert</i> &rarr; ist ein Wert im Ausgangsbereich. Die Funktion gibt einen korrespondierend skalierten Wert im Ausgabebereich zurück.<br>
+<i>  quell_min, quell_max</i> &rarr; gibt den Ausgangsbereich an, der kleinste und größte Wert den der Eingabewert <i>wert</i> annehmen kann.<br>
+<i>  ziel_min, ziel_max</i> &rarr; gibt den Ausgabebereich an, der kleinste und größte Wert den der Rückgabewert der Funktion annehmen kann.<br
+<i>  exponent</i> &rarr; ein positive Zahl (größer als 0), welche vorgibt wie die Eingabe auf den Ausgabebereich abgebildet werden soll. Große Exponenten sorgen für Ausgabewerten sich erst langsam und dann immer schneller dem Maximum des Ausgabebereichs nähern, während der Eingabewert sich dem Ende des Ausgangsbereichs nähert.  Kleinere Exponenten (kleiner als 1) sorgen dafür das die Ausgabewerte bei der die Abbildung erst schnell und dann immer langsamer dem Maximum des  [...]
 
-<p><h4>Beispiel</h4>
+<h4>Beispiel</h4>
 <!-- Show example of function.-->
-     toreal('123.45') -> 123.45</p>
+<b>Langsame annähern, mit einem Exponenten von 2:</b><br>
+     scale_exp(5,0,10,0,100,2) &rarr; 25<br>
+     scale_exp(7.5,0,10,0,100,2) &rarr; 56.25<br>
+     scale_exp(9.5,0,10,0,100,2) &rarr; 90.25<br>               
+     <br>
+<b>Schnell annähern, mit einem Exponenten von 0,5:</b><br>          
+     scale_exp(3,0,10,0,100,0.5) &rarr; 54.772<br>
+     scale_exp(6,0,10,0,100,0.5) &rarr; 77.459<br>
+     scale_exp(9,0,10,0,100,0.5) &rarr; 94.868<br>          
 </translation>
     </message>
     <message>
-        <source><h3>xat() function</h3>
-Retrieves a x coordinate of the current feature
+        <source><h3>union function</h3>
+Returns a geometry that represents the point set union of the geometries.
 
 <h4>Syntax</h4>
-<code>xat(i)</code>
+<pre>union( a, b )</pre>
 
 <h4>Arguments</h4>
-<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
+a &rarr; geometry
+b &rarr; geometry
 
 <h4>Example</h4>
-<pre>xat(1) &rarr; 5</pre>
+<pre> geomToWKT( union( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))  )   &rarr; returns MULTIPOINT(4 4, 5 5)</pre>
 </source>
-        <translation><h3>Funktion xat()</h3>
-Liefert eine X-Koordinate der Geometrie der aktuellen Geometrie.
+        <translation><h3>Funktion union</h3>
+Gibt eine Geometrie zurück, die alle Punkte beider Geometrien abdeckt.
 
 <h4>Syntax</h4>
-<code>xat(i)</code>
+<pre>union( $geometry , $geometry)</pre>
 
 <h4>Argumente</h4>
-<code>i</code> - ist int. X-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
+geometry &rarr; Geometrie
+geometry &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<pre>xat(1) &rarr; 5</pre>
-</translation>
+<pre> geomToWKT( union( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))  )   &rarr; ergibt MULTIPOINT(4 4, 5 5)</pre</translation>
     </message>
     <message>
-        <source><h3>$numpages function</h3>
-Returns the total number of pages in the composition.
+        <source><h3>bounds function</h3>
+Returns a geometry which represents the bounding box of an input geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
 <h4>Syntax</h4>
-<pre>$numpages</pre>
+<pre>bounds(geom)</pre>
 
 <h4>Arguments</h4>
-None
+geom &rarr; a geometry
 
 <h4>Example</h4>
-<pre>$numpages &rarr; 42</pre>
+<pre> bounds($geometry) &rarr; returns bounding box of $geometry</pre>
 
 </source>
-        <translation><h3>Funktion $numpages</h3>
-Gibt die Gesamtseitenzahl einer Druckzusammenstellung aus.
+        <translation><h3>Funktion bounds</h3>
+Ergibt das Begrenzungsrechteck als Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
 
 <h4>Syntax</h4>
-<pre>$numpages</pre>
+<pre>bounds(geom)</pre>
 
 <h4>Argumente</h4>
-Keine
+geom &rarr; eine Geometrie
 
 <h4>Beispiel</h4>
-<pre>$numpages &rarr; 42</pre>
+<pre> bounds($geometry) &rarr; ergibt das Begrenzungsrechteck der $geometry</pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>strpos() function</h3>
-Return the index of a regular expression in a string.
+        <source><h3>contains function</h3>
+Returns true if and only if no points of b lie in the exterior of a, and at least one point of the interior of b lies in the interior of a. 
 
 <h4>Syntax</h4>
-     strpos(<i>haystack</i>, <i>needle</i>)
-<br><br>
-Returns -1 if the expression isn't found.
+<pre>contains( geometry a , geometry b)</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  haystack</i> &rarr; is string.  The string that is to be searched.<br>
-<i>  needle</i> &rarr; is string.  The regular expression to look for.<br>
+<h4>Arguments</h4>
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-     strpos('HELLO WORLD','WORLD') &rarr; 6<br>
-     strpos('HELLO WORLD','GOODBYE') &rarr; -1<br>
+<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'POINT( 0.5 0.5 )' ))    &rarr; returns 1</pre>
+<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))          &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion strpos()</h3>
-Bestimmt die Position eines regul&auml;ren Ausdrucks in einer Zeichenkette.
+        <translation><h3>Funktion contains</h3>
+ Gibt dann und nur dann true zurück, wenn keine Punkte von b außerhalb von a liegen und mindestens ein innerer Punkt von b innerhalb von a liegt.
 
 <h4>Syntax</h4>
-     strpos(<i>heuhaufen</i>,<i>nadel</i>)/i>)
-<br><br>
-Gibt -1 zur&uuml;ck, wenn der Ausdruck nicht gefunden wurde.
+<pre>contains( a , b)</pre>
 
-<h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  heuhaufen</i> &rarr; ist string.  Zeichenkette in der gesucht werden soll.<br>
-<i>  nadel</i> &rarr; ist string.  Der gesuchte regul&auml;re Ausdruck.<br>
+<h4>Arguments</h4>
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-     strpos('HELLO WORLD','WORLD') &rarr; 6<br>
-     strpos('HELLO WORLD','GOOD BYE') &rarr; -1<br>
+<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'POINT( 0.5 0.5 )' ))    &rarr; ergibt 1</pre>
+<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))          &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>rand() function</h3>
-Returns a random integer within the range specified by the minimum and 
-maximum argument (inclusive).
-<br>
-This function takes two arguments.
-<h4>Syntax</h4>
-<code>rand(min, max)</code><br>
+        <source><h3>wordwrap() function</h3>
+Returns a string wrapped to a maximum/minimum number of characters.
 
-<h4>Arguments</h4>
-<code>min</code> - an integer representing the smallest possible random number desired.<br>
-<code>max</code> - an integer representing the largest possible random number desired.
-<br>
+<p><h4>Syntax</h4>
+     wordwrap(<i>string,wrap_length[,delimiter_string]</i>)</p>
 
-<h4>Example</h4>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The string to be wrapped.<br>
+<i>  wrap_length</i> &rarr; is number.  If positive, the number represents the ideal maximum number of characters to wrap; if negative, the number represents the minimum number of characters to wrap.<br>
+<i>  delimiter_string</i> &rarr; is string.  The delimiter string to wrap to a new line (<u>optional</u>).<br></p>
+
+<p><h4>Example</h4>
 <!-- Show example of function.-->
-<code>rand(1, 10) &rarr; 8</code><br>
+     wordwrap('UNIVERSITY OF QGIS',13) &rarr; 'UNIVERSITY OF&#92;nQGIS'<br>
+     wordwrap('UNIVERSITY OF QGIS',-3) &rarr; 'UNIVERSITY&#92;nOF QGIS'</p>
 </source>
-        <translation><h3>Funktion rand()</h3>
-Liefert eine Zufallszahl zwischen den Argumenten zur&uuml;ck (inklusiv).
-<br>
-Dies Funktion hat zwei Argumente.
-<h4>Syntax</h4>
-<code>rand(min, max)</code><br>
+        <translation><h3>Funktion wordwrap()</h3>
+Gibt eine auf eine maximal/minimale Länge umgebrochene Zeichenkette zurück.
 
-<h4>Argumente</h4>
-<code>min</code> - eine ganze Zahl, die die kleinste Zufallszahl angibt.<br>
-<code>max</code> - eine ganze Zahl, die die gr&ouml;&szlig;te Zufallszahl angibt.<br>
-<br>
+<p><h4>Syntax</h4>
+     wordwrap(<i>string,wrap_length[,delimiter_string]</i>)</p>
 
-<h4>Beispiel</h4>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; ist eine Zeichenkette.  Die umzubrechende Zeichenkette.<br>
+<i>  wrap_length</i> &rarr; ist eine Zahl.  Positive Zahlen bedeuten die ideale Maximalzahl von umzubrechenden Zeichen, der Betrag von negative Zahlen gibt die Minimalzahl der umzubrechenden Zeichen an.<br>
+<i>  delimiter_string</i> &rarr; ist eine Zeichenkette.  Die Trennzeichen für einen Zeilenumbruch (<u>optional</u>).<br></p>
+
+<p><h4>Beispiele</h4>
 <!-- Show example of function.-->
-<code>rand(1, 10) &rarr; 8</code><br>
+     wordwrap('UNIVERSITY OF QGIS',13) &rarr; 'UNIVERSITY OF&#92;nQGIS'<br>
+     wordwrap('UNIVERSITY OF QGIS',-3) &rarr; 'UNIVERSITY&#92;nOF QGIS'</p>
 </translation>
     </message>
     <message>
-        <source><h3>$atlasgeometry function</h3>
-Returns the geometry of the current feature iterated in atlas.
-Can be used for rule based display of geometry when using atlas.
-For example to only show geometries of other layers when their geometry 
-intersects the iterated geometry of features using atlas.
-
-<h4>Syntax</h4>
-<pre>$atlasgeometry</pre>
+        <source>
+<h3>color_rgb() function</h3>
+Returns a string representation of a color based on its red, green, and blue components
 
-<h4>Arguments</h4>
-None
+<p><h4>Syntax</h4>
+     color_rgb(<i>red, green, blue</i>)</p>
 
-<h4>Example</h4>
-<pre> intersects(  $atlasgeometry,  $geometry ) </pre>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  red</i> &rarr; the red component as an integer value from 0 to 255.<br>
+<i>  green</i> &rarr; the green component as an integer value from 0 to 255.<br>
+<i>  blue</i> &rarr; the blue component as an integer value from 0 to 255.<br>
 
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     color_rgb(255,127,0) &rarr; '255,127,0'</p>
 </source>
-        <translation><h3>$atlasgeometry Funktion</h3>
-Gibt die Geometrie des in Atlas iterierten Objekts zurück.
-Wird verwendet für Regelbasierte Darstellung unter Benutzung von Atlas.
-Zum Beispiel um nur die Geometrien anderer Layer zu zeigen wenn deren 
-Geometrie den durch Atlas iterierten Layer in dessen Geomtrien schneidet.
+        <translation><h3>Funktion color_rgb()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Rot-, Gr&uuml;n-, Blauanteil zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>$atlasgeometry</pre>
+<p><h4>Syntax</h4>
+     color_rgb(<i>rot, gr&uuml;n, blau</i>)</p>
 
-<h4>Argumente</h4>
-Kein
+<p><h4>Argumente</h4>
+<i>  rot</i> &rarr; Der Rot-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
+<i>  gr&uuml;n</i> &rarr; Der Gr&uuml;n-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
+<i>  blau</i> &rarr; Der Blau-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
 
-<h4>Beispiel</h4>
-<pre> intersects(  $atlasgeometry,  $geometry ) </pre>
+<p><h4>Beispiel</h4>
+     color_rgb(255,127,0) &rarr; '#ff7f00'</p>
 </translation>
     </message>
     <message>
-        <source><h3>$atlasfeatureid function</h3>
-Returns the feature id of the current row while using atlas.
-This enables you to use features of atlas in rules 
-and for example show or hide features based on their id.
-
-<h4>Syntax</h4>
-<pre>$atlasfeatureid</pre>
+        <source>
+<h3>color_cmyk() function</h3>
+Returns a string representation of a color based on its cyan, magenta, yellow and black components
 
-<h4>Arguments</h4>
-None
+<p><h4>Syntax</h4>
+     color_cmyk(<i>cyan, magenta, yellow, black</i>)</p>
 
-<h4>Example</h4>
-<pre>$atlasfeatureid = $id</pre>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  cyan</i> &rarr; the cyan component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  magenta</i> &rarr; the magenta component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  yellow</i> &rarr; the yellow component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  black</i> &rarr; the black component of the color, as a percentage integer value from 0 to 100.<br>
 
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     color_cmyk(100,50,0,10) &rarr; '0,115,230'</p>
 </source>
-        <translation><h3>$atlasfeatureid Funktion</h3>
-Gibt die Objektid der aktuellen Zeile bei benutzung von Atlas zurück.
-Dies ermöglicht Objekte in Atlas regelbasiert zu wählen um zum 
-Beispiel Objekte anhand deren id anzuzeigen oder zu verstecken.
+        <translation><h3>Funktion color_cmyk()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Cyan-, Magenta- Gelb- und Schwarzanteil zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>$atlasfeatureid</pre>
+<p><h4>Syntax</h4>
+     color_cmyk(<i>cyan, magenta, gelb, schwarz</i>)</p>
 
-<h4>Argumente</h4>
-None
+<p><h4>Argumente</h4>
+<i>  cyan</i> &rarr; Der Cyan-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  magenta</i> &rarr; Der Magenta-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  gelb</i> &rarr; Der Gelb-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  schwarz</i> &rarr; Der Schwarz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
 
-<h4>Beispiel</h4>
-<pre>$atlasfeatureid = $id</pre>
+<p><h4>Beispiel</h4>
+     color_cmyk(100,50,0,10) &rarr; '0,115,230'</p>
 </translation>
     </message>
     <message>
-        <source><h3>bounds_width function</h3>
-Returns the width of the bounding box of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>intersection function</h3>
+Returns a geometry that represents the shared portion of geometry a and geometry b.
 
 <h4>Syntax</h4>
-<pre>bounds_width(geom)</pre>
+<pre>intersection( geometry a , geometry b)</pre>
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<pre> bounds_width($geometry) &rarr; returns width of bounding box of $geometry</pre>
-
+<pre> geomToWKT( intersection( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 )' ))  )   &rarr; returns LINESTRING(3 3, 4 4)</pre>
 </source>
-        <translation><h3>Funktion bounds_width</h3>
-Gibt die Breite der Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
+        <translation><h3>Funktion intersection</h3>
+Gibt eine Geometrie zurück, die den gemeinsamen Teil der Geometrien a und b darstellt.
 
 <h4>Syntax</h4>
-<pre>bounds_width(geom)</pre>
+<pre>intersection( a, b)</pre>
 
 <h4>Argumente</h4>
-geom &rarr; eine Geometrie
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<pre> bounds_width($geometry) &rarr; ergibt die Breite der $geometry</pre>
-
-</translation>
+<pre> geomToWKT( intersection( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 )' ))  )   &rarr; ergibt LINESTRING(3 3, 4 4)</pre></translation>
     </message>
     <message>
-        <source><h3>floor() function</h3>
-Rounds a number downwards.
+        <source>
+<h3>ramp_color() function</h3>
+Returns a string representing a color from a color ramp. 
 
-<h4>Syntax</h4>
-<code>floor(value)</code><br>
+<p><h4>Syntax</h4>
+     ramp_color(<i>ramp_name,value</i>)</p>
 
-<h4>Arguments</h4>
-<code>value</code> - a number.
-<br>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  ramp_name</i> &rarr; the name of the color ramp as a string, for example 'Spectral'.<br>
+<i>  value</i> &rarr; the position on the ramp to select the color from as a real number between 0 and 1.<br>
 
-<h4>Example</h4>
+<p><h4>Example</h4>
 <!-- Show example of function.-->
-<code>floor(4.9) &rarr; 4</code><br>
-<code>floor(-4.9) &rarr; -5</code><br>
+     ramp_color('Spectral',0.3) &rarr; '253,190,115,255'</p>
+
+<p><h4>Note:</h4>
+The color ramps available vary between QGIS installations.  This function
+may not give the expected results if you move your Quantum project.
+</p>
 </source>
-        <translation><h3>Funktion floor()</h3>
-Rundet eine Zahl ab.
+        <translation><h3>Funktion ramp_color()</h3>
+Gibt eine Farbe als Zeichenkette zur&uuml;ck, die eine Farbe aus einem Farbverlauf darstellt.
 
-<h4>Syntax</h4>
-<code>floor(wert)</code><br>
+<p><h4>Syntax</h4>
+     ramp_color(<i>verlaufname,wert</i>)</p>
 
-<h4>Argumente</h4>
-<code>wert</code> - eine Zahl.
-<br>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  verlaufname</i> &rarr; der Name des Farbverlaufs als Zeichenkette, z.B. 'Spectral'.<br>
+<i>  wert</i> &rarr; die Position im Farbverlauf als Flie&szlig;kommazahl zwischen 0 und 1.<br>
 
-<h4>Beispiel</h4>
+<p><h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>floor(4.9) &rarr; 4</code><br>
-<code>floor(-4.9) &rarr; -5</code><br>
+     ramp_color('Spectral',0.3) &rarr; '253,190,115,255'</p>
+
+<p><h4>Bemerkung:</h4>
+Die Farbverl&auml;ufe k&ouml;nnen sich zwischen verschiedenen QGIS-Installationen
+unterscheiden.  Diese Funktion kann daher unterschiedliche Ergebnisse liefern.
+</p>
 </translation>
     </message>
     <message>
-        <source><h3>bounds_height function</h3>
-Returns the height of the bounding box of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>IS expression</h3>
+Returns 1 if a is the same as b.
 
 <h4>Syntax</h4>
-<pre>bounds_height(geom)</pre>
+<pre>a IS b</pre>
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+None
 
 <h4>Example</h4>
-<pre> bounds_height($geometry) &rarr; returns height of bounding box of $geometry</pre>
+<pre> 'A' IS 'A'  &rarr; returns 1 </pre>
+<pre> 'A' IS 'a'  &rarr; returns 0 </pre>
+<pre> 4 IS 4      &rarr; returns 1 </pre>
+<pre> 4 IS 2+2    &rarr; returns 1 </pre>
+<pre> 4 IS 2      &rarr; returns 0 </pre>
+<pre> $geometry IS NULL  &rarr; returns 0, if your geometry is not NULL</pre>
 
 </source>
-        <translation><h3>Funktion bounds_height</h3>
-Gibt die Höhe der Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
+        <translation><h3>Ausdruck IS</h3>
+Ergibt 1, wenn a gleich b ist.
 
 <h4>Syntax</h4>
-<pre>bounds_height(geom)</pre>
+<pre>a IS b</pre>
 
 <h4>Argumente</h4>
-geom &rarr; eine Geometrie
+Keine
 
 <h4>Beispiel</h4>
-<pre> bounds_height($geometry) &rarr; ergibt die Höhe der $geometry</pre>
-
+<pre> 'A' IS 'A'  &rarr; ergibt 1 </pre>
+<pre> 'A' IS 'a'  &rarr; ergibt 0 </pre>
+<pre> 4 IS 4      &rarr; ergibt 1 </pre>
+<pre> 4 IS 2+2    &rarr; ergibt 1 </pre>
+<pre> 4 IS 2      &rarr; ergibt 0 </pre>
+<pre> $geometry IS NULL  &rarr; ergibt 0, wenn die Geometrie nicht NULL ist</pre>
 </translation>
     </message>
     <message>
-        <source><h3>toint() function</h3>
-Converts a string to integer number. Nothing changed if a value cannot be converted to integer (e.g '123asd' is invalid).
+        <source><h3>color_hsv() function</h3>
+Returns a string representation of a color based on its hue, saturation, and value attributes
 
 <p><h4>Syntax</h4>
-     toint(<i>string</i>)</p>
+     color_hsv(<i>hue, saturation, value</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The String to convert to integer number.</p>
+<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
+<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
+<i>  value</i> &rarr; the value percentage of the color as an integer from 0 to 100.<br>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     toint('123') &rarr; 123</p>
+     color_hsv(40,100,100) &rarr; '255,170,0'</p>
 </source>
-        <translation><h3>Funktion toint()</h3>
-Wandelt eine Zeichenkette in eine ganze Zahl um.  Bricht ab, wenn die Zeichenkette nicht in eine Zahl umgewandelt werden kann ('123asd' ist z.B. ung&uuml;ltig).
+        <translation><h3>Funktion color_hsl()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung und ihres Betrag zur&uuml;ck.
+
+<p><h4>Syntax</h4>
+     color_hsv(<i>farbton, s&auml;ttigung, betrag</i>)</p>
+
+<p><h4>Argumente</h4>
+<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
+<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  betrag</i> &rarr; Die Betrag der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+
+<p><h4>Beispiel</h4>
+     color_hsv(40,100,100) &rarr; '255,170,0'</p></translation>
+    </message>
+    <message>
+        <source><h3>ILIKE expression</h3>
+Returns 1 if the first parameter matches case-insensitive the supplied pattern. LIKE can be used instead of ILIKE to make the match case-sensitive. Works with numbers also.
+
+<h4>Syntax</h4>
+<pre>string/number ILIKE pattern</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre> 'A' ILIKE 'A'  &rarr; returns 1 </pre>
+<pre> 'A' ILIKE 'a'  &rarr; returns 1 </pre>
+<pre> 'A' ILIKE 'B'  &rarr; returns 0 </pre>
+</source>
+        <translation><h3>Ausdruck ILIKE</h3>
+Liefert 1, wenn der erste Parameter dem gegebenen Muster (ohne Berücksichtung der Groß-/Kleinschreibung) entspricht. LIKE kann statt ILIKE kann verwendet werden, wenn die Groß-/Kleinschreibung berücksichtigt werden soll. Funktioniert auch mit Zahlen.
 
-<p><h4>Syntax</h4>
-     toint(<i>zeichenkette</i>)</p>
+<h4>Syntax</h4>
+<pre>Zeichenkette/Zahl LIKE Muster</pre>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die in eine ganze Zahl umzuwandelnde Zeichenkette.</p>
+<h4>Argumente</h4>
+keine
 
-<p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     toint('123') &rarr; 123</p>
-</translation>
+<h4>Beispiel</h4>
+<pre> 'A' ILIKE 'A'  &rarr; ergibt 1 </pre>
+<pre> 'A' ILIKE 'a'  &rarr; ergibt 1 </pre>
+<pre> 'A' ILIKE 'B'  &rarr; ergibt 0 </pre</translation>
     </message>
     <message>
-        <source><h3>yat() function</h3>
-Retrieves a y coordinate of the current feature
+        <source><h3>LIKE expression</h3>
+Returns 1 if the first parameter matches the supplied pattern. Works with numbers also.
 
 <h4>Syntax</h4>
-<code>yat(i)</code>
+<pre>string/number LIKE pattern</pre>
 
 <h4>Arguments</h4>
-<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
+None
 
 <h4>Example</h4>
-<pre>yat(1) &rarr; 5</pre>
+<pre> 'A' LIKE 'A'  &rarr; returns 1 </pre>
+<pre> 'A' LIKE 'a'  &rarr; returns 0 </pre>
+<pre> 'A' LIKE 'B'  &rarr; returns 0 </pre>
 </source>
-        <translation><h3>Funktion yat()</h3>
-Liefert eine Y-Koordinate der Geometrie der aktuellen Geometrie.
+        <translation><h3>Ausdruck LIKE</h3>
+Ergibt 1m wenn der erste Parameter dem gegebenen Muster entspricht. Funktioniert auch mit Zahlen.
 
 <h4>Syntax</h4>
-<code>xat(i)</code>
+<pre>Zeichenkette/Zahl LIKE Muster</pre>
 
 <h4>Argumente</h4>
-<code>i</code> - ist int. Y-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
+Keine
 
 <h4>Beispiel</h4>
-<pre>yat(1) &rarr; 5</pre>
+<pre> 'A' LIKE 'A'  &rarr; ergibt 1 </pre>
+<pre> 'A' LIKE 'a'  &rarr; ergibt 0 </pre>
+<pre> 'A' LIKE 'B'  &rarr; ergibt 0 </pre>
 </translation>
     </message>
     <message>
-        <source><h3>tostring() function</h3>
-Converts a number to string.
+        <source><h3>Date and Time Group</h3>
+This group contains functions for handling date and time data.
+</source>
+        <translation><h3>Datum- und Zeitgruppe</h3>
+Diese Gruppe enth&auml;lt Funktionen zur Verarbeitung von Daten und Zeiten.
+</translation>
+    </message>
+    <message>
+        <source><h3>combine function</h3>
+Returns the combination of geometry a and geometry b.
 
-<p><h4>Syntax</h4>
-     tostring(<i>number</i>)</p>
+<h4>Syntax</h4>
+<pre>combine( geometry a , geometry b)</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>number</i> &rarr; is integer or real.  The number to convert to string.</p>
+<h4>Arguments</h4>
+geometry &rarr; geometry
+geometry &rarr; geometry
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     tostring(123) &rarr; '123'</p>
+<h4>Example</h4>
+<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5 )' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4,  2 1 )' ))  )    &rarr; returns MULTILINESTRING((4 4, 2 1), (3 3, 4 4), (4 4, 5 5)) </pre>
+<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4  )' ) , geomFromWKT( 'LINESTRING(3 3 , 6 6,  2 1 )' ))  )  &rarr; returns LINESTRING(3 3, 4 4, 6 6, 2 1) </pre>
 </source>
-        <translation><h3>Funktion tostring()</h3>
-Wandelt eine Zahl in eine Zeichenkette um.
+        <translation><h3>Funktion combine</h3>
+Ergibt die Kombination der Geometrien a und b.
 
-<p><h4>Syntax</h4>
-     tostring(<i>zahl</i>)</p>
+<h4>Syntax</h4>
+<pre>combine( a , b)</pre>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>zahl</i> &rarr; ist eine ganze oder Flie&szlig;kommazahl.  Die in eine Zeichenkette umzuwandelnde Zahl.</p>
+<h4>Arguments</h4>
+geometry &rarr; Geometrie
+geometry &rarr; Geometrie
 
-<p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     tostring(123) &rarr; '123'</p>
-</translation>
+<h4>Beispiel</h4>
+<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5 )' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4,  2 1 )' ))  )    &rarr; ergibt MULTILINESTRING((4 4, 2 1), (3 3, 4 4), (4 4, 5 5)) </pre>
+<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4  )' ) , geomFromWKT( 'LINESTRING(3 3 , 6 6,  2 1 )' ))  )  &rarr; ergibt LINESTRING(3 3, 4 4, 6 6, 2 1) </pre></translation>
     </message>
     <message>
-        <source><h3>$rownum function</h3>
-Returns the number of the current row.
+        <source><h3>intersects function</h3>
+Returns 1 if the geometries spatially intersect (share any portion of space) and 0 if they don't.
 
 <h4>Syntax</h4>
-<pre>$rownum</pre>
+<pre>intersects( a, b )</pre>
 
 <h4>Arguments</h4>
-None
+a &rarr; geometry
+b &rarr; geometry
 
 <h4>Example</h4>
-<pre>$rownum &rarr; 4711</pre>
-
+<pre> intersects( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
+<pre> intersects( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'POINT(5 5)' ))             &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion $rownum</h3>
-Ergibt die Zeilennummer des aktuellen Datensatzes
+        <translation><h3>Funktion intersects</h3>
+Gibt 1 zurück, wenn die Geometrien sich räumlich überschneiden (d.h. einen Raum gemeinsam haben) und 0, wenn das nicht der Fall ist.
 
 <h4>Syntax</h4>
-<pre>$rownum</pre>
+<pre>intersects( a , b)</pre>
 
 <h4>Argumente</h4>
-Keine
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<pre>$rownum &rarr; 4711</pre>
+<pre> intersects( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 1</pre>
+<pre> intersects( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'POINT(5 5)' ))             &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>atan2() function</h3>
-Returns arcustangens of y/x using the signs of the two 
-arguments to determine the quadrant of the result
-
-
+        <source><h3>clamp() function</h3>
+Restricts an input value to a specified range.
 
 <p><h4>Syntax</h4>
-     atan2(<i>real</i>, <i>real</i>)</p>
+     clamp(<i>minimum</i>,<i>input</i>,<i>maximum</i>)</p>
 
 <p><h4>Arguments</h4>
-<i>real</i> &rarr; y coordinate difference<br>
-<i>real</i> &rarr; x coordinate difference</p>
+<!-- List args for functions here-->
+<i>  minimum</i> &rarr; The smallest value <i>input</i> is allowed to take.<br>
+<i>  input</i> &rarr; a value which will be restricted to the range specified by <i>minimum</i> and <i>maximum</i>.<br>
+<i>  maximum</i> &rarr; The largest value <i>input</i> is allowed to take.<br>
 
-<p><h4>Example</h4>
-     atan2(1.0, 1.732) &rarr; 0.523611477769969</p>
+<h4>Example</h4>
+<!-- Show example of function.-->
+     clamp(1,5,10) &rarr; 5 (<i>input</i> is between 1 and 10 so is returned unchanged)<br>
+     clamp(1,0,10) &rarr; 1 (<i>input</i> is less than minimum value of 1, so function returns 1)<br>
+     clamp(1,11,10) &rarr; 10 (<i>input</i> is greater than maximum value of 10, so function returns 10)<br>
+     
+     
 </source>
-        <translation><h3>Funktion atan2()</h3>
-Gibt den Arcustangens von y/x unter Ber&uuml;cksichtung der Vorzeichen der beiden
-Argumente zur&uuml;ck, um den den Quadranten des Ergebnisses zu bestimmen.
+        <translation><h3>clamp() Funktion</h3>
+Eingabewert auf eine gegebenen Bereich beschränken.
 
 <p><h4>Syntax</h4>
-     atan2(<i>dy</i>, <i>dx</i>)</p>
+     clamp(<i>minimum</i>,<i>wert</i>,<i>maximum</i>)</p>
 
 <p><h4>Argumente</h4>
-<i>dy</i> &rarr; y Ordinatendifferenz<br>
-<i>dx</i> &rarr; x Ordinatendifferenz</p>
+<!-- List args for functions here-->
+<i>  minimum</i> &rarr; Der kleinste Wert, den die Rückgabe annehmen kann.<br>
+<i>  wert</i> &rarr; ein Wert der auf den Bereich zwischen <i>minimum</i> und <i>maximum</i> beschränkt wird.<br>
+<i>  maximum</i> &rarr; Der größte Wert, den die Rückgabe annehmen kann.<br>
 
-<p><h4>Beispiel</h4>
-     atan2(1.0, 1.732) &rarr; 0.523611477769969</p>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+     clamp(1,5,10) &rarr; 5 (<i>wert</i> ist zwischen 1 und 10 und wird daher unverändert zurückgegeben)<br>
+     clamp(1,0,10) &rarr; 1 (<i>wert</i> ist kleiner als das Minimum 1, daher wird 1 zurückgegeben)<br>
+     clamp(1,11,10) &rarr; 10 (<i>wert</i> ist größer als das Maximum 10, daher wird 10 zurückgegeben)<br>
+     
 </translation>
     </message>
     <message>
-        <source><h3>sin() function</h3>
-Returns sinus of an angle.
-
+        <source><h3>disjoint function</h3>
+Returns 1 if the geometries do not "spatially intersect" - if they do not share any space together. 
 
-<p><h4>Syntax</h4>
-     sin(<i>real</i>)</p>
+<h4>Syntax</h4>
+<pre>disjoint( a, b )</pre>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; angle in radians.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Example</h4>
-     sin(1.571) &rarr; 0.999999682931835</p>
+<h4>Example</h4>
+<pre> disjoint( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; returns 1</pre>
+<pre> disjoint( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'POINT(4 4)' ))                              &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion sin()</h3>
-Gibt den Sinus eines Winkels zur&uuml;ck.
-
+        <translation><h3>Funktion disjoint</h3>
+Gibt 1 zurück, wenn die Geometrien sich nicht räumlich überschneiden - d.h. wenn sie keinen gemeinsamen Raum haben.
 
-<p><h4>Syntax</h4>
-     sin(<i>winkel</i>)</p>
+<h4>Syntax</h4>
+<pre>disjoint( a, b )</pre>
 
-<p><h4>Argumente</h4>
-<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Beispiel</h4>
-     sin(1.571) &rarr; 0.999999682931835</p>
+<h4>Beispiel</h4>
+<pre> disjoint( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; ergibt 1</pre>
+<pre> disjoint( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'POINT(4 4)' ))                              &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>month() function</h3>
-Extract the month part from a date, or the number of months
-from a <code>Interval</code>
+        <source><h3>buffer function</h3>
+Returns a geometry that represents all points whose distance from this geometry is less than or equal to distance. Calculations are in the Spatial Reference System of this Geometry. 
 
 <h4>Syntax</h4>
-<code>month(date)</code><br>
-<code>month(Interval)</code><br>
+<pre>buffer(a, b)</pre>
 
 <h4>Arguments</h4>
-<code>date</code> - is date or datetime. The date to extract the month from.
-<br>
-<code>Interval</code> - is Interval. The Interval to return the number of months from.
+a &rarr; geometry
+b &rarr; distance for the buffer
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>month('2012-05-12') &rarr; 05</code><br>
-<code>month(tointerval('3 months')) &rarr; 3</code><br>
-<code>month(age('2012-01-01','2010-01-01')) &rarr; 4.033...</code><br>
+<pre> buffer($geometry, 10.5 ) &rarr; returns a polygon</pre>
 
 </source>
-        <translation><h3>month() function</h3>
-Bestimmt den Monat eines Datums/Zeit oder die Anzahl der Monate
-aus einem <code>Intervall</code>
+        <translation><h3>Funktion buffer</h3>
+Gibt eine Geometrie zurück, die alle Punkte enthält, deren Abstand von der Geometrie kleiner gleich dem gegebenen Wert sind. Die Berechungen beziehen sich auf das räumliche Bezugssystem der Geometrie.
 
 <h4>Syntax</h4>
-<code>month(date)</code><br>
-<code>month(Intervall)</code><br>
+<pre>buffer(a,b)</pre>
 
-<h4>Argumente</h4>
-<code>date</code> - ist date oder datetime. Das Datum aus dem der Monat bestimmt werden soll.<br>
-<code>Interval</code> - ist Interval. Das Intervall dessen Monatsanzahl zur&uuml;ckgegeben werden soll.
+<h4>Arguments</h4>
+a &rarr; Geometrie
+b    &rarr; Distanz
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>month('2012-05-12') &rarr; 05</code><br>
-<code>month(tointerval('3 months')) &rarr; 3</code><br>
-<code>month(age('2012-01-01','2010-01-01')) &rarr; 4.033...</code><br>
+<pre> buffer($geometry, 10.5 ) &rarr; ergibt ein Polygon</pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>$area function</h3>
-Returns the area size of the current feature.
+        <source><h3>$atlasfeature function</h3>
+In atlas generation, returns the current feature that is iterated over on the coverage layer. This can be used with the 'attribute' function
+to return attribute values from the current atlas feature.
 
 <h4>Syntax</h4>
-<pre>$area</pre>
+<pre>$atlasfeature</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre>$area &rarr; 42</pre>
+<pre>attribute( $atlasfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current atlas feature</pre>
 
 </source>
-        <translation><h3>Funktion $area</h3>
-Liefert den Fl&auml;cheninhalt des aktuellen Objekts
+        <translation><h3>Funktion $atlasfeature</h3>
+Bei der Atlas-Erzeugung gib es das aktuelle Objekts beim Durchlaufen des Decklayer zurück. Es kann mit der Funktion 'attribute' verwendet werden, um die Attributwerte des aktuellen Atlas-Objekts zu erhalten.
 
 <h4>Syntax</h4>
-<pre>$area</pre>
+<pre>$atlasgeometry</pre>
 
 <h4>Argumente</h4>
-Keine
+Kein
 
 <h4>Beispiel</h4>
-<pre>$area &rarr; 4711.42</pre>
-
+<pre> attribute( $atlasfeature, 'name' ) &rarr; ergibt den Wert des Attributs 'name' des aktuellen Atlas-Objekts</pre>
 </translation>
     </message>
     <message>
-        <source><h3>day() function</h3>
-Extract the day from a date, or the number of days
-from a <code>Interval</code>
+        <source><h3>$currentfeature function</h3>
+Returns the current feature being evaluated. This can be used with the 'attribute' function
+to evaluate attribute values from the current feature.
 
 <h4>Syntax</h4>
-<code>day(date)</code><br>
-<code>day(Interval)</code><br>
+<pre>$currentfeature</pre>
 
 <h4>Arguments</h4>
-<code>date</code> - is date or datetime. The date to extract the day from.
-<br>
-<code>Interval</code> - is Interval. The Interval to return the number of days from.
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>day('2012-05-12') &rarr; 12</code><br>
-<code>day(tointerval('3 days')) &rarr; 3</code><br>
-<code>day(age('2012-01-01','2010-01-01')) &rarr; 730</code><br>
+<pre>attribute( $currentfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current feature</pre>
 
 </source>
-        <translation><h3>Funktion day()</h3>
-Tag eines Datum oder Anzahl der Tage eines <code>Intervalls</code>.
+        <translation><h3>Funktion $currentfeature</h3>
+Gibt das Objekt zurück, dass gerade ausgewertet wird. Dies kann mit der Funktion 'attribute' benutzt werden um die Attributwerte des aktuellen Objekts zu bestimmen.
 
 <h4>Syntax</h4>
-<code>day(date)</code><br>
-<code>day(Intervall)</code><br>
+<pre>$currentfeature</pre>
 
 <h4>Argumente</h4>
-<code>date</code> - ist date oder datetime. Das Datum oder die Zeit dessen Tag bestimmt werden soll.
-<br>
-<code>Interval</code> - ist Interval. Das Interval aus dem die Anzahl der Tage bestimmt werden soll.
+Keine
 
-<h4>Beispiele</h4>
-<!-- Show example of function.-->
-<code>day('2012-05-12') &rarr; 12</code><br>
-<code>day(tointerval('3 days')) &rarr; 3</code><br>
-<code>day(age('2012-01-01','2010-01-01')) &rarr; 730</code><br>
-</translation>
+<h4>Beispiel</h4>
+<pre>attribute( $currentfeature, 'name' ) &rarr; geibt den Wert des Attributs 'name' des aktuellen Objekts zurück</pre></translation>
     </message>
     <message>
-        <source><h3>todate() function</h3>
-Convert a string into Qt data type.
+        <source><h3>$id function</h3>
+Returns the feature id of the current row.
 
 <h4>Syntax</h4>
-<code>todate('string')</code><br>
+<pre>$id</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string in Qt date format.
-<br>
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>todate('2012-05-04') &rarr; 2012-05-04</code><br></source>
-        <translation><h3>Funktion todate()</h3>
-Wandelt eine Zeichenkette in eine Qt-Datumstyp um.
+<pre>$id &rarr; 42</pre>
+
+</source>
+        <translation><h3>Funktion $id</h3>
+Liefert die Feature-ID des aktuellen Objekts zur&uuml;ck.
 
 <h4>Syntax</h4>
-<code>todate('zeichenkette')</code><br>
+<pre>$id</pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - eine Zeichenkette im Qt-Datumsformat.
-<br>
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>todate('2012-05-04') &rarr; 2012-05-04</code><br>
+<pre>$id &rarr; 42</pre>
+
 </translation>
     </message>
     <message>
-        <source><h3>lpad() function</h3>
-Returns a string with supplied width padded
-using the fill character.
+        <source><h3>IN expression</h3>
+Returns 1 if value is found within a list of values
 
 <h4>Syntax</h4>
-<code>lpad(string, length, fill)</code><br>
+<pre>'a' IN ('a', 'b')</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. The string.
-<br>
-<code>length</code> - is int. The length of the new string.
-<br>
-<code>fill</code> - is char. The character to padd the remaining space with. 
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>lpad('Hello', 10, 'x') &rarr; 'Helloxxxxx'</code><br>
+<pre> 'A' IN ('A','B") &rarr; returns 1 </pre>
+<pre> 'A' IN ('C','B") &rarr; returns 0 </pre>
+
 </source>
-        <translation><h3>Funktion lpad()</h3>
-Ergibt eine mit einem am Ende mit einem Zeichen auf eine bestimmte L&auml;nge aufgef&uuml;llte Zeichenkette.
+        <translation><h3>IN Asudruck</h3>
+Gibt 1 zurück wenn der Wert in einer Liste von Werten gefunden wird
 
 <h4>Syntax</h4>
-<code>lpad(zeichenkette, laenge, fuellzeichen)</code><br>
+<pre>'a' IN ('a', 'b')</pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - ist string. Die Zeichenkette.
-<br>
-<code>laenge</code> - ist int. Die L&auml;nge der neuen Zeichenkette.
-<br>
-<code>fuellzeichen</code> - ist char. Das Zeichen mit dem die Zeichenkette am Ende aufgef&uuml;llt werden soll. 
+Keine
 
-<h4>Beispiel</h4>
-<code>lpad('Hallo', 10, 'x') &rarr; 'Halloxxxxx'</code><br>
+<h4>Beispiele</h4>
+<pre> 'A' IN ('A','B") &rarr; ergibt 1 </pre>
+<pre> 'A' IN ('C','B") &rarr; ergibt 0 </pre>
 </translation>
     </message>
     <message>
-        <source><h3>acos() function</h3>
-Returns arcuscosinus of a value in radians.
+        <source><h3>attribute function</h3>
+Returns the value of a specified attribute from a feature.
 
+<h4>Syntax</h4>
+<pre>attribute( feature, attribute_name )</pre>
 
-<p><h4>Syntax</h4>
-     acos(<i>real</i>)</p>
+<h4>Arguments</h4>
+feature &rarr; a feature<br />
+attribute_name &rarr; name of attribute to be returned
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; cos of an angle.</p>
+<h4>Example</h4>
+<pre>attribute( $currentfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current feature</pre>
 
-<p><h4>Example</h4>
-     acos(0.5) &rarr; 1.0471975511966</p>
 </source>
-        <translation><h3>Funktion acos()</h3>
-Gibt den Arcuscosinus eines Werts im Bogenma&szlig; zur&uuml;ck.
-
+        <translation><h3>Function attribut</h3>
+Gibt den Wert des angegebenen Attributs eines Objekts zurück.
 
-<p><h4>Syntax</h4>
-     acos(<i>wert</i>)</p>
+<h4>Syntax</h4>
+<pre>attribute( feature, attribute_name )</pre>
 
-<p><h4>Argumente</h4>
-<i>wert</i> &rarr; Cosinus eines Winkels.</p>
+<h4>Argumente</h4>
+feature &rarr; ein Objekt<br />
+attribute_name &rarr; Name des zurückzugebenden Attributs
 
-<p><h4>Beispiel</h4>
-     acos(0.5) &rarr; 1.0471975511966</p>
-</translation>
+<h4>Beispiel</h4>
+<pre>attribute( $currentfeature, 'name' ) &rarr; gibt den Wert des Attributs 'name' des aktuellen Objekts zurück</pre></translation>
     </message>
     <message>
-        <source><h3>Fields and Values</h3>
-Contains a list of fields from the layer.  Sample values can also be accessed via right-click.
-<br><br>
-Select the field name from the list then right-click to access context menu with options to load sample values from the selected field.
-
-<p><h4>Note:</h4>
-Loading field values from WFS layers isn't supported, before the layer is
-actually inserted, ie. when building queries.
-</p>
-</source>
-        <translation><h3>Felder und Werte</h3>
-Enth&auml;lt einen Feldliste des Layers.  Beispielwerte k&ouml;nnen per Rechtsklick geladen werden.
-<br><br>
-W&auml;hlen Sie ein Feld aus der Liste und klicken Sie dann rechts um in ein Kontextmen&uuml; zu gelangen
-in der Optionen zum Laden von Beispielwerten aus dem gew&auml;hlten Feld angeboten werden.
+        <source><h3>crosses function</h3>
+Returns 1 if the supplied geometries have some, but not all, interior points in common.
 
-<p><h4>Hinweis:</h4>
-Feldwerte aus WFS-Layern zu laden bevor die Layer tatsächlich geladen wurde, wird nicht unterstützt, d.h bei der Eingabe von Abfragen.
-</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>log() function</h3>
-Returns the value of the logarithm of the passed value and base.
-<br>
-This function takes two arguments.
 <h4>Syntax</h4>
-<code>log(base, value)</code><br>
+<pre>crosses( $geometry , $geometry)</pre>
 
 <h4>Arguments</h4>
-<code>base</code> - any positive number.<br>
-<code>value</code> - any positive number.
-<br>
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>log(2, 32) &rarr; 5</code><br>
-<code>log(0.5, 32) &rarr; -5</code><br>
+<pre> crosses( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 3)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
+<pre> crosses( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))             &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion log()</h3>
-Gibt ist der Logarithmus von des &uuml;bergebenen Wertes zur &uuml;bergebenen Basis zur&uuml;ck.
-<br>
-Die Funktion akzeptiert zwei Werte.
+        <translation><h3>Funktion crosses</h3>
+Gibt 1 zurück, wenn die übergebenen Geometrien einige aber nicht alle innere Punkten gemeinsam haben.
+
 <h4>Syntax</h4>
-<code>log(basis, wert)</code><br>
+<pre>crosses( $geometry , $geometry)</pre>
 
 <h4>Argumente</h4>
-<code>basis</code> - eine positive Zahl.
-<code>wert</code> - eine positive Zahl.
-<br>
-
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>log(2, 32) &rarr; 5</code><br>
-<code>log(0.5, 32) &rarr; -5</code><br>
-</translation>
-    </message>
-    <message>
-        <source><h3>Geometry Group</h3>
-This group contains functions that operate on geometry objects e.g length, area.
-</source>
-        <translation><h3>Gruppe Geometrie</h3>
-Dies Gruppe enth&auml;lt Funktionen f&uuml;r Geometrieobjekten (z.B. L&auml;nge und Fl&auml;cheninhalt).
-</translation>
-    </message>
-    <message>
-        <source><h3>Field</h3>
-Double click to add field name to expression string.
-<br><br>
-Right-Click on field name to open context menu sample value loading options.
-
-<p><h4>Note:</h4>
-Loading field values from WFS layers isn't supported, before the layer is
-actually inserted, ie. when building queries.
-</p>
-</source>
-        <translation>Klicken Sie den Feldnamen doppelt um ihn dem Ausdruck hinzuzufügen.
-<br><br>
-Per Rechtsklick auf den Feldnamen können Sie ein Kontextmenü mit Optionen zum Laden von Beispielwerten öffnen.
+geometry &rarr; Geometrie
+geometry &rarr; Geometrie
 
-<p><h4>Hinweis:</h4>
-Feldwerte aus WFS-Layern zu laden bevor die Layer tatsächlich geladen wurde, wird nicht unterstützt, d.h bei der Eingabe von Abfragen.
-</p>
+<h4>Beispiele</h4>
+<pre> crosses( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 3)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; gibt 1 zurück</pre>
+<pre> crosses( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))             &rarr; gibt 0 zurück</pre>
 </translation>
     </message>
     <message>
-        <source><h3>$page function</h3>
-Returns the current page number within a composition.
+        <source><h3>touches function</h3>
+Returns 1 if the geometries have at least one point in common, but their interiors do not intersect.
 
 <h4>Syntax</h4>
-<pre>$page</pre>
+<pre>touches( a, b )</pre>
 
 <h4>Arguments</h4>
-None
+a &rarr; geometry
+b &rarr; geometry
 
 <h4>Example</h4>
-<pre>$page &rarr; 2</pre>
-
+<pre> touches( geomFromWKT( 'LINESTRING(5 3 , 4 4)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
+<pre> touches( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))                     &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion $page</h3>
-Gibt die aktuelle Seitennummer in einer Druckzusammenstellung aus.
+        <translation><h3>Funktion touches</h3>
+Gibt 1 zurück, wenn die übergebenen Geometrie mindestens einen Punkt gemeinsam haben, aber es keine gemeinsamen inneren Punkte gibt.
 
 <h4>Syntax</h4>
-<pre>$page</pre>
+<pre>touches( $geometry , $geometry)</pre>
 
 <h4>Argumente</h4>
-Keine
+geometry &rarr; Geometrie
+geometry &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<pre>$page &rarr; 2</pre>
-
-</translation>
+<pre> touches( geomFromWKT( 'LINESTRING(5 3 , 4 4)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 1</pre>
+<pre> touches( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))                     &rarr; ergibt 0</pre></translation>
     </message>
     <message>
-        <source><h3>exp() function</h3>
-Returns exponential of an value.
-
+        <source><h3>overlaps function</h3>
+Returns 1 if the geometries share space, are of the same dimension, but are not completely contained by each other.
 
-<p><h4>Syntax</h4>
-     exp(<i>real</i>)</p>
+<h4>Syntax</h4>
+<pre>overlaps( a, b )</pre>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; number.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Example</h4>
-     exp(1.0) &rarr; 2.71828182845905</p>
+<h4>Example</h4>
+<pre> overlaps( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 5 , 5 3)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))   &rarr; returns 1</pre>
+<pre> overlaps( geomFromWKT( 'LINESTRING(0 0 , 1 1)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion exp()</h3>
-Gibt die Exponentialfunktion eines Wert zur&uuml;ck.
+        <translation><h3>Funktion overlaps</h3>
+Gibt 1 zurück, wenn die Geometrien gemeinsamen Raum haben, von gleicher Dimension, aber nicht komplett ineinander enthalten sind.
 
-<p><h4>Syntax</h4>
-     exp(<i>zahl</i>)</p>
+<h4>Syntax</h4>
+<pre>overlaps( a, b)</pre>
 
-<p><h4>Argumente</h4>
-<i>zahl</i> &rarr; Zahl.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Beispiel</h4>
-     exp(1.0) &rarr; 2.71828182845905</p>
+<h4>Beispiel</h4>
+<pre> overlaps( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 5 , 5 3)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))   &rarr; ergibt 1</pre>
+<pre> overlaps( geomFromWKT( 'LINESTRING(0 0 , 1 1)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>rpad() function</h3>
-Returns a string with supplied width padded
-using the fill character.
+        <source><h3>AND logical operator</h3>
+Returns 1 when condition a and b are true.
 
 <h4>Syntax</h4>
-<code>rpad(string, width, fill)</code><br>
+<pre> condition a AND condition b </pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. The string.
-<br>
-<code>width</code> - is int. The length of the new string.
-<br>
-<code>fill</code> - is char. The character to padd the remaining space with. 
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>rpad('Hello', 10, 'x') &rarr; 'xxxxxHello'</code><br>
+<pre> 4 = 2+2 AND 1 = 1  &rarr; returns 1 </pre>
+<pre> 4 = 2+2 AND 1 = 2  &rarr; returns 0 </pre>
 
 </source>
-        <translation><h3>Funktion rpad()</h3>
-Ergibt eine mit einem am Anfang mit einem Zeichen auf eine bestimmte L&auml;nge aufgef&uuml;llte Zeichenkette.
+        <translation><h3>Logischer Operator AND</h3>
+Ergibt 1, wenn die Bedingungen a und b erfüllt sind.
 
 <h4>Syntax</h4>
-<code>rpad(zeichenkette, laenge, fuellzeichen)</code><br>
+<pre> bedingung a AND bedingung b </pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - ist string. Die Zeichenkette.  <br>
-<code>laenge</code> - ist int. Die L&auml;nge der neuen Zeichenkette.  <br>
-<code>fuellzeichen</code> - ist char.  Das Zeichen mit dem die Zeichenkette aufgef&uuml;llt werden soll.
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>rpad('Hallo', 10, 'x') &rarr; 'xxxxxHallo'</code><br>
+<pre> 4 = 2+2 AND 1 = 1  &rarr; ergibt 1 </pre>
+<pre> 4 = 2+2 AND 1 = 2  &rarr; ergibt 0 </pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>round() function</h3>
-Rounds a number to number of decimal places.
-<br>
-This function can take one or two arguments depending on what is needed.
+        <source><h3>$geometry function</h3>
+Returns the geometry of the current feature. Can be used for processing with other functions.
+
 <h4>Syntax</h4>
-<code>round(decimal,places)</code><br>
-<code>round(decimal)</code><br>
+<pre>$geometry</pre>
 
 <h4>Arguments</h4>
-<code>decimal</code> - is decimal. The decimal number to be rounded.
-<br>
-<code>places</code> - is int. The number of places to round decimal too. Can be negative.
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>round(1234.567, 2 ) &rarr; 1234.57</code><br>
-use <code>round(decimal)</code> to round to the nearest integer<br>
-<code>round(1234.567) &rarr; 1235</code><br>
-
+<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
 
 </source>
-        <translation><h3>Funktion round()</h3>
-Rundet eine Zahl auf eine gegebene Anzahl von Nachkommastellen.
-<br>
-Dies Funktion kann ein oder zwei Argumente haben.
+        <translation><h3>Funktion $geometry</h3>
+Gibt die Geometrie des aktuellen Objekts zurück. Kann zur Verarbeitung mit anderen Funktion verwendet werden.
+
 <h4>Syntax</h4>
-<code>round(zahl,stellen)</code><br>
-<code>round(zahl)</code><br>
+<pre>$geometry</pre>
 
 <h4>Argumente</h4>
-<code>zahl</code> - ist eine Zahl. Die Zahl die gerundet werden soll.
-<br>
-<code>stellen</code> - ist Ganzahl. Die Anzahl der Nachkommastellen auf die gerundet werden soll. Kann negativ sein.
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>round(1234.567, 2) &rarr; 1234.57</code><br>
-Um zur n&auml;chsten ganzen Zahl zu runden: <code>round(zahl)</code><br>
-<code>round(1234.567) &rarr; 1235</code><br>
-
-
-</translation>
+<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre></translation>
     </message>
     <message>
-        <source><h3>$now function</h3>
-Returns the current date and time
+        <source><h3>OR logical operator</h3>
+Returns 1 when condition a or b is true.
 
 <h4>Syntax</h4>
-<pre>$now</pre>
+<pre> condition a OR condition b </pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre>$now &rarr; 2012-07-22T13:24:57</pre>
-
+<pre> 4 = 2+2 OR 1 = 1  &rarr; returns 1 </pre>
+<pre> 4 = 2+2 OR 1 = 2  &rarr; returns 1 </pre>
+<pre> 4 = 2   OR 1 = 2  &rarr; returns 0 </pre>
 </source>
-        <translation><h3>Funktion $now</h3>
-Ergibt aktuelles Datum und Zeit
+        <translation><h3>Logischer Operator OR</h3>
+Ergibt 1m wenn die Bedingung a oder b erfüllt ist.
 
 <h4>Syntax</h4>
-<pre>$now</pre>
+<pre> bedingung a OR bedingung b </pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre>$now &rarr; 2012-07-22T13:24:57</pre>
+<pre> 4 = 2+2 OR 1 = 1  &rarr; ergibt 1 </pre>
+<pre> 4 = 2+2 OR 1 = 2  &rarr; ergibt 1 </pre>
+<pre> 4 = 2 OR 1 = 2  &rarr; ergibt 0 </pre>
 </translation>
     </message>
     <message>
-        <source><h3>color_hsl() function</h3>
-Returns a string representation of a color based on its hue, saturation, and lightness attributes
+        <source><h3>centroid function</h3>
+Returns the geometric center of a geometry.
 
-<p><h4>Syntax</h4>
-     color_hsl(<i>hue, saturation, lightness</i>)</p>
+<h4>Syntax</h4>
+<pre>centroid(a)</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
-<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
-<i>  lightness</i> &rarr; the lightness percentage of the color as an integer value from 0 to 100.<br>
+<h4>Arguments</h4>
+b &rarr; geometry
+
+<h4>Example</h4>
+<pre> centroid($geometry) &rarr; returns a point geometry</pre>
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     color_hsl(100,50,70) &rarr; '166,217,140'</p>
 </source>
-        <translation><h3>Funktion color_hsl()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung und Helligkeit zur&uuml;ck.
+        <translation><h3>Funktion centroid</h3>
+Gibt das geometrische Zentrum der Geometrie zurück.
 
-<p><h4>Syntax</h4>
-     color_hsl(<i>farbton, s&auml;ttigung, helligkeit</i>)</p>
+<h4>Syntax</h4>
+<pre>centroid(a)</pre>
 
-<p><h4>Argumente</h4>
-<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
-<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  helligkeit</i> &rarr; Die Helligkeit der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<h4>Argumente</h4>
+a &rarr; geometry
 
-<p><h4>Beispiel</h4>
-     color_hsl(100,50,70) &rarr; '166,217,140'</p></translation>
+<h4>Beispiel</h4>
+<pre> centroid($geometry) &rarr; ergibt einen Punkt</pre>
+</translation>
     </message>
     <message>
-        <source><h3>scale_exp() function</h3>
-Transforms a given value from an input domain to an output range using an exponential curve. This function can be used to ease values in or out 
-of the specified output range.   
+        <source><h3>within function</h3>
+Returns 1 if the geometry a is completely inside geometry b
 
-<p><h4>Syntax</h4>
-     scale_exp(<i>val</i>,<i>domain_min</i>,<i>domain_max</i>,<i>range_min</i>,<i>range_max</i>,<i>exponent</i>)</p>
+<h4>Syntax</h4>
+<pre>within( geometry a , geometry b)</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  val</i> &rarr; is a value in the input domain. The function will return a corresponding scaled value in the output range.<br>
-<i>  domain_min, domain_max</i> &rarr; specify the input domain, the smallest and largest values the input <i>val</i> should take.<br>
-<i>  range_min, range_max</i> &rarr; specify the output range, the smallest and largest values which should be output by the function.<br>
-<i>  exponent</i> &rarr; a positive value (greater than 0), which dictates the way input values are mapped to the output range. Large exponents will cause the output values to 'ease in', starting slowly before
-accelerating as the input values approach the domain maximum. Smaller exponents (less than 1) will cause output values to 'ease out', where the mapping starts quickly but slows as it approaches the domain maximum.<br>
+<h4>Arguments</h4>
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<b>Easing in, using an exponent of 2:</b><br>
-     scale_exp(5,0,10,0,100,2) &rarr; 25<br>
-     scale_exp(7.5,0,10,0,100,2) &rarr; 56.25<br>
-     scale_exp(9.5,0,10,0,100,2) &rarr; 90.25<br>               
-     <br>
-<b>Easing out, using an exponent of 0.5:</b><br>          
-     scale_exp(3,0,10,0,100,0.5) &rarr; 54.772<br>
-     scale_exp(6,0,10,0,100,0.5) &rarr; 77.459<br>
-     scale_exp(9,0,10,0,100,0.5) &rarr; 94.868<br>          
-     
-     
+<pre> within( geomFromWKT( 'POINT( 0.5 0.5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )    &rarr; returns 1</pre>
+<pre> within( geomFromWKT( 'POINT( 5 5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )        &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion scale_linear()</h3>
-Formt einen gegebenen Wert aus einem Ausgangsbereich mittels einer exponentielle Kurve in einen Ausgabebereich um. Die Funktion kann verwendet um Werte in oder aus einem Ausgabebereichs einzupassen.
-<p><h4>Syntax</h4>
-     scale_exp(<i>wert</i>,<i>quell_min</i>,<i>quell_max</i>,<i>ziel_min</i>,<i>ziel_max</i>,<i>exponent</i>)</p>
+        <translation><h3>Funktion within</h3>
+Gibt 1 zurück, wenn die Geometire a komplett innerhalb der Geometrie b liegt
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  wert</i> &rarr; ist ein Wert im Ausgangsbereich. Die Funktion gibt einen korrespondierend skalierten Wert im Ausgabebereich zurück.<br>
-<i>  quell_min, quell_max</i> &rarr; gibt den Ausgangsbereich an, der kleinste und größte Wert den der Eingabewert <i>wert</i> annehmen kann.<br>
-<i>  ziel_min, ziel_max</i> &rarr; gibt den Ausgabebereich an, der kleinste und größte Wert den der Rückgabewert der Funktion annehmen kann.<br
-<i>  exponent</i> &rarr; ein positive Zahl (größer als 0), welche vorgibt wie die Eingabe auf den Ausgabebereich abgebildet werden soll. Große Exponenten sorgen für Ausgabewerten sich erst langsam und dann immer schneller dem Maximum des Ausgabebereichs nähern, während der Eingabewert sich dem Ende des Ausgangsbereichs nähert.  Kleinere Exponenten (kleiner als 1) sorgen dafür das die Ausgabewerte bei der die Abbildung erst schnell und dann immer langsamer dem Maximum des  [...]
+<h4>Syntax</h4>
+<pre>within( a , b)</pre>
+
+<h4>Arguments</h4>
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<b>Langsame annähern, mit einem Exponenten von 2:</b><br>
-     scale_exp(5,0,10,0,100,2) &rarr; 25<br>
-     scale_exp(7.5,0,10,0,100,2) &rarr; 56.25<br>
-     scale_exp(9.5,0,10,0,100,2) &rarr; 90.25<br>               
-     <br>
-<b>Schnell annähern, mit einem Exponenten von 0,5:</b><br>          
-     scale_exp(3,0,10,0,100,0.5) &rarr; 54.772<br>
-     scale_exp(6,0,10,0,100,0.5) &rarr; 77.459<br>
-     scale_exp(9,0,10,0,100,0.5) &rarr; 94.868<br>          
+<pre> within( geomFromWKT( 'POINT( 0.5 0.5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )    &rarr; ergibt 1</pre>
+<pre> within( geomFromWKT( 'POINT( 5 5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )        &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>convexHull function</h3>
-Returns the convex hull of a geometry. It represents the minimum convex geometry that encloses all geometries within the set.
+        <source><h3>$map function</h3>
+Returns the id of the current map item if the map is being drawn in a composition, or "canvas" if the map is being
+drawn within the main QGIS window.
 
 <h4>Syntax</h4>
-<pre>convexHull( a, b )</pre>
+<pre>$map</pre>
 
 <h4>Arguments</h4>
-a &rarr; geometry
-a &rarr; geometry
+None
 
 <h4>Example</h4>
-<pre>  geomToWKT( convexHull( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; returns POLYGON((3 3,4 10,4 4,3 3)) </pre>
+<!-- Show example of function.-->
+<pre>$map &rarr; "overview_map" (within a composer item)<br />
+$map &rarr; "canvas" (within the main QGIS main canvas)</pre>
+
+
 </source>
-        <translation><h3>Funktion convexHull</h3>
-Gibt die konvexe Hülle einer Geometrie zurück. Es stellt die minimale konvexe Geometrie dar, sie alle Geometrien des Satzes umfassen.
+        <translation><h3>Funktion $map</h3>
+Gibt die Kennung des aktuellen Druckzusammenstellungselements zurück, wenn die Karte in einer Druckzusammenstellung gezeichnet wird oder "canvas", wenn die Karte im QGIS-Fenster gezeichnet wird.
+.
 
 <h4>Syntax</h4>
-<pre>convexHull( a, b)</pre>
+<pre>$map</pre>
 
 <h4>Argumente</h4>
-a &rarr; geometry
-b &rarr; geometry
+None
 
 <h4>Beispiel</h4>
-<pre>  geomToWKT( convexHull( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; ergibt POLYGON((3 3,4 10,4 4,3 3)) </pre></translation>
+<!-- Show example of function.-->
+<pre>$map &rarr; "overview_map" (in einem Zusammenstellungselement)<br />
+$map &rarr; "canvas" (im QGIS-Kartenfenster)</pre>
+
+</translation>
     </message>
     <message>
-        <source><h3>union function</h3>
-Returns a geometry that represents the point set union of the geometries.
+        <source><h3>distance function</h3>
+ Returns the minimum distance (based on spatial ref) between two geometries in projected units.
 
 <h4>Syntax</h4>
-<pre>union( a, b )</pre>
+<pre>distance( a, b )</pre>
 
 <h4>Arguments</h4>
 a &rarr; geometry
 b &rarr; geometry
 
 <h4>Example</h4>
-<pre> geomToWKT( union( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))  )   &rarr; returns MULTIPOINT(4 4, 5 5)</pre>
+<pre> distance( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(4 8)' ))    &rarr; returns 4</pre>
 </source>
-        <translation><h3>Funktion union</h3>
-Gibt eine Geometrie zurück, die alle Punkte beider Geometrien abdeckt.
+        <translation><h3>Funktion distance</h3>
+ Gibt den minimalen Abstand (basierend auf dem Raumbezug) zwischen zwei Geometrien in projiizierten Einheiten.
 
 <h4>Syntax</h4>
-<pre>union( $geometry , $geometry)</pre>
+<pre>distance( a, b )</pre>
 
 <h4>Argumente</h4>
-geometry &rarr; Geometrie
-geometry &rarr; Geometrie
+a &rarr; geometry
+b &rarr; geometry
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( union( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))  )   &rarr; ergibt MULTIPOINT(4 4, 5 5)</pre</translation>
+<pre> distance( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(4 8)' ))    &rarr; ergibt 4</pre>
+</translation>
     </message>
     <message>
-        <source><h3>xmax function</h3>
-Returns the maximum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>difference function</h3>
+Returns a geometry that represents that part of geometry a that does not intersect with geometry b.
 
 <h4>Syntax</h4>
-<pre>xmax(geom)</pre>
+<pre>difference( a, b )</pre>
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<pre> xmax($geometry) &rarr; returns maximum x coordinate of $geometry</pre>
-
+<pre> geomToWKT( difference( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4)' ))  )   &rarr; returns LINESTRING(4 4, 5 5)</pre>
 </source>
-        <translation><h3>Funktion xmax()</h3>
-Gibt die größte X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
+        <translation><h3>Funktion difference</h3>
+Gibt eine Geometrie zurück, die den Teil der Geometrie a repräsentiert, der die Geometrie b nicht schneidet.
 
 <h4>Syntax</h4>
-<pre>xmax(geom)</pre>
+<pre>difference( geometry a , geometry b)</pre>
 
-<h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  geom</i> &rarr; eine Geometrie.<br>
+<h4>Arguments</h4>
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<pre>xmax($geometry) &rarr; ergibt die maximale X-Koordinate von $geometry</pre></translation>
+<pre> geomToWKT( difference( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4)' ))  )   &rarr; ergibt LINESTRING(4 4, 5 5)
+</pre></translation>
     </message>
     <message>
-        <source><h3>bounds function</h3>
-Returns a geometry which represents the bounding box of an input geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>NOT</h3>
+Returns 1 if a is not the same as b.
 
 <h4>Syntax</h4>
-<pre>bounds(geom)</pre>
+<pre> a NOT b </pre>
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+None
 
 <h4>Example</h4>
-<pre> bounds($geometry) &rarr; returns bounding box of $geometry</pre>
+<pre> 'a' IS NOT 'b'  &rarr; returns 1 </pre>
+<pre> 'a' IS NOT 'a'  &rarr; returns 0 </pre>
+<pre> 4 IS NOT 2+2    &rarr; returns 0 </pre>
 
 </source>
-        <translation><h3>Funktion bounds</h3>
-Ergibt das Begrenzungsrechteck als Geometrie. Berechnungen erfolgen im räumliches Bezugssystem der Geometrie. 
+        <translation><h3>NOT</h3>
+Gibt 1 zurück, wenn a ungleich b ist.
 
 <h4>Syntax</h4>
-<pre>bounds(geom)</pre>
+<pre> a NOT b </pre>
 
 <h4>Argumente</h4>
-geom &rarr; eine Geometrie
+Keine
 
 <h4>Beispiel</h4>
-<pre> bounds($geometry) &rarr; ergibt das Begrenzungsrechteck der $geometry</pre>
+<pre> 'a' IS NOT 'b'  &rarr; ergibt 1 </pre>
+<pre> 'a' IS NOT 'a'  &rarr; ergibt 0 </pre>
+<pre> 4 IS NOT 2+2    &rarr; ergibt 0 </pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>ymax function</h3>
-Returns the maximum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>$perimeter function</h3>
+Returns the perimeter length of the current feature.
 
 <h4>Syntax</h4>
-<pre>ymax(geom)</pre>
+<pre>$perimeter</pre>
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+None
 
 <h4>Example</h4>
-<pre> ymax($geometry) &rarr; returns maximum y coordinate of $geometry</pre>
+<pre>$perimeter &rarr; 42</pre>
 
 </source>
-        <translation><h3>Funktion ymax()</h3>
-Gibt den größten Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
+        <translation><h3>Funktion $perimeter</h3>
+Liefert den Umfang des aktuellen Objekts zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre>ymax(geom)</pre>
+<pre>$perimeter</pre>
 
 <h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  geom</i> &rarr; eine Geometrie.<br>
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<pre>ymax($geometry) &rarr; ergibt die maximale Y-Koordinate von $geometry</pre></translation>
+<pre>$perimeter &rarr; 42</pre>
+
+</translation>
     </message>
     <message>
-        <source><h3>contains function</h3>
-Returns true if and only if no points of b lie in the exterior of a, and at least one point of the interior of b lies in the interior of a. 
+        <source><h3>hour() function</h3>
+Extract the hour from a datetime or time, or the number of hours
+from a <code>Interval</code>
 
 <h4>Syntax</h4>
-<pre>contains( geometry a , geometry b)</pre>
+<code>hour(datetime)</code><br>
+<code>hour(Interval)</code><br>
 
 <h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<code>date</code> - is datetime or time. The date to extract the hour from.
+<br>
+<code>Interval</code> - is Interval. The Interval to return the number of hours from.
 
 <h4>Example</h4>
-<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'POINT( 0.5 0.5 )' ))    &rarr; returns 1</pre>
-<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))          &rarr; returns 0</pre>
+<!-- Show example of function.-->
+<code>hour('2012-07-22T13:24:57') &rarr; 13</code><br>
+<code>hour(tointerval('3 hours')) &rarr; 3</code><br>
+<code>hour(age('2012-07-22T13:00:00','2012-07-22T10:00:00')) &rarr; 3</code><br>
+<code>hour(age('2012-01-01','2010-01-01')) &rarr; 17520</code><br>
+
 </source>
-        <translation><h3>Funktion contains</h3>
- Gibt dann und nur dann true zurück, wenn keine Punkte von b außerhalb von a liegen und mindestens ein innerer Punkt von b innerhalb von a liegt.
+        <translation><h3>Funktion hour()</h3>
+Bestimmt die Stunde eines Datums/Zeit oder die Anzahl der Stunden
+aus einem <code>Intervall</code>
 
 <h4>Syntax</h4>
-<pre>contains( a , b)</pre>
+<code>hour(datetime)</code><br>
+<code>hour(Intervall)</code><br>
 
-<h4>Arguments</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<h4>Argumente</h4>
+<code>date</code> - ist date oder datetime. Das Datum/die Zeit dessen Stunde bestimmt werden soll.
+<br>
+<code>Intervall</code> - ist Interval. Das Intervall aus der die Stundenzahl bestimmt werden soll.
+
+<h4>Beispiele</h4>
+<!-- Show example of function.-->
+<code>hour('2012-07-22T13:24:57') &rarr; 13</code><br>
+<code>hour(tointerval('3 hours')) &rarr; 3</code><br>
+<code>hour(age('2012-07-22T13:00:00','2012-07-22T10:00:00')) &rarr; 3</code><br>
+<code>hour(age('2012-01-01','2010-01-01')) &rarr; 17520</code><br>
 
-<h4>Beispiel</h4>
-<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'POINT( 0.5 0.5 )' ))    &rarr; ergibt 1</pre>
-<pre> contains( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))          &rarr; ergibt 0</pre>
 </translation>
     </message>
     <message>
-        <source><h3>wordwrap() function</h3>
-Returns a string wrapped to a maximum/minimum number of characters.
+        <source><h3>color_hsla() function</h3>
+Returns a string representation of a color based on its hue, saturation, lightness and alpha (transparency) attributes
 
 <p><h4>Syntax</h4>
-     wordwrap(<i>string,wrap_length[,delimiter_string]</i>)</p>
+     color_hsla(<i>hue, saturation, lightness, alpha</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The string to be wrapped.<br>
-<i>  wrap_length</i> &rarr; is number.  If positive, the number represents the ideal maximum number of characters to wrap; if negative, the number represents the minimum number of characters to wrap.<br>
-<i>  delimiter_string</i> &rarr; is string.  The delimiter string to wrap to a new line (<u>optional</u>).<br></p>
+<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
+<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
+<i>  lightness</i> &rarr; the lightness percentage of the color as an integer value from 0 to 100.<br>
+<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     wordwrap('UNIVERSITY OF QGIS',13) &rarr; 'UNIVERSITY OF&#92;nQGIS'<br>
-     wordwrap('UNIVERSITY OF QGIS',-3) &rarr; 'UNIVERSITY&#92;nOF QGIS'</p>
+     color_hsla(100,50,70,200) &rarr; '166,217,140,200'</p>
 </source>
-        <translation><h3>Funktion wordwrap()</h3>
-Gibt eine auf eine maximal/minimale Länge umgebrochene Zeichenkette zurück.
+        <translation><h3>Funktion color_hsl()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung, ihrer Helligkeit und ihrer Transparenz zur&uuml;ck.
 
 <p><h4>Syntax</h4>
-     wordwrap(<i>string,wrap_length[,delimiter_string]</i>)</p>
+     color_hsla(<i>farbton, s&auml;ttigung, helligkeit, alpha</i>)</p>
 
 <p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; ist eine Zeichenkette.  Die umzubrechende Zeichenkette.<br>
-<i>  wrap_length</i> &rarr; ist eine Zahl.  Positive Zahlen bedeuten die ideale Maximalzahl von umzubrechenden Zeichen, der Betrag von negative Zahlen gibt die Minimalzahl der umzubrechenden Zeichen an.<br>
-<i>  delimiter_string</i> &rarr; ist eine Zeichenkette.  Die Trennzeichen für einen Zeilenumbruch (<u>optional</u>).<br></p>
+<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
+<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  helligkeit</i> &rarr; Die Helligkeit der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
 
-<p><h4>Beispiele</h4>
-<!-- Show example of function.-->
-     wordwrap('UNIVERSITY OF QGIS',13) &rarr; 'UNIVERSITY OF&#92;nQGIS'<br>
-     wordwrap('UNIVERSITY OF QGIS',-3) &rarr; 'UNIVERSITY&#92;nOF QGIS'</p>
+<p><h4>Beispiel</h4>
+     color_hsla(100,50,70,200) &rarr; '#166,217,140,200'</p>
 </translation>
     </message>
     <message>
-        <source>
-<h3>color_rgb() function</h3>
-Returns a string representation of a color based on its red, green, and blue components
+        <source><h3>Record Group</h3>
+This group contains functions that operate on record identifiers.
+</source>
+        <translation><h3>Gruppe Datensatz</h3>
+Diese Gruppe enth&auml;lt Funktionen, die mit Datensatzkennungen arbeiten.
+</translation>
+    </message>
+    <message>
+        <source><h3>replace() function</h3>
+Returns a string with the the supplied string replaced.
 
 <p><h4>Syntax</h4>
-     color_rgb(<i>red, green, blue</i>)</p>
+     replace(<i>string,before,after</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  red</i> &rarr; the red component as an integer value from 0 to 255.<br>
-<i>  green</i> &rarr; the green component as an integer value from 0 to 255.<br>
-<i>  blue</i> &rarr; the blue component as an integer value from 0 to 255.<br>
+<i>  string</i> &rarr; is string.  The start string.<br>
+<i>  before</i> &rarr; is string.  The string to replace.<br>
+<i>  after</i> &rarr; is string.  The string that will replace <i>before</i><br></p>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     color_rgb(255,127,0) &rarr; '255,127,0'</p>
+     replace('QGIS SHOULD ROCK','SHOULD','DOES') &rarr; 'QGIS DOES ROCK'</p>
 </source>
-        <translation><h3>Funktion color_rgb()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Rot-, Gr&uuml;n-, Blauanteil zur&uuml;ck.
+        <translation><h3>Funktion replace()</h3>
+Liefert eine Zeichenkette in der die angegebene Zeichenkette ersetzt ist.
 
 <p><h4>Syntax</h4>
-     color_rgb(<i>rot, gr&uuml;n, blau</i>)</p>
+     replace(<i>zeichenkette,vorher,nachher</i>)</p>
 
 <p><h4>Argumente</h4>
-<i>  rot</i> &rarr; Der Rot-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
-<i>  gr&uuml;n</i> &rarr; Der Gr&uuml;n-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
-<i>  blau</i> &rarr; Der Blau-Anteil der Farbe, als ganze Zahl zwischen 0 und 255.<br>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die urspr&uuml;ngliche Zeichenkette.<br>
+<i>  vorher</i> &rarr; ist eine Zeichenkette.  Die zu ersetzende Zeichenkette.<br>
+<i>  nacher</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette durch die <i>vorher</i> ersetzen soll<br></p>
 
 <p><h4>Beispiel</h4>
-     color_rgb(255,127,0) &rarr; '#ff7f00'</p>
+<!-- Show example of function.-->
+     replace('QGIS SHOULD ROCK','SHOULD','DOES') &rarr; 'QGIS DOES ROCK'</p>
 </translation>
     </message>
     <message>
-        <source>
-<h3>color_cmyk() function</h3>
-Returns a string representation of a color based on its cyan, magenta, yellow and black components
+        <source><h3>Conditionals Group</h3>
+This group contains functions to handle conditional checks in expressions.
+</source>
+        <translation><h3>Gruppe Bedingungen</h3>
+Dies Gruppe enth&auml;lt Funktionen die mit Bedingungen umgehen.
+</translation>
+    </message>
+    <message>
+        <source><h3>abs() function</h3>
+Returns the absolute value of a number.<br>
 
-<p><h4>Syntax</h4>
-     color_cmyk(<i>cyan, magenta, yellow, black</i>)</p>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  cyan</i> &rarr; the cyan component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  magenta</i> &rarr; the magenta component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  yellow</i> &rarr; the yellow component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  black</i> &rarr; the black component of the color, as a percentage integer value from 0 to 100.<br>
+<h4>Syntax</h4>
+abs(<i>value</i>)<br>
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     color_cmyk(100,50,0,10) &rarr; '0,115,230'</p>
+<h4>Arguments</h4>
+<code>value</code> - a number.<br>
+
+<h4>Example</h4>
+<code>abs(-2) &rarr; 2</code><br>
 </source>
-        <translation><h3>Funktion color_cmyk()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Cyan-, Magenta- Gelb- und Schwarzanteil zur&uuml;ck.
+        <translation><h3>Funktion abs()</h3>
+Gibt den Betrag einer Zahl zur&uuml;ck.<br>
 
-<p><h4>Syntax</h4>
-     color_cmyk(<i>cyan, magenta, gelb, schwarz</i>)</p>
+<h4>Syntax</h4>
+abs(<i>wert</i>)<br>
 
-<p><h4>Argumente</h4>
-<i>  cyan</i> &rarr; Der Cyan-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  magenta</i> &rarr; Der Magenta-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  gelb</i> &rarr; Der Gelb-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  schwarz</i> &rarr; Der Schwarz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<h4>Argumente</h4>
+<code>wert</code> - ein Zahl.<br>
 
-<p><h4>Beispiel</h4>
-     color_cmyk(100,50,0,10) &rarr; '0,115,230'</p>
+<h4>Beispiel</h4>
+<code>abs(-2) &rarr; 2</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>intersection function</h3>
-Returns a geometry that represents the shared portion of geometry a and geometry b.
+        <source><h3>max() function</h3>
+Returns the largest value in a set of values.
 
 <h4>Syntax</h4>
-<pre>intersection( geometry a , geometry b)</pre>
+     max(<i>value<i>[,<i>value</i>...])
 
 <h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<!-- List args for functions here-->
+<i>  value</i> &rarr; a number.<br>
 
 <h4>Example</h4>
-<pre> geomToWKT( intersection( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 )' ))  )   &rarr; returns LINESTRING(3 3, 4 4)</pre>
+<!-- Show example of function.-->
+     max(2,10.2,5.5) &rarr; 10.2
 </source>
-        <translation><h3>Funktion intersection</h3>
-Gibt eine Geometrie zurück, die den gemeinsamen Teil der Geometrien a und b darstellt.
+        <translation><h3>Funktion max()</h3>
+Gibt den gr&ouml;&szlig;ten Wert eine Menge von Werte zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre>intersection( a, b)</pre>
+     max(<i>wert<i>[,<i>wert</i>...])
 
 <h4>Argumente</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<!-- List args for functions here-->
+<i>  wert</i> &rarr; eine Zahl.<br>
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( intersection( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 )' ))  )   &rarr; ergibt LINESTRING(3 3, 4 4)</pre></translation>
+<!-- Show example of function.-->
+     max(2,10.2,5.5) &rarr; 10.2
+</translation>
     </message>
     <message>
-        <source>
-<h3>ramp_color() function</h3>
-Returns a string representing a color from a color ramp. 
+        <source><h3>sqrt() function</h3>
+Returns square root of a value
+
 
 <p><h4>Syntax</h4>
-     ramp_color(<i>ramp_name,value</i>)</p>
+     sqrt(<i>real</i>)</p>
 
 <p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  ramp_name</i> &rarr; the name of the color ramp as a string, for example 'Spectral'.<br>
-<i>  value</i> &rarr; the position on the ramp to select the color from as a real number between 0 and 1.<br>
+<i>real</i> &rarr; number.</p>
 
 <p><h4>Example</h4>
-<!-- Show example of function.-->
-     ramp_color('Spectral',0.3) &rarr; '253,190,115,255'</p>
-
-<p><h4>Note:</h4>
-The color ramps available vary between QGIS installations.  This function
-may not give the expected results if you move your Quantum project.
-</p>
+     sqrt(9) &rarr; 3</p>
 </source>
-        <translation><h3>Funktion ramp_color()</h3>
-Gibt eine Farbe als Zeichenkette zur&uuml;ck, die eine Farbe aus einem Farbverlauf darstellt.
+        <translation><h3>Funktion sqrt()</h3>
+Gibt die Quadratwurzel eines Werts zur&uuml;ck.
+
 
 <p><h4>Syntax</h4>
-     ramp_color(<i>verlaufname,wert</i>)</p>
+     sqrt(<i>radikant</i>)</p>
 
 <p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  verlaufname</i> &rarr; der Name des Farbverlaufs als Zeichenkette, z.B. 'Spectral'.<br>
-<i>  wert</i> &rarr; die Position im Farbverlauf als Flie&szlig;kommazahl zwischen 0 und 1.<br>
+<i>radikant</i> &rarr; Zahl aus der die Wurzel gezogen werden soll.</p>
 
 <p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     ramp_color('Spectral',0.3) &rarr; '253,190,115,255'</p>
-
-<p><h4>Bemerkung:</h4>
-Die Farbverl&auml;ufe k&ouml;nnen sich zwischen verschiedenen QGIS-Installationen
-unterscheiden.  Diese Funktion kann daher unterschiedliche Ergebnisse liefern.
-</p>
+     sqrt(9) &rarr; 3</p>
 </translation>
     </message>
     <message>
-        <source><h3>IS expression</h3>
-Returns 1 if a is the same as b.
-
-<h4>Syntax</h4>
-<pre>a IS b</pre>
-
-<h4>Arguments</h4>
-None
-
-<h4>Example</h4>
-<pre> 'A' IS 'A'  &rarr; returns 1 </pre>
-<pre> 'A' IS 'a'  &rarr; returns 0 </pre>
-<pre> 4 IS 4      &rarr; returns 1 </pre>
-<pre> 4 IS 2+2    &rarr; returns 1 </pre>
-<pre> 4 IS 2      &rarr; returns 0 </pre>
-<pre> $geometry IS NULL  &rarr; returns 0, if your geometry is not NULL</pre>
-
+        <source><h3>Conditions Group</h3>
+This group contains functions that operate on condition.
 </source>
-        <translation><h3>Ausdruck IS</h3>
-Ergibt 1, wenn a gleich b ist.
-
-<h4>Syntax</h4>
-<pre>a IS b</pre>
-
-<h4>Argumente</h4>
-Keine
-
-<h4>Beispiel</h4>
-<pre> 'A' IS 'A'  &rarr; ergibt 1 </pre>
-<pre> 'A' IS 'a'  &rarr; ergibt 0 </pre>
-<pre> 4 IS 4      &rarr; ergibt 1 </pre>
-<pre> 4 IS 2+2    &rarr; ergibt 1 </pre>
-<pre> 4 IS 2      &rarr; ergibt 0 </pre>
-<pre> $geometry IS NULL  &rarr; ergibt 0, wenn die Geometrie nicht NULL ist</pre>
+        <translation><h3>Conditions Group</h3>
+This group contains functions that operate on condition.
 </translation>
     </message>
     <message>
-        <source><h3>color_hsv() function</h3>
-Returns a string representation of a color based on its hue, saturation, and value attributes
+        <source>
+<h3>color_cmyka() function</h3>
+Returns a string representation of a color based on its cyan, magenta, yellow, black and alpha (transparency) components
 
 <p><h4>Syntax</h4>
-     color_hsv(<i>hue, saturation, value</i>)</p>
+     color_cmyka(<i>cyan, magenta, yellow, black, alpha</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
-<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
-<i>  value</i> &rarr; the value percentage of the color as an integer from 0 to 100.<br>
+<i>  cyan</i> &rarr; the cyan component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  magenta</i> &rarr; the magenta component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  yellow</i> &rarr; the yellow component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  black</i> &rarr; the black component of the color, as a percentage integer value from 0 to 100.<br>
+<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     color_hsv(40,100,100) &rarr; '255,170,0'</p>
+     color_cmyka(100,50,0,10,200) &rarr; '0,115,230,200'</p>
 </source>
-        <translation><h3>Funktion color_hsl()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung und ihres Betrag zur&uuml;ck.
+        <translation><h3>Funktion color_cmyka()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Cyan-, Magenta- Gelb-,
+Schwarzanteil und Alpha-/Transparenzanteil zur&uuml;ck.
 
 <p><h4>Syntax</h4>
-     color_hsv(<i>farbton, s&auml;ttigung, betrag</i>)</p>
+     color_cmyk(<i>cyan, magenta, gelb, schwarz, alpha</i>)</p>
 
 <p><h4>Argumente</h4>
-<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
-<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  betrag</i> &rarr; Die Betrag der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  cyan</i> &rarr; Der Cyan-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  magenta</i> &rarr; Der Magenta-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  gelb</i> &rarr; Der Gelb-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  schwarz</i> &rarr; Der Schwarz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  alpha</i> &rarr; Der Alpha/Transparenz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
 
 <p><h4>Beispiel</h4>
-     color_hsv(40,100,100) &rarr; '255,170,0'</p></translation>
+     color_cmyka(100,50,0,10,200) &rarr; '0,115,230,200'</p>
+</translation>
     </message>
     <message>
-        <source><h3>ILIKE expression</h3>
-Returns 1 if the first parameter matches case-insensitive the supplied pattern. LIKE can be used instead of ILIKE to make the match case-sensitive. Works with numbers also.
-
+        <source><h3>format_number() function</h3>
+Returns a number formatted with the locale separator for thousands. 
+Also truncates the number to the number of supplied places. 
 <h4>Syntax</h4>
-<pre>string/number ILIKE pattern</pre>
+<code>format_number(number,places)</code><br>
 
 <h4>Arguments</h4>
-None
+<code>number</code> - is number. The number to be formatted.
+<br>
+<code>places</code> - is int. The number of decimal places to truncate the string
+to.
 
 <h4>Example</h4>
-<pre> 'A' ILIKE 'A'  &rarr; returns 1 </pre>
-<pre> 'A' ILIKE 'a'  &rarr; returns 1 </pre>
-<pre> 'A' ILIKE 'B'  &rarr; returns 0 </pre>
-</source>
-        <translation><h3>Ausdruck ILIKE</h3>
-Liefert 1, wenn der erste Parameter dem gegebenen Muster (ohne Berücksichtung der Groß-/Kleinschreibung) entspricht. LIKE kann statt ILIKE kann verwendet werden, wenn die Groß-/Kleinschreibung berücksichtigt werden soll. Funktioniert auch mit Zahlen.
+<!-- Show example of function.-->
+<code>format_number(10000000.332,2) &rarr; 10,000,000.33</code>
 
+</source>
+        <translation><h3>Funktion format_number()</h3>
+Liefert eine mit dem lokalen Tausendertrenner versehene Zahl zur&uuml;ck und
+beschr&auml;nkt die Zahl auch auf die angegebene Anzahl von Nachkommastellen.
 <h4>Syntax</h4>
-<pre>Zeichenkette/Zahl LIKE Muster</pre>
+<code>format_number(zahl,nachkommastellen)</code><br>
 
 <h4>Argumente</h4>
-keine
+<code>zahl</code> - ist Zahl. Die zu formatierende Zahl
+<br>
+<code>places</code> - ist Ganzzahl. Die Anzahl der Nachkommastellen.
 
 <h4>Beispiel</h4>
-<pre> 'A' ILIKE 'A'  &rarr; ergibt 1 </pre>
-<pre> 'A' ILIKE 'a'  &rarr; ergibt 1 </pre>
-<pre> 'A' ILIKE 'B'  &rarr; ergibt 0 </pre</translation>
+<!-- Show example of function.-->
+<code>format_number(10000000.332,2) &rarr; 10.000.000,33</code>
+
+</translation>
     </message>
     <message>
-        <source><h3>LIKE expression</h3>
-Returns 1 if the first parameter matches the supplied pattern. Works with numbers also.
+        <source><h3>year() function</h3>
+Extract the year part from a date, or the number of years
+from a <code>Interval</code>
 
 <h4>Syntax</h4>
-<pre>string/number LIKE pattern</pre>
+<code>year(date)</code><br>
+<code>year(Interval)</code><br>
 
 <h4>Arguments</h4>
-None
+<code>date</code> - is date or datetime. The date to extract the year from.
+<br>
+<code>Interval</code> - is Interval. The Interval to return the number of years from.
 
 <h4>Example</h4>
-<pre> 'A' LIKE 'A'  &rarr; returns 1 </pre>
-<pre> 'A' LIKE 'a'  &rarr; returns 0 </pre>
-<pre> 'A' LIKE 'B'  &rarr; returns 0 </pre>
+<!-- Show example of function.-->
+<code>year('2012-05-12') &rarr; 2012</code><br>
+<code>year(tointerval('3 Years')) &rarr; 3</code><br>
+<code>year(age('2012-01-01','2010-01-01')) &rarr; 1.9986..</code><br>
+
 </source>
-        <translation><h3>Ausdruck LIKE</h3>
-Ergibt 1m wenn der erste Parameter dem gegebenen Muster entspricht. Funktioniert auch mit Zahlen.
+        <translation><h3>Funktion year()</h3>
+Bestimmt das Jahr eines Datums oder die L&auml;nge eines <code>Intervals</code> in Jahren.
 
 <h4>Syntax</h4>
-<pre>Zeichenkette/Zahl LIKE Muster</pre>
+<code>year(date)</code><br>
+<code>year(Interval)</code><br>
 
 <h4>Argumente</h4>
-Keine
+<code>date</code> - ist date oder datetime. Das Datum dessen Jahr zur&uuml;ckgegeben werden soll.<br>
+<code>Interval</code> - ist Interval. Das Interval dessen L&auml;nge in Jahren zur&uuml;ckgegeben werden soll.
 
 <h4>Beispiel</h4>
-<pre> 'A' LIKE 'A'  &rarr; ergibt 1 </pre>
-<pre> 'A' LIKE 'a'  &rarr; ergibt 0 </pre>
-<pre> 'A' LIKE 'B'  &rarr; ergibt 0 </pre>
+<!-- Show example of function.-->
+<code>year('2012-05-12') &rarr; 2012</code><br>
+<code>year(tointerval('3 Years')) &rarr; 3</code><br>
+<code>year(age('2012-01-01','2010-01-01')) &rarr; 1.9986..</code><br>
+
 </translation>
     </message>
     <message>
-        <source><h3>ymin function</h3>
-Returns the minimum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>CASE expression</h3>
+A conditional expression that can be used to evaluate multiple expressions and
+return a result.
 
 <h4>Syntax</h4>
-<pre>ymin(geom)</pre>
+<pre>
+     CASE
+        WHEN <i>condition</i> THEN <i>result</i>
+        [ ...n ]
+        [ ELSE <i>result</i> ]
+     END
+</pre>
+[ ] marks optional components
 
 <h4>Arguments</h4>
-geom &rarr; a geometry
+<!-- List args for functions here-->
+<i>  WHEN condition</i> - The condition expression to evaluate. <br>
+<i>  THEN result</i> - If <i>condition</i> evaluates to True then <i>result</i> is evaluated and returned. <br>
+<i>  ELSE result</i> - If none of the above conditions evaluated to True then <i>result</i> is evaluated and returned. <br>
 
 <h4>Example</h4>
-<pre> ymin($geometry) &rarr; returns minimum y coordinate of $geometry</pre>
-
+<!-- Show example of function.-->
+<pre>
+    CASE
+        WHEN <i>"column" IS NULL</i> THEN <i>'None'</i>
+    END
+</pre>
 </source>
-        <translation><h3>Funktion ymin()</h3>
-Gibt den kleinste Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
+        <translation><h3>CASE Ausdruck</h3>
+Ist ein bedingter Ausdruck mit dem mehrere Ausdr&uuml;cken ausgewertet und ein
+Ergebnis zur&uuml;ckgegeben werden kann.
 
 <h4>Syntax</h4>
-<pre>ymin(geom)</pre>
+<pre>
+     CASE
+        WHEN <i>bedingung</i> THEN <i>ergebnis</i>
+        [ ...n ]
+        [ ELSE <i>ergebnis</i> ]
+     END
+</pre>
+[ ] markiert optionale Komponenten
 
 <h4>Argumente</h4>
 <!-- List args for functions here-->
-<i>  geom</i> &rarr; eine Geometrie.<br>
+<i>  WHEN bedingung</i> - Der Bedingungsausdruck. <br>
+<i>  THEN ergebnis</i> - Wenn die <i>bedingung</i> True ergibt, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
+<i>  ELSE ergebnis</i> - Wenn keine der Bedingungen erf&uuml;llt ist, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<pre>ymin($geometry) &rarr; ergibt die minimale Y-Koordinate von $geometry</pre></translation>
+<pre>
+    CASE
+        WHEN <i>"column" IS NULL</i> THEN <i>'Leer'</i>
+    END
+</pre>
+</translation>
     </message>
     <message>
-        <source><h3>geomFromGML function</h3>
-Returns a geometry from a GML representation of geometry
-
+        <source><h3>randf() function</h3>
+Returns a random float within the range specified by the minimum and 
+maximum argument (inclusive).
+<br>
+This function takes two arguments.
 <h4>Syntax</h4>
-<pre>geomFromGML(text)</pre>
+<code>randf(min, max)</code><br>
 
 <h4>Arguments</h4>
-text &rarr; GML representation of a geometry
+<code>min</code> - a float representing the smallest possible random number desired.<br>
+<code>max</code> - a float representing the largest possible random number desired.
+<br>
 
 <h4>Example</h4>
-<pre> geomFromGML( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; returns a geometry</pre>
-
+<!-- Show example of function.-->
+<code>randf(1, 10) &rarr; 4.59258286403147</code><br>
 </source>
-        <translation><h3>Funktion geomFromGML</h3>
-Gibt eine aus einer GML-Repräsentation erzeugte Geometrie zurück.
-
+        <translation><h3>Funktion randf()</h3>
+Gibt eine zuf&auml;llige Flie&szlig;kommazahl in den gegebenen Grenzen zur&uuml;ck (inklusiv).
+<br>
+Diese Funktion hat zwei Argumente.
 <h4>Syntax</h4>
-<pre>geomFromGML(text)</pre>
+<code>randf(min, max)</code><br>
 
 <h4>Argumente</h4>
-text &rarr; GML-Repräsentation einer Geometrie
+<code>min</code> - eine Flie&szlig;kommazahl, die die minimale Zufallszahl angibt.<br>
+<code>max</code> - eine Flie&szlig;kommazahl, die die maximale Zufallszahl angibt.<br>
+<br>
 
 <h4>Beispiel</h4>
-<pre> geomFromGML( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; ergibt eine Geometrie</pre>
-</translation>
-    </message>
-    <message>
-        <source><h3>Date and Time Group</h3>
-This group contains functions for handling date and time data.
-</source>
-        <translation><h3>Datum- und Zeitgruppe</h3>
-Diese Gruppe enth&auml;lt Funktionen zur Verarbeitung von Daten und Zeiten.
+<!-- Show example of function.-->
+<code>randf(1, 10) &rarr; 4.59258286403147</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>combine function</h3>
-Returns the combination of geometry a and geometry b.
+        <source><h3>scale_linear() function</h3>
+Transforms a given value from an input domain to an output range using linear interpolation. 
 
-<h4>Syntax</h4>
-<pre>combine( geometry a , geometry b)</pre>
+<p><h4>Syntax</h4>
+     scale_linear(<i>val</i>,<i>domain_min</i>,<i>domain_max</i>,<i>range_min</i>,<i>range_max</i>)</p>
 
-<h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  val</i> &rarr; is a value in the input domain. The function will return a corresponding scaled value in the output range.<br>
+<i>  domain_min, domain_max</i> &rarr; specify the input domain, the smallest and largest values the input <i>val</i> should take.<br>
+<i>  range_min, range_max</i> &rarr; specify the output range, the smallest and largest values which should be output by the function.<br>
 
 <h4>Example</h4>
-<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5 )' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4,  2 1 )' ))  )    &rarr; returns MULTILINESTRING((4 4, 2 1), (3 3, 4 4), (4 4, 5 5)) </pre>
-<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4  )' ) , geomFromWKT( 'LINESTRING(3 3 , 6 6,  2 1 )' ))  )  &rarr; returns LINESTRING(3 3, 4 4, 6 6, 2 1) </pre>
+<!-- Show example of function.-->
+     scale_linear(5,0,10,0,100) &rarr; 50<br>
+     scale_linear(0.2,0,1,0,360) &rarr; 72 <i>(eg, scaling a value between 0 and 1 to an angle between 0 and 360)</i><br>
+     scale_linear(1500,1000,10000,9,20) &rarr; 10.22 <i>(eg, scaling a population which varies between 1000 and 10000 to a font size between 9 and 20)</i><br>
+     
+     
 </source>
-        <translation><h3>Funktion combine</h3>
-Ergibt die Kombination der Geometrien a und b.
+        <translation><h3>Funktion scale_linear()</h3>
+Formt einen gegebenen Wert aus einem Ausgangsbereich mittels linearer Interpolation in einen Ausgabebereich um.
 
-<h4>Syntax</h4>
-<pre>combine( a , b)</pre>
+<p><h4>Syntax</h4>
+     scale_linear(<i>wert</i>,<i>quelle_min</i>,<i>quelle_max</i>,<i>ziel_min</i>,<i>ziel_max</i>)</p>
 
-<h4>Arguments</h4>
-geometry &rarr; Geometrie
-geometry &rarr; Geometrie
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  wert</i> &rarr; ein Wert im Ausgangsbereich. Die Funktion gibt den korrespondierenden skalierten Wert im Ausgabebereich zur&uuml;ck.<br>
+<i>  quelle_min, quelle_max</i> &rarr; legt den Ausgangsbereich fest - denn kleinsten und gr&ouml;&szlig;ten Wert in dem sich <i>wert</i> bewegt.<br>
+<i>  ziel_min, ziel_max</i> &rarr; legt den Ausgabebereich fest - denn kleinsten und gr&ouml;&szlig;ten Wert in dem sich das Funktionergebnis bewegt.<br>
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5 )' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4,  2 1 )' ))  )    &rarr; ergibt MULTILINESTRING((4 4, 2 1), (3 3, 4 4), (4 4, 5 5)) </pre>
-<pre> geomToWKT( combine( geomFromWKT( 'LINESTRING(3 3 , 4 4  )' ) , geomFromWKT( 'LINESTRING(3 3 , 6 6,  2 1 )' ))  )  &rarr; ergibt LINESTRING(3 3, 4 4, 6 6, 2 1) </pre></translation>
+<!-- Show example of function.-->
+     scale_linear(5,0,10,0,100) &rarr; 50<br>
+     scale_linear(0.2,0,1,0,360) &rarr; 72 <i>(z.B. um einen Wert zwischen 0 und 1 auf eine Winkel zwischen 0 und 360 skalieren)</i><br>
+     scale_linear(1500,1000,10000,9,20) &rarr; 10.22 <i>(z.B. um eine Bev&ouml;lkerungszahl zwischen 1000 und 10000 auf eine Schriftgr&ouml;&szlig;e zwischen 9 und 20 zu skalieren)</i><br>
+</translation>
     </message>
     <message>
-        <source><h3>intersects function</h3>
-Returns 1 if the geometries spatially intersect (share any portion of space) and 0 if they don't.
+        <source><h3>trim() function</h3>
+Removes all leading and trailing whitespace (spaces, tabs, etc) from a string.
 
-<h4>Syntax</h4>
-<pre>intersects( a, b )</pre>
+<p><h4>Syntax</h4>
+     trim(<i>string</i>)</p>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string. The string to trim.</p>
 
-<h4>Example</h4>
-<pre> intersects( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
-<pre> intersects( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'POINT(5 5)' ))             &rarr; returns 0</pre>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     trim('   hello world    ') &rarr; 'hello world'</p>
 </source>
-        <translation><h3>Funktion intersects</h3>
-Gibt 1 zurück, wenn die Geometrien sich räumlich überschneiden (d.h. einen Raum gemeinsam haben) und 0, wenn das nicht der Fall ist.
+        <translation><h3>Funktion trim()</h3>
+Entfernt f&uuml;hrende und schlie&szlig;ende Leerzeichen (Leerzeichen, Tabs usw.) aus einer Zeichenkette.
 
-<h4>Syntax</h4>
-<pre>intersects( a , b)</pre>
+<p><h4>Syntax</h4>
+     trim(<i>zeichenkette</i>)</p>
 
-<h4>Argumente</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; eine Zeichenkett. Zu k&uuml;rzende Zeichenkette.</p>
 
-<h4>Beispiel</h4>
-<pre> intersects( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 1</pre>
-<pre> intersects( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'POINT(5 5)' ))             &rarr; ergibt 0</pre>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     trim('   hallo welt    ') &rarr; 'hallo welt'</p>
 </translation>
     </message>
     <message>
-        <source><h3>clamp() function</h3>
-Restricts an input value to a specified range.
+        <source><h3>minute() function</h3>
+Extract the minute from a datetime or time, or the number of minutes
+from a <code>Interval</code>
 
-<p><h4>Syntax</h4>
-     clamp(<i>minimum</i>,<i>input</i>,<i>maximum</i>)</p>
+<h4>Syntax</h4>
+<code>minute(datetime)</code><br>
+<code>minute(Interval)</code><br>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  minimum</i> &rarr; The smallest value <i>input</i> is allowed to take.<br>
-<i>  input</i> &rarr; a value which will be restricted to the range specified by <i>minimum</i> and <i>maximum</i>.<br>
-<i>  maximum</i> &rarr; The largest value <i>input</i> is allowed to take.<br>
+<h4>Arguments</h4>
+<code>date</code> - is datetime or time. The date to extract the minute from.
+<br>
+<code>Interval</code> - is Interval. The Interval to return the number of minutes from.
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-     clamp(1,5,10) &rarr; 5 (<i>input</i> is between 1 and 10 so is returned unchanged)<br>
-     clamp(1,0,10) &rarr; 1 (<i>input</i> is less than minimum value of 1, so function returns 1)<br>
-     clamp(1,11,10) &rarr; 10 (<i>input</i> is greater than maximum value of 10, so function returns 10)<br>
-     
-     
+<code>minute('2012-07-22T13:24:57') &rarr; 24</code><br>
+<code>minute(tointerval('3 minutes')) &rarr; 3</code><br>
+<code>minute(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 20</code><br>
+<code>minute(age('2012-01-01','2010-01-01')) &rarr; 1051200</code><br>
+
 </source>
-        <translation><h3>clamp() Funktion</h3>
-Eingabewert auf eine gegebenen Bereich beschränken.
+        <translation><h3>Funktion minute()</h3>
+Bestimmt die Minute eines Datums/Zeit oder die Anzahl der Minuten
+eines <code>Intervalls</code>
 
-<p><h4>Syntax</h4>
-     clamp(<i>minimum</i>,<i>wert</i>,<i>maximum</i>)</p>
+<h4>Syntax</h4>
+<code>minute(datetime)</code><br>
+<code>minute(Intervall)</code><br>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  minimum</i> &rarr; Der kleinste Wert, den die Rückgabe annehmen kann.<br>
-<i>  wert</i> &rarr; ein Wert der auf den Bereich zwischen <i>minimum</i> und <i>maximum</i> beschränkt wird.<br>
-<i>  maximum</i> &rarr; Der größte Wert, den die Rückgabe annehmen kann.<br>
+<h4>Argumente</h4>
+<code>datetime</code> - ist datetime oder time. Das Datum aus der die Minute bestimmt werden soll.<br>
+<code>Interval</code> - is Interval. Das Intervall aus dem die Minutenanzahl bestimmt werden soll.
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-     clamp(1,5,10) &rarr; 5 (<i>wert</i> ist zwischen 1 und 10 und wird daher unverändert zurückgegeben)<br>
-     clamp(1,0,10) &rarr; 1 (<i>wert</i> ist kleiner als das Minimum 1, daher wird 1 zurückgegeben)<br>
-     clamp(1,11,10) &rarr; 10 (<i>wert</i> ist größer als das Maximum 10, daher wird 10 zurückgegeben)<br>
-     
+<code>minute('2012-07-22T13:24:57') &rarr; 24</code><br>
+<code>minute(tointerval('3 minutes')) &rarr; 3</code><br>
+<code>minute(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 20</code><br>
+<code>minute(age('2012-01-01','2010-01-01')) &rarr; 1051200</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>disjoint function</h3>
-Returns 1 if the geometries do not "spatially intersect" - if they do not share any space together. 
-
+        <source><h3>age() function</h3>
+Returns the difference between two dates.
+<br><br>
+The difference is returned as a <code>Interval</code> 
+and needs to be used with one of the following functions
+in order to extract useful information:
+<ul>
+<li><code>year</code>
+<li><code>month</code>
+<li><code>week</code>
+<li><code>day</code>
+<li><code>hour</code>
+<li><code>minute</code>
+<li><code>second</code>
+</ul>
 <h4>Syntax</h4>
-<pre>disjoint( a, b )</pre>
+<code>age(string,string)</code><br>
+<code>age(datetime,datetime)</code><br>
+<code>age(string,datetime)</code><br>
+<code>age(datetime,string)</code><br>
 
 <h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<code>string</code> - is string. A string in date format.
+<br>
+<code>datetime</code> - is date or datetime. A date or datetime type.
 
 <h4>Example</h4>
-<pre> disjoint( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; returns 1</pre>
-<pre> disjoint( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'POINT(4 4)' ))                              &rarr; returns 0</pre>
-</source>
-        <translation><h3>Funktion disjoint</h3>
-Gibt 1 zurück, wenn die Geometrien sich nicht räumlich überschneiden - d.h. wenn sie keinen gemeinsamen Raum haben.
+<!-- Show example of function.-->
+<code>age('2012-05-12','2012-05-2') &rarr; Interval</code><br>
+use <code>day</code> to extract number of days<br>
+<code>day(age('2012-05-12','2012-05-2')) &rarr; 10</code><br>
 
+</source>
+        <translation><h3>Funktion age()</h3>
+Gibt den Unterschied zwischen zwei Daten zur&uuml;ck.
+<br><br>
+Der Unterschied wird als <code>Intervall</code> zur&uuml;ckgegeben
+und mu&szlig; mit folgenden Funktionen weiterverarbeitet werde, um
+sinnvolle Informationen zu erhalten:
+><code>year</code>
+<li><code>month</code>
+<li><code>week</code>
+<li><code>day</code>
+<li><code>hour</code>
+<li><code>minute</code>
+<li><code>second</code>
+</ul>
 <h4>Syntax</h4>
-<pre>disjoint( a, b )</pre>
+<code>age(zeichenkette,zeichenkette)</code><br>
+<code>age(datetime,datetime)</code><br>
+<code>age(zeichenkette,datetime)</code><br>
+<code>age(datetime,zeichenkette)</code><br>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<h4>Argumente</h4>
+<code>zeichenkette</code> - ist string. Eine Zeichenkette in Datumsformat. <br>
+<code>datetime</code> - ist date oder datetime. Eine Datums oder eine Zeit.
 
 <h4>Beispiel</h4>
-<pre> disjoint( geomFromWKT( 'POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; ergibt 1</pre>
-<pre> disjoint( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'POINT(4 4)' ))                              &rarr; ergibt 0</pre>
+<!-- Show example of function.-->
+<code>age('2012-05-12','2012-05-2') &rarr; Intervall</code><br>
+<code>day</code> benutzen um die Anzahl der Tage zur bestimmen<br>
+<code>day(age('2012-05-12','2012-05-2')) &rarr; 10</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>geomFromWKT function</h3>
-Returns a geometry created from a Well-Known Text (WKT) representation.
-
+        <source><h3>log10() function</h3>
+Returns the value of the base 10 logarithm of the passed expression.
+<br>
+This function takes one argument.
 <h4>Syntax</h4>
-<pre>geomFromWKT(text)</pre>
+<code>log10(value)</code><br>
 
 <h4>Arguments</h4>
-text &rarr; Well-Known Text (WKT) representation of a geometry
+<code>value</code> - any positive number.
+<br>
 
 <h4>Example</h4>
-<pre> geomFromWKT( 'POINT(4 5)' ) &rarr; returns a geometry</pre>
-
+<!-- Show example of function.-->
+<code>log10(1) &rarr; 0</code><br>
+<code>log10(100) &rarr; 2</code><br>
 </source>
-        <translation><h3>Funktion geomFromWKT</h3>
-Erzeugt aus einer Well-Known-Text-Repräsentation (WKT) eine Geometrie.
-
+        <translation><h3>Funktion log10()</h3>
+Gibt den Logarithmus des &uuml;bergebenen Wertes zur Basis 10 zur&uuml;ck.
+<br>
+Diese Funktion akzeptiert ein Argument.
 <h4>Syntax</h4>
-<pre>geomFromWKT(text)</pre>
+<code>log10(wert)</code><br>
 
 <h4>Argumente</h4>
-text &rarr; Well-Known Text-Repräsentation (WKT) einer Geometrie
+<code>wert</code> - eine positive Zahl.
+<br>
 
 <h4>Beispiel</h4>
-<pre> geomFromWKT( 'POINT(4 5)' ) &rarr; ergibt eine Geometrie</pre>
+<!-- Show example of function.-->
+<code>log10(1) &rarr; 0</code><br>
+<code>log10(100) &rarr; 2</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>buffer function</h3>
-Returns a geometry that represents all points whose distance from this geometry is less than or equal to distance. Calculations are in the Spatial Reference System of this Geometry. 
+        <source><h3>Conversions Group</h3>
+This group contains functions to convert on data type to another e.g string to integer, integer to string.
+</source>
+        <translation><h3>Umwandlungsgruppe</h3>
+Diese Gruppe enth&auml;lt Funktionen, die einen Datentypen in einen anderen umwandeln (z.B. Zeichenketten zu Ganzzahlen oder zur&uuml;ck).
+</translation>
+    </message>
+    <message>
+        <source><h3>cos() function</h3>
+Returns cosinus of an angle.
 
-<h4>Syntax</h4>
-<pre>buffer(a, b)</pre>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; distance for the buffer
+<p><h4>Syntax</h4>
+     cos(<i>real</i>)</p>
 
-<h4>Example</h4>
-<pre> buffer($geometry, 10.5 ) &rarr; returns a polygon</pre>
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; angle in radians.</p>
 
+<p><h4>Example</h4>
+     cos(1.571) &rarr; 0.000796326710733263</p>
 </source>
-        <translation><h3>Funktion buffer</h3>
-Gibt eine Geometrie zurück, die alle Punkte enthält, deren Abstand von der Geometrie kleiner gleich dem gegebenen Wert sind. Die Berechungen beziehen sich auf das räumliche Bezugssystem der Geometrie.
-
-<h4>Syntax</h4>
-<pre>buffer(a,b)</pre>
+        <translation><h3>Funktion cos()</h3>
+Gibt den Cosinus eines Winkels zur&uuml;ck.
 
-<h4>Arguments</h4>
-a &rarr; Geometrie
-b    &rarr; Distanz
+<p><h4>Syntax</h4>
+     cos(<i>winkel</i>)</p>
 
-<h4>Beispiel</h4>
-<pre> buffer($geometry, 10.5 ) &rarr; ergibt ein Polygon</pre>
+<p><h4>Argumente</h4>
+<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
 
+<p><h4>Beispiel</h4>
+     cos(1.571) &rarr; 0.000796326710733263</p>
 </translation>
     </message>
     <message>
-        <source><h3>$atlasfeature function</h3>
-In atlas generation, returns the current feature that is iterated over on the coverage layer. This can be used with the 'attribute' function
-to return attribute values from the current atlas feature.
+        <source><h3>Operators Group</h3>
+This group contains operators e.g + - * 
+</source>
+        <translation><h3>Gruppe Operatoren</h3>
+Die Gruppe enth&auml;lt Operatoren (z.B. +, - und *)
+</translation>
+    </message>
+    <message>
+        <source><h3>second() function</h3>
+Extract the seconds from a datetime or time, or the number of seconds
+from a <code>Interval</code>
 
 <h4>Syntax</h4>
-<pre>$atlasfeature</pre>
+<code>second(datetime)</code><br>
+<code>second(Interval)</code><br>
 
 <h4>Arguments</h4>
-None
+<code>date</code> - is datetime or time. The date to extract the second from.
+<br>
+<code>Interval</code> - is Interval. The Interval to return the number of seconds from.
 
 <h4>Example</h4>
-<pre>attribute( $atlasfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current atlas feature</pre>
+<!-- Show example of function.-->
+<code>second('2012-07-22T13:24:57') &rarr; 57</code><br>
+<code>second(tointerval('3 seconds')) &rarr; 3</code><br>
+<code>second(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 1200</code><br>
+<code>second(age('2012-01-01','2010-01-01')) &rarr; 63072000</code><br>
 
 </source>
-        <translation><h3>Funktion $atlasfeature</h3>
-Bei der Atlas-Erzeugung gib es das aktuelle Objekts beim Durchlaufen des Decklayer zurück. Es kann mit der Funktion 'attribute' verwendet werden, um die Attributwerte des aktuellen Atlas-Objekts zu erhalten.
+        <translation><h3>Funktion second()</h3>
+Bestimmt die Sekunde eines Datums/Zeit oder die Anzahl der Sekunden
+aus einem <code>Intervall</code>
 
 <h4>Syntax</h4>
-<pre>$atlasgeometry</pre>
+<code>second(datetime)</code><br>
+<code>second(Intervall)</code><br>
 
 <h4>Argumente</h4>
-Kein
+<code>date</code> - ist datetime oder time. Das Datum dessen Sekunden bestimmt werden sollen.<br>
+<code>Intervall</code> - ist Interval. Ergib die Intervalll&auml;nge in Sekunden.
+
+<h4>Beispiele</h4>
+<!-- Show example of function.-->
+<code>second('2012-07-22T13:24:57') &rarr; 57</code><br>
+<code>second(tointerval('3 seconds')) &rarr; 3</code><br>
+<code>second(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 1200</code><br>
+<code>second(age('2012-01-01','2010-01-01')) &rarr; 63072000</code><br>
 
-<h4>Beispiel</h4>
-<pre> attribute( $atlasfeature, 'name' ) &rarr; ergibt den Wert des Attributs 'name' des aktuellen Atlas-Objekts</pre>
 </translation>
     </message>
     <message>
-        <source><h3>$currentfeature function</h3>
-Returns the current feature being evaluated. This can be used with the 'attribute' function
-to evaluate attribute values from the current feature.
+        <source><h3>atan() function</h3>
+Returns arcustanget of a value in radians.
 
-<h4>Syntax</h4>
-<pre>$currentfeature</pre>
 
-<h4>Arguments</h4>
-None
+<p><h4>Syntax</h4>
+     atan(<i>real</i>)</p>
 
-<h4>Example</h4>
-<pre>attribute( $currentfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current feature</pre>
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; tan of an angle.</p>
 
+<p><h4>Example</h4>
+     atan(0.5) &rarr; 0.463647609000806</p>
 </source>
-        <translation><h3>Funktion $currentfeature</h3>
-Gibt das Objekt zurück, dass gerade ausgewertet wird. Dies kann mit der Funktion 'attribute' benutzt werden um die Attributwerte des aktuellen Objekts zu bestimmen.
+        <translation><h3>Funktion atan()</h3>
+Gibt den Arcustanget eines Werts im Bogenma&szlig; zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>$currentfeature</pre>
 
-<h4>Argumente</h4>
-Keine
+<p><h4>Syntax</h4>
+     atan(<i>zahl</i>)</p>
 
-<h4>Beispiel</h4>
-<pre>attribute( $currentfeature, 'name' ) &rarr; geibt den Wert des Attributs 'name' des aktuellen Objekts zurück</pre></translation>
+<p><h4>Argumente</h4>
+<i>zahl</i> &rarr; Tangens eines Winkels.</p>
+
+<p><h4>Beispiel</h4>
+     atan(0.5) &rarr; 0.463647609000806</p>
+</translation>
     </message>
     <message>
-        <source><h3>$id function</h3>
-Returns the feature id of the current row.
+        <source><h3>$length function</h3>
+Returns the length of the current feature.
 
 <h4>Syntax</h4>
-<pre>$id</pre>
+<pre>$length</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre>$id &rarr; 42</pre>
-
+<pre>$length &rarr; 42.4711</pre>
 </source>
-        <translation><h3>Funktion $id</h3>
-Liefert die Feature-ID des aktuellen Objekts zur&uuml;ck.
+        <translation><h3>Funktion $length</h3>
+Liefert die L&auml;nge der aktuellen Geometrie.
 
 <h4>Syntax</h4>
-<pre>$id</pre>
+<pre>$length</pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre>$id &rarr; 42</pre>
+<pre>$length &rarr; 42.4711</pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>$uuid function</h3>
-Generates a Universally Unique Identifier (UUID) for each row using the Qt
-<a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a>
-method.  Each UUID is 38 characters long.
+        <source><h3>title() function</h3>
+Converts all words of a string to title case (all words lower case with leading
+capital letter).
 
-<h4>Syntax</h4>
-<pre>$uuid</pre>
+<p><h4>Syntax</h4>
+     title(<i>string</i>)</p>
 
-<h4>Arguments</h4>
-None
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The string to convert to title case.</p>
 
-<h4>Example</h4>
-<pre>$uuid &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     upper('hello WOrld') &rarr; 'Hello World'</p>
 </source>
-        <translation><h3>Funktion $uuid</h3>
-Generiert eine universal eindeutige Kennung (UUID) mit der Qt-Methode <a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a> für jede Zeile.  Jede Kennung ist 38 Zeichen lang.
+        <translation><h3>Funktion title()</h3>
+Wandelt alle Worte einer Zeichenkette in Kleinbuchstaben mit gro&szlig;em Anfangsbuchstaben um.
 
-<h4>Syntax</h4>
-<pre>$uuid</pre>
+<p><h4>Syntax</h4>
+     title(<i>zeichenkette</i>)</p>
 
-<h4>Argumente</h4>
-Keine
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, deren Worte in Kleinbuchstaben mit gro&szlig;em Anfangsbuchstaben umgewandelt werden.</p>
 
-<h4>Beispiel</h4>
-<pre>$uuid &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre></translation>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     title('hello WOrld') &rarr; 'Hello World'</p>
+</translation>
     </message>
     <message>
-        <source><h3>IN expression</h3>
-Returns 1 if value is found within a list of values
-
-<h4>Syntax</h4>
-<pre>'a' IN ('a', 'b')</pre>
+        <source><h3>regexp_match() function</h3>
+Returns true if any part of a string matches the supplied regular expression.
 
-<h4>Arguments</h4>
-None
+<p><h4>Syntax</h4>
+     regexp_match(<i>string,regex</i>)</p>
 
-<h4>Example</h4>
-<pre> 'A' IN ('A','B") &rarr; returns 1 </pre>
-<pre> 'A' IN ('C','B") &rarr; returns 0 </pre>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The string to test against the regular expression.<br>
+<i>  regex</i> &rarr; is string.  The regular expression to test against. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
 
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     regexp_match('QGIS ROCKS','&#92;&#92;sROCKS') &rarr; 1</p>
 </source>
-        <translation><h3>IN Asudruck</h3>
-Gibt 1 zurück wenn der Wert in einer Liste von Werten gefunden wird
+        <translation><h3>Funktion regexp_match()</h3>
+Gibt 1 zur&uuml;ck, wenn irgendein Teil der Zeichenkette dem gegebenen regul&auml;ren Ausdruck entspricht.
 
-<h4>Syntax</h4>
-<pre>'a' IN ('a', 'b')</pre>
+<p><h4>Syntax</h4>
+     regexp_match(<i>zeichenkette,regex</i>)</p>
 
-<h4>Argumente</h4>
-Keine
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; eine Zeichenkette.  Die Zeichenkette, die mit dem regul&auml;ren Ausdruck verglichen werden soll.<br>
+<i>  regex</i> &rarr; eine Zeichenkette.  Der regul&auml;re Ausdruck mit dem verglichen werden. Backslash-Zeichen m&uuml;ssen doppelt ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r ein Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
 
-<h4>Beispiele</h4>
-<pre> 'A' IN ('A','B") &rarr; ergibt 1 </pre>
-<pre> 'A' IN ('C','B") &rarr; ergibt 0 </pre>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     regexp_match('QGIS ROCKT','&#92;&#92;sROCKT') &rarr; 1</p>
 </translation>
     </message>
     <message>
-        <source><h3>attribute function</h3>
-Returns the value of a specified attribute from a feature.
-
-<h4>Syntax</h4>
-<pre>attribute( feature, attribute_name )</pre>
+        <source><h3>substr() function</h3>
+Return a part of a string
 
-<h4>Arguments</h4>
-feature &rarr; a feature<br />
-attribute_name &rarr; name of attribute to be returned
+<p><h4>Syntax</h4>
+     substr(<i>string,startpos,length</i>)</p>
 
-<h4>Example</h4>
-<pre>attribute( $currentfeature, 'name' ) &rarr; returns value stored in 'name' attribute for the current feature</pre>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The full string.<br>
+<i>  startpos</i> &rarr; is number.  The start position to extract from.<br>
+<i>  length</i> &rarr; is number.  The length of the string to extract.<br></p>
 
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     substr('HELLO WORLD',3,5) &rarr; 'LLO W'</p>
 </source>
-        <translation><h3>Function attribut</h3>
-Gibt den Wert des angegebenen Attributs eines Objekts zurück.
+        <translation><h3>Funktion substr()</h3>
+Liefert einen Teil einer Zeichenkette
 
-<h4>Syntax</h4>
-<pre>attribute( feature, attribute_name )</pre>
+<p><h4>Syntax</h4>
+     substr(<i>zeichenkette,startpos,l&auml;nge</i>)</p>
 
-<h4>Argumente</h4>
-feature &rarr; ein Objekt<br />
-attribute_name &rarr; Name des zurückzugebenden Attributs
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die vollst&auml;ndige Zeichenkette.<br>
+<i>  startpos</i> &rarr; ist eine Zahl.  Die Startposition des Teils.<br>
+<i>  l&auml;nge</i> &rarr; ist eine Zahl.  Die L&auml;nge des Teils.<br></p>
 
-<h4>Beispiel</h4>
-<pre>attribute( $currentfeature, 'name' ) &rarr; gibt den Wert des Attributs 'name' des aktuellen Objekts zurück</pre></translation>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     substr('HELLO WORLD',3,5) &rarr; 'LLO W'</p>
+</translation>
     </message>
     <message>
-        <source><h3>crosses function</h3>
-Returns 1 if the supplied geometries have some, but not all, interior points in common.
+        <source><h3>format() function</h3>
+Format a string using supplied arguments. 
 
 <h4>Syntax</h4>
-<pre>crosses( $geometry , $geometry)</pre>
+<code>format('string', arg, [arg...n])</code><br>
 
 <h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<code>string</code> - is string.  String with Qt QString place holders.  Use %1, %2, etc for placeholders. Placeholders can be repeated. 
+<br>
+<code>arg [arg...n]</code> - any type. Any number of args. 
 
 <h4>Example</h4>
-<pre> crosses( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 3)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
-<pre> crosses( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))             &rarr; returns 0</pre>
-</source>
-        <translation><h3>Funktion crosses</h3>
-Gibt 1 zurück, wenn die übergebenen Geometrien einige aber nicht alle innere Punkten gemeinsam haben.
+<!-- Show example of function.-->
+<code>format('This %1 a %2','is', 'test') &rarr; This is a test</code><br></source>
+        <translation><h3>Funktion format()</h3>
+Formatiert eine Zeichenkette mit den gegebenen Argumenten.
 
 <h4>Syntax</h4>
-<pre>crosses( $geometry , $geometry)</pre>
+<code>format('zeichenkette', arg, [arg...n])</code><br>
 
 <h4>Argumente</h4>
-geometry &rarr; Geometrie
-geometry &rarr; Geometrie
+<code>zeichenkette</code> - ist eine Zeichenkette.  Zeichenkette mit Qt QString Platzhaltern.  %1, %2, usw. als Platzhalter. Platzhalter k&ouml;nnen sich wiederholen.
+<br>
+<code>arg [arg...n]</code> - jeder Typ. Beliebige Anzahl von Argumenten
 
-<h4>Beispiele</h4>
-<pre> crosses( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 3)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; gibt 1 zurück</pre>
-<pre> crosses( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))             &rarr; gibt 0 zurück</pre>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>format('Dies %1 ein %2','ist', 'Test') &rarr; Dies ist ein Test</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>geomToWKT function</h3>
-Returns the Well-Known Text (WKT) representation of the geometry without SRID metadata.
+        <source><h3>regexp_replace() function</h3>
+Returns a string with the supplied regular expression replaced.
 
-<h4>Syntax</h4>
-<pre>geomToWKT(a)</pre>
+<p><h4>Syntax</h4>
+     regexp_replace(<i>string,regex,after</i>)</p>
 
-<h4>Arguments</h4>
-a &rarr; geometry
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The start string.<br>
+<i>  regex</i> &rarr; is string.  The regular expression to replace. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
+<i>  after</i> &rarr; is string.  The string that will replace any matching occurences of the supplied regular expression. Captured groups can be inserted into the replacement string using &#92;&#92;1, &#92;&#92;2, etc. <br></p>
 
-<h4>Example</h4>
-<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     regexp_replace('QGIS SHOULD ROCK','&#92;&#92;sSHOULD&#92;&#92;s',' DOES ') &rarr; 'QGIS DOES ROCK'</p>
 </source>
-        <translation><h3>Funktion geomToWKT</h3>
-Ergibt die Well-Known-Text-Darstellung (WKT) der Geometrie ohne räumlichen Bezugssystem zurück.
+        <translation><h3>Funktion regexp_replace()</h3>
+Liefert eine Zeichenkette in der der angegebene regul&auml;re Ausdruck ersetzt wurde.
 
-<h4>Syntax</h4>
-<pre>geomToWKT(a)</pre>
+<p><h4>Syntax</h4>
+     regexp_replace(<i>a</i>, <i>streiche</i>, <i>setze</i>)
 
-<h4>Argumente</h4>
-a &rarr;  Geometriee
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>a</i> &rarr; ist string.  Die urspr&uuml;ngliche Zeichenkette.<br>
+<i>streiche</i> &rarr; ist string.  Die zu ersetzende regul&auml;re Ausdruck. Backslash-Zeichen m&uuml;ssen doppelt ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r ein Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
+<i>setze</i> &rarr; ist string.  Die Zeichenkette durch die <i>streiche</i> ersetzt werden soll<br></p>
 
-<h4>Beispiel</h4>
-<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>regexp_replace('QGIS SHOULD ROCK','(SHOULD)','DOES (was:&#92;1)')</pre> &rarr; 'QGIS DOES (was: SHOULD) ROCK'
 </translation>
     </message>
     <message>
-        <source><h3>getFeature function</h3>
-Returns the first feature of a layer matching a given attribute value
+        <source><h3>regexp_substr() function</h3>
+Returns the portion of a string which matches a supplied regular expression.
 
-<h4>Syntax</h4>
-<pre>getFeature( layer, attributeField, value )</pre>
+<p><h4>Syntax</h4>
+     regexp_substr(<i>string,regex</i>)</p>
 
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The input string.<br>
+<i>  regex</i> &rarr; is string.  The regular expression to match against. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
+
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     regexp_substr('abc123','(&#92;&#92;d+)') &rarr; '123'</p>
 </source>
-        <translation><h3>Funktion getFeature</h3>
-Gibt des erste Objekt des Layers zurück, das denn gegebenen Attribute entspricht
+        <translation><h3>Funktion regexp_substr()</h3>
+Liefert den Teil einer Zeichenkette zur&uuml;ck, die dem gegebenen regul&auml;ren Ausdruck entspricht.
 
-<h4>Syntax</h4>
-<pre>getFeature( layer, attributFeld, wert )</pre>
+<p><h4>Syntax</h4>
+     regexp_substr(<i>zeichenkette,regex</i>)</p>
 
- </translation>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; eine Zeichenkette.  Die Eingabezeichenkette.<br>
+<i>  regex</i> &rarr; eine Zeichenkette.  Der anzuwendende regul&auml;re Ausdruck. Backslash-Zeichen m&uuml;ssen doppelte ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
+
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     regexp_substr('abc123','(&#92;&#92;d+)') &rarr; '123'</p>
+</translation>
     </message>
     <message>
-        <source><h3>touches function</h3>
-Returns 1 if the geometries have at least one point in common, but their interiors do not intersect.
+        <source><h3>$y function</h3>
+Returns the y coordinate of the current feature.
 
 <h4>Syntax</h4>
-<pre>touches( a, b )</pre>
+<pre>$y</pre>
 
 <h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+None
 
 <h4>Example</h4>
-<pre> touches( geomFromWKT( 'LINESTRING(5 3 , 4 4)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 1</pre>
-<pre> touches( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))                     &rarr; returns 0</pre>
+<pre>$y &rarr; 42</pre>
+
 </source>
-        <translation><h3>Funktion touches</h3>
-Gibt 1 zurück, wenn die übergebenen Geometrie mindestens einen Punkt gemeinsam haben, aber es keine gemeinsamen inneren Punkte gibt.
+        <translation><h3>Funktion $y</h3>
+Liefert die Y-Koordinate des aktuellen Objekts zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre>touches( $geometry , $geometry)</pre>
+<pre>$y</pre>
 
 <h4>Argumente</h4>
-geometry &rarr; Geometrie
-geometry &rarr; Geometrie
+Keine
 
 <h4>Beispiel</h4>
-<pre> touches( geomFromWKT( 'LINESTRING(5 3 , 4 4)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 1</pre>
-<pre> touches( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(5 5)' ))                     &rarr; ergibt 0</pre></translation>
+<pre>$y &rarr; 42</pre>
+
+</translation>
     </message>
     <message>
-        <source><h3>overlaps function</h3>
-Returns 1 if the geometries share space, are of the same dimension, but are not completely contained by each other.
+        <source>
+<h3>color_rgba() function</h3>
+Returns a string representation of a color based on its red, green, blue, and alpha (transparency) components
 
-<h4>Syntax</h4>
-<pre>overlaps( a, b )</pre>
+<p><h4>Syntax</h4>
+     color_rgba(<i>red, green, blue, alpha</i>)</p>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  red</i> &rarr; the red component as an integer value from 0 to 255.<br>
+<i>  green</i> &rarr; the green component as an integer value from 0 to 255.<br>
+<i>  blue</i> &rarr; the blue component as an integer value from 0 to 255.<br>
+<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
 
-<h4>Example</h4>
-<pre> overlaps( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 5 , 5 3)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))   &rarr; returns 1</pre>
-<pre> overlaps( geomFromWKT( 'LINESTRING(0 0 , 1 1)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; returns 0</pre>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     color_rgba(255,127,0,200) &rarr; '255,127,0,200'</p>
 </source>
-        <translation><h3>Funktion overlaps</h3>
-Gibt 1 zurück, wenn die Geometrien gemeinsamen Raum haben, von gleicher Dimension, aber nicht komplett ineinander enthalten sind.
+        <translation><h3>Funktion color_rgba()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Rot-, Gr&uuml;n-, Blauanteil und ihrer Transparenz zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>overlaps( a, b)</pre>
+<p><h4>Syntax</h4>
+     color_rgba(<i>rot, gr&uuml;n, blau, alpha</i>)</p>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<p><h4>Argumente</h4>
+<i>  rot</i> &rarr; Der Rot-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
+<i>  gr&uuml;n</i> &rarr; Der Gr&uuml;n-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
+<i>  blau</i> &rarr; Der Blau-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
+<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganze Zahl zwischen 0 (g&auml;nzlich transparent) und 256 (volldeckend).<br>
 
-<h4>Beispiel</h4>
-<pre> overlaps( geomFromWKT( 'LINESTRING(3 5 , 4 4 , 5 5 , 5 3)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))   &rarr; ergibt 1</pre>
-<pre> overlaps( geomFromWKT( 'LINESTRING(0 0 , 1 1)'  ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ))    &rarr; ergibt 0</pre>
+<p><h4>Beispiel</h4>
+     color_rgba(255,127,0,200) &rarr; '255,127,0,200'</p>
 </translation>
     </message>
     <message>
-        <source><h3>AND logical operator</h3>
-Returns 1 when condition a and b are true.
+        <source><h3>$x function</h3>
+Returns the x coordinate of the current feature.
 
 <h4>Syntax</h4>
-<pre> condition a AND condition b </pre>
+<pre>$x</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre> 4 = 2+2 AND 1 = 1  &rarr; returns 1 </pre>
-<pre> 4 = 2+2 AND 1 = 2  &rarr; returns 0 </pre>
+<pre>$x &rarr; 42</pre>
 
 </source>
-        <translation><h3>Logischer Operator AND</h3>
-Ergibt 1, wenn die Bedingungen a und b erfüllt sind.
+        <translation><h3>Funktion $x</h3>
+Liefert die X-Koordinate des aktuellen Punkts zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre> bedingung a AND bedingung b </pre>
+<pre>$x</pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre> 4 = 2+2 AND 1 = 1  &rarr; ergibt 1 </pre>
-<pre> 4 = 2+2 AND 1 = 2  &rarr; ergibt 0 </pre>
+<pre>$x &rarr; 42</pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>$geometry function</h3>
-Returns the geometry of the current feature. Can be used for processing with other functions.
+        <source><h3>Math Group</h3>
+This group contains math functions e.g square root, sin and cos
+</source>
+        <translation><h3>Gruppe Mathematik</h3>
+Die Gruppe enth&auml;lt mathematische Funktionen (z.B. Quadratwurzel, Sinus und Cosinus)
+</translation>
+    </message>
+    <message>
+        <source><h3>min() function</h3>
+Returns the smallest value in a set of values.
 
 <h4>Syntax</h4>
-<pre>$geometry</pre>
+     min(<i>value<i>[,<i>value</i>...])
 
 <h4>Arguments</h4>
-None
+<!-- List args for functions here-->
+<i>  value</i> &rarr; a number.<br>
 
 <h4>Example</h4>
-<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
-
+<!-- Show example of function.-->
+     min(20.5,10,6.2) &rarr; 6.2
 </source>
-        <translation><h3>Funktion $geometry</h3>
-Gibt die Geometrie des aktuellen Objekts zurück. Kann zur Verarbeitung mit anderen Funktion verwendet werden.
+        <translation><h3>Funktion min()</h3>
+Gibt den kleinsten Wert eine Menge von Werten zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre>$geometry</pre>
+     min(<i>wert<i>[,<i>wert</i>...])
 
 <h4>Argumente</h4>
-Keine
+<!-- List args for functions here-->
+<i>  wert</i> &rarr; eine Zahl.<br>
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre></translation>
+<!-- Show example of function.-->
+     min(20.5,10,6.2) &rarr; 6.2
+</translation>
     </message>
     <message>
-        <source><h3>OR logical operator</h3>
-Returns 1 when condition a or b is true.
+        <source><h3>lower() function</h3>
+Converts a string to lower case letters.
 
-<h4>Syntax</h4>
-<pre> condition a OR condition b </pre>
+<p><h4>  Syntax</h4>
+     lower(<i>string</i>)</p>
 
-<h4>Arguments</h4>
-None
+<p><h4>  Arguments</h4>
+<i>  string</i> &rarr; is string.  The String to convert to lower case.</p>
 
-<h4>Example</h4>
-<pre> 4 = 2+2 OR 1 = 1  &rarr; returns 1 </pre>
-<pre> 4 = 2+2 OR 1 = 2  &rarr; returns 1 </pre>
-<pre> 4 = 2   OR 1 = 2  &rarr; returns 0 </pre>
+<p><h4>  Example</h4>
+     lower('HELLO World') &rarr; 'hello world'</p>
 </source>
-        <translation><h3>Logischer Operator OR</h3>
-Ergibt 1m wenn die Bedingung a oder b erfüllt ist.
+        <translation><h3>Funktion lower()</h3>
+Wandelt eine Zeichenkette in Kleinbuchstaben um.
 
-<h4>Syntax</h4>
-<pre> bedingung a OR bedingung b </pre>
+<p><h4>  Syntax</h4>
+     lower(<i>zeichenkette</i>)</p>
 
-<h4>Argumente</h4>
-Keine
+<p><h4>  Argumente</h4>
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, die in Kleinbuchstaben umzuwandeln ist.</p>
 
-<h4>Beispiel</h4>
-<pre> 4 = 2+2 OR 1 = 1  &rarr; ergibt 1 </pre>
-<pre> 4 = 2+2 OR 1 = 2  &rarr; ergibt 1 </pre>
-<pre> 4 = 2 OR 1 = 2  &rarr; ergibt 0 </pre>
+<p><h4>  Beispiel</h4>
+     lower('Hallo Welt') &rarr; 'hallo welt'</p>
 </translation>
     </message>
     <message>
-        <source><h3>centroid function</h3>
-Returns the geometric center of a geometry.
+        <source><h3>$numfeatures function</h3>
+In atlas generation, returns the total number of features within the coverage layer.
 
 <h4>Syntax</h4>
-<pre>centroid(a)</pre>
+<pre>$numfeatures</pre>
 
 <h4>Arguments</h4>
-b &rarr; geometry
+None
 
 <h4>Example</h4>
-<pre> centroid($geometry) &rarr; returns a point geometry</pre>
+<pre>$numfeatures &rarr; 42</pre>
 
 </source>
-        <translation><h3>Funktion centroid</h3>
-Gibt das geometrische Zentrum der Geometrie zurück.
+        <translation><h3>$numfeatures function</h3>
+Bei der Atlantenerzeugung gibt es die Gesamtzahl der Objekte des Deckungslayers aus.
 
 <h4>Syntax</h4>
-<pre>centroid(a)</pre>
+<pre>$numfeatures</pre>
 
 <h4>Argumente</h4>
-a &rarr; geometry
+Keine
 
 <h4>Beispiel</h4>
-<pre> centroid($geometry) &rarr; ergibt einen Punkt</pre>
+<pre>$numfeatures &rarr; 42</pre>
+
 </translation>
     </message>
     <message>
-        <source><h3>within function</h3>
-Returns 1 if the geometry a is completely inside geometry b
+        <source><h3>String Group</h3>
+This group contains functions that operate on strings e.g replace, convert to upper case.
+</source>
+        <translation><h3>Gruppe Zeichenketten</h3>
+Dies Gruppen enth&auml;lt Funktionen f&uuml;r Zeichenketten (z.B. Ersetzen und in Gro&szlig;buchstaben umwandeln).
+</translation>
+    </message>
+    <message>
+        <source><h3>concat() function</h3>
+Concatenates several strings to one.
 
 <h4>Syntax</h4>
-<pre>within( geometry a , geometry b)</pre>
+     concat(<i>string<i>[,<i>string</i>...])
 
 <h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  a string.<br>
 
 <h4>Example</h4>
-<pre> within( geomFromWKT( 'POINT( 0.5 0.5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )    &rarr; returns 1</pre>
-<pre> within( geomFromWKT( 'POINT( 5 5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )        &rarr; returns 0</pre>
+<!-- Show example of function.-->
+     concat('a','b','c','d','e') &rarr; 'abcde'
 </source>
-        <translation><h3>Funktion within</h3>
-Gibt 1 zurück, wenn die Geometire a komplett innerhalb der Geometrie b liegt
+        <translation><h3>Funktion concat()</h3>
+F&uuml;gt Zeichenketten zu einer zusammen.
 
-<h4>Syntax</h4>
-<pre>within( a , b)</pre>
+<p><h4>Syntax</h4>
+     substr(<i>zeichenkette<i>[, <i>zeichenkette</i>...])</p>
 
-<h4>Arguments</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist string.  Ein Zeichenkette.<br>
 
-<h4>Beispiel</h4>
-<pre> within( geomFromWKT( 'POINT( 0.5 0.5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )    &rarr; ergibt 1</pre>
-<pre> within( geomFromWKT( 'POINT( 5 5 )') , geomFromWKT('POLYGON((0 0 , 0 1 , 1 1 , 1 0 , 0 0 ))' ) )        &rarr; ergibt 0</pre>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     concat('a','b','c','d','e') &rarr; 'abcde'</p>
 </translation>
     </message>
     <message>
-        <source><h3>$map function</h3>
-Returns the id of the current map item if the map is being drawn in a composition, or "canvas" if the map is being
-drawn within the main QGIS window.
-
+        <source><h3>coalesce() function</h3>
+Returns the first non-NULL value from the expression list.
+<br>
+This function can take any number of arguments.
 <h4>Syntax</h4>
-<pre>$map</pre>
+<code>coalesce(expression1, expression2 ...)</code><br>
 
 <h4>Arguments</h4>
-None
+<code>expression</code> - any valid expression or value, irregardless of type.
+<br>
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<pre>$map &rarr; "overview_map" (within a composer item)<br />
-$map &rarr; "canvas" (within the main QGIS main canvas)</pre>
-
+<code>coalesce(NULL, 2) &rarr; 2</code><br>
+<code>coalesce(NULL, 2, 3) &rarr; 2</code><br>
+<code>coalesce(7, NULL, 3*2) &rarr; 7</code><br><br>
+<code>coalesce("fieldA", "fallbackField", 'ERROR') &rarr; value of fieldA if it is non-NULL
+ else the value of "fallbackField" or the string 'ERROR' if both are NULL</code><br>
 
 </source>
-        <translation><h3>Funktion $map</h3>
-Gibt die Kennung des aktuellen Druckzusammenstellungselements zurück, wenn die Karte in einer Druckzusammenstellung gezeichnet wird oder "canvas", wenn die Karte im QGIS-Fenster gezeichnet wird.
-.
-
+        <translation><h3>Funktion coalesce()</h3>
+Liefert den ersten Wert, der nicht NULL ist, einer Ausdruckliste.
+<br>
+Diese Funktion kann beliebig viele Argumente haben.
 <h4>Syntax</h4>
-<pre>$map</pre>
+<code>coalesce(ausdruck1, ausdruck2...)</code><br>
 
 <h4>Argumente</h4>
-None
+<code>ausdruck</code> - ein g&uuml;ltige Ausdruck jeden Typs
+<br>
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<pre>$map &rarr; "overview_map" (in einem Zusammenstellungselement)<br />
-$map &rarr; "canvas" (im QGIS-Kartenfenster)</pre>
-
+<code>coalesce(NULL, 2) &rarr; 2</code><br>
+<code>coalesce(NULL, 2, 3) &rarr; 2</code><br>
+<code>coalesce(7, NULL, 3*2) &rarr; 7</code><br><br>
+<code>coalesce("attributA", "anderesFeld", 'FEHLER') &rarr; Wert des Attributs attributA falls es nicht NULL ist,
+ sonst der Wert des Attributes "anderesFeld" oder die Zeichenkette 'FEHLER', wenn beide NULL sind.</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>distance function</h3>
- Returns the minimum distance (based on spatial ref) between two geometries in projected units.
+        <source><h3>asin() function</h3>
+Returns arcussinus of a value in radians.
 
-<h4>Syntax</h4>
-<pre>distance( a, b )</pre>
 
-<h4>Arguments</h4>
-a &rarr; geometry
-b &rarr; geometry
+<p><h4>Syntax</h4>
+     asin(<i>real</i>)</p>
 
-<h4>Example</h4>
-<pre> distance( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(4 8)' ))    &rarr; returns 4</pre>
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; sin of an angle.</p>
+
+<p><h4>Example</h4>
+     asin(1.0) &rarr; 1.5707963267949</p>
 </source>
-        <translation><h3>Funktion distance</h3>
- Gibt den minimalen Abstand (basierend auf dem Raumbezug) zwischen zwei Geometrien in projiizierten Einheiten.
+        <translation><h3>Funktion asin()</h3>
+Gibt den Arcussinus eines Werts im Bogenma&szlig; zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>distance( a, b )</pre>
 
-<h4>Argumente</h4>
-a &rarr; geometry
-b &rarr; geometry
+<p><h4>Syntax</h4>
+     asin(<i>wert</i>)</p>
 
-<h4>Beispiel</h4>
-<pre> distance( geomFromWKT( 'POINT(4 4)' ) , geomFromWKT( 'POINT(4 8)' ))    &rarr; ergibt 4</pre>
+<p><h4>Argumente</h4>
+<i>wert</i> &rarr; Sinus des Werts.</p>
+
+<p><h4>Beispiel</h4>
+     asin(1.0) &rarr; 1.5707963267949</p>
 </translation>
     </message>
     <message>
-        <source><h3>difference function</h3>
-Returns a geometry that represents that part of geometry a that does not intersect with geometry b.
+        <source><h3>tan() function</h3>
+Returns tangent of an angle.
 
-<h4>Syntax</h4>
-<pre>difference( a, b )</pre>
 
-<h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<p><h4>Syntax</h4>
+     tan(<i>real</i>)</p>
 
-<h4>Example</h4>
-<pre> geomToWKT( difference( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4)' ))  )   &rarr; returns LINESTRING(4 4, 5 5)</pre>
+<p><h4>Arguments</h4>
+<i>real</i> &rarr; angle in radians.</p>
+
+<p><h4>Example</h4>
+     tan(1.0) &rarr; 1.5574077246549</p>
 </source>
-        <translation><h3>Funktion difference</h3>
-Gibt eine Geometrie zurück, die den Teil der Geometrie a repräsentiert, der die Geometrie b nicht schneidet.
+        <translation><h3>Funktion tan()</h3>
+Gibt den Tangens eines Winkel zur&uuml;ck.
 
-<h4>Syntax</h4>
-<pre>difference( geometry a , geometry b)</pre>
 
-<h4>Arguments</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<p><h4>Syntax</h4>
+     tan(<i>winkel</i>)</p>
 
-<h4>Beispiel</h4>
-<pre> geomToWKT( difference( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4)' ))  )   &rarr; ergibt LINESTRING(4 4, 5 5)
-</pre></translation>
+<p><h4>Argumente</h4>
+<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
+
+<p><h4>Beispiel</h4>
+     tan(1.0) &rarr; 1.5574077246549</p>
+</translation>
     </message>
     <message>
-        <source><h3>NOT</h3>
-Returns 1 if a is not the same as b.
+        <source><h3>$feature function</h3>
+In atlas generation, returns the current feature number that is iterated over on the coverage layer.
 
 <h4>Syntax</h4>
-<pre> a NOT b </pre>
+<pre>$feature</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre> 'a' IS NOT 'b'  &rarr; returns 1 </pre>
-<pre> 'a' IS NOT 'a'  &rarr; returns 0 </pre>
-<pre> 4 IS NOT 2+2    &rarr; returns 0 </pre>
+<pre>$feature &rarr; 2</pre>
 
 </source>
-        <translation><h3>NOT</h3>
-Gibt 1 zurück, wenn a ungleich b ist.
+        <translation><h3>Funktion $feature</h3>
+Beid der Atlantenerzeugung gibt es die aktuelle Objektanzahl auf dem Deckungslayer zur&uuml;ck.
 
 <h4>Syntax</h4>
-<pre> a NOT b </pre>
+<pre>$feature</pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre> 'a' IS NOT 'b'  &rarr; ergibt 1 </pre>
-<pre> 'a' IS NOT 'a'  &rarr; ergibt 0 </pre>
-<pre> 4 IS NOT 2+2    &rarr; ergibt 0 </pre>
+<pre>$feature &rarr; 2</pre>
 
 </translation>
     </message>
     <message>
-        <source><h3>symDifference function</h3>
-Returns a geometry that represents the portions of a and b that do not intersect.
-
+        <source><h3>ln() function</h3>
+Returns the value of the natural logarithm of the passed expression.
+<br>
+This function takes one argument.
 <h4>Syntax</h4>
-<pre>symDifference( geometry a, geometry b)</pre>
+<code>ln(value)</code><br>
 
 <h4>Arguments</h4>
-geometry &rarr; geometry
-geometry &rarr; geometry
+<code>value</code> - any positive number.
+<br>
 
 <h4>Example</h4>
-<pre> geomToWKT( symDifference(  geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; returns LINESTRING(5 5, 8 8)</pre>
+<!-- Show example of function.-->
+<code>ln(1) &rarr; 0</code><br>
+<code>ln(2.7182818284590452354) &rarr; 1</code><br>
 </source>
-        <translation><h3>Funktion symDifference</h3>
-Gibt eine Geometrie zurück, die die Teile der Geometrien a und b darstellen, die sich nicht schneiden.
-
+        <translation><h3>Funktion ln()</h3>
+Gibt den nat&uuml;rlichen Logrithmus des gegebenen Ausdrucks zur&uuml;ck.
+<br>
+Die Funktion akzeptiert ein Argument.
 <h4>Syntax</h4>
-<pre>symDifference( a, b )</pre>
+<code>ln(wert)</code><br>
 
 <h4>Argumente</h4>
-a &rarr; Geometrie
-b &rarr; Geometrie
+<code>wert</code> - eine positive Zahl.
+<br>
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( symDifference(  geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; ergibt LINESTRING(5 5, 8 8)</pre>
+<!-- Show example of function.-->
+<code>ln(1) &rarr; 0</code><br>
+<code>ln(2.7182818284590452354) &rarr; 1</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>$perimeter function</h3>
-Returns the perimeter length of the current feature.
+        <source><h3>color_hsva() function</h3>
+Returns a string representation of a color based on its hue, saturation, value and alpha (transparency) attributes
+
+<p><h4>Syntax</h4>
+     color_hsva(<i>hue, saturation, value, alpha</i>)</p>
+
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
+<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
+<i>  value</i> &rarr; the value percentage of the color as an integer from 0 to 100.<br>
+<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
+
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     color_hsva(40,100,100,200) &rarr; '255,170,0,200'</p>
+</source>
+        <translation><h3>Funktion color_hsla()</h3>
+Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung, ihres Betrags und Alpha/Transparenz zur&uuml;ck.
+
+<p><h4>Syntax</h4>
+     color_hsva(<i>farbton, s&auml;ttigung, betrag, alpha</i>)</p>
+
+<p><h4>Argumente</h4>
+<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
+<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  betrag</i> &rarr; Die Betrag der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
+<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
+
+<p><h4>Beispiel</h4>
+     color_hsva(40,100,100,200) &rarr; '255,170,0,200'</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>geometry function</h3>
+Returns the feature's geometry
 
 <h4>Syntax</h4>
-<pre>$perimeter</pre>
+<pre>geometry( f )</pre>
 
 <h4>Arguments</h4>
-None
+f &rarr; QgsFeature
 
 <h4>Example</h4>
-<pre>$perimeter &rarr; 42</pre>
-
+<pre> geomToWKT( geometry( getFeature( layer, attributeField, value ) ) ) &rarr; POINT(6 50)</pre>
+<pre> intersects( $geometry, geometry( getFeature( layer, attributeField, value ) ) ) &rarr; 1</pre>
 </source>
-        <translation><h3>Funktion $perimeter</h3>
-Liefert den Umfang des aktuellen Objekts zur&uuml;ck.
+        <translation><h3>geometry function</h3>
+Ergibt die Geometrie eines Objekts
 
 <h4>Syntax</h4>
-<pre>$perimeter</pre>
+<pre>geometry( f )</pre>
 
 <h4>Argumente</h4>
-Keine
-
-<h4>Beispiel</h4>
-<pre>$perimeter &rarr; 42</pre>
+f &rarr; QgsFeature
 
+<h4>Beispiele</h4>
+<pre> geomToWKT( geometry( getFeature( layer, attributeField, value ) ) ) &rarr; POINT(6 50)</pre>
+<pre> intersects( $geometry, geometry( getFeature( layer, attributeField, value ) ) ) &rarr; 1</pre>
 </translation>
     </message>
     <message>
-        <source><h3>tointerval() function</h3>
-Converts a string to a interval type.  Can be used to take days, hours, month, etc off a date. 
+        <source><h3>transform function</h3>
+Returns the geometry transformed from the source CRS to the dest CRS.
 
 <h4>Syntax</h4>
-<code>tointerval('string')</code><br>
+<pre>transform( geom, sAuthId, dAuthId )</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. Format {n} days {n} hours {n} months
-<br>
+geom &rarr; QgsGeometry
+
+sCrsId &rarr; the Source Auth CRS Id
+
+dCrsId &rarr; the Dest Auth CRS Id
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>todatetime('2012-05-05 12:00:00') - tointerval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br></source>
-        <translation><h3>Funktion tointerval()</h3>
-Wandelt eine Zeichenkette in einen Interval-Typ.  Kann verwendet werden um Tagen, Stunden, Monaten etc von Daten abzuziehen.
+<pre> geomToWKT( transform( $geometry, 'EPSG:2154', 'EPSG:4326' ) ) &rarr; POINT(0 51)</pre>
+</source>
+        <translation><h3>Funktion transform</h3>
+Ergibt die vom Quell- zum Ziel-KBS transformierte Geometrie.
 
 <h4>Syntax</h4>
-<code>tointerval('zeichenkette')</code><br>
+<pre>transform( geom, sAuthId, dAuthId )</pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - eine Zeichenkette. Format {n} Tage {n} Stunden {n} Monate
-<br>
+geom &rarr; QgsGeometry
+
+sCrsId &rarr; Kennung des Quell-KBS
+
+dCrsId &rarr; Kennung des Ziel-KBS
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>todatetime('2012-05-05 12:00:00') - tointerval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br>
+<pre> geomToWKT( transform( $geometry, 'EPSG:2154', 'EPSG:4326' ) ) &rarr; POINT(0 51)</pre>
 </translation>
     </message>
     <message>
-        <source><h3>hour() function</h3>
-Extract the hour from a datetime or time, or the number of hours
-from a <code>Interval</code>
+        <source><h3>format_date() function</h3>
+Format a date type or string into a custom string format. Uses Qt data time format strings.  See <a href='http://qt-project.org/doc/qt-4.8/qdatetime.html#toString'>QDateTime::toString</a>
 
 <h4>Syntax</h4>
-<code>hour(datetime)</code><br>
-<code>hour(Interval)</code><br>
+<code>format_date('string', 'format_string')</code><br>
 
 <h4>Arguments</h4>
-<code>date</code> - is datetime or time. The date to extract the hour from.
+<code>string</code> - is string. Date/Time/DateTime string.
 <br>
-<code>Interval</code> - is Interval. The Interval to return the number of hours from.
+<code>format_string</code> - is string. String template used to format the string.
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<code>hour('2012-07-22T13:24:57') &rarr; 13</code><br>
-<code>hour(tointerval('3 hours')) &rarr; 3</code><br>
-<code>hour(age('2012-07-22T13:00:00','2012-07-22T10:00:00')) &rarr; 3</code><br>
-<code>hour(age('2012-01-01','2010-01-01')) &rarr; 17520</code><br>
+  <table>
+    <thead>
+      <tr>
+        <th>Expression</th>
 
-</source>
-        <translation><h3>Funktion hour()</h3>
-Bestimmt die Stunde eines Datums/Zeit oder die Anzahl der Stunden
-aus einem <code>Intervall</code>
+        <th>Output</th>
+      </tr>
+    </thead>
 
-<h4>Syntax</h4>
-<code>hour(datetime)</code><br>
-<code>hour(Intervall)</code><br>
+    <tr valign="top">
+      <td>d</td>
 
-<h4>Argumente</h4>
-<code>date</code> - ist date oder datetime. Das Datum/die Zeit dessen Stunde bestimmt werden soll.
-<br>
-<code>Intervall</code> - ist Interval. Das Intervall aus der die Stundenzahl bestimmt werden soll.
+      <td>the day as number without a leading zero (1 to 31)</td>
+    </tr>
 
-<h4>Beispiele</h4>
-<!-- Show example of function.-->
-<code>hour('2012-07-22T13:24:57') &rarr; 13</code><br>
-<code>hour(tointerval('3 hours')) &rarr; 3</code><br>
-<code>hour(age('2012-07-22T13:00:00','2012-07-22T10:00:00')) &rarr; 3</code><br>
-<code>hour(age('2012-01-01','2010-01-01')) &rarr; 17520</code><br>
+    <tr valign="top">
+      <td>dd</td>
 
-</translation>
-    </message>
-    <message>
-        <source><h3>color_hsla() function</h3>
-Returns a string representation of a color based on its hue, saturation, lightness and alpha (transparency) attributes
+      <td>the day as number with a leading zero (01 to 31)</td>
+    </tr>
 
-<p><h4>Syntax</h4>
-     color_hsla(<i>hue, saturation, lightness, alpha</i>)</p>
+    <tr valign="top">
+      <td>ddd</td>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
-<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
-<i>  lightness</i> &rarr; the lightness percentage of the color as an integer value from 0 to 100.<br>
-<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
+      <td>the abbreviated localized day name (e.g. 'Mon' to 'Sun'). Uses <a href=
+      "qdate.html#shortDayName">QDate::shortDayName</a>().</td>
+    </tr>
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     color_hsla(100,50,70,200) &rarr; '166,217,140,200'</p>
-</source>
-        <translation><h3>Funktion color_hsl()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung, ihrer Helligkeit und ihrer Transparenz zur&uuml;ck.
+    <tr valign="top">
+      <td>dddd</td>
 
-<p><h4>Syntax</h4>
-     color_hsla(<i>farbton, s&auml;ttigung, helligkeit, alpha</i>)</p>
+      <td>the long localized day name (e.g. 'Monday' to 'Sunday'). Uses <a href=
+      "qdate.html#longDayName">QDate::longDayName</a>().</td>
+    </tr>
+
+    <tr valign="top">
+      <td>M</td>
+
+      <td>the month as number without a leading zero (1-12)</td>
+    </tr>
+
+    <tr valign="top">
+      <td>MM</td>
+
+      <td>the month as number with a leading zero (01-12)</td>
+    </tr>
+
+    <tr valign="top">
+      <td>MMM</td>
+
+      <td>the abbreviated localized month name (e.g. 'Jan' to 'Dec'). Uses <a href=
+      "qdate.html#shortMonthName">QDate::shortMonthName</a>().</td>
+    </tr>
+
+    <tr valign="top">
+      <td>MMMM</td>
+
+      <td>the long localized month name (e.g. 'January' to 'December'). Uses <a href=
+      "qdate.html#longMonthName">QDate::longMonthName</a>().</td>
+    </tr>
+
+    <tr valign="top">
+      <td>yy</td>
+
+      <td>the year as two digit number (00-99)</td>
+    </tr>
+
+    <tr valign="top">
+      <td>yyyy</td>
 
-<p><h4>Argumente</h4>
-<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
-<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  helligkeit</i> &rarr; Die Helligkeit der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
+      <td>the year as four digit number</td>
+    </tr>
+  </table>
 
-<p><h4>Beispiel</h4>
-     color_hsla(100,50,70,200) &rarr; '#166,217,140,200'</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>$pi constant</h3>
-Returns pi as value for calculations
+  <p>These expressions may be used for the time part of the format string:</p>
 
-<h4>Syntax</h4>
-<pre>$pi</pre>
+  <table>
+    <thead>
+      <tr>
+        <th>Expression</th>
 
-<h4>Arguments</h4>
-None
+        <th>Output</th>
+      </tr>
+    </thead>
 
-<h4>Example</h4>
-<pre>$pi &rarr; 3.14159265358979</pre>
-</source>
-        <translation><h3>$pi Konstante</h3>
-Liefert den Wert von pi f&uuml;r Berechnungen
+    <tr valign="top">
+      <td>h</td>
 
-<h4>Syntax</h4>
-<pre>$pi</pre>
+      <td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td>
+    </tr>
 
-<h4>Argumente</h4>
-Keine
+    <tr valign="top">
+      <td>hh</td>
 
-<h4>Beispiel</h4>
-<pre>$pi &rarr; 3.14159265358979</pre>
-</translation>
-    </message>
-    <message>
-        <source><h3>Record Group</h3>
-This group contains functions that operate on record identifiers.
-</source>
-        <translation><h3>Gruppe Datensatz</h3>
-Diese Gruppe enth&auml;lt Funktionen, die mit Datensatzkennungen arbeiten.
-</translation>
-    </message>
-    <message>
-        <source><h3>totime() function</h3>
-Convert a string into Qt time type.
+      <td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td>
+    </tr>
 
-<h4>Syntax</h4>
-<code>totime('string')</code><br>
+    <tr valign="top">
+      <td>H</td>
 
-<h4>Arguments</h4>
-<code>string</code> - is string in Qt time format.
-<br>
+      <td>the hour without a leading zero (0 to 23, even with AM/PM display)</td>
+    </tr>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<code>totime('12:30:01') &rarr; 12:30:01</code><br></source>
-        <translation><h3>Funktion totime()</h3>
-Wandelt eine Zeichenkette in einen Qt-Zeittyp um.
+    <tr valign="top">
+      <td>HH</td>
 
-<h4>Syntax</h4>
-<code>totime('zeichenkette')</code><br>
+      <td>the hour with a leading zero (00 to 23, even with AM/PM display)</td>
+    </tr>
 
-<h4>Argumente</h4>
-<code>zeichenkette</code> - eine Zeichenkette im Qt-Zeitformat.
-<br>
+    <tr valign="top">
+      <td>m</td>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>totime('12:30:01') &rarr; 12:30:01</code><br>
-</translation>
-    </message>
-    <message>
-        <source><h3>replace() function</h3>
-Returns a string with the the supplied string replaced.
+      <td>the minute without a leading zero (0 to 59)</td>
+    </tr>
 
-<p><h4>Syntax</h4>
-     replace(<i>string,before,after</i>)</p>
+    <tr valign="top">
+      <td>mm</td>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The start string.<br>
-<i>  before</i> &rarr; is string.  The string to replace.<br>
-<i>  after</i> &rarr; is string.  The string that will replace <i>before</i><br></p>
+      <td>the minute with a leading zero (00 to 59)</td>
+    </tr>
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     replace('QGIS SHOULD ROCK','SHOULD','DOES') &rarr; 'QGIS DOES ROCK'</p>
-</source>
-        <translation><h3>Funktion replace()</h3>
-Liefert eine Zeichenkette in der die angegebene Zeichenkette ersetzt ist.
+    <tr valign="top">
+      <td>s</td>
 
-<p><h4>Syntax</h4>
-     replace(<i>zeichenkette,vorher,nachher</i>)</p>
+      <td>the second without a leading zero (0 to 59)</td>
+    </tr>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die urspr&uuml;ngliche Zeichenkette.<br>
-<i>  vorher</i> &rarr; ist eine Zeichenkette.  Die zu ersetzende Zeichenkette.<br>
-<i>  nacher</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette durch die <i>vorher</i> ersetzen soll<br></p>
+    <tr valign="top">
+      <td>ss</td>
 
-<p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     replace('QGIS SHOULD ROCK','SHOULD','DOES') &rarr; 'QGIS DOES ROCK'</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>Conditionals Group</h3>
-This group contains functions to handle conditional checks in expressions.
-</source>
-        <translation><h3>Gruppe Bedingungen</h3>
-Dies Gruppe enth&auml;lt Funktionen die mit Bedingungen umgehen.
-</translation>
-    </message>
-    <message>
-        <source><h3>abs() function</h3>
-Returns the absolute value of a number.<br>
+      <td>the second with a leading zero (00 to 59)</td>
+    </tr>
 
+    <tr valign="top">
+      <td>z</td>
 
-<h4>Syntax</h4>
-abs(<i>value</i>)<br>
+      <td>the milliseconds without leading zeroes (0 to 999)</td>
+    </tr>
 
-<h4>Arguments</h4>
-<code>value</code> - a number.<br>
+    <tr valign="top">
+      <td>zzz</td>
 
-<h4>Example</h4>
-<code>abs(-2) &rarr; 2</code><br>
-</source>
-        <translation><h3>Funktion abs()</h3>
-Gibt den Betrag einer Zahl zur&uuml;ck.<br>
+      <td>the milliseconds with leading zeroes (000 to 999)</td>
+    </tr>
 
-<h4>Syntax</h4>
-abs(<i>wert</i>)<br>
+    <tr valign="top">
+      <td>AP or A</td>
 
-<h4>Argumente</h4>
-<code>wert</code> - ein Zahl.<br>
+      <td>interpret as an AM/PM time. <i>AP</i> must be either "AM" or "PM".</td>
+    </tr>
 
-<h4>Beispiel</h4>
-<code>abs(-2) &rarr; 2</code><br>
-</translation>
-    </message>
-    <message>
-        <source><h3>max() function</h3>
-Returns the largest value in a set of values.
+    <tr valign="top">
+      <td>ap or a</td>
 
-<h4>Syntax</h4>
-     max(<i>value<i>[,<i>value</i>...])
+      <td>Interpret as an AM/PM time. <i>ap</i> must be either "am" or "pm".</td>
+    </tr>
+  </table>
 
-<h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  value</i> &rarr; a number.<br>
+<br>
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-     max(2,10.2,5.5) &rarr; 10.2
+<code>format_date('2012-05-15','dd.MM.yyyy') &rarr; 15.05.2012</code><br>
 </source>
-        <translation><h3>Funktion max()</h3>
-Gibt den gr&ouml;&szlig;ten Wert eine Menge von Werte zur&uuml;ck.
+        <translation><h3>Funktion format_date()</h3>
+Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt Datum- und Zeitformate. Siehe <a href='http://qt-project.org/doc/qt-4.8/qdatetime.html#toString'>QDateTime::toString</a>
 
 <h4>Syntax</h4>
-     max(<i>wert<i>[,<i>wert</i>...])
+<code>format_date('zeichenkette', 'format')</code><br>
 
 <h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  wert</i> &rarr; eine Zahl.<br>
-
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-     max(2,10.2,5.5) &rarr; 10.2
-</translation>
-    </message>
-    <message>
-        <source><h3>sqrt() function</h3>
-Returns square root of a value
+<code>zeichenkette</code> - eine Zeichenkette. Datum/Zeit/Datum&amp;Zeit-Zeichenkette.
+<br>
+<code>format</code> - eine Zeichenkette. Vorlage zur Formatierung.
 
+  <table>
+    <thead>
+      <tr>
+        <th>Ausdruck</th>
 
-<p><h4>Syntax</h4>
-     sqrt(<i>real</i>)</p>
+        <th>Ausgabe</th>
+      </tr>
+    </thead>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; number.</p>
+    <tr valign="top">
+      <td>d</td>
 
-<p><h4>Example</h4>
-     sqrt(9) &rarr; 3</p>
-</source>
-        <translation><h3>Funktion sqrt()</h3>
-Gibt die Quadratwurzel eines Werts zur&uuml;ck.
+      <td>Der Tag als Zahl ohne f&uuml;hrende Null (1 to 31)</td>
+    </tr>
 
+    <tr valign="top">
+      <td>dd</td>
 
-<p><h4>Syntax</h4>
-     sqrt(<i>radikant</i>)</p>
+      <td>Der Tag als Zahl mit f&uuml;hrender Null (01 to 31)</td>
+    </tr>
 
-<p><h4>Argumente</h4>
-<i>radikant</i> &rarr; Zahl aus der die Wurzel gezogen werden soll.</p>
+    <tr valign="top">
+      <td>ddd</td>
 
-<p><h4>Beispiel</h4>
-     sqrt(9) &rarr; 3</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>Conditions Group</h3>
-This group contains functions that operate on condition.
-</source>
-        <translation><h3>Conditions Group</h3>
-This group contains functions that operate on condition.
-</translation>
-    </message>
-    <message>
-        <source>
-<h3>color_cmyka() function</h3>
-Returns a string representation of a color based on its cyan, magenta, yellow, black and alpha (transparency) components
+      <td>Der abgek&uuml;rzte lokale Tagname (z.B. 'Mon' bis 'Son'). Siehe <a href="qdate.html#shortDayName">QDate::shortDayName</a>().</td>
+    </tr>
 
-<p><h4>Syntax</h4>
-     color_cmyka(<i>cyan, magenta, yellow, black, alpha</i>)</p>
+    <tr valign="top">
+      <td>dddd</td>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  cyan</i> &rarr; the cyan component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  magenta</i> &rarr; the magenta component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  yellow</i> &rarr; the yellow component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  black</i> &rarr; the black component of the color, as a percentage integer value from 0 to 100.<br>
-<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
+      <td>Der lokale Tagname (z.B. 'Montag' to 'Sonntag'). Siehe <a href="qdate.html#longDayName">QDate::longDayName</a>().</td>
+    </tr>
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     color_cmyka(100,50,0,10,200) &rarr; '0,115,230,200'</p>
-</source>
-        <translation><h3>Funktion color_cmyka()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Cyan-, Magenta- Gelb-,
-Schwarzanteil und Alpha-/Transparenzanteil zur&uuml;ck.
+    <tr valign="top">
+      <td>M</td>
 
-<p><h4>Syntax</h4>
-     color_cmyk(<i>cyan, magenta, gelb, schwarz, alpha</i>)</p>
+      <td>Der Monat als Zahl ohne f&uuml;hrende Null (1-12)</td>
+    </tr>
 
-<p><h4>Argumente</h4>
-<i>  cyan</i> &rarr; Der Cyan-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  magenta</i> &rarr; Der Magenta-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  gelb</i> &rarr; Der Gelb-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  schwarz</i> &rarr; Der Schwarz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  alpha</i> &rarr; Der Alpha/Transparenz-Anteil der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
+    <tr valign="top">
+      <td>MM</td>
 
-<p><h4>Beispiel</h4>
-     color_cmyka(100,50,0,10,200) &rarr; '0,115,230,200'</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>format_number() function</h3>
-Returns a number formatted with the locale separator for thousands. 
-Also truncates the number to the number of supplied places. 
-<h4>Syntax</h4>
-<code>format_number(number,places)</code><br>
+      <td>Der Monat als Zahl mit f&uuml;hrender Null (01-12)</td>
+    </tr>
 
-<h4>Arguments</h4>
-<code>number</code> - is number. The number to be formatted.
-<br>
-<code>places</code> - is int. The number of decimal places to truncate the string
-to.
+    <tr valign="top">
+      <td>MMM</td>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<code>format_number(10000000.332,2) &rarr; 10,000,000.33</code>
+      <td>Der abgek&uuml;rzte lokale Monatsname (z.B. 'Jan' bis 'Dez'). Siehe <a href="qdate.html#shortMonthName">QDate::shortMonthName</a>().</td>
+    </tr>
 
-</source>
-        <translation><h3>Funktion format_number()</h3>
-Liefert eine mit dem lokalen Tausendertrenner versehene Zahl zur&uuml;ck und
-beschr&auml;nkt die Zahl auch auf die angegebene Anzahl von Nachkommastellen.
-<h4>Syntax</h4>
-<code>format_number(zahl,nachkommastellen)</code><br>
+    <tr valign="top">
+      <td>MMMM</td>
 
-<h4>Argumente</h4>
-<code>zahl</code> - ist Zahl. Die zu formatierende Zahl
-<br>
-<code>places</code> - ist Ganzzahl. Die Anzahl der Nachkommastellen.
+      <td>Der lokale Monatsname (z.B. 'Januar' to 'Dezember'). Siehe <a href="qdate.html#longMonthName">QDate::longMonthName</a>().</td>
+    </tr>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>format_number(10000000.332,2) &rarr; 10.000.000,33</code>
+    <tr valign="top">
+      <td>yy</td>
 
-</translation>
-    </message>
-    <message>
-        <source><h3>year() function</h3>
-Extract the year part from a date, or the number of years
-from a <code>Interval</code>
+      <td>Das Jahr als zweistellige Zahl (00-99)</td>
+    </tr>
 
-<h4>Syntax</h4>
-<code>year(date)</code><br>
-<code>year(Interval)</code><br>
+    <tr valign="top">
+      <td>yyyy</td>
 
-<h4>Arguments</h4>
-<code>date</code> - is date or datetime. The date to extract the year from.
-<br>
-<code>Interval</code> - is Interval. The Interval to return the number of years from.
+      <td>Das Jahr als vierstellige Zahl</td>
+    </tr>
+  </table>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<code>year('2012-05-12') &rarr; 2012</code><br>
-<code>year(tointerval('3 Years')) &rarr; 3</code><br>
-<code>year(age('2012-01-01','2010-01-01')) &rarr; 1.9986..</code><br>
+  <p>Diese Ausdr&uuml;cke k&ouml;nnen zum Formatieren des Zeitanteils verwendet werden:</p>
 
-</source>
-        <translation><h3>Funktion year()</h3>
-Bestimmt das Jahr eines Datums oder die L&auml;nge eines <code>Intervals</code> in Jahren.
+  <table>
+    <thead>
+      <tr>
+        <th>Ausdruck</th>
 
-<h4>Syntax</h4>
-<code>year(date)</code><br>
-<code>year(Interval)</code><br>
+        <th>Ausgabe</th>
+      </tr>
+    </thead>
 
-<h4>Argumente</h4>
-<code>date</code> - ist date oder datetime. Das Datum dessen Jahr zur&uuml;ckgegeben werden soll.<br>
-<code>Interval</code> - ist Interval. Das Interval dessen L&auml;nge in Jahren zur&uuml;ckgegeben werden soll.
+    <tr valign="top">
+      <td>h</td>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>year('2012-05-12') &rarr; 2012</code><br>
-<code>year(tointerval('3 Years')) &rarr; 3</code><br>
-<code>year(age('2012-01-01','2010-01-01')) &rarr; 1.9986..</code><br>
+      <td>die Stunde ohne f&uuml;hrende Null (0 to 23 oder 1 to 12 bei AM/PM Anzeige)</td>
+    </tr>
 
-</translation>
-    </message>
-    <message>
-        <source><h3>CASE expression</h3>
-A conditional expression that can be used to evaluate multiple expressions and
-return a result.
+    <tr valign="top">
+      <td>hh</td>
 
-<h4>Syntax</h4>
-<pre>
-     CASE
-        WHEN <i>condition</i> THEN <i>result</i>
-        [ ...n ]
-        [ ELSE <i>result</i> ]
-     END
-</pre>
-[ ] marks optional components
+      <td>die Stunde mit f&uuml;hrender Null (00 to 23 oder 01 to 12 bei AM/PM Anzeige)</td>
+    </tr>
 
-<h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  WHEN condition</i> - The condition expression to evaluate. <br>
-<i>  THEN result</i> - If <i>condition</i> evaluates to True then <i>result</i> is evaluated and returned. <br>
-<i>  ELSE result</i> - If none of the above conditions evaluated to True then <i>result</i> is evaluated and returned. <br>
+    <tr valign="top">
+      <td>H</td>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<pre>
-    CASE
-        WHEN <i>"column" IS NULL</i> THEN <i>'None'</i>
-    END
-</pre>
-</source>
-        <translation><h3>CASE Ausdruck</h3>
-Ist ein bedingter Ausdruck mit dem mehrere Ausdr&uuml;cken ausgewertet und ein
-Ergebnis zur&uuml;ckgegeben werden kann.
+      <td>die Stunde ohne f&uuml;hrende Null (0 to 23 auch bei AM/PM Anzeige)</td>
+    </tr>
 
-<h4>Syntax</h4>
-<pre>
-     CASE
-        WHEN <i>bedingung</i> THEN <i>ergebnis</i>
-        [ ...n ]
-        [ ELSE <i>ergebnis</i> ]
-     END
-</pre>
-[ ] markiert optionale Komponenten
+    <tr valign="top">
+      <td>HH</td>
 
-<h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  WHEN bedingung</i> - Der Bedingungsausdruck. <br>
-<i>  THEN ergebnis</i> - Wenn die <i>bedingung</i> True ergibt, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
-<i>  ELSE ergebnis</i> - Wenn keine der Bedingungen erf&uuml;llt ist, wird der Ausdruck <i>ergebnis</i> ausgewertet und zur&uuml;ckgegeben. <br>
+      <td>die Stunde mit f&uuml;hrender Null (0 to 23 auch bei AM/PM Anzeige)</td>
+    </tr>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<pre>
-    CASE
-        WHEN <i>"column" IS NULL</i> THEN <i>'Leer'</i>
-    END
-</pre>
-</translation>
-    </message>
-    <message>
-        <source><h3>randf() function</h3>
-Returns a random float within the range specified by the minimum and 
-maximum argument (inclusive).
-<br>
-This function takes two arguments.
-<h4>Syntax</h4>
-<code>randf(min, max)</code><br>
+    <tr valign="top">
+      <td>m</td>
 
-<h4>Arguments</h4>
-<code>min</code> - a float representing the smallest possible random number desired.<br>
-<code>max</code> - a float representing the largest possible random number desired.
-<br>
+      <td>Die Minute ohne f&uuml;hrende Null (0 to 59)</td>
+    </tr>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-<code>randf(1, 10) &rarr; 4.59258286403147</code><br>
-</source>
-        <translation><h3>Funktion randf()</h3>
-Gibt eine zuf&auml;llige Flie&szlig;kommazahl in den gegebenen Grenzen zur&uuml;ck (inklusiv).
-<br>
-Diese Funktion hat zwei Argumente.
-<h4>Syntax</h4>
-<code>randf(min, max)</code><br>
+    <tr valign="top">
+      <td>mm</td>
 
-<h4>Argumente</h4>
-<code>min</code> - eine Flie&szlig;kommazahl, die die minimale Zufallszahl angibt.<br>
-<code>max</code> - eine Flie&szlig;kommazahl, die die maximale Zufallszahl angibt.<br>
-<br>
+      <td>Die Minute mit f&uuml;hrender Null (00 to 59)</td>
+    </tr>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>randf(1, 10) &rarr; 4.59258286403147</code><br>
-</translation>
-    </message>
-    <message>
-        <source><h3>xmin function</h3>
-Returns the minimum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+    <tr valign="top">
+      <td>s</td>
 
-<h4>Syntax</h4>
-<pre>xmin(geom)</pre>
+      <td>Die Sekunde ohne f&uuml;hrende Null (0 to 59)</td>
+    </tr>
 
-<h4>Arguments</h4>
-geom &rarr; a geometry
+    <tr valign="top">
+      <td>ss</td>
 
-<h4>Example</h4>
-<pre> xmin($geometry) &rarr; returns minimum x coordinate of $geometry</pre>
+      <td>Die Sekunde mit f&uuml;hrender Null (00 to 59)</td>
+    </tr>
 
-</source>
-        <translation><h3>Funktion xmin()</h3>
-Gibt den kleinste X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
+    <tr valign="top">
+      <td>z</td>
 
-<h4>Syntax</h4>
-<pre>xmin(geom)</pre>
+      <td>Die Millisekunde ohne f&uuml;hrende Null (0 to 999)</td>
+    </tr>
 
-<h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  geom</i> &rarr; eine Geometrie.<br>
+    <tr valign="top">
+      <td>zzz</td>
 
-<h4>Beispiel</h4>
-<!-- Show example of function.-->
-<pre>xmin($geometry) &rarr; ergibt die minimale X-Koordinate von $geometry</pre></translation>
-    </message>
-    <message>
-        <source><h3>scale_linear() function</h3>
-Transforms a given value from an input domain to an output range using linear interpolation. 
+      <td>Die Millisekunde mit f&uuml;hrender Null (000 to 999)</td>
+    </tr>
 
-<p><h4>Syntax</h4>
-     scale_linear(<i>val</i>,<i>domain_min</i>,<i>domain_max</i>,<i>range_min</i>,<i>range_max</i>)</p>
+    <tr valign="top">
+      <td>AP or A</td>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  val</i> &rarr; is a value in the input domain. The function will return a corresponding scaled value in the output range.<br>
-<i>  domain_min, domain_max</i> &rarr; specify the input domain, the smallest and largest values the input <i>val</i> should take.<br>
-<i>  range_min, range_max</i> &rarr; specify the output range, the smallest and largest values which should be output by the function.<br>
+      <td>als AM/PM Zeit interpretieren. <i>AP</i> muss entweder "AM" oder "PM" sein.</td>
+    </tr>
 
-<h4>Example</h4>
-<!-- Show example of function.-->
-     scale_linear(5,0,10,0,100) &rarr; 50<br>
-     scale_linear(0.2,0,1,0,360) &rarr; 72 <i>(eg, scaling a value between 0 and 1 to an angle between 0 and 360)</i><br>
-     scale_linear(1500,1000,10000,9,20) &rarr; 10.22 <i>(eg, scaling a population which varies between 1000 and 10000 to a font size between 9 and 20)</i><br>
-     
-     
-</source>
-        <translation><h3>Funktion scale_linear()</h3>
-Formt einen gegebenen Wert aus einem Ausgangsbereich mittels linearer Interpolation in einen Ausgabebereich um.
+    <tr valign="top">
+      <td>ap or a</td>
 
-<p><h4>Syntax</h4>
-     scale_linear(<i>wert</i>,<i>quelle_min</i>,<i>quelle_max</i>,<i>ziel_min</i>,<i>ziel_max</i>)</p>
+      <td>als AM/PM Zeit interpretieren. <i>ap</i> muss entweder "am" oder "pm" sein.</td>
+    </tr>
+  </table>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  wert</i> &rarr; ein Wert im Ausgangsbereich. Die Funktion gibt den korrespondierenden skalierten Wert im Ausgabebereich zur&uuml;ck.<br>
-<i>  quelle_min, quelle_max</i> &rarr; legt den Ausgangsbereich fest - denn kleinsten und gr&ouml;&szlig;ten Wert in dem sich <i>wert</i> bewegt.<br>
-<i>  ziel_min, ziel_max</i> &rarr; legt den Ausgabebereich fest - denn kleinsten und gr&ouml;&szlig;ten Wert in dem sich das Funktionergebnis bewegt.<br>
+<br>
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-     scale_linear(5,0,10,0,100) &rarr; 50<br>
-     scale_linear(0.2,0,1,0,360) &rarr; 72 <i>(z.B. um einen Wert zwischen 0 und 1 auf eine Winkel zwischen 0 und 360 skalieren)</i><br>
-     scale_linear(1500,1000,10000,9,20) &rarr; 10.22 <i>(z.B. um eine Bev&ouml;lkerungszahl zwischen 1000 und 10000 auf eine Schriftgr&ouml;&szlig;e zwischen 9 und 20 zu skalieren)</i><br>
+<code>format_date('2012-05-15','dd.mm.yyyy') &rarr; 15.05.2012</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>trim() function</h3>
-Removes all leading and trailing whitespace (spaces, tabs, etc) from a string.
+        <source><h3>convex_hull function</h3>
+Returns the convex hull of a geometry. It represents the minimum convex geometry that encloses all geometries within the set.
 
-<p><h4>Syntax</h4>
-     trim(<i>string</i>)</p>
+<h4>Syntax</h4>
+<pre>convex_hull( a, b )</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string. The string to trim.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+a &rarr; geometry
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     trim('   hello world    ') &rarr; 'hello world'</p>
+<h4>Example</h4>
+<pre>  geom_to_wkt( convex_hull( geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; returns POLYGON((3 3,4 10,4 4,3 3)) </pre>
 </source>
-        <translation><h3>Funktion trim()</h3>
-Entfernt f&uuml;hrende und schlie&szlig;ende Leerzeichen (Leerzeichen, Tabs usw.) aus einer Zeichenkette.
+        <translation type="obsolete"><h3>Funktion convex_hull</h3>
+Gibt die konvexe Hülle einer Geometrie zurück. Es stellt die minimale konvexe Geometrie dar, sie alle Geometrien des Satzes umfassen.
 
-<p><h4>Syntax</h4>
-     trim(<i>zeichenkette</i>)</p>
+<h4>Syntax</h4>
+<pre>convex_hull( a, b)</pre>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; eine Zeichenkett. Zu k&uuml;rzende Zeichenkette.</p>
+<h4>Argumente</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     trim('   hallo welt    ') &rarr; 'hallo welt'</p>
-</translation>
+<h4>Beispiel</h4>
+<pre>  geomToWKT( convex_hull( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; ergibt POLYGON((3 3,4 10,4 4,3 3)) </pre></translation>
     </message>
     <message>
-        <source><h3>minute() function</h3>
-Extract the minute from a datetime or time, or the number of minutes
-from a <code>Interval</code>
+        <source><h3>geom_from_gml function</h3>
+Returns a geometry from a GML representation of geometry
 
 <h4>Syntax</h4>
-<code>minute(datetime)</code><br>
-<code>minute(Interval)</code><br>
+<pre>geom_from_gml(text)</pre>
 
 <h4>Arguments</h4>
-<code>date</code> - is datetime or time. The date to extract the minute from.
-<br>
-<code>Interval</code> - is Interval. The Interval to return the number of minutes from.
+text &rarr; GML representation of a geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>minute('2012-07-22T13:24:57') &rarr; 24</code><br>
-<code>minute(tointerval('3 minutes')) &rarr; 3</code><br>
-<code>minute(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 20</code><br>
-<code>minute(age('2012-01-01','2010-01-01')) &rarr; 1051200</code><br>
+<pre> geom_from_gml( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; returns a geometry</pre>
 
 </source>
-        <translation><h3>Funktion minute()</h3>
-Bestimmt die Minute eines Datums/Zeit oder die Anzahl der Minuten
-eines <code>Intervalls</code>
+        <translation type="obsolete"><h3>Funktion geom_from_gml</h3>
+Gibt eine aus einer GML-Repräsentation erzeugte Geometrie zurück.
 
 <h4>Syntax</h4>
-<code>minute(datetime)</code><br>
-<code>minute(Intervall)</code><br>
+<pre>geom_from_gml(text)</pre>
 
 <h4>Argumente</h4>
-<code>datetime</code> - ist datetime oder time. Das Datum aus der die Minute bestimmt werden soll.<br>
-<code>Interval</code> - is Interval. Das Intervall aus dem die Minutenanzahl bestimmt werden soll.
+text &rarr; GML-Repräsentation einer Geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>minute('2012-07-22T13:24:57') &rarr; 24</code><br>
-<code>minute(tointerval('3 minutes')) &rarr; 3</code><br>
-<code>minute(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 20</code><br>
-<code>minute(age('2012-01-01','2010-01-01')) &rarr; 1051200</code><br>
+<pre> geom_from_gml( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; ergibt eine Geometrie</pre>
 </translation>
     </message>
     <message>
-        <source><h3>age() function</h3>
-Returns the difference between two dates.
-<br><br>
-The difference is returned as a <code>Interval</code> 
-and needs to be used with one of the following functions
-in order to extract useful information:
-<ul>
-<li><code>year</code>
-<li><code>month</code>
-<li><code>week</code>
-<li><code>day</code>
-<li><code>hour</code>
-<li><code>minute</code>
-<li><code>second</code>
-</ul>
+        <source><h3>geom_from_wkt function</h3>
+Returns a geometry created from a Well-Known Text (WKT) representation.
+
 <h4>Syntax</h4>
-<code>age(string,string)</code><br>
-<code>age(datetime,datetime)</code><br>
-<code>age(string,datetime)</code><br>
-<code>age(datetime,string)</code><br>
+<pre>geom_from_wkt(text)</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. A string in date format.
-<br>
-<code>datetime</code> - is date or datetime. A date or datetime type.
+text &rarr; Well-Known Text (WKT) representation of a geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>age('2012-05-12','2012-05-2') &rarr; Interval</code><br>
-use <code>day</code> to extract number of days<br>
-<code>day(age('2012-05-12','2012-05-2')) &rarr; 10</code><br>
+<pre> geom_from_wkt( 'POINT(4 5)' ) &rarr; returns a geometry</pre>
 
 </source>
-        <translation><h3>Funktion age()</h3>
-Gibt den Unterschied zwischen zwei Daten zur&uuml;ck.
-<br><br>
-Der Unterschied wird als <code>Intervall</code> zur&uuml;ckgegeben
-und mu&szlig; mit folgenden Funktionen weiterverarbeitet werde, um
-sinnvolle Informationen zu erhalten:
-><code>year</code>
-<li><code>month</code>
-<li><code>week</code>
-<li><code>day</code>
-<li><code>hour</code>
-<li><code>minute</code>
-<li><code>second</code>
-</ul>
+        <translation type="obsolete"><h3>Funktion geom_from_wkt</h3>
+Erzeugt aus einer Well-Known-Text-Repräsentation (WKT) eine Geometrie.
+
 <h4>Syntax</h4>
-<code>age(zeichenkette,zeichenkette)</code><br>
-<code>age(datetime,datetime)</code><br>
-<code>age(zeichenkette,datetime)</code><br>
-<code>age(datetime,zeichenkette)</code><br>
+<pre>geom_from_wkt(text)</pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - ist string. Eine Zeichenkette in Datumsformat. <br>
-<code>datetime</code> - ist date oder datetime. Eine Datums oder eine Zeit.
+text &rarr; Well-Known Text-Repräsentation (WKT) einer Geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>age('2012-05-12','2012-05-2') &rarr; Intervall</code><br>
-<code>day</code> benutzen um die Anzahl der Tage zur bestimmen<br>
-<code>day(age('2012-05-12','2012-05-2')) &rarr; 10</code><br>
+<pre> geom_from_wkt( 'POINT(4 5)' ) &rarr; ergibt eine Geometrie</pre>
 </translation>
     </message>
     <message>
-        <source><h3>log10() function</h3>
-Returns the value of the base 10 logarithm of the passed expression.
-<br>
-This function takes one argument.
+        <source><h3>geom_to_wkt function</h3>
+Returns the Well-Known Text (WKT) representation of the geometry without SRID metadata.
+
 <h4>Syntax</h4>
-<code>log10(value)</code><br>
+<pre>geom_to_wkt(a)</pre>
 
 <h4>Arguments</h4>
-<code>value</code> - any positive number.
-<br>
+a &rarr; geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>log10(1) &rarr; 0</code><br>
-<code>log10(100) &rarr; 2</code><br>
+<pre> geom_to_wkt( $geometry ) &rarr; POINT(6 50)</pre>
 </source>
-        <translation><h3>Funktion log10()</h3>
-Gibt den Logarithmus des &uuml;bergebenen Wertes zur Basis 10 zur&uuml;ck.
-<br>
-Diese Funktion akzeptiert ein Argument.
+        <translation type="obsolete"><h3>Funktion geom_to_wkt</h3>
+Ergibt die Well-Known-Text-Darstellung (WKT) der Geometrie ohne räumlichen Bezugssystem zurück.
+
 <h4>Syntax</h4>
-<code>log10(wert)</code><br>
+<pre>geom_to_wkt(a)</pre>
 
 <h4>Argumente</h4>
-<code>wert</code> - eine positive Zahl.
-<br>
+a &rarr;  Geometriee
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>log10(1) &rarr; 0</code><br>
-<code>log10(100) &rarr; 2</code><br>
+<pre> geom_to_wkt( $geometry ) &rarr; POINT(6 50)</pre>
 </translation>
     </message>
     <message>
-        <source><h3>Conversions Group</h3>
-This group contains functions to convert on data type to another e.g string to integer, integer to string.
+        <source><h3>get_feature function</h3>
+Returns the first feature of a layer matching a given attribute value
+
+<h4>Syntax</h4>
+<pre>get_feature( layer, attributeField, value )</pre>
+
 </source>
-        <translation><h3>Umwandlungsgruppe</h3>
-Diese Gruppe enth&auml;lt Funktionen, die einen Datentypen in einen anderen umwandeln (z.B. Zeichenketten zu Ganzzahlen oder zur&uuml;ck).
-</translation>
+        <translation type="obsolete"><h3>Funktion get_feature</h3>
+Gibt des erste Objekt des Layers zurück, das denn gegebenen Attribute entspricht
+
+<h4>Syntax</h4>
+<pre>get_feature( layer, attributFeld, wert )</pre>
+
+ </translation>
     </message>
     <message>
-        <source><h3>cos() function</h3>
-Returns cosinus of an angle.
-
+        <source><h3>intersects_bbox function</h3>
+Returns 1 if the geometries spatially intersect the bounding box defined and 0 if they don't.
 
-<p><h4>Syntax</h4>
-     cos(<i>real</i>)</p>
+<h4>Syntax</h4>
+<pre>intersects_bbox( a, b )</pre>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; angle in radians.</p>
+<h4>Arguments</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Example</h4>
-     cos(1.571) &rarr; 0.000796326710733263</p>
+<h4>Example</h4>
+<pre>intersects_bbox( geomFromWKT( 'POINT(4 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; returns 1</pre>
+<pre>intersects_bbox( geomFromWKT( 'POINT(6 5)' ) , geom_from_wkt( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion cos()</h3>
-Gibt den Cosinus eines Winkels zur&uuml;ck.
+        <translation type="obsolete"><h3>Funktion intersect_bbox</h3>
+Gibt 1 zurück, wenn sich die Ausmaße der beiden Geometrien räumlich überschneiden und anderenfalls 0 zurück.
 
-<p><h4>Syntax</h4>
-     cos(<i>winkel</i>)</p>
+<h4>Syntax</h4>
+<pre>intersect_bbox( a, b )</pre>
 
-<p><h4>Argumente</h4>
-<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
+<h4>Argumente</h4>
+a &rarr; geometrie
+b &rarr; geometrie
 
-<p><h4>Beispiel</h4>
-     cos(1.571) &rarr; 0.000796326710733263</p>
-</translation>
-    </message>
-    <message>
-        <source><h3>Operators Group</h3>
-This group contains operators e.g + - * 
-</source>
-        <translation><h3>Gruppe Operatoren</h3>
-Die Gruppe enth&auml;lt Operatoren (z.B. +, - und *)
-</translation>
+<h4>Beispiel</h4>
+<pre>intersect_bbox( geom_from_wkt( 'POINT(4 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; ergibt 1</pre>
+<pre>intersect_bbox( geom_from_wkt( 'POINT(6 5)' ) , geom_from_wkt( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; ergibt 0</pre</translation>
     </message>
     <message>
-        <source><h3>second() function</h3>
-Extract the seconds from a datetime or time, or the number of seconds
-from a <code>Interval</code>
+        <source><h3>now function</h3>
+Returns the current date and time
 
 <h4>Syntax</h4>
-<code>second(datetime)</code><br>
-<code>second(Interval)</code><br>
+<pre>now()</pre>
 
 <h4>Arguments</h4>
-<code>date</code> - is datetime or time. The date to extract the second from.
-<br>
-<code>Interval</code> - is Interval. The Interval to return the number of seconds from.
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>second('2012-07-22T13:24:57') &rarr; 57</code><br>
-<code>second(tointerval('3 seconds')) &rarr; 3</code><br>
-<code>second(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 1200</code><br>
-<code>second(age('2012-01-01','2010-01-01')) &rarr; 63072000</code><br>
+<pre>now() &rarr; 2012-07-22T13:24:57</pre>
 
 </source>
-        <translation><h3>Funktion second()</h3>
-Bestimmt die Sekunde eines Datums/Zeit oder die Anzahl der Sekunden
-aus einem <code>Intervall</code>
+        <translation type="obsolete"><h3>Funktion now</h3>
+Ergibt aktuelles Datum und Zeit
 
 <h4>Syntax</h4>
-<code>second(datetime)</code><br>
-<code>second(Intervall)</code><br>
+<pre>now()</pre>
 
 <h4>Argumente</h4>
-<code>date</code> - ist datetime oder time. Das Datum dessen Sekunden bestimmt werden sollen.<br>
-<code>Intervall</code> - ist Interval. Ergib die Intervalll&auml;nge in Sekunden.
-
-<h4>Beispiele</h4>
-<!-- Show example of function.-->
-<code>second('2012-07-22T13:24:57') &rarr; 57</code><br>
-<code>second(tointerval('3 seconds')) &rarr; 3</code><br>
-<code>second(age('2012-07-22T00:20:00','2012-07-22T00:00:00')) &rarr; 1200</code><br>
-<code>second(age('2012-01-01','2010-01-01')) &rarr; 63072000</code><br>
+Keine
 
+<h4>Beispiel</h4>
+<pre>now() &rarr; 2012-07-22T13:24:57</pre>
 </translation>
     </message>
     <message>
-        <source><h3>atan() function</h3>
-Returns arcustanget of a value in radians.
-
+        <source><h3>pi constant</h3>
+Returns pi as value for calculations
 
-<p><h4>Syntax</h4>
-     atan(<i>real</i>)</p>
+<h4>Syntax</h4>
+<pre>pi()</pre>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; tan of an angle.</p>
+<h4>Arguments</h4>
+None
 
-<p><h4>Example</h4>
-     atan(0.5) &rarr; 0.463647609000806</p>
+<h4>Example</h4>
+<pre>pi() &rarr; 3.14159265358979</pre>
 </source>
-        <translation><h3>Funktion atan()</h3>
-Gibt den Arcustanget eines Werts im Bogenma&szlig; zur&uuml;ck.
-
+        <translation type="obsolete"><h3>Funktion pi</h3>
+Liefert den Wert von pi f&uuml;r Berechnungen
 
-<p><h4>Syntax</h4>
-     atan(<i>zahl</i>)</p>
+<h4>Syntax</h4>
+<pre>pi()</pre>
 
-<p><h4>Argumente</h4>
-<i>zahl</i> &rarr; Tangens eines Winkels.</p>
+<h4>Argumente</h4>
+Keine
 
-<p><h4>Beispiel</h4>
-     atan(0.5) &rarr; 0.463647609000806</p>
+<h4>Beispiel</h4>
+<pre>pi() &rarr; 3.14159265358979</pre>
 </translation>
     </message>
     <message>
-        <source><h3>$length function</h3>
-Returns the length of the current feature.
+        <source><h3>sym_difference function</h3>
+Returns a geometry that represents the portions of a and b that do not intersect.
 
 <h4>Syntax</h4>
-<pre>$length</pre>
+<pre>sym_difference( geometry a, geometry b)</pre>
 
 <h4>Arguments</h4>
-None
+geometry &rarr; geometry
+geometry &rarr; geometry
 
 <h4>Example</h4>
-<pre>$length &rarr; 42.4711</pre>
+<pre> geom_to_wkt( sym_difference(  geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; returns LINESTRING(5 5, 8 8)</pre>
 </source>
-        <translation><h3>Funktion $length</h3>
-Liefert die L&auml;nge der aktuellen Geometrie.
+        <translation type="obsolete"><h3>Funktion sym_difference</h3>
+Gibt eine Geometrie zurück, die die Teile der Geometrien a und b darstellen, die sich nicht schneiden.
 
 <h4>Syntax</h4>
-<pre>$length</pre>
+<pre>sym_difference( a, b )</pre>
 
 <h4>Argumente</h4>
-Keine
+a &rarr; Geometrie
+b &rarr; Geometrie
 
 <h4>Beispiel</h4>
-<pre>$length &rarr; 42.4711</pre>
-
+<pre> geom_to_wkt( sym_difference( geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; ergibt LINESTRING(5 5, 8 8)</pre>
 </translation>
     </message>
     <message>
-        <source><h3>title() function</h3>
-Converts all words of a string to title case (all words lower case with leading
-capital letter).
+        <source><h3>to_date() function</h3>
+Convert a string into Qt data type.
 
-<p><h4>Syntax</h4>
-     title(<i>string</i>)</p>
+<h4>Syntax</h4>
+<code>to_date('string')</code><br>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The string to convert to title case.</p>
+<h4>Arguments</h4>
+<code>string</code> - is string in Qt date format.
+<br>
 
-<p><h4>Example</h4>
+<h4>Example</h4>
 <!-- Show example of function.-->
-     upper('hello WOrld') &rarr; 'Hello World'</p>
+<code>to_date('2012-05-04') &rarr; 2012-05-04</code><br>
 </source>
-        <translation><h3>Funktion title()</h3>
-Wandelt alle Worte einer Zeichenkette in Kleinbuchstaben mit gro&szlig;em Anfangsbuchstaben um.
+        <translation type="obsolete"><h3>Funktion to_date()</h3>
+Wandelt eine Zeichenkette in eine Qt-Datumstyp um.
 
-<p><h4>Syntax</h4>
-     title(<i>zeichenkette</i>)</p>
+<h4>Syntax</h4>
+<code>to_date('zeichenkette')</code><br>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, deren Worte in Kleinbuchstaben mit gro&szlig;em Anfangsbuchstaben umgewandelt werden.</p>
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Datumsformat.
+<br>
 
-<p><h4>Beispiel</h4>
+<h4>Beispiel</h4>
 <!-- Show example of function.-->
-     title('hello WOrld') &rarr; 'Hello World'</p>
+<code>to_date('2012-05-04') &rarr; 2012-05-04</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>regexp_match() function</h3>
-Returns true if any part of a string matches the supplied regular expression.
+        <source><h3>to_datetime() function</h3>
+Convert a string into Qt data time type.
 
-<p><h4>Syntax</h4>
-     regexp_match(<i>string,regex</i>)</p>
+<h4>Syntax</h4>
+<code>to_datetime('string')</code><br>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The string to test against the regular expression.<br>
-<i>  regex</i> &rarr; is string.  The regular expression to test against. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
+<h4>Arguments</h4>
+<code>string</code> - is string in Qt date time format.
+<br>
 
-<p><h4>Example</h4>
+<h4>Example</h4>
 <!-- Show example of function.-->
-     regexp_match('QGIS ROCKS','&#92;&#92;sROCKS') &rarr; 1</p>
+<code>to_datetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br>
 </source>
-        <translation><h3>Funktion regexp_match()</h3>
-Gibt 1 zur&uuml;ck, wenn irgendein Teil der Zeichenkette dem gegebenen regul&auml;ren Ausdruck entspricht.
+        <translation type="obsolete"><h3>Funktion to_datetime()</h3>
+Wandelt eine Zeichenkette in einen Qt-Datum&amp;Zeit-Typ.
 
-<p><h4>Syntax</h4>
-     regexp_match(<i>zeichenkette,regex</i>)</p>
+<h4>Syntax</h4>
+<code>to_datetime('zeichenkette')</code><br>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; eine Zeichenkette.  Die Zeichenkette, die mit dem regul&auml;ren Ausdruck verglichen werden soll.<br>
-<i>  regex</i> &rarr; eine Zeichenkette.  Der regul&auml;re Ausdruck mit dem verglichen werden. Backslash-Zeichen m&uuml;ssen doppelt ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r ein Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Datum&amp;Zeit-Format.
+<br>
 
-<p><h4>Beispiel</h4>
+<h4>Beispiel</h4>
 <!-- Show example of function.-->
-     regexp_match('QGIS ROCKT','&#92;&#92;sROCKT') &rarr; 1</p>
+<code>to_datetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>substr() function</h3>
-Return a part of a string
+        <source><h3>to_int() function</h3>
+Converts a string to integer number. Nothing changed if a value cannot be converted to integer (e.g '123asd' is invalid).
 
 <p><h4>Syntax</h4>
-     substr(<i>string,startpos,length</i>)</p>
+     to_int(<i>string</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The full string.<br>
-<i>  startpos</i> &rarr; is number.  The start position to extract from.<br>
-<i>  length</i> &rarr; is number.  The length of the string to extract.<br></p>
+<i>  string</i> &rarr; is string.  The String to convert to integer number.</p>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     substr('HELLO WORLD',3,5) &rarr; 'LLO W'</p>
+     to_int('123') &rarr; 123</p>
 </source>
-        <translation><h3>Funktion substr()</h3>
-Liefert einen Teil einer Zeichenkette
+        <translation type="obsolete"><h3>Funktion to_int()</h3>
+Wandelt eine Zeichenkette in eine ganze Zahl um.  Bricht ab, wenn die Zeichenkette nicht in eine Zahl umgewandelt werden kann ('123asd' ist z.B. ung&uuml;ltig).
 
 <p><h4>Syntax</h4>
-     substr(<i>zeichenkette,startpos,l&auml;nge</i>)</p>
+     to_int(<i>zeichenkette</i>)</p>
 
 <p><h4>Argumente</h4>
 <!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die vollst&auml;ndige Zeichenkette.<br>
-<i>  startpos</i> &rarr; ist eine Zahl.  Die Startposition des Teils.<br>
-<i>  l&auml;nge</i> &rarr; ist eine Zahl.  Die L&auml;nge des Teils.<br></p>
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die in eine ganze Zahl umzuwandelnde Zeichenkette.</p>
 
 <p><h4>Beispiel</h4>
 <!-- Show example of function.-->
-     substr('HELLO WORLD',3,5) &rarr; 'LLO W'</p>
+     to_int('123') &rarr; 123</p>
 </translation>
     </message>
     <message>
-        <source><h3>format() function</h3>
-Format a string using supplied arguments. 
+        <source><h3>to_interval() function</h3>
+Converts a string to a interval type.  Can be used to take days, hours, month, etc off a date. 
 
 <h4>Syntax</h4>
-<code>format('string', arg, [arg...n])</code><br>
+<code>to_interval('string')</code><br>
 
 <h4>Arguments</h4>
-<code>string</code> - is string.  String with Qt QString place holders.  Use %1, %2, etc for placeholders. Placeholders can be repeated. 
+<code>string</code> - is string. Format {n} days {n} hours {n} months
 <br>
-<code>arg [arg...n]</code> - any type. Any number of args. 
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>format('This %1 a %2','is', 'test') &rarr; This is a test</code><br></source>
-        <translation><h3>Funktion format()</h3>
-Formatiert eine Zeichenkette mit den gegebenen Argumenten.
+<code>todatetime('2012-05-05 12:00:00') - to_interval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br>
+</source>
+        <translation type="obsolete"><h3>Funktion to_interval()</h3>
+Wandelt eine Zeichenkette in einen Interval-Typ.  Kann verwendet werden um Tagen, Stunden, Monaten etc von Daten abzuziehen.
 
 <h4>Syntax</h4>
-<code>format('zeichenkette', arg, [arg...n])</code><br>
+<code>to_interval('zeichenkette')</code><br>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - ist eine Zeichenkette.  Zeichenkette mit Qt QString Platzhaltern.  %1, %2, usw. als Platzhalter. Platzhalter k&ouml;nnen sich wiederholen.
+<code>zeichenkette</code> - eine Zeichenkette. Format {n} Tage {n} Stunden {n} Monate
 <br>
-<code>arg [arg...n]</code> - jeder Typ. Beliebige Anzahl von Argumenten
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>format('Dies %1 ein %2','ist', 'Test') &rarr; Dies ist ein Test</code><br>
+<code>to_datetime('2012-05-05 12:00:00') - to_interval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>regexp_replace() function</h3>
-Returns a string with the supplied regular expression replaced.
+        <source><h3>to_real() function</h3>
+Converts a string to real number. Nothing changed if a value cannot be converted to real (e.g '123.56asd' is invalid). Numbers are rounded after saving changes if the precision is smaller than the result of the conversion.
 
 <p><h4>Syntax</h4>
-     regexp_replace(<i>string,regex,after</i>)</p>
+     to_real(<i>string</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The start string.<br>
-<i>  regex</i> &rarr; is string.  The regular expression to replace. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
-<i>  after</i> &rarr; is string.  The string that will replace any matching occurences of the supplied regular expression. Captured groups can be inserted into the replacement string using &#92;&#92;1, &#92;&#92;2, etc. <br></p>
+<i>  string</i> &rarr; is string.  The String to convert to real number.</p>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     regexp_replace('QGIS SHOULD ROCK','&#92;&#92;sSHOULD&#92;&#92;s',' DOES ') &rarr; 'QGIS DOES ROCK'</p>
+     to_real('123.45') &rarr; 123.45</p>
 </source>
-        <translation><h3>Funktion regexp_replace()</h3>
-Liefert eine Zeichenkette in der der angegebene regul&auml;re Ausdruck ersetzt wurde.
+        <translation type="obsolete"><h3>Funktion to_real()</h3>
+Wandelt eine Zeichenkette in eine Flie&szlig;kommazahl.  Nichts &auml;ndert sich, wenn die
+Zeichenkette nicht in eine Zahl umgewandelt werden kann (z.B. ist '123.56asd'
+ung&uuml;ltig).  Zahlen werden beim Speichern gerundet, wenn die Genauigkeit kleiner
+als des Umwandlungsergebnis ist.
 
 <p><h4>Syntax</h4>
-     regexp_replace(<i>a</i>, <i>streiche</i>, <i>setze</i>)
+     to_real(<i>zeichenkette</i>)</p>
 
 <p><h4>Argumente</h4>
 <!-- List args for functions here-->
-<i>a</i> &rarr; ist string.  Die urspr&uuml;ngliche Zeichenkette.<br>
-<i>streiche</i> &rarr; ist string.  Die zu ersetzende regul&auml;re Ausdruck. Backslash-Zeichen m&uuml;ssen doppelt ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r ein Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
-<i>setze</i> &rarr; ist string.  Die Zeichenkette durch die <i>streiche</i> ersetzt werden soll<br></p>
+<i>  zeichenkette</i> &larr; eine Zeichenkette.  Die Zeichenkette, die in eine Flie&szlig;kommazahl umgewandelt werden soll.</p>
 
 <p><h4>Beispiel</h4>
 <!-- Show example of function.-->
-<pre>regexp_replace('QGIS SHOULD ROCK','(SHOULD)','DOES (was:&#92;1)')</pre> &rarr; 'QGIS DOES (was: SHOULD) ROCK'
+     to_real('123.45') -> 123.45</p>
 </translation>
     </message>
     <message>
-        <source><h3>regexp_substr() function</h3>
-Returns the portion of a string which matches a supplied regular expression.
+        <source><h3>to_string() function</h3>
+Converts a number to string.
 
 <p><h4>Syntax</h4>
-     regexp_substr(<i>string,regex</i>)</p>
+     to_string(<i>number</i>)</p>
 
 <p><h4>Arguments</h4>
 <!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  The input string.<br>
-<i>  regex</i> &rarr; is string.  The regular expression to match against. Backslash characters must be double escaped (eg "&#92;&#92;s" to match a white space character). Non-greedy regular expressions are not supported.<br>
+<i>number</i> &rarr; is integer or real.  The number to convert to string.</p>
 
 <p><h4>Example</h4>
 <!-- Show example of function.-->
-     regexp_substr('abc123','(&#92;&#92;d+)') &rarr; '123'</p>
+     to_string(123) &rarr; '123'</p>
 </source>
-        <translation><h3>Funktion regexp_substr()</h3>
-Liefert den Teil einer Zeichenkette zur&uuml;ck, die dem gegebenen regul&auml;ren Ausdruck entspricht.
+        <translation type="obsolete"><h3>Funktion to_string()</h3>
+Wandelt eine Zahl in eine Zeichenkette um.
 
 <p><h4>Syntax</h4>
-     regexp_substr(<i>zeichenkette,regex</i>)</p>
+     to_string(<i>zahl</i>)</p>
 
 <p><h4>Argumente</h4>
 <!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; eine Zeichenkette.  Die Eingabezeichenkette.<br>
-<i>  regex</i> &rarr; eine Zeichenkette.  Der anzuwendende regul&auml;re Ausdruck. Backslash-Zeichen m&uuml;ssen doppelte ausgenommen werden (z.B. "&#92;&#92;s" f&uuml;r Leerzeichen). Genügsame (engl. non-greedy) reguläre Ausdrücke werde nicht unterstützt.<br>
+<i>zahl</i> &rarr; ist eine ganze oder Flie&szlig;kommazahl.  Die in eine Zeichenkette umzuwandelnde Zahl.</p>
 
 <p><h4>Beispiel</h4>
 <!-- Show example of function.-->
-     regexp_substr('abc123','(&#92;&#92;d+)') &rarr; '123'</p>
+     to_string(123) &rarr; '123'</p>
 </translation>
     </message>
     <message>
-        <source><h3>$y function</h3>
-Returns the y coordinate of the current feature.
+        <source><h3>to_time() function</h3>
+Convert a string into Qt time type.
 
 <h4>Syntax</h4>
-<pre>$y</pre>
+<code>to_time('string')</code><br>
 
 <h4>Arguments</h4>
-None
+<code>string</code> - is string in Qt time format.
+<br>
 
 <h4>Example</h4>
-<pre>$y &rarr; 42</pre>
-
-</source>
-        <translation><h3>Funktion $y</h3>
-Liefert die Y-Koordinate des aktuellen Objekts zur&uuml;ck.
-
-<h4>Syntax</h4>
-<pre>$y</pre>
-
-<h4>Argumente</h4>
-Keine
-
-<h4>Beispiel</h4>
-<pre>$y &rarr; 42</pre>
-
-</translation>
-    </message>
-    <message>
-        <source>
-<h3>color_rgba() function</h3>
-Returns a string representation of a color based on its red, green, blue, and alpha (transparency) components
-
-<p><h4>Syntax</h4>
-     color_rgba(<i>red, green, blue, alpha</i>)</p>
-
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  red</i> &rarr; the red component as an integer value from 0 to 255.<br>
-<i>  green</i> &rarr; the green component as an integer value from 0 to 255.<br>
-<i>  blue</i> &rarr; the blue component as an integer value from 0 to 255.<br>
-<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
-
-<p><h4>Example</h4>
 <!-- Show example of function.-->
-     color_rgba(255,127,0,200) &rarr; '255,127,0,200'</p>
+<code>to_time('12:30:01') &rarr; 12:30:01</code><br>
 </source>
-        <translation><h3>Funktion color_rgba()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Rot-, Gr&uuml;n-, Blauanteil und ihrer Transparenz zur&uuml;ck.
-
-<p><h4>Syntax</h4>
-     color_rgba(<i>rot, gr&uuml;n, blau, alpha</i>)</p>
-
-<p><h4>Argumente</h4>
-<i>  rot</i> &rarr; Der Rot-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
-<i>  gr&uuml;n</i> &rarr; Der Gr&uuml;n-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
-<i>  blau</i> &rarr; Der Blau-Anteil der Farbe, als ganze Zahl zwischen 0 und 256.<br>
-<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganze Zahl zwischen 0 (g&auml;nzlich transparent) und 256 (volldeckend).<br>
+        <translation type="obsolete"><h3>Funktion to_time()</h3>
+Wandelt eine Zeichenkette in einen Qt-Zeittyp um.
 
-<p><h4>Beispiel</h4>
-     color_rgba(255,127,0,200) &rarr; '255,127,0,200'</p>
+<h4>Syntax</h4>
+<code>to_time('zeichenkette')</code><br>
+
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Zeitformat.
+<br>
+
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>to_time('12:30:01') &rarr; 12:30:01</code><br>
 </translation>
     </message>
     <message>
-        <source><h3>$x function</h3>
-Returns the x coordinate of the current feature.
+        <source><h3>uuid function</h3>
+Generates a Universally Unique Identifier (UUID) for each row using the Qt
+<a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a>
+method.  Each UUID is 38 characters long.
 
 <h4>Syntax</h4>
-<pre>$x</pre>
+<pre>uuid()</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre>$x &rarr; 42</pre>
-
+<pre>uuid() &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre>
 </source>
-        <translation><h3>Funktion $x</h3>
-Liefert die X-Koordinate des aktuellen Punkts zur&uuml;ck.
+        <translation type="obsolete"><h3>Funktion uuid()</h3>
+Generiert eine universal eindeutige Kennung (UUID) mit der Qt-Methode <a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a> für jede Zeile.  Jede Kennung ist 38 Zeichen lang.
 
 <h4>Syntax</h4>
-<pre>$x</pre>
+<pre>uuid()</pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre>$x &rarr; 42</pre>
-
-</translation>
-    </message>
-    <message>
-        <source><h3>Math Group</h3>
-This group contains math functions e.g square root, sin and cos
-</source>
-        <translation><h3>Gruppe Mathematik</h3>
-Die Gruppe enth&auml;lt mathematische Funktionen (z.B. Quadratwurzel, Sinus und Cosinus)
-</translation>
+<pre>uuid() &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre></translation>
     </message>
     <message>
-        <source><h3>min() function</h3>
-Returns the smallest value in a set of values.
+        <source><h3>x_at() function</h3>
+Retrieves a x coordinate of the current feature
 
 <h4>Syntax</h4>
-     min(<i>value<i>[,<i>value</i>...])
+<code>x_at(i)</code>
 
 <h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  value</i> &rarr; a number.<br>
+<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-     min(20.5,10,6.2) &rarr; 6.2
+<pre>x_at(1) &rarr; 5</pre>
 </source>
-        <translation><h3>Funktion min()</h3>
-Gibt den kleinsten Wert eine Menge von Werten zur&uuml;ck.
+        <translation type="obsolete"><h3>Funktion x_at()</h3>
+Liefert eine X-Koordinate der Geometrie der aktuellen Geometrie.
 
 <h4>Syntax</h4>
-     min(<i>wert<i>[,<i>wert</i>...])
+<code>x_at(i)</code>
 
 <h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  wert</i> &rarr; eine Zahl.<br>
+<code>i</code> - ist int. X-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-     min(20.5,10,6.2) &rarr; 6.2
+<pre>x_at(1) &rarr; 5</pre>
 </translation>
     </message>
     <message>
-        <source><h3>lower() function</h3>
-Converts a string to lower case letters.
+        <source><h3>x_max function</h3>
+Returns the maximum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
-<p><h4>  Syntax</h4>
-     lower(<i>string</i>)</p>
+<h4>Syntax</h4>
+<pre>x_max(geom)</pre>
 
-<p><h4>  Arguments</h4>
-<i>  string</i> &rarr; is string.  The String to convert to lower case.</p>
+<h4>Arguments</h4>
+geom &rarr; a geometry
+
+<h4>Example</h4>
+<pre> x_max($geometry) &rarr; returns maximum x coordinate of $geometry</pre>
 
-<p><h4>  Example</h4>
-     lower('HELLO World') &rarr; 'hello world'</p>
 </source>
-        <translation><h3>Funktion lower()</h3>
-Wandelt eine Zeichenkette in Kleinbuchstaben um.
+        <translation type="obsolete"><h3>Funktion x_max()</h3>
+Gibt die größte X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-<p><h4>  Syntax</h4>
-     lower(<i>zeichenkette</i>)</p>
+<h4>Syntax</h4>
+<pre>x_max(geom)</pre>
 
-<p><h4>  Argumente</h4>
-<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die Zeichenkette, die in Kleinbuchstaben umzuwandeln ist.</p>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-<p><h4>  Beispiel</h4>
-     lower('Hallo Welt') &rarr; 'hallo welt'</p>
-</translation>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>x_max($geometry) &rarr; ergibt die maximale X-Koordinate von $geometry</pre></translation>
     </message>
     <message>
-        <source><h3>$numfeatures function</h3>
-In atlas generation, returns the total number of features within the coverage layer.
+        <source><h3>x_min function</h3>
+Returns the minimum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
 <h4>Syntax</h4>
-<pre>$numfeatures</pre>
+<pre>x_min(geom)</pre>
 
 <h4>Arguments</h4>
-None
+geom &rarr; a geometry
 
 <h4>Example</h4>
-<pre>$numfeatures &rarr; 42</pre>
+<pre> x_min($geometry) &rarr; returns minimum x coordinate of $geometry</pre>
 
 </source>
-        <translation><h3>$numfeatures function</h3>
-Bei der Atlantenerzeugung gibt es die Gesamtzahl der Objekte des Deckungslayers aus.
+        <translation type="obsolete"><h3>Funktion x_min()</h3>
+Gibt den kleinste X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
 <h4>Syntax</h4>
-<pre>$numfeatures</pre>
+<pre>x_min(geom)</pre>
 
 <h4>Argumente</h4>
-Keine
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
 <h4>Beispiel</h4>
-<pre>$numfeatures &rarr; 42</pre>
-
-</translation>
-    </message>
-    <message>
-        <source><h3>String Group</h3>
-This group contains functions that operate on strings e.g replace, convert to upper case.
-</source>
-        <translation><h3>Gruppe Zeichenketten</h3>
-Dies Gruppen enth&auml;lt Funktionen f&uuml;r Zeichenketten (z.B. Ersetzen und in Gro&szlig;buchstaben umwandeln).
-</translation>
+<!-- Show example of function.-->
+<pre>x_min($geometry) &rarr; ergibt die minimale X-Koordinate von $geometry</pre></translation>
     </message>
     <message>
-        <source><h3>concat() function</h3>
-Concatenates several strings to one.
+        <source><h3>y_at() function</h3>
+Retrieves a y coordinate of the current feature
 
 <h4>Syntax</h4>
-     concat(<i>string<i>[,<i>string</i>...])
+<code>y_at(i)</code>
 
 <h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  string</i> &rarr; is string.  a string.<br>
+<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-     concat('a','b','c','d','e') &rarr; 'abcde'
+<pre>y_at(1) &rarr; 5</pre>
 </source>
-        <translation><h3>Funktion concat()</h3>
-F&uuml;gt Zeichenketten zu einer zusammen.
+        <translation type="obsolete"><h3>Funktion y_at()</h3>
+Liefert eine Y-Koordinate der Geometrie der aktuellen Geometrie.
 
-<p><h4>Syntax</h4>
-     substr(<i>zeichenkette<i>[, <i>zeichenkette</i>...])</p>
+<h4>Syntax</h4>
+<code>y_at(i)</code>
 
-<p><h4>Argumente</h4>
-<!-- List args for functions here-->
-<i>  zeichenkette</i> &rarr; ist string.  Ein Zeichenkette.<br>
+<h4>Argumente</h4>
+<code>i</code> - ist int. Y-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
 
-<p><h4>Beispiel</h4>
-<!-- Show example of function.-->
-     concat('a','b','c','d','e') &rarr; 'abcde'</p>
+<h4>Beispiel</h4>
+<pre>y_at(1) &rarr; 5</pre>
 </translation>
     </message>
     <message>
-        <source><h3>coalesce() function</h3>
-Returns the first non-NULL value from the expression list.
-<br>
-This function can take any number of arguments.
+        <source><h3>y_max function</h3>
+Returns the maximum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
+
 <h4>Syntax</h4>
-<code>coalesce(expression1, expression2 ...)</code><br>
+<pre>y_max(geom)</pre>
 
 <h4>Arguments</h4>
-<code>expression</code> - any valid expression or value, irregardless of type.
-<br>
+geom &rarr; a geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>coalesce(NULL, 2) &rarr; 2</code><br>
-<code>coalesce(NULL, 2, 3) &rarr; 2</code><br>
-<code>coalesce(7, NULL, 3*2) &rarr; 7</code><br><br>
-<code>coalesce("fieldA", "fallbackField", 'ERROR') &rarr; value of fieldA if it is non-NULL
- else the value of "fallbackField" or the string 'ERROR' if both are NULL</code><br>
+<pre> y_max($geometry) &rarr; returns maximum y coordinate of $geometry</pre>
 
 </source>
-        <translation><h3>Funktion coalesce()</h3>
-Liefert den ersten Wert, der nicht NULL ist, einer Ausdruckliste.
-<br>
-Diese Funktion kann beliebig viele Argumente haben.
+        <translation type="obsolete"><h3>Funktion y_max()</h3>
+Gibt den größten Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
+
 <h4>Syntax</h4>
-<code>coalesce(ausdruck1, ausdruck2...)</code><br>
+<pre>y_max(geom)</pre>
 
 <h4>Argumente</h4>
-<code>ausdruck</code> - ein g&uuml;ltige Ausdruck jeden Typs
-<br>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
 <h4>Beispiel</h4>
 <!-- Show example of function.-->
-<code>coalesce(NULL, 2) &rarr; 2</code><br>
-<code>coalesce(NULL, 2, 3) &rarr; 2</code><br>
-<code>coalesce(7, NULL, 3*2) &rarr; 7</code><br><br>
-<code>coalesce("attributA", "anderesFeld", 'FEHLER') &rarr; Wert des Attributs attributA falls es nicht NULL ist,
- sonst der Wert des Attributes "anderesFeld" oder die Zeichenkette 'FEHLER', wenn beide NULL sind.</code><br>
-</translation>
+<pre>y_max($geometry) &rarr; ergibt die maximale Y-Koordinate von $geometry</pre></translation>
     </message>
     <message>
-        <source><h3>asin() function</h3>
-Returns arcussinus of a value in radians.
+        <source><h3>y_min function</h3>
+Returns the minimum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
+<h4>Syntax</h4>
+<pre>y_min(geom)</pre>
 
-<p><h4>Syntax</h4>
-     asin(<i>real</i>)</p>
+<h4>Arguments</h4>
+geom &rarr; a geometry
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; sin of an angle.</p>
+<h4>Example</h4>
+<pre> y_min($geometry) &rarr; returns minimum y coordinate of $geometry</pre>
 
-<p><h4>Example</h4>
-     asin(1.0) &rarr; 1.5707963267949</p>
 </source>
-        <translation><h3>Funktion asin()</h3>
-Gibt den Arcussinus eines Werts im Bogenma&szlig; zur&uuml;ck.
-
+        <translation type="obsolete"><h3>Funktion y_min()</h3>
+Gibt den kleinste Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-<p><h4>Syntax</h4>
-     asin(<i>wert</i>)</p>
+<h4>Syntax</h4>
+<pre>y_min(geom)</pre>
 
-<p><h4>Argumente</h4>
-<i>wert</i> &rarr; Sinus des Werts.</p>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-<p><h4>Beispiel</h4>
-     asin(1.0) &rarr; 1.5707963267949</p>
-</translation>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>y_min($geometry) &rarr; ergibt die minimale Y-Koordinate von $geometry</pre></translation>
     </message>
     <message>
-        <source><h3>todatetime() function</h3>
-Convert a string into Qt data time type.
+        <source><h3>$now function</h3>
+Returns the current date and time
 
 <h4>Syntax</h4>
-<code>todatetime('string')</code><br>
+<pre>$now</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string in Qt date time format.
-<br>
+None
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>todatetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br></source>
-        <translation><h3>Funktion todatetime()</h3>
-Wandelt eine Zeichenkette in einen Qt-Datum&amp;Zeit-Typ.
+<pre>$now &rarr; 2012-07-22T13:24:57</pre>
+
+</source>
+        <translation><h3>Funktion now</h3>
+Ergibt aktuelles Datum und Zeit
 
 <h4>Syntax</h4>
-<code>todatetime('zeichenkette')</code><br>
+<pre>now()</pre>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - eine Zeichenkette im Qt-Datum&amp;Zeit-Format.
-<br>
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>todatetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br>
+<pre>now() &rarr; 2012-07-22T13:24:57</pre>
 </translation>
     </message>
     <message>
-        <source><h3>tan() function</h3>
-Returns tangent of an angle.
-
+        <source><h3>$pi constant</h3>
+Returns pi as value for calculations
 
-<p><h4>Syntax</h4>
-     tan(<i>real</i>)</p>
+<h4>Syntax</h4>
+<pre>$pi</pre>
 
-<p><h4>Arguments</h4>
-<i>real</i> &rarr; angle in radians.</p>
+<h4>Arguments</h4>
+None
 
-<p><h4>Example</h4>
-     tan(1.0) &rarr; 1.5574077246549</p>
+<h4>Example</h4>
+<pre>$pi &rarr; 3.14159265358979</pre>
 </source>
-        <translation><h3>Funktion tan()</h3>
-Gibt den Tangens eines Winkel zur&uuml;ck.
-
+        <translation><h3>Konstante $pi</h3>
+Liefert den Wert von pi f&uuml;r Berechnungen
 
-<p><h4>Syntax</h4>
-     tan(<i>winkel</i>)</p>
+<h4>Syntax</h4>
+<pre>$pi</pre>
 
-<p><h4>Argumente</h4>
-<i>winkel</i> &rarr; Winkel im Bogenma&szlig;.</p>
+<h4>Argumente</h4>
+Keine
 
-<p><h4>Beispiel</h4>
-     tan(1.0) &rarr; 1.5574077246549</p>
+<h4>Beispiel</h4>
+<pre>$pi &rarr; 3.14159265358979</pre>
 </translation>
     </message>
     <message>
-        <source><h3>$feature function</h3>
-In atlas generation, returns the current feature number that is iterated over on the coverage layer.
+        <source><h3>$uuid function</h3>
+Generates a Universally Unique Identifier (UUID) for each row using the Qt
+<a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a>
+method.  Each UUID is 38 characters long.
 
 <h4>Syntax</h4>
-<pre>$feature</pre>
+<pre>$uuid</pre>
 
 <h4>Arguments</h4>
 None
 
 <h4>Example</h4>
-<pre>$feature &rarr; 2</pre>
-
+<pre>$uuid &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre>
 </source>
-        <translation><h3>Funktion $feature</h3>
-Beid der Atlantenerzeugung gibt es die aktuelle Objektanzahl auf dem Deckungslayer zur&uuml;ck.
+        <translation><h3>Funktion $uuid</h3>
+Generiert eine universal eindeutige Kennung (UUID) mit der Qt-Methode <a href='http://qt-project.org/doc/qt-4.8/quuid.html#createUuid'>QUuid::createUuid</a> für jede Zeile.  Jede Kennung ist 38 Zeichen lang.
 
 <h4>Syntax</h4>
-<pre>$feature</pre>
+<pre>uuid()</pre>
 
 <h4>Argumente</h4>
 Keine
 
 <h4>Beispiel</h4>
-<pre>$feature &rarr; 2</pre>
-
-</translation>
+<pre>$uuid &rarr; {0bd2f60f-f157-4a6d-96af-d4ba4cb366a1}</pre></translation>
     </message>
     <message>
-        <source><h3>ln() function</h3>
-Returns the value of the natural logarithm of the passed expression.
-<br>
-This function takes one argument.
+        <source><h3>bbox function</h3>
+Returns 1 if the geometries spatially intersect the bounding box defined and 0 if they don't.
+
 <h4>Syntax</h4>
-<code>ln(value)</code><br>
+<pre>bbox( a, b )</pre>
 
 <h4>Arguments</h4>
-<code>value</code> - any positive number.
-<br>
+a &rarr; geometry
+b &rarr; geometry
 
 <h4>Example</h4>
-<!-- Show example of function.-->
-<code>ln(1) &rarr; 0</code><br>
-<code>ln(2.7182818284590452354) &rarr; 1</code><br>
+<pre>bbox( geomFromWKT( 'POINT(4 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; returns 1</pre>
+<pre>bbox( geomFromWKT( 'POINT(6 5)' ) , geomFromWKT( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; returns 0</pre>
 </source>
-        <translation><h3>Funktion ln()</h3>
-Gibt den nat&uuml;rlichen Logrithmus des gegebenen Ausdrucks zur&uuml;ck.
-<br>
-Die Funktion akzeptiert ein Argument.
+        <translation><h3>Funktion bbox</h3>
+Gibt 1 zurück, wenn sich die Ausmaße der beiden Geometrien räumlich überschneiden und anderenfalls 0 zurück.
+
 <h4>Syntax</h4>
-<code>ln(wert)</code><br>
+<pre>bbox( a, b )</pre>
 
 <h4>Argumente</h4>
-<code>wert</code> - eine positive Zahl.
-<br>
+a &rarr; geometrie
+b &rarr; geometrie
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>ln(1) &rarr; 0</code><br>
-<code>ln(2.7182818284590452354) &rarr; 1</code><br>
-</translation>
+<pre>bbox( geom_from_wkt( 'POINT(4 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' )) &rarr; ergibt 1</pre>
+<pre>bbox( geom_from_wkt( 'POINT(6 5)' ) , geom_from_wkt( 'POLYGON((3 3 , 4 4 , 5 5, 3 3))' )) &rarr; ergibt 0</pre</translation>
     </message>
     <message>
-        <source><h3>color_hsva() function</h3>
-Returns a string representation of a color based on its hue, saturation, value and alpha (transparency) attributes
+        <source><h3>convexHull function</h3>
+Returns the convex hull of a geometry. It represents the minimum convex geometry that encloses all geometries within the set.
 
-<p><h4>Syntax</h4>
-     color_hsva(<i>hue, saturation, value, alpha</i>)</p>
+<h4>Syntax</h4>
+<pre>convexHull( a, b )</pre>
 
-<p><h4>Arguments</h4>
-<!-- List args for functions here-->
-<i>  hue</i> &rarr; the hue of the color, as an integer value from 0 to 360.<br>
-<i>  saturation</i> &rarr; the saturation percentage of the color as an integer value from 0 to 100.<br>
-<i>  value</i> &rarr; the value percentage of the color as an integer from 0 to 100.<br>
-<i>  alpha</i> &rarr; the alpha component as an integer value from 0 (completely transparent) to 255 (opaque).<br>
+<h4>Arguments</h4>
+a &rarr; geometry
+a &rarr; geometry
 
-<p><h4>Example</h4>
-<!-- Show example of function.-->
-     color_hsva(40,100,100,200) &rarr; '255,170,0,200'</p>
+<h4>Example</h4>
+<pre>  geomToWKT( convexHull( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; returns POLYGON((3 3,4 10,4 4,3 3)) </pre>
 </source>
-        <translation><h3>Funktion color_hsla()</h3>
-Gibt eine Farbe als Zeichenkette basierend auf ihrem Farbton, ihrer S&auml;ttigung, ihres Betrags und Alpha/Transparenz zur&uuml;ck.
+        <translation><h3>Funktion convexHull</h3>
+Gibt die konvexe Hülle einer Geometrie zurück. Es stellt die minimale konvexe Geometrie dar, sie alle Geometrien des Satzes umfassen.
 
-<p><h4>Syntax</h4>
-     color_hsva(<i>farbton, s&auml;ttigung, betrag, alpha</i>)</p>
+<h4>Syntax</h4>
+<pre>convexHull( a, b)</pre>
 
-<p><h4>Argumente</h4>
-<i>  farbton</i> &rarr; Der Farbton der Farbe, als ganzzahliger Wert zwischen 0 und 360.<br>
-<i>  s&auml;ttigung</i> &rarr; Der S&auml;ttigung der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  betrag</i> &rarr; Die Betrag der Farbe, als ganzzahliger Prozentsatz zwischen 0 und 100.<br>
-<i>  alpha</i> &rarr; Die Transparenz der Farbe, als ganzzahliger Prozentsatz zwischen 0 (g&auml;nzlich transparent) und 100 (deckend).<br>
+<h4>Argumente</h4>
+a &rarr; geometry
+b &rarr; geometry
 
-<p><h4>Beispiel</h4>
-     color_hsva(40,100,100,200) &rarr; '255,170,0,200'</p>
-</translation>
+<h4>Beispiel</h4>
+<pre>  geomToWKT( convexHull( geomFromWKT( 'LINESTRING(3 3 , 4 4 , 4 10)' )) )   &rarr; ergibt POLYGON((3 3,4 10,4 4,3 3)) </pre></translation>
     </message>
     <message>
-        <source><h3>geometry function</h3>
-Returns the feature's geometry
+        <source><h3>geomFromGML function</h3>
+Returns a geometry from a GML representation of geometry
 
 <h4>Syntax</h4>
-<pre>geometry( f )</pre>
+<pre>geomFromGML(text)</pre>
 
 <h4>Arguments</h4>
-f &rarr; QgsFeature
+text &rarr; GML representation of a geometry
 
 <h4>Example</h4>
-<pre> geomToWKT( geometry( getFeature( layer, attributeField, value ) ) ) &rarr; POINT(6 50)</pre>
-<pre> intersects( $geometry, geometry( getFeature( layer, attributeField, value ) ) ) &rarr; 1</pre>
+<pre> geomFromGML( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; returns a geometry</pre>
+
 </source>
-        <translation><h3>geometry function</h3>
-Ergibt die Geometrie eines Objekts
+        <translation><h3>Funktion geomFromGml</h3>
+Gibt eine aus einer GML-Repräsentation erzeugte Geometrie zurück.
 
 <h4>Syntax</h4>
-<pre>geometry( f )</pre>
+<pre>geomFromGml(text)</pre>
 
 <h4>Argumente</h4>
-f &rarr; QgsFeature
+text &rarr; GML-Repräsentation einer Geometrie
 
-<h4>Beispiele</h4>
-<pre> geomToWKT( geometry( getFeature( layer, attributeField, value ) ) ) &rarr; POINT(6 50)</pre>
-<pre> intersects( $geometry, geometry( getFeature( layer, attributeField, value ) ) ) &rarr; 1</pre>
+<h4>Beispiel</h4>
+<pre> geomFromGml( '<gml:LineString srsName="EPSG:4326"><gml:coordinates>4,4 5,5 6,6</gml:coordinates></gml:LineString>') &rarr; ergibt eine Geometrie</pre>
 </translation>
     </message>
     <message>
-        <source><h3>transform function</h3>
-Returns the geometry transformed from the source CRS to the dest CRS.
+        <source><h3>geomFromWKT function</h3>
+Returns a geometry created from a Well-Known Text (WKT) representation.
 
 <h4>Syntax</h4>
-<pre>transform( geom, sAuthId, dAuthId )</pre>
+<pre>geomFromWKT(text)</pre>
 
 <h4>Arguments</h4>
-geom &rarr; QgsGeometry
-
-sCrsId &rarr; the Source Auth CRS Id
-
-dCrsId &rarr; the Dest Auth CRS Id
+text &rarr; Well-Known Text (WKT) representation of a geometry
 
 <h4>Example</h4>
-<pre> geomToWKT( transform( $geometry, 'EPSG:2154', 'EPSG:4326' ) ) &rarr; POINT(0 51)</pre>
+<pre> geomFromWKT( 'POINT(4 5)' ) &rarr; returns a geometry</pre>
+
 </source>
-        <translation><h3>Funktion transform</h3>
-Ergibt die vom Quell- zum Ziel-KBS transformierte Geometrie.
+        <translation><h3>Funktion geomFromWkt</h3>
+Erzeugt aus einer Well-Known-Text-Repräsentation (WKT) eine Geometrie.
 
 <h4>Syntax</h4>
-<pre>transform( geom, sAuthId, dAuthId )</pre>
+<pre>geomFromWkt(text)</pre>
 
 <h4>Argumente</h4>
-geom &rarr; QgsGeometry
-
-sCrsId &rarr; Kennung des Quell-KBS
-
-dCrsId &rarr; Kennung des Ziel-KBS
+text &rarr; Well-Known Text-Repräsentation (WKT) einer Geometrie
 
 <h4>Beispiel</h4>
-<pre> geomToWKT( transform( $geometry, 'EPSG:2154', 'EPSG:4326' ) ) &rarr; POINT(0 51)</pre>
+<pre> geomFromWkt( 'POINT(4 5)' ) &rarr; ergibt eine Geometrie</pre>
 </translation>
     </message>
     <message>
-        <source><h3>format_date() function</h3>
-Format a date type or string into a custom string format. Uses Qt data time format strings.  See <a href='http://qt-project.org/doc/qt-4.8/qdatetime.html#toString'>QDateTime::toString</a>
+        <source><h3>geomToWKT function</h3>
+Returns the Well-Known Text (WKT) representation of the geometry without SRID metadata.
 
 <h4>Syntax</h4>
-<code>format_date('string', 'format_string')</code><br>
+<pre>geomToWKT(a)</pre>
 
 <h4>Arguments</h4>
-<code>string</code> - is string. Date/Time/DateTime string.
-<br>
-<code>format_string</code> - is string. String template used to format the string.
+a &rarr; geometry
 
-  <table>
-    <thead>
-      <tr>
-        <th>Expression</th>
+<h4>Example</h4>
+<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
+</source>
+        <translation><h3>Funktion geomToWKT</h3>
+Ergibt die Well-Known-Text-Darstellung (WKT) der Geometrie ohne räumlichen Bezugssystem zurück.
 
-        <th>Output</th>
-      </tr>
-    </thead>
+<h4>Syntax</h4>
+<pre>geomToWKT(a)</pre>
 
-    <tr valign="top">
-      <td>d</td>
+<h4>Argumente</h4>
+a &rarr;  Geometriee
 
-      <td>the day as number without a leading zero (1 to 31)</td>
-    </tr>
+<h4>Beispiel</h4>
+<pre> geomToWKT( $geometry ) &rarr; POINT(6 50)</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>getFeature function</h3>
+Returns the first feature of a layer matching a given attribute value
 
-    <tr valign="top">
-      <td>dd</td>
+<h4>Syntax</h4>
+<pre>getFeature( layer, attributeField, value )</pre>
 
-      <td>the day as number with a leading zero (01 to 31)</td>
-    </tr>
+</source>
+        <translation><h3>Funktion getFeature</h3>
+Gibt des erste Objekt des Layers zurück, das denn gegebenen Attribute entspricht
 
-    <tr valign="top">
-      <td>ddd</td>
+<h4>Syntax</h4>
+<pre>getFeature( layer, attributFeld, wert )</pre>
 
-      <td>the abbreviated localized day name (e.g. 'Mon' to 'Sun'). Uses <a href=
-      "qdate.html#shortDayName">QDate::shortDayName</a>().</td>
-    </tr>
+ </translation>
+    </message>
+    <message>
+        <source><h3>symDifference function</h3>
+Returns a geometry that represents the portions of a and b that do not intersect.
 
-    <tr valign="top">
-      <td>dddd</td>
+<h4>Syntax</h4>
+<pre>symDifference( geometry a, geometry b)</pre>
 
-      <td>the long localized day name (e.g. 'Monday' to 'Sunday'). Uses <a href=
-      "qdate.html#longDayName">QDate::longDayName</a>().</td>
-    </tr>
+<h4>Arguments</h4>
+geometry &rarr; geometry
+geometry &rarr; geometry
 
-    <tr valign="top">
-      <td>M</td>
+<h4>Example</h4>
+<pre> geomToWKT( symDifference(  geomFromWKT( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geomFromWKT( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; returns LINESTRING(5 5, 8 8)</pre>
+</source>
+        <translation><h3>Funktion symDifference</h3>
+Gibt eine Geometrie zurück, die die Teile der Geometrien a und b darstellen, die sich nicht schneiden.
 
-      <td>the month as number without a leading zero (1-12)</td>
-    </tr>
+<h4>Syntax</h4>
+<pre>symDifference( a, b )</pre>
 
-    <tr valign="top">
-      <td>MM</td>
+<h4>Argumente</h4>
+a &rarr; Geometrie
+b &rarr; Geometrie
 
-      <td>the month as number with a leading zero (01-12)</td>
-    </tr>
+<h4>Beispiel</h4>
+<pre> geom_to_wkt( symDifference( geom_from_wkt( 'LINESTRING(3 3 , 4 4 , 5 5)' ) , geom_from_wkt( 'LINESTRING(3 3 , 8 8)' ))   )   &rarr; ergibt LINESTRING(5 5, 8 8)</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>todate() function</h3>
+Convert a string into Qt data type.
 
-    <tr valign="top">
-      <td>MMM</td>
+<h4>Syntax</h4>
+<code>todate('string')</code><br>
 
-      <td>the abbreviated localized month name (e.g. 'Jan' to 'Dec'). Uses <a href=
-      "qdate.html#shortMonthName">QDate::shortMonthName</a>().</td>
-    </tr>
+<h4>Arguments</h4>
+<code>string</code> - is string in Qt date format.
+<br>
 
-    <tr valign="top">
-      <td>MMMM</td>
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>todate('2012-05-04') &rarr; 2012-05-04</code><br></source>
+        <translation><h3>Funktion todate()</h3>
+Wandelt eine Zeichenkette in eine Qt-Datumstyp um.
+
+<h4>Syntax</h4>
+<code>todate('zeichenkette')</code><br>
+
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Datumsformat.
+<br>
 
-      <td>the long localized month name (e.g. 'January' to 'December'). Uses <a href=
-      "qdate.html#longMonthName">QDate::longMonthName</a>().</td>
-    </tr>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>todate('2012-05-04') &rarr; 2012-05-04</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>todatetime() function</h3>
+Convert a string into Qt data time type.
 
-    <tr valign="top">
-      <td>yy</td>
+<h4>Syntax</h4>
+<code>todatetime('string')</code><br>
 
-      <td>the year as two digit number (00-99)</td>
-    </tr>
+<h4>Arguments</h4>
+<code>string</code> - is string in Qt date time format.
+<br>
 
-    <tr valign="top">
-      <td>yyyy</td>
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>todatetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br></source>
+        <translation><h3>Funktion todatetime()</h3>
+Wandelt eine Zeichenkette in einen Qt-Datum&amp;Zeit-Typ.
 
-      <td>the year as four digit number</td>
-    </tr>
-  </table>
+<h4>Syntax</h4>
+<code>todatetime('zeichenkette')</code><br>
 
-  <p>These expressions may be used for the time part of the format string:</p>
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Datum&amp;Zeit-Format.
+<br>
 
-  <table>
-    <thead>
-      <tr>
-        <th>Expression</th>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>todatetime('2012-05-04 12:50:00') &rarr; 2012-05-04T12:50:00</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>toint() function</h3>
+Converts a string to integer number. Nothing changed if a value cannot be converted to integer (e.g '123asd' is invalid).
 
-        <th>Output</th>
-      </tr>
-    </thead>
+<p><h4>Syntax</h4>
+     toint(<i>string</i>)</p>
 
-    <tr valign="top">
-      <td>h</td>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The String to convert to integer number.</p>
 
-      <td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td>
-    </tr>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     toint('123') &rarr; 123</p>
+</source>
+        <translation><h3>Funktion toint()</h3>
+Wandelt eine Zeichenkette in eine ganze Zahl um.  Bricht ab, wenn die Zeichenkette nicht in eine Zahl umgewandelt werden kann ('123asd' ist z.B. ung&uuml;ltig).
 
-    <tr valign="top">
-      <td>hh</td>
+<p><h4>Syntax</h4>
+     toint(<i>zeichenkette</i>)</p>
 
-      <td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td>
-    </tr>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &rarr; ist eine Zeichenkette.  Die in eine ganze Zahl umzuwandelnde Zeichenkette.</p>
 
-    <tr valign="top">
-      <td>H</td>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     toint('123') &rarr; 123</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>tointerval() function</h3>
+Converts a string to a interval type.  Can be used to take days, hours, month, etc off a date. 
 
-      <td>the hour without a leading zero (0 to 23, even with AM/PM display)</td>
-    </tr>
+<h4>Syntax</h4>
+<code>tointerval('string')</code><br>
 
-    <tr valign="top">
-      <td>HH</td>
+<h4>Arguments</h4>
+<code>string</code> - is string. Format {n} days {n} hours {n} months
+<br>
 
-      <td>the hour with a leading zero (00 to 23, even with AM/PM display)</td>
-    </tr>
+<h4>Example</h4>
+<!-- Show example of function.-->
+<code>todatetime('2012-05-05 12:00:00') - tointerval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br></source>
+        <translation><h3>Funktion tointerval()</h3>
+Wandelt eine Zeichenkette in einen Interval-Typ.  Kann verwendet werden um Tagen, Stunden, Monaten etc von Daten abzuziehen.
 
-    <tr valign="top">
-      <td>m</td>
+<h4>Syntax</h4>
+<code>tointerval('zeichenkette')</code><br>
 
-      <td>the minute without a leading zero (0 to 59)</td>
-    </tr>
+<h4>Argumente</h4>
+<code>zeichenkette</code> - eine Zeichenkette. Format {n} Tage {n} Stunden {n} Monate
+<br>
 
-    <tr valign="top">
-      <td>mm</td>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>todatetime('2012-05-05 12:00:00') - to_interval('1 day 2 hours') &rarr; 2012-05-04T10:00:00</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>toreal() function</h3>
+Converts a string to real number. Nothing changed if a value cannot be converted to real (e.g '123.56asd' is invalid). Numbers are rounded after saving changes if the precision is smaller than the result of the conversion.
 
-      <td>the minute with a leading zero (00 to 59)</td>
-    </tr>
+<p><h4>Syntax</h4>
+     toreal(<i>string</i>)</p>
 
-    <tr valign="top">
-      <td>s</td>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>  string</i> &rarr; is string.  The String to convert to real number.</p>
 
-      <td>the second without a leading zero (0 to 59)</td>
-    </tr>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     toreal('123.45') &rarr; 123.45</p>
+</source>
+        <translation><h3>Funktion toreal()</h3>
+Wandelt eine Zeichenkette in eine Flie&szlig;kommazahl.  Nichts &auml;ndert sich, wenn die
+Zeichenkette nicht in eine Zahl umgewandelt werden kann (z.B. ist '123.56asd'
+ung&uuml;ltig).  Zahlen werden beim Speichern gerundet, wenn die Genauigkeit kleiner
+als des Umwandlungsergebnis ist.
 
-    <tr valign="top">
-      <td>ss</td>
+<p><h4>Syntax</h4>
+     to_real(<i>zeichenkette</i>)</p>
 
-      <td>the second with a leading zero (00 to 59)</td>
-    </tr>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  zeichenkette</i> &larr; eine Zeichenkette.  Die Zeichenkette, die in eine Flie&szlig;kommazahl umgewandelt werden soll.</p>
 
-    <tr valign="top">
-      <td>z</td>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     toreal('123.45') -> 123.45</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>tostring() function</h3>
+Converts a number to string.
 
-      <td>the milliseconds without leading zeroes (0 to 999)</td>
-    </tr>
+<p><h4>Syntax</h4>
+     tostring(<i>number</i>)</p>
 
-    <tr valign="top">
-      <td>zzz</td>
+<p><h4>Arguments</h4>
+<!-- List args for functions here-->
+<i>number</i> &rarr; is integer or real.  The number to convert to string.</p>
 
-      <td>the milliseconds with leading zeroes (000 to 999)</td>
-    </tr>
+<p><h4>Example</h4>
+<!-- Show example of function.-->
+     tostring(123) &rarr; '123'</p>
+</source>
+        <translation><h3>Funktion tostring()</h3>
+Wandelt eine Zahl in eine Zeichenkette um.
 
-    <tr valign="top">
-      <td>AP or A</td>
+<p><h4>Syntax</h4>
+     tostring(<i>zahl</i>)</p>
 
-      <td>interpret as an AM/PM time. <i>AP</i> must be either "AM" or "PM".</td>
-    </tr>
+<p><h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>zahl</i> &rarr; ist eine ganze oder Flie&szlig;kommazahl.  Die in eine Zeichenkette umzuwandelnde Zahl.</p>
 
-    <tr valign="top">
-      <td>ap or a</td>
+<p><h4>Beispiel</h4>
+<!-- Show example of function.-->
+     tostring(123) &rarr; '123'</p>
+</translation>
+    </message>
+    <message>
+        <source><h3>totime() function</h3>
+Convert a string into Qt time type.
 
-      <td>Interpret as an AM/PM time. <i>ap</i> must be either "am" or "pm".</td>
-    </tr>
-  </table>
+<h4>Syntax</h4>
+<code>totime('string')</code><br>
 
+<h4>Arguments</h4>
+<code>string</code> - is string in Qt time format.
 <br>
 
 <h4>Example</h4>
 <!-- Show example of function.-->
-<code>format_date('2012-05-15','dd.MM.yyyy') &rarr; 15.05.2012</code><br>
-</source>
-        <translation><h3>Funktion format_date()</h3>
-Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt Datum- und Zeitformate. Siehe <a href='http://qt-project.org/doc/qt-4.8/qdatetime.html#toString'>QDateTime::toString</a>
+<code>totime('12:30:01') &rarr; 12:30:01</code><br></source>
+        <translation><h3>Funktion totime()</h3>
+Wandelt eine Zeichenkette in einen Qt-Zeittyp um.
 
 <h4>Syntax</h4>
-<code>format_date('zeichenkette', 'format')</code><br>
+<code>totime('zeichenkette')</code><br>
 
 <h4>Argumente</h4>
-<code>zeichenkette</code> - eine Zeichenkette. Datum/Zeit/Datum&Zeit-Zeichenkette.
+<code>zeichenkette</code> - eine Zeichenkette im Qt-Zeitformat.
 <br>
-<code>format</code> - eine Zeichenkette. Vorlage zur Formatierung.
-
-  <table>
-    <thead>
-      <tr>
-        <th>Ausdruck</th>
-
-        <th>Ausgabe</th>
-      </tr>
-    </thead>
-
-    <tr valign="top">
-      <td>d</td>
 
-      <td>Der Tag als Zahl ohne f&uuml;hrende Null (1 to 31)</td>
-    </tr>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<code>totime('12:30:01') &rarr; 12:30:01</code><br>
+</translation>
+    </message>
+    <message>
+        <source><h3>xat() function</h3>
+Retrieves a x coordinate of the current feature
 
-    <tr valign="top">
-      <td>dd</td>
+<h4>Syntax</h4>
+<code>xat(i)</code>
 
-      <td>Der Tag als Zahl mit f&uuml;hrender Null (01 to 31)</td>
-    </tr>
+<h4>Arguments</h4>
+<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
 
-    <tr valign="top">
-      <td>ddd</td>
+<h4>Example</h4>
+<pre>xat(1) &rarr; 5</pre>
+</source>
+        <translation><h3>Funktion xat()</h3>
+Liefert eine X-Koordinate der Geometrie der aktuellen Geometrie.
 
-      <td>Der abgek&uuml;rzte lokale Tagname (z.B. 'Mon' bis 'Son'). Siehe <a href="qdate.html#shortDayName">QDate::shortDayName</a>().</td>
-    </tr>
+<h4>Syntax</h4>
+<code>xat(i)</code>
 
-    <tr valign="top">
-      <td>dddd</td>
+<h4>Argumente</h4>
+<code>i</code> - ist int. X-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
 
-      <td>Der lokale Tagname (z.B. 'Montag' to 'Sonntag'). Siehe <a href="qdate.html#longDayName">QDate::longDayName</a>().</td>
-    </tr>
+<h4>Beispiel</h4>
+<pre>xat(1) &rarr; 5</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>xmax function</h3>
+Returns the maximum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
-    <tr valign="top">
-      <td>M</td>
+<h4>Syntax</h4>
+<pre>xmax(geom)</pre>
 
-      <td>Der Monat als Zahl ohne f&uuml;hrende Null (1-12)</td>
-    </tr>
+<h4>Arguments</h4>
+geom &rarr; a geometry
 
-    <tr valign="top">
-      <td>MM</td>
+<h4>Example</h4>
+<pre> xmax($geometry) &rarr; returns maximum x coordinate of $geometry</pre>
 
-      <td>Der Monat als Zahl mit f&uuml;hrender Null (01-12)</td>
-    </tr>
+</source>
+        <translation><h3>Funktion xmax()</h3>
+Gibt die größte X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-    <tr valign="top">
-      <td>MMM</td>
+<h4>Syntax</h4>
+<pre>xmax(geom)</pre>
 
-      <td>Der abgek&uuml;rzte lokale Monatsname (z.B. 'Jan' bis 'Dez'). Siehe <a href="qdate.html#shortMonthName">QDate::shortMonthName</a>().</td>
-    </tr>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-    <tr valign="top">
-      <td>MMMM</td>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>xmax($geometry) &rarr; ergibt die maximale X-Koordinate von $geometry</pre></translation>
+    </message>
+    <message>
+        <source><h3>xmin function</h3>
+Returns the minimum x coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
-      <td>Der lokale Monatsname (z.B. 'Januar' to 'Dezember'). Siehe <a href="qdate.html#longMonthName">QDate::longMonthName</a>().</td>
-    </tr>
+<h4>Syntax</h4>
+<pre>xmin(geom)</pre>
 
-    <tr valign="top">
-      <td>yy</td>
+<h4>Arguments</h4>
+geom &rarr; a geometry
 
-      <td>Das Jahr als zweistellige Zahl (00-99)</td>
-    </tr>
+<h4>Example</h4>
+<pre> xmin($geometry) &rarr; returns minimum x coordinate of $geometry</pre>
 
-    <tr valign="top">
-      <td>yyyy</td>
+</source>
+        <translation><h3>Funktion xmin()</h3>
+Gibt den kleinste X-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-      <td>Das Jahr als vierstellige Zahl</td>
-    </tr>
-  </table>
+<h4>Syntax</h4>
+<pre>xmin(geom)</pre>
 
-  <p>Diese Ausdr&uuml;cke k&ouml;nnen zum Formatieren des Zeitanteils verwendet werden:</p>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-  <table>
-    <thead>
-      <tr>
-        <th>Ausdruck</th>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>xmin($geometry) &rarr; ergibt die minimale X-Koordinate von $geometry</pre></translation>
+    </message>
+    <message>
+        <source><h3>yat() function</h3>
+Retrieves a y coordinate of the current feature
 
-        <th>Ausgabe</th>
-      </tr>
-    </thead>
+<h4>Syntax</h4>
+<code>yat(i)</code>
 
-    <tr valign="top">
-      <td>h</td>
+<h4>Arguments</h4>
+<code>i<code> - is int. index of point of a line (indices start at 0; negative values apply to the last index).
 
-      <td>die Stunde ohne f&uuml;hrende Null (0 to 23 oder 1 to 12 bei AM/PM Anzeige)</td>
-    </tr>
+<h4>Example</h4>
+<pre>yat(1) &rarr; 5</pre>
+</source>
+        <translation><h3>Funktion yat()</h3>
+Liefert eine Y-Koordinate der Geometrie der aktuellen Geometrie.
 
-    <tr valign="top">
-      <td>hh</td>
+<h4>Syntax</h4>
+<code>yat(i)</code>
 
-      <td>die Stunde mit f&uuml;hrender Null (00 to 23 oder 01 to 12 bei AM/PM Anzeige)</td>
-    </tr>
+<h4>Argumente</h4>
+<code>i</code> - ist int. Y-Koordinate des n-ten Punkts einer Linie (Indizes beginnen bei 0; Negative Werte beziehen sich auf das Linienende)
 
-    <tr valign="top">
-      <td>H</td>
+<h4>Beispiel</h4>
+<pre>yat(1) &rarr; 5</pre>
+</translation>
+    </message>
+    <message>
+        <source><h3>ymax function</h3>
+Returns the maximum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
-      <td>die Stunde ohne f&uuml;hrende Null (0 to 23 auch bei AM/PM Anzeige)</td>
-    </tr>
+<h4>Syntax</h4>
+<pre>ymax(geom)</pre>
 
-    <tr valign="top">
-      <td>HH</td>
+<h4>Arguments</h4>
+geom &rarr; a geometry
 
-      <td>die Stunde mit f&uuml;hrender Null (0 to 23 auch bei AM/PM Anzeige)</td>
-    </tr>
+<h4>Example</h4>
+<pre> ymax($geometry) &rarr; returns maximum y coordinate of $geometry</pre>
 
-    <tr valign="top">
-      <td>m</td>
+</source>
+        <translation><h3>Funktion ymax()</h3>
+Gibt den größten Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-      <td>Die Minute ohne f&uuml;hrende Null (0 to 59)</td>
-    </tr>
+<h4>Syntax</h4>
+<pre>ymax(geom)</pre>
 
-    <tr valign="top">
-      <td>mm</td>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-      <td>Die Minute mit f&uuml;hrender Null (00 to 59)</td>
-    </tr>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>ymax($geometry) &rarr; ergibt die maximale Y-Koordinate von $geometry</pre></translation>
+    </message>
+    <message>
+        <source><h3>ymin function</h3>
+Returns the minimum y coordinate of a geometry. Calculations are in the Spatial Reference System of this Geometry. 
 
-    <tr valign="top">
-      <td>s</td>
+<h4>Syntax</h4>
+<pre>ymin(geom)</pre>
 
-      <td>Die Sekunde ohne f&uuml;hrende Null (0 to 59)</td>
-    </tr>
+<h4>Arguments</h4>
+geom &rarr; a geometry
 
-    <tr valign="top">
-      <td>ss</td>
+<h4>Example</h4>
+<pre> ymin($geometry) &rarr; returns minimum y coordinate of $geometry</pre>
 
-      <td>Die Sekunde mit f&uuml;hrender Null (00 to 59)</td>
-    </tr>
+</source>
+        <translation><h3>Funktion ymin()</h3>
+Gibt den kleinste Y-Koordinate einer Geometrie zurück. Berechnung erfolgt im räumlichen Bezugssystem der Geometrie.
 
-    <tr valign="top">
-      <td>z</td>
+<h4>Syntax</h4>
+<pre>ymin(geom)</pre>
 
-      <td>Die Millisekunde ohne f&uuml;hrende Null (0 to 999)</td>
-    </tr>
+<h4>Argumente</h4>
+<!-- List args for functions here-->
+<i>  geom</i> &rarr; eine Geometrie.<br>
 
-    <tr valign="top">
-      <td>zzz</td>
+<h4>Beispiel</h4>
+<!-- Show example of function.-->
+<pre>ymin($geometry) &rarr; ergibt die minimale Y-Koordinate von $geometry</pre></translation>
+    </message>
+    <message>
+        <source><h3>NULL value</h3>
+Equates to a null value.
 
-      <td>Die Millisekunde mit f&uuml;hrender Null (000 to 999)</td>
-    </tr>
+<h4>Syntax</h4>
+<pre>NULL</pre>
 
-    <tr valign="top">
-      <td>AP or A</td>
+<h4>Arguments</h4>
+None
 
-      <td>als AM/PM Zeit interpretiren. <i>AP</i> muss entweder "AM" oder "PM" sein.</td>
-    </tr>
+<h4>Example</h4>
+<pre> NULL &rarr; returns a null value </pre>
 
-    <tr valign="top">
-      <td>ap or a</td>
+<h4>Note:</h4>
+<p>To test for NULL use an <pre>IS NULL</pre> or <pre>IS NOT NULL</pre> expression.</p>
+</source>
+        <translation type="unfinished"><h3>NULL-Wert</h3>
+Entspricht dem Leerwert.
 
-      <td>als AM/PM Zeit interpretiren. <i>ap</i> muss entweder "am" oder "pm" sein.</td>
-    </tr>
-  </table>
+<h4>Syntax</h4>
+<pre>NULL</pre>
 
-<br>
+<h4>Argumente</h4>
+Keine
 
 <h4>Beispiel</h4>
-<!-- Show example of function.-->
-<code>format_date('2012-05-15','dd.mm.yyyy') &rarr; 15.05.2012</code><br>
+<pre> NULL &rarr; ergibt einen Leerwert</pre>
+
+<h4>Hinweis:</h4>
+<p>Um auf einen NULL-Wert zu testen ist <pre>IS NULL</pre> oder <pre>IS NOT NULL</pre> in Ausdrücken zu verwendenj.</p>
 </translation>
     </message>
 </context>
@@ -61503,10 +62143,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Kanalnummer</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>xyz</source>
         <translation>xyz</translation>
     </message>
@@ -61534,10 +62170,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Übersichtsformat</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Pyramidized</source>
         <translation>Ausgabelayer</translation>
     </message>
@@ -63363,10 +63995,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Höhe des Lichts</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Hillshade</source>
         <translation>Schummerung</translation>
     </message>
@@ -64355,10 +64983,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Merged</source>
         <translation>Verschmolzen</translation>
     </message>
@@ -64378,10 +65002,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Suche nach fast weißen statt schwarzen Pixeln</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Nearblack</source>
         <translation>Fast-Schwarz</translation>
     </message>
@@ -64481,10 +65101,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Umzuwandelnder Kanal</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>PCT to RGB</source>
         <translation>PCT nach RGB</translation>
     </message>
@@ -64500,10 +65116,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgabefeldname</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Vectorized</source>
         <translation>Vektorisiert</translation>
     </message>
@@ -64539,10 +65151,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Distance</source>
         <translation>Entfernung</translation>
     </message>
@@ -64558,10 +65166,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Attributfeld</translation>
     </message>
     <message>
-        <source>Write values inside an existing raster layer(*)</source>
-        <translation type="obsolete">Werte in einen vorhandenen Rasterlayer(*) eintragen </translation>
-    </message>
-    <message>
         <source>Set output raster size (ignored if above option is checked)</source>
         <translation>Ausgabelayergröße setzen (wird ignoriert, wenn Option oben gewählt ist)</translation>
     </message>
@@ -64578,10 +65182,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Rastertyp</translation>
     </message>
     <message>
-        <source>Output layer: mandatory to choose an existing raster layer if the (*) option is selected</source>
-        <translation type="obsolete">Ausgabelayer: Auswahl eines vorhandenen Rasters zwingend, wenn (*)  Option gewählt ist</translation>
-    </message>
-    <message>
         <source>Nodata value</source>
         <translation>Leerwert</translation>
     </message>
@@ -64610,10 +65210,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgabe als BigTIFF oder klassisches TIFF steuern</translation>
     </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>
@@ -64633,10 +65229,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Farbanzahl</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>RGB to PCT</source>
         <translation>RGB nach PCT</translation>
     </message>
@@ -64656,10 +65248,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Kanten berechnen</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Roughness</source>
         <translation>Rauhigkeit</translation>
     </message>
@@ -64749,10 +65337,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Pixelverbindung</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation type="obsolete">Ausgabelayer</translation>
-    </message>
-    <message>
         <source>Sieved</source>
         <translation>Gesiebt</translation>
     </message>
@@ -64784,10 +65368,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Skalierung (Verh. von vert. zu horz. Einheiten)</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Slope</source>
         <translation>Neigung</translation>
     </message>
@@ -64946,10 +65526,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Kanten berechnen</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation type="obsolete">Ausgabedatei</translation>
-    </message>
-    <message>
         <source>Topographic Position Index</source>
         <translation>Topographischer Positionsindex</translation>
     </message>
@@ -64993,10 +65569,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <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>
@@ -65228,10 +65800,6 @@ Formatiert ein Datum oder eine Zeichenkette in eine Zeichenkette.  Nutzt die Qt
         <translation>Ausgaberastertyp</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <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>
diff --git a/i18n/qgis_en.ts b/i18n/qgis_en.ts
index 6cda777..226a7ef 100644
--- a/i18n/qgis_en.ts
+++ b/i18n/qgis_en.ts
@@ -14483,6 +14483,42 @@ Response was:
         <source>NOTICE: %1</source>
         <translation>NOTICE: %1</translation>
     </message>
+    <message>
+        <source>Recent colors</source>
+        <translation type="unfinished">Recent colors</translation>
+    </message>
+    <message>
+        <source>Standard colors</source>
+        <translation type="unfinished">Standard colors</translation>
+    </message>
+    <message>
+        <source>Project colors</source>
+        <translation type="unfinished">Project colors</translation>
+    </message>
+    <message>
+        <source>Number of places must be positive</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete Connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete the connection to %1?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete Object</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1.%2?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpatiaLiteDriver</name>
@@ -23233,7 +23269,7 @@ and current file is [%3]</translation>
     <name>QgsCustomColorScheme</name>
     <message>
         <source>Standard colors</source>
-        <translation>Standard colors</translation>
+        <translation type="obsolete">Standard colors</translation>
     </message>
 </context>
 <context>
@@ -25741,6 +25777,10 @@ p, li { white-space: pre-wrap; }
         <source>Load all unique values</source>
         <translation>Load all unique values</translation>
     </message>
+    <message>
+        <source>%1...</source>
+        <translation type="unfinished">%1...</translation>
+    </message>
 </context>
 <context>
     <name>QgsExpressionBuilderWidgetBase</name>
@@ -37826,6 +37866,14 @@ Error: %2</source>
         <translation>Oracle error: %1
 Error: %2</translation>
     </message>
+    <message>
+        <source>Could not prepare get feature id statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Could not retrieve feature id %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsOracleRootItem</name>
@@ -38085,12 +38133,16 @@ Error: %2</translation>
     <name>QgsPGLayerItem</name>
     <message>
         <source>Delete layer</source>
-        <translation>Delete layer</translation>
+        <translation type="obsolete">Delete layer</translation>
     </message>
     <message>
         <source>Layer deleted successfully.</source>
         <translation>Layer deleted successfully.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsPGRootItem</name>
@@ -39945,7 +39997,7 @@ Choose ignore to continue loading without the missing layers. Choose cancel to r
     <name>QgsProjectColorScheme</name>
     <message>
         <source>Project colors</source>
-        <translation>Project colors</translation>
+        <translation type="obsolete">Project colors</translation>
     </message>
 </context>
 <context>
@@ -42754,7 +42806,7 @@ standard deviation ×</translation>
     <name>QgsRecentColorScheme</name>
     <message>
         <source>Recent colors</source>
-        <translation>Recent colors</translation>
+        <translation type="obsolete">Recent colors</translation>
     </message>
 </context>
 <context>
@@ -43360,12 +43412,16 @@ standard deviation ×</translation>
     <name>QgsSLLayerItem</name>
     <message>
         <source>Delete layer</source>
-        <translation>Delete layer</translation>
+        <translation type="obsolete">Delete layer</translation>
     </message>
     <message>
         <source>Layer deleted successfully.</source>
         <translation>Layer deleted successfully.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QgsSLRootItem</name>
@@ -46711,6 +46767,14 @@ Error was:%2</translation>
         <source>Height attribute</source>
         <translation>Height attribute</translation>
     </message>
+    <message>
+        <source>Millimeter</source>
+        <translation type="unfinished">Millimeter</translation>
+    </message>
+    <message>
+        <source>Map unit</source>
+        <translation type="unfinished">Map unit</translation>
+    </message>
 </context>
 <context>
     <name>QgsVectorGradientColorRampV2Dialog</name>
@@ -54362,7 +54426,7 @@ The following options can be added
 
 
 </source>
-        <translation type="obsolete"><h3>Delimited Text File Layer</h3>
+        <translation type="unfinished"><h3>Delimited Text File Layer</h3>
 Loads and displays delimited text files
 <p>
 <a href="#re">Overview</a><br/>
@@ -55401,327 +55465,6 @@ 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>
diff --git a/i18n/qgis_ja.ts b/i18n/qgis_ja.ts
index 95b6201..cf65c49 100644
--- a/i18n/qgis_ja.ts
+++ b/i18n/qgis_ja.ts
@@ -229,7 +229,7 @@ Open the results dialog to check it.</source>
     <name>BarPlot</name>
     <message>
         <source>Input table</source>
-        <translation>テーブルを入力する</translation>
+        <translation>入力テーブル</translation>
     </message>
     <message>
         <source>Category name field</source>
@@ -280,7 +280,7 @@ Open the results dialog to check it.</source>
     </message>
     <message>
         <source>Count</source>
-        <translation>カウント</translation>
+        <translation>個数</translation>
     </message>
     <message>
         <source>Range</source>
@@ -327,7 +327,7 @@ Open the results dialog to check it.</source>
     </message>
     <message>
         <source>Count</source>
-        <translation>カウント</translation>
+        <translation>個数</translation>
     </message>
     <message>
         <source>Number of empty values</source>
@@ -404,7 +404,7 @@ Open the results dialog to check it.</source>
     </message>
     <message>
         <source>Select directory</source>
-        <translation type="unfinished"></translation>
+        <translation>ディレクトリ選択</translation>
     </message>
 </context>
 <context>
@@ -531,7 +531,7 @@ Open the results dialog to check it.</source>
     </message>
     <message>
         <source>Smooth</source>
-        <translation type="unfinished"></translation>
+        <translation>スムース</translation>
     </message>
     <message>
         <source>Slope</source>
@@ -633,13 +633,13 @@ Open the results dialog to check it.</source>
         <translation>追加の作成パラメータ</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
-    </message>
-    <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
         <translation>データなしの値, 空白の場合は入力から取得</translation>
     </message>
+    <message>
+        <source>Clipped</source>
+        <translation>クリップされた</translation>
+    </message>
 </context>
 <context>
     <name>ClipByMask</name>
@@ -741,8 +741,8 @@ Open the results dialog to check it.</source>
         <translation>マッチングモード</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Color relief</source>
+        <translation>カラーレリーフ</translation>
     </message>
 </context>
 <context>
@@ -985,7 +985,7 @@ Open the results dialog to check it.</source>
     <name>DBManager</name>
     <message>
         <source>No database selected or you are not connected to it.</source>
-        <translation>データベースが無いまたはデータベースに接続していません.</translation>
+        <translation>データベースがないかデータベースに接続していません.</translation>
     </message>
     <message>
         <source>Select the table you want export to file.</source>
@@ -1064,7 +1064,7 @@ Open the results dialog to check it.</source>
     </message>
     <message>
         <source>Select a table/view for deletion.</source>
-        <translation>削除するテーブル/ビューの選択</translation>
+        <translation>削除するテーブル/ビューの選択.</translation>
     </message>
     <message>
         <source>Select a table to empty it.</source>
@@ -1266,7 +1266,7 @@ This table is essential for many GIS applications for enumeration of tables.</so
     </message>
     <message>
         <source>Rows (estimation):</source>
-        <translation>行数(推定値)</translation>
+        <translation>行数 (推定値):</translation>
     </message>
     <message>
         <source>Privileges:</source>
@@ -1278,7 +1278,7 @@ This table is essential for many GIS applications for enumeration of tables.</so
     </message>
     <message>
         <source>Rows (counted):</source>
-        <translation>行数(カウント値)</translation>
+        <translation>行数 (カウント値):</translation>
     </message>
     <message>
         <source><warning> This user has read-only privileges.</source>
@@ -1466,7 +1466,7 @@ Query:
     </message>
     <message>
         <source>Do you want to %s spatial index for field %s?</source>
-        <translation>%sをフィールド%sの空間インデックスにしますか?</translation>
+        <translation>次のフィールドの空間インデックスを%sしますか? フィールド: %s</translation>
     </message>
     <message>
         <source>Spatial Index</source>
@@ -2013,7 +2013,7 @@ columns</source>
     </message>
     <message>
         <source>Are you sure you want to delete this model?</source>
-        <translation>このモデルを削除してよろしいですか?</translation>
+        <translation>このモデルを削除してよろしいですか?</translation>
     </message>
 </context>
 <context>
@@ -2028,7 +2028,7 @@ columns</source>
     </message>
     <message>
         <source>Are you sure you want to delete this script?</source>
-        <translation>このスクリプトを削除してよろしいですか?</translation>
+        <translation>このスクリプトを削除してよろしいですか?</translation>
     </message>
 </context>
 <context>
@@ -2289,7 +2289,7 @@ columns</source>
     </message>
     <message>
         <source>Output count field name</source>
-        <translation>出力カウントフィールド名称</translation>
+        <translation>出力フィールド名</translation>
     </message>
     <message>
         <source>PNTCNT</source>
@@ -3182,9 +3182,48 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
+    <name>DinfDistDownMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>穴埋め標高グリッド</translation>
+    </message>
+    <message>
+        <source>Stream Raster Grid</source>
+        <translation>流量グリッド</translation>
+    </message>
+    <message>
+        <source>Weight Path Grid</source>
+        <translation>重み付けパスグリッド</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation>統計的手法</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation>距離計算法</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
         <source>D-Infinity Drop to Stream Grid</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3213,7 +3252,7 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Distance Method</source>
-        <translation>距離グリッド</translation>
+        <translation>距離計算法</translation>
     </message>
     <message>
         <source>Proportion Threshold</source>
@@ -3221,9 +3260,48 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
+        <source>D-Infinity Distance Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
+    <name>DinfDistUpMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>穴埋め標高グリッド</translation>
+    </message>
+    <message>
+        <source>Slope Grid</source>
+        <translation>スロープグリッド</translation>
+    </message>
+    <message>
+        <source>Statistical Method</source>
+        <translation>統計的手法</translation>
+    </message>
+    <message>
+        <source>Distance Method</source>
+        <translation>距離計算法</translation>
+    </message>
+    <message>
+        <source>Proportion Threshold</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
         <source>D-Infinity Distance Up</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3248,11 +3326,11 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Outlets Shapefile</source>
-        <translation type="unfinished"></translation>
+        <translation>アウトレット Shapefile</translation>
     </message>
     <message>
         <source>Check for edge contamination</source>
-        <translation type="unfinished"></translation>
+        <translation>エッジ汚染のチェック</translation>
     </message>
     <message>
         <source>Transport Limited Accumulation Grid</source>
@@ -3260,7 +3338,7 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Deposition Grid</source>
-        <translation type="unfinished"></translation>
+        <translation>蓄積グリッド</translation>
     </message>
     <message>
         <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
@@ -3283,15 +3361,15 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Input Concentration Grid</source>
-        <translation type="unfinished"></translation>
+        <translation>入力濃度グリッド</translation>
     </message>
     <message>
         <source>Outlets Shapefile</source>
-        <translation type="unfinished"></translation>
+        <translation>アウトレット Shapefile</translation>
     </message>
     <message>
         <source>Check for edge contamination</source>
-        <translation type="unfinished"></translation>
+        <translation>エッジ汚染のチェック</translation>
     </message>
     <message>
         <source>Transport Limited Accumulation Grid</source>
@@ -3299,9 +3377,52 @@ Are you sure you want to proceed?</source>
     </message>
     <message>
         <source>Deposition Grid</source>
+        <translation>蓄積グリッド</translation>
+    </message>
+    <message>
+        <source>Output Concentration Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
+    <name>DinfTransLimAccum2Multi</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation>流入グリッド</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation>輸送許容量グリッド</translation>
+    </message>
+    <message>
+        <source>Input Concentration Grid</source>
+        <translation>入力濃度グリッド</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <source>Deposition Grid</source>
+        <translation>蓄積グリッド</translation>
+    </message>
+    <message>
         <source>Output Concentration Grid</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3311,6 +3432,41 @@ Are you sure you want to proceed?</source>
     </message>
 </context>
 <context>
+    <name>DinfTransLimAccumMulti</name>
+    <message>
+        <source>D-Infinity Flow Direction Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Supply Grid</source>
+        <translation>流入グリッド</translation>
+    </message>
+    <message>
+        <source>Transport Capacity Grid</source>
+        <translation>輸送許容量グリッド</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
+        <source>Check for edge contamination</source>
+        <translation>エッジ汚染のチェック</translation>
+    </message>
+    <message>
+        <source>Transport Limited Accumulation Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Deposition Grid</source>
+        <translation>蓄積グリッド</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
     <name>Dissolve</name>
     <message>
         <source>Geometry exception while dissolving</source>
@@ -3918,9 +4074,56 @@ geometry column - column with unique integer values</source>
     </message>
     <message>
         <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
+        <source>Minimum Threshold</source>
+        <translation>最小スレッショルド</translation>
+    </message>
+    <message>
+        <source>Maximum Threshold</source>
+        <translation>最大スレッショルド</translation>
+    </message>
+    <message>
+        <source>Number of Threshold Values</source>
+        <translation>スレッショルド値の数</translation>
+    </message>
+    <message>
+        <source>Spacing for Threshold Values</source>
+        <translation>スレッショルド値の間隔</translation>
+    </message>
+    <message>
+        <source>D-Infinity Drop to Stream Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
+    <name>DropAnalysisMulti</name>
+    <message>
+        <source>D8 Contributing Area Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation type="unfinished">D8流向グリッド</translation>
+    </message>
+    <message>
+        <source>Pit Filled Elevation Grid</source>
+        <translation>穴埋め標高グリッド</translation>
+    </message>
+    <message>
+        <source>Accumulated Stream Source Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
         <source>Minimum Threshold</source>
         <translation>最小スレッショルド</translation>
     </message>
@@ -4910,7 +5113,7 @@ Plugin will not be enabled.</source>
     </message>
     <message>
         <source>Various settings for Gdal Tools</source>
-        <translation>Gdal Toolsに関する多彩な設定</translation>
+        <translation>Gdal Toolsに関する様々な設定</translation>
     </message>
 </context>
 <context>
@@ -5561,15 +5764,15 @@ when pressing on the tool dialog's Help button.</source>
     </message>
     <message>
         <source>TRI (Terrain Ruggedness Index)</source>
-        <translation>TRI(領域起伏指標)</translation>
+        <translation>TRI (Terrain Ruggedness Index)</translation>
     </message>
     <message>
         <source>TPI (Topographic Position Index)</source>
-        <translation>TPI(トポロジカル位置インデックス)</translation>
+        <translation>TPI (Topographic Position Index)</translation>
     </message>
     <message>
         <source>Roughness</source>
-        <translation>祖度</translation>
+        <translation>粗度</translation>
     </message>
     <message>
         <source>Mode Options</source>
@@ -6049,7 +6252,7 @@ JPEG,JPEG2000,MrSID,ECW,のようなカラー索引をサポートしないデ
     </message>
     <message>
         <source>&Resampling method</source>
-        <translation>リサンプリングメソッド(&R)</translation>
+        <translation>リサンプリング方法(&R)</translation>
     </message>
     <message>
         <source>Near</source>
@@ -6449,7 +6652,7 @@ Some output geometries may be missing or invalid.
 
 Would you like to add the new layer anyway?</source>
         <translation>
-いくつかの出力ジオメトリが欠落しているか不正です
+いくつかの出力ジオメトリが欠落しているか不正です.
 
 そのまま新レイヤを追加しますか?</translation>
     </message>
@@ -6801,10 +7004,6 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <translation>垂直方向間隔</translation>
     </message>
     <message>
-        <source>Output</source>
-        <translation>出力</translation>
-    </message>
-    <message>
         <source>Invalid grid spacing: %s/%s</source>
         <translation>グリッドの間隔が不正です: %s/%s</translation>
     </message>
@@ -6816,6 +7015,10 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <source>Vertical spacing is too small for the covered area</source>
         <translation>垂直方向の間隔が範囲面積に対して狭すぎます</translation>
     </message>
+    <message>
+        <source>Grid</source>
+        <translation>グリッド</translation>
+    </message>
 </context>
 <context>
     <name>GridAverage</name>
@@ -6852,8 +7055,8 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Average</source>
+        <translation>平均</translation>
     </message>
 </context>
 <context>
@@ -6895,8 +7098,8 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Interpolated metrics</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -6942,13 +7145,13 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
-    </message>
-    <message>
         <source>Smoothing</source>
         <translation>補正</translation>
     </message>
+    <message>
+        <source>Interpolated IDW</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>GridMetrics</name>
@@ -7024,8 +7227,8 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Interpolated nearest neighbor</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -7036,9 +7239,44 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
     </message>
     <message>
         <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
+        <source>Mask Grid</source>
+        <translation>マスクグリッド</translation>
+    </message>
+    <message>
+        <source>Mask Threshold</source>
+        <translation>マスクのしきい値</translation>
+    </message>
+    <message>
+        <source>Longest Upslope Length Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Total Upslope Length Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Strahler Network Order Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
+    <name>GridNetMulti</name>
+    <message>
+        <source>D8 Flow Direction Grid</source>
+        <translation type="unfinished">D8流向グリッド</translation>
+    </message>
+    <message>
+        <source>Outlets Shapefile</source>
+        <translation>アウトレット Shapefile</translation>
+    </message>
+    <message>
         <source>Mask Grid</source>
         <translation>マスクグリッド</translation>
     </message>
@@ -7095,7 +7333,7 @@ GRASSアルゴリズムを実行する前にインストールして下さい.</
     </message>
     <message>
         <source>Smooth</source>
-        <translation type="unfinished"></translation>
+        <translation>スムース</translation>
     </message>
     <message>
         <source>Slope</source>
@@ -7478,7 +7716,7 @@ are stored on the installation folder</source>
     </message>
     <message>
         <source>Hub layer name attribute</source>
-        <translation type="unfinished"></translation>
+        <translation>ハブレイヤ名属性</translation>
     </message>
     <message>
         <source>Output shape type</source>
@@ -7494,26 +7732,26 @@ are stored on the installation folder</source>
     </message>
     <message>
         <source>Same layer given for both hubs and spokes</source>
-        <translation type="unfinished"></translation>
+        <translation>ハブとスポーク両方に同じレイヤが指定されています</translation>
     </message>
 </context>
 <context>
     <name>HubLines</name>
     <message>
         <source>Hub point layer</source>
-        <translation type="unfinished"></translation>
+        <translation>ハブポイントレイヤ</translation>
     </message>
     <message>
         <source>Hub ID field</source>
-        <translation type="unfinished"></translation>
+        <translation>ハブIDフィールド</translation>
     </message>
     <message>
         <source>Spoke point layer</source>
-        <translation type="unfinished"></translation>
+        <translation>スポークポイントレイヤ</translation>
     </message>
     <message>
         <source>Spoke ID field</source>
-        <translation type="unfinished"></translation>
+        <translation>スポークIDフィールド</translation>
     </message>
     <message>
         <source>Output</source>
@@ -7521,7 +7759,7 @@ are stored on the installation folder</source>
     </message>
     <message>
         <source>Same layer given for both hubs and spokes</source>
-        <translation type="unfinished"></translation>
+        <translation>ハブとスポーク両方に同じレイヤが指定されています</translation>
     </message>
 </context>
 <context>
@@ -7558,6 +7796,10 @@ are stored on the installation folder</source>
         <source>Elevation</source>
         <translation>高さ</translation>
     </message>
+    <message>
+        <source>Feature %d is smaller than raster cell size</source>
+        <translation>地物 %d はラスタセルサイズより小さいです</translation>
+    </message>
 </context>
 <context>
     <name>ImportIntoPostGIS</name>
@@ -7896,6 +8138,33 @@ LAStoolsアルゴリズムを実行する前に設定をして下さい.</transl
     </message>
 </context>
 <context>
+    <name>LengthAreaMulti</name>
+    <message>
+        <source>Length Grid</source>
+        <translation>距離グリッド</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Threshold</source>
+        <translation>しきい値</translation>
+    </message>
+    <message>
+        <source>Exponent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
     <name>LidarToolsAlgorithmProvider</name>
     <message>
         <source>LAStools folder</source>
@@ -8902,7 +9171,7 @@ Shift+クリックで非表示
     </message>
     <message>
         <source>Html Annotation</source>
-        <translation>Htmlアノテーション</translation>
+        <translation>HTMLアノテーション</translation>
     </message>
     <message>
         <source>Duplicate Layer(s)</source>
@@ -9076,7 +9345,7 @@ Shift+クリックで非表示
     <name>MeanAndStdDevPlot</name>
     <message>
         <source>Input table</source>
-        <translation>テーブルを入力する</translation>
+        <translation>入力テーブル</translation>
     </message>
     <message>
         <source>Category name field</source>
@@ -9294,7 +9563,7 @@ Shift+クリックで非表示
     </message>
     <message>
         <source>GetCapabilities response</source>
-        <translation>GetCapabilities の反応</translation>
+        <translation>GetCapabilitiesレスポンス</translation>
     </message>
     <message>
         <source>New</source>
@@ -9446,6 +9715,10 @@ Shift+クリックで非表示
         <source>seconds</source>
         <translation>秒</translation>
     </message>
+    <message>
+        <source>Record parsing error</source>
+        <translation>レコード解析エラー</translation>
+    </message>
 </context>
 <context>
     <name>ModelerAlgorithm</name>
@@ -9911,6 +10184,10 @@ See the log for more information.</source>
         <source>Overwrite %s?</source>
         <translation>%s を上書きしますか?</translation>
     </message>
+    <message>
+        <source>Name cannot contain '/'</source>
+        <translation>名前には"/"を含められません</translation>
+    </message>
 </context>
 <context>
     <name>NotSupportedDbType</name>
@@ -9987,7 +10264,7 @@ See the log for more information.</source>
     </message>
     <message>
         <source>The expression entered is not correct</source>
-        <translation>式が指定されたけど正しくないです</translation>
+        <translation>入力された式が正しくありません</translation>
     </message>
 </context>
 <context>
@@ -10551,7 +10828,7 @@ Please check the configuration in the Processing settings dialog.</source>
     </message>
     <message>
         <source> (xmin, xmax, ymin, ymax)</source>
-        <translation type="unfinished"></translation>
+        <translation>(xmin, xmax, ymin, ymax)</translation>
     </message>
 </context>
 <context>
@@ -10582,6 +10859,33 @@ Please check the configuration in the Processing settings dialog.</source>
     </message>
 </context>
 <context>
+    <name>PeukerDouglasMulti</name>
+    <message>
+        <source>Elevation Grid</source>
+        <translation>標高グリッド</translation>
+    </message>
+    <message>
+        <source>Center Smoothing Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Side Smoothing Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Diagonal Smoothing Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Stream Source Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
     <name>PointDistance</name>
     <message>
         <source>Input point layer</source>
@@ -10589,7 +10893,7 @@ Please check the configuration in the Processing settings dialog.</source>
     </message>
     <message>
         <source>Input unique ID field</source>
-        <translation>ユニークIdフィールドの入力</translation>
+        <translation>ユニークIDフィールドの入力</translation>
     </message>
     <message>
         <source>Target point layer</source>
@@ -10684,7 +10988,7 @@ Please check the configuration in the Processing settings dialog.</source>
     <name>PointsInPolygonThread</name>
     <message>
         <source>point count field</source>
-        <translation>ポイントカウントフィールド</translation>
+        <translation>ポイント数フィールド</translation>
     </message>
 </context>
 <context>
@@ -10787,7 +11091,7 @@ Please check the configuration in the Processing settings dialog.</source>
     <name>PolarPlot</name>
     <message>
         <source>Input table</source>
-        <translation>テーブルを入力する</translation>
+        <translation>入力テーブル</translation>
     </message>
     <message>
         <source>Category name field</source>
@@ -10833,11 +11137,11 @@ Please check the configuration in the Processing settings dialog.</source>
     <name>Polygonize</name>
     <message>
         <source>Polygonize algorithm requires shapely module!</source>
-        <translation type="unfinished"></translation>
+        <translation>ポリゴン化アルゴリズムを実行するにはshapelyモジュールが必要です!</translation>
     </message>
     <message>
         <source>Processing lines...</source>
-        <translation type="unfinished"></translation>
+        <translation>ラインを処理しています...</translation>
     </message>
     <message>
         <source>Noding lines...</source>
@@ -11608,11 +11912,11 @@ QGIS API interfaceにアクセスするにはifaceを使います。詳細は、
     <name>QObject</name>
     <message>
         <source>Interpolating...</source>
-        <translation>変換中...</translation>
+        <translation>補間中...</translation>
     </message>
     <message>
         <source>Abort</source>
-        <translation>取り消し</translation>
+        <translation>中断</translation>
     </message>
     <message>
         <source>Building triangulation...</source>
@@ -11624,11 +11928,11 @@ QGIS API interfaceにアクセスするにはifaceを使います。詳細は、
     </message>
     <message>
         <source>minidump written to %1</source>
-        <translation>%1へのミニダンプ完了</translation>
+        <translation>%1にミニダンプが書き込まれました</translation>
     </message>
     <message>
         <source>writing of minidump to %1 failed (%2)</source>
-        <translation>%1へのミニダンプに失敗しました(%2)</translation>
+        <translation>%1へのミニダンプ書き込みに失敗しました(%2)</translation>
     </message>
     <message>
         <source>creation of minidump to %1 failed (%2)</source>
@@ -12412,7 +12716,7 @@ Only %1 of %2 features written.</source>
     </message>
     <message>
         <source>If GPX_USE_EXTENSIONS=YES is specified, extra fields will be written inside the <extensions> tag.</source>
-        <translation> GPX_USE_EXTENSIONS=YESが指定されていると<,extensions>タグの内部に別フィールドが書き込まれます.</translation>
+        <translation> GPX_USE_EXTENSIONS=YESが指定されていると<extensions>タグの内部に別フィールドが書き込まれます.</translation>
     </message>
     <message>
         <source>Only used if GPX_USE_EXTENSIONS=YES and GPX_EXTENSIONS_NS_URL is set. The namespace value used for extension tags. By default, 'ogr'.</source>
@@ -14051,7 +14355,7 @@ SQL: %1</translation>
     </message>
     <message>
         <source>empty capabilities document</source>
-        <translation>capabilitiesドキュメントの中身がありません</translation>
+        <translation>Capabilitiesドキュメントの中身がありません</translation>
     </message>
     <message>
         <source>Dom Exception</source>
@@ -14086,7 +14390,7 @@ Response was:
     </message>
     <message>
         <source>Style was missing in capabilities</source>
-        <translation>capabilitiesでスタイルが欠落しています</translation>
+        <translation>Capabilitiesにスタイルが欠落しています</translation>
     </message>
     <message>
         <source>Displays a combo box containing values of attributes used for classification.</source>
@@ -14098,7 +14402,7 @@ Response was:
     </message>
     <message>
         <source>Combo box with values that can be used within the column's type. Must be supported by the provider.</source>
-        <translation>カラムの型の値で利用できるコンボボックス.プロバイダのサポートが必要です.</translation>
+        <translation>カラムの型で利用できる値を持つコンボボックス. プロバイダのサポートが必要です.</translation>
     </message>
     <message>
         <source>Simplifies file selection by adding a file chooser dialog.</source>
@@ -14106,7 +14410,7 @@ Response was:
     </message>
     <message>
         <source>A hidden attribute will be invisible - the user is not able to see it's contents.</source>
-        <translation>表示されないであろう隠された属性-ユーザーはこのコンテンツを見ることは無い.</translation>
+        <translation>表示されない属性 - ユーザは内容を見ることはできません.</translation>
     </message>
     <message>
         <source>Read-only field that generates a UUID if empty.</source>
@@ -14117,10 +14421,6 @@ Response was:
         <translation>凡例</translation>
     </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>致命的なエラーがGRASSライブラリで発生しました. QGISはエラーから回復しますが次回の致命的なエラーは警告なしにQGISを終了させるかもしれません. これはGRASS 7.0.0beta1の問題で, GRASS 7.1以降では修正されています. エラーメッセージ: %1</translation>
-    </message>
-    <message>
         <source>Raster image fill</source>
         <translation>ラスタイメージ塗りつぶし</translation>
     </message>
@@ -14136,6 +14436,42 @@ Response was:
         <source>NOTICE: %1</source>
         <translation>通知: %1</translation>
     </message>
+    <message>
+        <source>Recent colors</source>
+        <translation>最近の色</translation>
+    </message>
+    <message>
+        <source>Standard colors</source>
+        <translation>標準カラー</translation>
+    </message>
+    <message>
+        <source>Project colors</source>
+        <translation>プロジェクトカラー</translation>
+    </message>
+    <message>
+        <source>Number of places must be positive</source>
+        <translation>桁数は正の数でなければいけません</translation>
+    </message>
+    <message>
+        <source>Delete Connection</source>
+        <translation>接続の削除</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete the connection to %1?</source>
+        <translation>%1への接続を削除します. よろしいですか?</translation>
+    </message>
+    <message>
+        <source>Delete Object</source>
+        <translation>オブジェクトの削除</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1.%2?</source>
+        <translation>%1.%2を削除します. よろしいですか?</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete %1?</source>
+        <translation>%1を削除します. よろしいですか?</translation>
+    </message>
 </context>
 <context>
     <name>QSpatiaLiteDriver</name>
@@ -14367,7 +14703,7 @@ Response was:
     </message>
     <message>
         <source>Failed to open Python console:</source>
-        <translation>Pythomコンソールのオープンに失敗しました:</translation>
+        <translation>Pythonコンソールのオープンに失敗しました:</translation>
     </message>
     <message>
         <source>QGIS </source>
@@ -14578,7 +14914,7 @@ Please contact the developers.
     </message>
     <message>
         <source>%1 is an invalid layer - not loaded</source>
-        <translation>%1は無効なレイヤです-ロードできませんでした</translation>
+        <translation>%1は無効なレイヤです - ロードできませんでした</translation>
     </message>
     <message>
         <source>%1 is an invalid layer and cannot be loaded. Please check the <a href="#messageLog">message log</a> for further info.</source>
@@ -15411,7 +15747,7 @@ Errors: %3
     </message>
     <message>
         <source>A network request timed out, any data received is likely incomplete.</source>
-        <translation>ネットワークリクエストがタイムアウトしました,受信した任意のデータは不完全かもしれません.</translation>
+        <translation>ネットワークリクエストがタイムアウトしました,受信したデータは不完全かもしれません.</translation>
     </message>
     <message>
         <source>Warning</source>
@@ -16622,10 +16958,6 @@ Parser error:
         <translation>評価エラー</translation>
     </message>
     <message>
-        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</source>
-        <translation>属性テーブル - %1 :: 総地物数: %2, フィルター数: %3, 選択数: %4</translation>
-    </message>
-    <message>
         <source>Update Filtered</source>
         <translation>フィルタされたものを更新</translation>
     </message>
@@ -16671,6 +17003,22 @@ Parser error:
         <source>Update Selected</source>
         <translation>選択の更新</translation>
     </message>
+    <message>
+        <source>Ctrl+R</source>
+        <translation>Ctrl+R</translation>
+    </message>
+    <message>
+        <source>Show All Features In Initial Canvas Extent</source>
+        <translation>初期キャンバス領域のすべての地物を表示する</translation>
+    </message>
+    <message>
+        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5</source>
+        <translation>属性テーブル - %1 :: 総地物数: %2, フィルター数: %3, 選択数: %4%5</translation>
+    </message>
+    <message>
+        <source>, spatially limited</source>
+        <translation>, 空間的な制限あり</translation>
+    </message>
 </context>
 <context>
     <name>QgsAttributeTableModel</name>
@@ -16683,7 +17031,7 @@ Parser error:
     <name>QgsAttributeTableView</name>
     <message>
         <source>Select All</source>
-        <translation>全部を選択する</translation>
+        <translation>全てを選択する</translation>
     </message>
 </context>
 <context>
@@ -17071,7 +17419,7 @@ Database: %2</source>
     </message>
     <message>
         <source>Add Selected Layers</source>
-        <translation>選択したレイヤを追加する</translation>
+        <translation>選択したレイヤの追加</translation>
     </message>
     <message>
         <source>Filter Files</source>
@@ -17271,10 +17619,6 @@ Database: %2</source>
         <translation>全削除</translation>
     </message>
     <message>
-        <source>Join</source>
-        <translation>結合</translation>
-    </message>
-    <message>
         <source>Advanced</source>
         <translation>アドバンスト</translation>
     </message>
@@ -18323,7 +18667,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Automatic</source>
-        <translation>オートマチック</translation>
+        <translation>自動</translation>
     </message>
     <message>
         <source>%1 mm</source>
@@ -18616,7 +18960,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Follow column alignment</source>
-        <translation>カラム位置あわせに従う</translation>
+        <translation>カラムの配置に従う</translation>
     </message>
     <message>
         <source>Left</source>
@@ -19508,7 +19852,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Automatic</source>
-        <translation>オートマチック</translation>
+        <translation>自動</translation>
     </message>
 </context>
 <context>
@@ -20081,7 +20425,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Legend column count</source>
-        <translation>凡例カラムカウント</translation>
+        <translation>凡例カラム数</translation>
     </message>
     <message>
         <source>Legend split layers</source>
@@ -20252,7 +20596,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Count</source>
-        <translation>カウント</translation>
+        <translation>列数</translation>
     </message>
     <message>
         <source>Equal column widths</source>
@@ -20276,7 +20620,7 @@ Please try a lower resolution or a smaller papersize</source>
     </message>
     <message>
         <source>Title alignment:</source>
-        <translation>タイトル配置</translation>
+        <translation>タイトル配置:</translation>
     </message>
     <message>
         <source>Left</source>
@@ -22857,13 +23201,6 @@ and current file is [%3]</source>
     </message>
 </context>
 <context>
-    <name>QgsCustomColorScheme</name>
-    <message>
-        <source>Standard colors</source>
-        <translation>標準カラー</translation>
-    </message>
-</context>
-<context>
     <name>QgsCustomLayerOrderWidget</name>
     <message>
         <source>Control rendering order</source>
@@ -23039,7 +23376,7 @@ and current file is [%3]</source>
     </message>
     <message>
         <source>Select All</source>
-        <translation>全部を選択する</translation>
+        <translation>全てを選択する</translation>
     </message>
 </context>
 <context>
@@ -23362,7 +23699,7 @@ and current file is [%3]</source>
     </message>
     <message>
         <source>allow NULL values</source>
-        <translation>NULL値を許可する</translation>
+        <translation>NULL値を許容する</translation>
     </message>
     <message>
         <source>preview</source>
@@ -24027,6 +24364,18 @@ not displayed</source>
         <source>The file has been updated by another application - reloading</source>
         <translation>ファイルが他のアプリケーションによって更新されました - リロードします</translation>
     </message>
+    <message>
+        <source>Whole number (integer)</source>
+        <translation>整数値(integer)</translation>
+    </message>
+    <message>
+        <source>Decimal number (double)</source>
+        <translation>小数点付き数値(double)</translation>
+    </message>
+    <message>
+        <source>Text, unlimited length (text)</source>
+        <translation>上限無し可変長テキスト(text)</translation>
+    </message>
 </context>
 <context>
     <name>QgsDelimitedTextSourceSelect</name>
@@ -24359,19 +24708,19 @@ not displayed</source>
     </message>
     <message>
         <source>Tab character is one of the delimiters</source>
-        <translation>デリミタとしタブを使用</translation>
+        <translation>デリミタとしてタブを使用</translation>
     </message>
     <message>
         <source>Space character is one of the delimiters</source>
-        <translation>デリミタとしスペースを使用</translation>
+        <translation>デリミタとしてスペースを使用</translation>
     </message>
     <message>
         <source>Colon character is one of the delimiters</source>
-        <translation>デリミタとしコロンを使用</translation>
+        <translation>デリミタとしてコロンを使用</translation>
     </message>
     <message>
         <source>Semicolon character is one of the delimiters</source>
-        <translation>デリミタとしセミコロンを使用</translation>
+        <translation>デリミタとしてセミコロンを使用</translation>
     </message>
     <message>
         <source>Semicolon</source>
@@ -25355,6 +25704,10 @@ p, li { white-space: pre-wrap; }
         <source>Load all unique values</source>
         <translation>全てのユニーク値をロードする</translation>
     </message>
+    <message>
+        <source>%1...</source>
+        <translation>%1...</translation>
+    </message>
 </context>
 <context>
     <name>QgsExpressionBuilderWidgetBase</name>
@@ -26114,11 +26467,11 @@ MyForms.pyはPYTHONPATH環境変数, qgis/pythonディレクトリ, もしくは
     </message>
     <message>
         <source>Are you sure?</source>
-        <translation>よろしいですか?</translation>
+        <translation>よろしいですか?</translation>
     </message>
     <message>
         <source>Are you sure that you want to delete this device?</source>
-        <translation>このデバイスを削除してよろしいですか?</translation>
+        <translation>このデバイスを削除してよろしいですか?</translation>
     </message>
 </context>
 <context>
@@ -27191,7 +27544,7 @@ Please reselect a valid file.</source>
     </message>
     <message>
         <source>Use map units if possible</source>
-        <translation>可能な場合地図上の単位を利用</translation>
+        <translation>可能な場合には地図上の単位を利用</translation>
     </message>
     <message>
         <source>PDF report</source>
@@ -27211,7 +27564,7 @@ Please reselect a valid file.</source>
     </message>
     <message>
         <source>Show Georeferencer window docked</source>
-        <translation>ジオレファレンサウィンドウを結合して表示する</translation>
+        <translation>ジオリファレンサーウィンドウを結合して表示する</translation>
     </message>
     <message>
         <source>PDF map</source>
@@ -27226,7 +27579,7 @@ Please reselect a valid file.</source>
     <name>QgsGeorefDescriptionDialogBase</name>
     <message>
         <source>Description georeferencer</source>
-        <translation>Georeferencerについて</translation>
+        <translation>ジオリファレンサーについて</translation>
     </message>
     <message>
         <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
@@ -27249,14 +27602,14 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Georeferencer</source>
-        <translation>Georeferencer(&G)</translation>
+        <translation>ジオリファレンサー(&G)</translation>
     </message>
 </context>
 <context>
     <name>QgsGeorefPluginGui</name>
     <message>
         <source>Georeferencer</source>
-        <translation>ジオレファレンサー</translation>
+        <translation>ジオリファレンサー</translation>
     </message>
     <message>
         <source>All other files (*)</source>
@@ -27264,7 +27617,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Open raster</source>
-        <translation>ラスタのオープン</translation>
+        <translation>ラスタを開く</translation>
     </message>
     <message>
         <source>%1 is not a supported raster data source</source>
@@ -27280,7 +27633,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Georeferencer - %1</source>
-        <translation>ジオレファレンサー-%1</translation>
+        <translation>ジオリファレンサー-%1</translation>
     </message>
     <message>
         <source>Transform: </source>
@@ -27507,7 +27860,7 @@ p, li { white-space: pre-wrap; }
     <name>QgsGeorefPluginGuiBase</name>
     <message>
         <source>Georeferencer</source>
-        <translation>ジオレファレンサー</translation>
+        <translation>ジオリファレンサー</translation>
     </message>
     <message>
         <source>File</source>
@@ -27595,7 +27948,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Start georeferencing</source>
-        <translation>ジオリファレンシングの開始</translation>
+        <translation>ジオリファレンスの開始</translation>
     </message>
     <message>
         <source>Ctrl+G</source>
@@ -27619,7 +27972,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Save GCP points as...</source>
-        <translation>名前をつけてGCPポイントを保存...</translation>
+        <translation>名前を付けてGCPポイントを保存...</translation>
     </message>
     <message>
         <source>Ctrl+S</source>
@@ -27967,7 +28320,9 @@ p, li { white-space: pre-wrap; }
         <source>Precision of upper and lower values in label text.
 Positive is number of decimal places
 Negative rounds to powers of 10</source>
-        <translation>ラベルテキストの上下限値の精度.</translation>
+        <translation>ラベルテキストの上下限値の精度.
+正の値は小数点以下桁数
+負の値は10の累乗に丸められます</translation>
     </message>
     <message>
         <source>Check to remove trailing zeroes after the decimal point from the upper and lower values in the legend.</source>
@@ -28037,7 +28392,7 @@ Use "%1" for the lower bound of the classification, and "%2"
     </message>
     <message>
         <source>Link class boundaries</source>
-        <translation>リンククラス境界</translation>
+        <translation>クラス境界の連結</translation>
     </message>
     <message>
         <source>Advanced</source>
@@ -28071,11 +28426,11 @@ Press cancel to abort breaks calculation or OK to continue.</source>
     </message>
     <message>
         <source>Linked range warning</source>
-        <translation>リンクされた範囲警告</translation>
+        <translation>範囲結合の注意</translation>
     </message>
     <message>
         <source>Rows will be reordered before linking boundaries. Continue?</source>
-        <translation>行は境界線のリンクの前に並べ替えられます.継続しますか?</translation>
+        <translation>境界を連結する前に行が並べ替えられます. 続けますか?</translation>
     </message>
 </context>
 <context>
@@ -28611,7 +28966,7 @@ Press cancel to abort breaks calculation or OK to continue.</source>
     </message>
     <message>
         <source><font color='red'>Enter a name!</font></source>
-        <translation><font color='red'>名前入力!</font></translation>
+        <translation><font color='red'>名前を入力して下さい!</font></translation>
     </message>
     <message>
         <source><font color='red'>This is name of the source!</font></source>
@@ -29478,10 +29833,6 @@ at line %2 column %3</source>
         <source>New mapset successfully created and set as current working mapset.</source>
         <translation>新しいマップセットを作成し、利用するマップセットに設定しました。</translation>
     </message>
-    <message>
-        <source>Cannot activate grass</source>
-        <translation>GRASSを有効化できません</translation>
-    </message>
 </context>
 <context>
     <name>QgsGrassNewMapsetBase</name>
@@ -30286,7 +30637,7 @@ at line %2 column %3</source>
     </message>
     <message>
         <source>Automatic</source>
-        <translation>オートマチック</translation>
+        <translation>自動</translation>
     </message>
     <message>
         <source>Radius</source>
@@ -30343,7 +30694,7 @@ at line %2 column %3</source>
     <name>QgsHtmlAnnotationDialog</name>
     <message>
         <source>HTML annotation</source>
-        <translation>Htmlアノテーション</translation>
+        <translation>HTMLアノテーション</translation>
     </message>
     <message>
         <source>Delete</source>
@@ -30500,7 +30851,7 @@ This may be a problem in your network connection or at the WMS server.</source>
     </message>
     <message>
         <source>New results will be expanded by default.</source>
-        <translation>新しい結果はデフォルトで開かれます.</translation>
+        <translation>新しい結果はデフォルトで展開されます.</translation>
     </message>
     <message>
         <source>Copy selected feature to clipboard.</source>
@@ -30691,11 +31042,11 @@ This may be a problem in your network connection or at the WMS server.</source>
     </message>
     <message>
         <source>Output file name invalid</source>
-        <translation>出力ファイル名称が不正です</translation>
+        <translation>出力ファイル名が不正です</translation>
     </message>
     <message>
         <source>Please enter a valid output file name</source>
-        <translation>正しい出力ファイル名称を入力してください</translation>
+        <translation>正しい出力ファイル名を入力してください</translation>
     </message>
     <message>
         <source>Break lines</source>
@@ -33122,22 +33473,6 @@ This may be a problem in your network connection or at the WMS server.</source>
         <source>Segments [%1]</source>
         <translation>セグメント [%1]</translation>
     </message>
-    <message>
-        <source>Meters</source>
-        <translation>メーター</translation>
-    </message>
-    <message>
-        <source>Feet</source>
-        <translation>フィート</translation>
-    </message>
-    <message>
-        <source>Degrees</source>
-        <translation>度</translation>
-    </message>
-    <message>
-        <source>Nautical Miles</source>
-        <translation>海里</translation>
-    </message>
 </context>
 <context>
     <name>QgsMeasureTool</name>
@@ -33590,7 +33925,7 @@ This may be a problem in your network connection or at the WMS server.</source>
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -33794,7 +34129,7 @@ enhancement</source>
     <name>QgsNetworkContentFetcher</name>
     <message>
         <source>HTTP fetch %1 failed with error %2</source>
-        <translation>HTTP が %1 を取得するのにエラー %2 にが発生しました</translation>
+        <translation>HTTP取得 %1 がエラー %2 で失敗しました</translation>
     </message>
 </context>
 <context>
@@ -34496,7 +34831,7 @@ Extended error information:
     </message>
     <message>
         <source>Count</source>
-        <translation>カウント</translation>
+        <translation>個数</translation>
     </message>
     <message>
         <source>SQLite databases (*.db)</source>
@@ -34626,7 +34961,7 @@ Extended error information:
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -35116,11 +35451,11 @@ Always network: always load from network and do not check if the cache has a val
     </message>
     <message>
         <source>OGR error creating field %1: %2</source>
-        <translation>OGR エラー フィールド作成 %1: %2</translation>
+        <translation>OGRエラー フィールド%1の作成: %2</translation>
     </message>
     <message>
         <source>OGR error deleting field %1: %2</source>
-        <translation>OGR エラー フィールド削除 %1: %2</translation>
+        <translation>OGRエラー フィールド%1の削除: %2</translation>
     </message>
     <message>
         <source>Deleting fields is not supported prior to GDAL 1.9.0</source>
@@ -35148,7 +35483,7 @@ Always network: always load from network and do not check if the cache has a val
     </message>
     <message>
         <source>OGR error syncing to disk: %1</source>
-        <translation>QGR ディスクとの同期エラー: %1</translation>
+        <translation>OGRエラー ディスク同期: %1</translation>
     </message>
     <message>
         <source>OGR error changing geometry: feature %1 not found</source>
@@ -35160,7 +35495,7 @@ Always network: always load from network and do not check if the cache has a val
     </message>
     <message>
         <source>OGR error in feature %1: geometry is null</source>
-        <translation>OGRエラー 地物%1 のジオメトリがnullです</translation>
+        <translation>OGRエラー 地物%1 のジオメトリがNULLです</translation>
     </message>
     <message>
         <source>OGR error setting geometry of feature %1: %2</source>
@@ -35180,7 +35515,7 @@ Always network: always load from network and do not check if the cache has a val
     </message>
     <message>
         <source>OGR error deleting feature %1: %2</source>
-        <translation>OGRエラー 地物削除 %1 %2</translation>
+        <translation>OGRエラー 地物%1の削除: %2</translation>
     </message>
     <message>
         <source>Shapefiles without attribute are considered read-only.</source>
@@ -35191,7 +35526,7 @@ Always network: always load from network and do not check if the cache has a val
     <name>QgsOpenRasterDialog</name>
     <message>
         <source>Open raster</source>
-        <translation>ラスタのオープン</translation>
+        <translation>ラスタを開く</translation>
     </message>
     <message>
         <source>Raster file:</source>
@@ -35239,7 +35574,7 @@ Always network: always load from network and do not check if the cache has a val
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -36864,7 +37199,7 @@ SQL:%1
     <name>QgsOracleLayerItem</name>
     <message>
         <source>Delete layer</source>
-        <translation>レイヤ削除</translation>
+        <translation>レイヤの削除</translation>
     </message>
     <message>
         <source>Layer deleted successfully.</source>
@@ -36899,12 +37234,10 @@ SQL:%1
         <translation>%1 への接続に成功しました</translation>
     </message>
     <message>
-        <source>Connection failed - Check settings and try again.
+        <source>Connection failed - consult message log for details.
 
 </source>
-        <translation>接続失敗 - 設定を確認して再度実行してください.
-
-</translation>
+        <translation>接続に失敗しました - 詳細についてはメッセージログを参照して下さい.</translation>
     </message>
 </context>
 <context>
@@ -37003,7 +37336,7 @@ SQL:%1
     </message>
     <message>
         <source><html><head/><body><p>When the layer is setup various metadata is required for the Oracle table. This includes information such as the table row count, geometry type and spatial extents of the data in the geometry column. If the table contains a large number of rows determining this metadata is time consuming.</p><p>By activating this option the following fast table metadata operations are done:</p><p>1) Row count is determi [...]
-        <translation><html><head/><body><p>レイヤが設定される時に多くのメタデータがOracleテーブルのために必要です.そこにはテーブルの行数やジオメトリタイプやジオメトリカラムの空間の領域が含まれます.もしテーブルがとても多くの行を持つような場合このメタデータを算出するのに多くの時間を使います.</p><p>テーブルメタデータの高速処理オプションをアクティベートすることによって以下のことができます:</p><p>1) 行のカウントを all_tables.num_rowsから取得する.</p><p>2) テーブルの領域は常に SDO_TUNE.EXTENTS_OF関数で取得され,レイヤフィルタが適用されている場合も同様の処理を行う.</p><p>3) テーブルジオメトリは最初の100個のnullでないジオメトリによって決定されます.</p></body>&lt [...]
+        <translation><html><head/><body><p>レイヤが設定される時に多くのメタデータがOracleテーブルのために必要です.そこにはテーブルの行数やジオメトリタイプやジオメトリカラムの空間の領域が含まれます.もしテーブルがとても多くの行を持つような場合このメタデータを算出するのに多くの時間を使います.</p><p>テーブルメタデータの高速処理オプションをアクティベートすることによって以下のことができます:</p><p>1) 行数を all_tables.num_rowsから取得する.</p><p>2) テーブルの領域は常に SDO_TUNE.EXTENTS_OF関数で取得され,レイヤフィルタが適用されている場合も同様の処理を行う.</p><p>3) テーブルジオメトリは最初の100個のnullでないジオメトリによって決定されます.</p></body></ht [...]
     </message>
     <message>
         <source>Use estimated table metadata</source>
@@ -37310,7 +37643,7 @@ SQL: %3</translation>
     </message>
     <message>
         <source>Editing and adding disabled for 2D+ layer (%1; %2)</source>
-        <translation>2D+layer (%1; %2)では編集と追加は禁止されています</translation>
+        <translation>2D+layer (%1; %2)では編集と追加はできません</translation>
     </message>
     <message>
         <source>Could not update metadata for %1.%2.
@@ -37414,6 +37747,14 @@ Error: %2</source>
         <translation>Oracleエラー: %1
 エラー: %2</translation>
     </message>
+    <message>
+        <source>Could not prepare get feature id statement</source>
+        <translation>地物ID取得ステートメントの準備ができませんでした</translation>
+    </message>
+    <message>
+        <source>Could not retrieve feature id %1</source>
+        <translation>地物ID %1を取得できませんでした</translation>
+    </message>
 </context>
 <context>
     <name>QgsOracleRootItem</name>
@@ -37426,7 +37767,7 @@ Error: %2</source>
     <name>QgsOracleSelectGeoraster</name>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -37509,7 +37850,7 @@ Error: %2</source>
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -37638,7 +37979,7 @@ Error: %2</source>
     </message>
     <message>
         <source>%1: Not a vector layer!</source>
-        <translation>%1はベクタレイヤじゃありません!</translation>
+        <translation>%1はベクタレイヤではありません!</translation>
     </message>
     <message>
         <source>%1: OK!</source>
@@ -37672,13 +38013,13 @@ Error: %2</source>
 <context>
     <name>QgsPGLayerItem</name>
     <message>
-        <source>Delete layer</source>
-        <translation>レイヤを削除する</translation>
-    </message>
-    <message>
         <source>Layer deleted successfully.</source>
         <translation>レイヤ検出に成功しました.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation>レイヤの削除</translation>
+    </message>
 </context>
 <context>
     <name>QgsPGRootItem</name>
@@ -37854,12 +38195,10 @@ Error: %2</source>
         <translation>%1 への接続に成功しました</translation>
     </message>
     <message>
-        <source>Connection failed - Check settings and try again.
+        <source>Connection failed - consult message log for details.
 
 </source>
-        <translation>接続失敗 - 設定を確認して再度実行してください.
-
-</translation>
+        <translation>接続に失敗しました - 詳細についてはメッセージログを参照して下さい.</translation>
     </message>
 </context>
 <context>
@@ -38045,7 +38384,7 @@ Error: %2</source>
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -38482,11 +38821,11 @@ You need to restart QGIS in order to reload it.</source>
     </message>
     <message>
         <source>The plugin seems to be invalid or have unfulfilled dependencies. It has been installed, but can't be loaded. If you really need this plugin, you can contact its author or <a href="http://lists.osgeo.org/mailman/listinfo/qgis-user">QGIS users group</a> and try to solve the problem. If not, you can just uninstall it. Here is the error message below:</source>
-        <translation>指定プラグインは不正であるか不完全な依存があります.これはインストールされていますがロードされていません.もしあなたが本当にこのプラグインが必要な場合このプラグインの作者か<a href="http://lists.osgeo.org/mailman/listinfo/qgis-user">QGISユーザーグループ</a>に連絡して問題解決を試みてください.このプラグインが必要でない場合はアンインストールしてください.エラーメッセージは以下のとおりです:</translation>
+        <translation>このプラグインは壊れているか依存関係が満たされていません. インストールはされましたがロードできませんでした. もしこのプラグインを本当に必要とする場合はプラグインの作者か&lt;a href=&quot;http://lists.osgeo.org/mailman/listinfo/qgis-user&quot;&gt;QGISユーザーグループ&lt;/a&gt;に連絡して問題の解決を試みてください. このプラグインが必要でない場合はアンインストールしてください. エラーメッセージは以下の通りです:</translation>
     </message>
     <message>
         <source>Do you want to uninstall this plugin now? If you're unsure, probably you would like to do this.</source>
-        <translation>このプラグインをアンインストールしたいですか?もしそうならば実行してください。</translation>
+        <translation>このプラグインを今アンインストールしますか? よくわからない場合はアンインストールするのが好ましいです.</translation>
     </message>
 </context>
 <context>
@@ -39089,7 +39428,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>undefined return value from encoding setting</source>
-        <translation>エンコーディング設定の帰り値が定義されていません</translation>
+        <translation>エンコーディング設定の返り値が定義されていません</translation>
     </message>
     <message>
         <source>Your database has no working PostGIS support.</source>
@@ -39116,7 +39455,7 @@ error:%3
         <source>Database connection was successful, but the accessible tables could not be determined. The error message from the database was:
 %1
 </source>
-        <translation>データベース接続は成功しましたがアクセスできるテーブルを決められません.データベースからのエラーメッセージjは以下のとおりです
+        <translation>データベース接続は成功しましたがアクセスできるテーブルを決められません.データベースからのエラーメッセージは以下のとおりです
 %1
 </translation>
     </message>
@@ -39124,8 +39463,8 @@ error:%3
         <source>Database connection was successful, but the accessible tables could not be determined.
 The error message from the database was:
 %1</source>
-        <translation>データベース接続は成功しましたがアクセスできるテーブルを決められません
-データベースからのエラーメッセージjは以下のとおりです
+        <translation>データベース接続は成功しましたがアクセスできるテーブルを決められません.
+データベースからのエラーメッセージは以下のとおりです
 %1</translation>
     </message>
     <message>
@@ -39522,13 +39861,6 @@ Choose ignore to continue loading without the missing layers. Choose cancel to r
     </message>
 </context>
 <context>
-    <name>QgsProjectColorScheme</name>
-    <message>
-        <source>Project colors</source>
-        <translation>プロジェクトカラー</translation>
-    </message>
-</context>
-<context>
     <name>QgsProjectLayerGroupDialog</name>
     <message>
         <source>Select project file</source>
@@ -41523,11 +41855,11 @@ Click on help button to get valid creation options for this format.</source>
     </message>
     <message>
         <source>Grayscale</source>
-        <translation>原色グレースケール</translation>
+        <translation>グレースケール</translation>
     </message>
     <message>
         <source>Colorize</source>
-        <translation>色を強調</translation>
+        <translation>着色</translation>
     </message>
     <message>
         <source>Strength</source>
@@ -41805,7 +42137,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Write out raw raster layer data. Optionally user defined no data values may be applied.</source>
-        <translation>ラスタレイヤの生データを出力します。オプションでユーザー定義のno dataの値も適用します。</translation>
+        <translation>ラスタレイヤの生データを出力します。オプションでユーザ定義のno dataの値も適用します。</translation>
     </message>
     <message>
         <source>Raw data</source>
@@ -41984,11 +42316,11 @@ datasets with maximum width and height specified below.</source>
     </message>
     <message>
         <source>Full</source>
-        <translation>全部</translation>
+        <translation>全体</translation>
     </message>
     <message>
         <source>Current</source>
-        <translation>現在の設定</translation>
+        <translation>現在の範囲</translation>
     </message>
     <message>
         <source>Accuracy</source>
@@ -42005,7 +42337,7 @@ datasets with maximum width and height specified below.</source>
     <message>
         <source>Cumulative
 count cut</source>
-        <translation>累積カウント数でのカット範囲</translation>
+        <translation>累積個数によるカット</translation>
     </message>
     <message utf8="true">
         <source>Mean +/-
@@ -42077,7 +42409,7 @@ standard deviation ×</source>
     </message>
     <message>
         <source>User defined</source>
-        <translation>ユーザー定義</translation>
+        <translation>ユーザ定義</translation>
     </message>
     <message>
         <source>Estimated</source>
@@ -42323,13 +42655,6 @@ standard deviation ×</source>
     </message>
 </context>
 <context>
-    <name>QgsRecentColorScheme</name>
-    <message>
-        <source>Recent colors</source>
-        <translation>最近の色</translation>
-    </message>
-</context>
-<context>
     <name>QgsRelReferenceConfigDlgBase</name>
     <message>
         <source>Dialog</source>
@@ -42349,7 +42674,7 @@ standard deviation ×</source>
     </message>
     <message>
         <source>Allow NULL value</source>
-        <translation>null値を許可する</translation>
+        <translation>NULL値を許容する</translation>
     </message>
     <message>
         <source>Show embedded form</source>
@@ -42361,7 +42686,7 @@ standard deviation ×</source>
     </message>
     <message>
         <source>Order by value</source>
-        <translation>値で整列する</translation>
+        <translation>値で並べ替える</translation>
     </message>
 </context>
 <context>
@@ -42749,11 +43074,11 @@ standard deviation ×</source>
     </message>
     <message>
         <source>Count</source>
-        <translation>カウント</translation>
+        <translation>個数</translation>
     </message>
     <message>
         <source>Duplicate count</source>
-        <translation>2重カウント</translation>
+        <translation>重複数</translation>
     </message>
     <message>
         <source>Max. scale</source>
@@ -42930,13 +43255,13 @@ standard deviation ×</source>
 <context>
     <name>QgsSLLayerItem</name>
     <message>
-        <source>Delete layer</source>
-        <translation>レイヤ削除</translation>
-    </message>
-    <message>
         <source>Layer deleted successfully.</source>
         <translation>レイヤ削除が成功しました.</translation>
     </message>
+    <message>
+        <source>Delete Layer</source>
+        <translation>レイヤの削除</translation>
+    </message>
 </context>
 <context>
     <name>QgsSLRootItem</name>
@@ -43808,7 +44133,7 @@ enhancement</source>
     </message>
     <message>
         <source>Snap to</source>
-        <translation>スナップ</translation>
+        <translation>スナップ先</translation>
     </message>
     <message>
         <source>map units</source>
@@ -44025,7 +44350,7 @@ but implies better performance thereafter.</source>
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -44462,7 +44787,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Are you sure you want to remove the [%1] connection and all associated settings?</source>
-        <translation>[%1]の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>[%1]の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -45816,7 +46141,7 @@ There was a problem with your symbol database.</source>
     </message>
     <message>
         <source>Both used to be correct, but we recently decided to just use 'QGIS'. For articles we suggest you write 'QGIS is ....'</source>
-        <translation>両方の使い方が正しいです,しかし私たちは最近 'QGIS' を利用することに決めました'. あなたが記事を書く場合 'QGIS は....' と書くことをお勧めします</translation>
+        <translation>両方の使い方が正しいですが私たちは最近 'QGIS' を利用することに決めました. あなたが記事を書く場合 'QGIS は....' と書くことをお勧めします</translation>
     </message>
     <message>
         <source>In the Print Composer you can rotate a map by setting its rotation value in the tab <strong>Item Properties -> Map -> Main properties</strong> section. To place a north arrow in your layout you can use the <strong>Add Image</strong> tool. After the selection and placement of the north arrow in the layout you can link it with a specific map frame by activating the <strong>Sync with map</strong> checkbox and selecting a map frame. W [...]
@@ -45996,7 +46321,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Load in QGIS when done</source>
-        <translation>実行された時にQGISにロードします</translation>
+        <translation>完了時にQGISにロードする</translation>
     </message>
     <message>
         <source>Helmert</source>
@@ -46161,15 +46486,15 @@ Error was:%2</source>
     </message>
     <message>
         <source>Allow null value</source>
-        <translation>null値を許可する</translation>
+        <translation>NULL値を許容する</translation>
     </message>
     <message>
         <source>Order by value</source>
-        <translation>値で整列する</translation>
+        <translation>値で並べ替える</translation>
     </message>
     <message>
         <source>Allow multiple selections</source>
-        <translation>複数選択を許可する</translation>
+        <translation>複数選択を許容する</translation>
     </message>
     <message>
         <source>Filter expression</source>
@@ -46275,6 +46600,14 @@ Error was:%2</source>
         <source>Height attribute</source>
         <translation>高さ属性値</translation>
     </message>
+    <message>
+        <source>Millimeter</source>
+        <translation>ミリメートル</translation>
+    </message>
+    <message>
+        <source>Map unit</source>
+        <translation>地図上の単位</translation>
+    </message>
 </context>
 <context>
     <name>QgsVectorGradientColorRampV2Dialog</name>
@@ -47422,7 +47755,7 @@ Error was:%2</source>
     </message>
     <message>
         <source>Are you sure you want to remove the %1 connection and all associated settings?</source>
-        <translation>%1の接続と全ての設定を削除してもいいですか?</translation>
+        <translation>%1の接続と全ての設定を削除してもよろしいですか?</translation>
     </message>
     <message>
         <source>Confirm Delete</source>
@@ -50166,6 +50499,33 @@ Problem with line %d</source>
     </message>
 </context>
 <context>
+    <name>SlopeAreaMulti</name>
+    <message>
+        <source>Slope Grid</source>
+        <translation>スロープグリッド</translation>
+    </message>
+    <message>
+        <source>Contributing Area Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slope Exponent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Area Exponent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slope Area Grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
+</context>
+<context>
     <name>SpatialJoin</name>
     <message>
         <source>Target vector layer</source>
@@ -50328,14 +50688,14 @@ Problem with line %d</source>
     </message>
 </context>
 <context>
-    <name>SymetricalDifference</name>
+    <name>SymmetricalDifference</name>
     <message>
         <source>Input layer</source>
         <translation>入力レイヤ</translation>
     </message>
     <message>
         <source>Difference layer</source>
-        <translation>レイヤの差分</translation>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Symetrical difference</source>
@@ -50385,6 +50745,36 @@ Problem with line %d</source>
         <source>TauDEM (hydrologic analysis)</source>
         <translation>TauDEM (水文解析)</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">TauDEMアルゴリズムを開けません: %s
+%s</translation>
+    </message>
+    <message>
+        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
+        <translation>誤ったMPIプロセス数が使われました。TauDEMアルゴリズムを実行する前に、正しい数を設定して下さい</translation>
+    </message>
 </context>
 <context>
     <name>TauDEMUtils</name>
@@ -51806,8 +52196,8 @@ Problem with line %d</source>
         <translation>投影法の異なりを許す</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Virtual</source>
+        <translation>仮想</translation>
     </message>
 </context>
 <context>
@@ -51914,7 +52304,7 @@ Run topology check again.</source>
     <message>
         <source><h3>Database connection</h3>
 </source>
-        <translation><h3>データベースコネクション</h3>
+        <translation><h3>データベース接続</h3>
 </translation>
     </message>
     <message>
@@ -52090,7 +52480,7 @@ geometry types and don't offer to add others.
  このオプションを有効にすると次のようにして迅速にテーブルメタデータが処理されます:
  行数はall_tables.num_rowsから決定されます.
  レイヤフィルタが適用されていたとしてもテーブルの領域はSDO_TUNE.EXTENTS_OF関数を用いて決定されます.
- テーブルのジオメトリはテーブルの始めのnullではない100行のジオメトリから決定されます.
+ テーブルのジオメトリはテーブルのはじめのnullではない100行のジオメトリから決定されます.
 
 <li> <label>存在するジオメトリタイプのみ</label> 存在するジオメトリタイプのみリストします. 他のものはリストしません.
 </ul>
@@ -54962,7 +55352,7 @@ CNR, Milan Unit (Information Technology), Construction Technologies Institute.
     <name>eVis</name>
     <message>
         <source>eVis Database Connection</source>
-        <translation>eVis データベースコネクション</translation>
+        <translation>eVis データベース接続</translation>
     </message>
     <message>
         <source>eVis Event Id Tool</source>
@@ -55747,8 +56137,8 @@ Plugin will not be enabled.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Filled</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -60494,8 +60884,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>バンド番号</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>xyz</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -60510,7 +60900,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Remove all existing overviews</source>
-        <translation type="unfinished"></translation>
+        <translation>すべてのオーバービューを削除します.</translation>
     </message>
     <message>
         <source>Resampling method</source>
@@ -60521,8 +60911,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>オーバービュー形式</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Pyramidized</source>
+        <translation>ピラミッドになった</translation>
     </message>
 </context>
 <context>
@@ -60564,7 +60954,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>3D-Viewer (NVIZ)</source>
-        <translation>3D-ビューワー(NVIZ)</translation>
+        <translation>3Dビューワー(NVIZ)</translation>
     </message>
     <message>
         <source>3d Visualization</source>
@@ -60692,7 +61082,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Calculate optimal index factor table for LANDSAT-TM raster</source>
-        <translation>LANDSAT-TMラスタの最適インデックファクタを計算する</translation>
+        <translation>LANDSAT-TMラスタの最適インデックスファクタを計算する</translation>
     </message>
     <message>
         <source>Calculate raster surface area</source>
@@ -60720,7 +61110,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Calculate univariate statistics from the non-null cells of raster</source>
-        <translation>ラスタ中のnullでないセルの単変量統計を計算する</translation>
+        <translation>ラスタ中のNULLでないセルの単変量統計を計算する</translation>
     </message>
     <message>
         <source>Calculate univariate statistics of vector map features</source>
@@ -61612,7 +62002,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Input table</source>
-        <translation>テーブルを入力する</translation>
+        <translation>入力テーブル</translation>
     </message>
     <message>
         <source>Interpolate surface</source>
@@ -62346,8 +62736,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>ライトの高さ</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Hillshade</source>
+        <translation>陰影図</translation>
     </message>
 </context>
 <context>
@@ -62427,11 +62817,11 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>Suppress GCP info</source>
-        <translation type="unfinished"></translation>
+        <translation>GCP情報を出力しない</translation>
     </message>
     <message>
         <source>Suppress metadata info</source>
-        <translation type="unfinished"></translation>
+        <translation>メタデータ情報を出力しない</translation>
     </message>
     <message>
         <source>Layer information</source>
@@ -62457,7 +62847,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     <name>las2demPro</name>
     <message>
         <source>attribute (what to interpolate)</source>
-        <translation type="unfinished"></translation>
+        <translation>属性(何を補間するか)</translation>
     </message>
     <message>
         <source>product (how to output per pixel)</source>
@@ -62526,7 +62916,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>argument for operation</source>
-        <translation type="unfinished"></translation>
+        <translation>オペレーション用引数</translation>
     </message>
 </context>
 <context>
@@ -62564,7 +62954,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>argument for operation</source>
-        <translation type="unfinished"></translation>
+        <translation>オペレーション用引数</translation>
     </message>
 </context>
 <context>
@@ -62586,7 +62976,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     <name>las2txt</name>
     <message>
         <source>parse string</source>
-        <translation type="unfinished"></translation>
+        <translation>文字列解析</translation>
     </message>
     <message>
         <source>Output ASCII file</source>
@@ -62597,7 +62987,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     <name>las2txtPro</name>
     <message>
         <source>parse string</source>
-        <translation type="unfinished"></translation>
+        <translation>文字列解析</translation>
     </message>
 </context>
 <context>
@@ -62642,7 +63032,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     <name>lascanopy</name>
     <message>
         <source>square plot size</source>
-        <translation type="unfinished"></translation>
+        <translation>四角形プロットサイズ</translation>
     </message>
     <message>
         <source>height cutoff / breast height</source>
@@ -62666,14 +63056,14 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>input file is single plot</source>
-        <translation type="unfinished"></translation>
+        <translation>入力ファイルはシングルプロットです</translation>
     </message>
 </context>
 <context>
     <name>lascanopyPro</name>
     <message>
         <source>square plot size</source>
-        <translation type="unfinished"></translation>
+        <translation>四角形プロットサイズ</translation>
     </message>
     <message>
         <source>height cutoff / breast height</source>
@@ -62697,7 +63087,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>input file is single plot</source>
-        <translation type="unfinished"></translation>
+        <translation>入力ファイルはシングルプロットです</translation>
     </message>
 </context>
 <context>
@@ -62708,7 +63098,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>interior</source>
-        <translation type="unfinished"></translation>
+        <translation>内部</translation>
     </message>
     <message>
         <source>what to do with points</source>
@@ -62734,7 +63124,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>interior</source>
-        <translation type="unfinished"></translation>
+        <translation>内部</translation>
     </message>
     <message>
         <source>what to do with isolated points</source>
@@ -62855,7 +63245,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>drop above height</source>
-        <translation type="unfinished"></translation>
+        <translation>指定高さ値以上を除外する</translation>
     </message>
     <message>
         <source>drop below</source>
@@ -62863,7 +63253,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>drop below height</source>
-        <translation type="unfinished"></translation>
+        <translation>指定高さ値以下を除外する</translation>
     </message>
 </context>
 <context>
@@ -62878,7 +63268,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>drop above height</source>
-        <translation type="unfinished"></translation>
+        <translation>指定高さ値以上を除外する</translation>
     </message>
     <message>
         <source>drop below</source>
@@ -62886,7 +63276,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>drop below height</source>
-        <translation type="unfinished"></translation>
+        <translation>指定高さ値以下を除外する</translation>
     </message>
 </context>
 <context>
@@ -63068,7 +63458,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>operation on attribute per cell</source>
-        <translation type="unfinished"></translation>
+        <translation>セルごとの属性操作</translation>
     </message>
     <message>
         <source>create overlap raster</source>
@@ -63091,7 +63481,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>operation on attribute per cell</source>
-        <translation type="unfinished"></translation>
+        <translation>セルごとの属性操作</translation>
     </message>
     <message>
         <source>create overlap raster</source>
@@ -63161,7 +63551,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>keep particular point per cell</source>
-        <translation type="unfinished"></translation>
+        <translation>特徴点をセル単位で保持する</translation>
     </message>
     <message>
         <source>mark thinned-away points as withheld</source>
@@ -63169,7 +63559,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>classify surviving points as class</source>
-        <translation type="unfinished"></translation>
+        <translation>計測ポイントをクラス分類する</translation>
     </message>
     <message>
         <source>class</source>
@@ -63184,7 +63574,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>keep particular point per cell</source>
-        <translation type="unfinished"></translation>
+        <translation>特徴点をセル単位で保持する</translation>
     </message>
     <message>
         <source>mark thinned-away points as withheld</source>
@@ -63192,7 +63582,7 @@ Format a date type or string into a custom string format. Uses Qt data time form
     </message>
     <message>
         <source>classify surviving points as class</source>
-        <translation type="unfinished"></translation>
+        <translation>計測ポイントをクラス分類する</translation>
     </message>
     <message>
         <source>class</source>
@@ -63334,8 +63724,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Merged</source>
+        <translation>結合された</translation>
     </message>
 </context>
 <context>
@@ -63353,8 +63743,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Nearblack</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -63452,8 +63842,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>変換するバンド</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>PCT to RGB</source>
+        <translation>PCTをRGBに変換する</translation>
     </message>
 </context>
 <context>
@@ -63467,8 +63857,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>出力フィールド名</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Vectorized</source>
+        <translation>ベクタ化</translation>
     </message>
 </context>
 <context>
@@ -63502,8 +63892,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Distance</source>
+        <translation>距離</translation>
     </message>
 </context>
 <context>
@@ -63517,10 +63907,6 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>属性フィールド</translation>
     </message>
     <message>
-        <source>Write values inside an existing raster layer(*)</source>
-        <translation>既存のラスタレイヤの中に値を書き込む (*)</translation>
-    </message>
-    <message>
         <source>Set output raster size (ignored if above option is checked)</source>
         <translation>出力ラスタサイズの設定 (上のオプションがチェックされている場合は無視されます)</translation>
     </message>
@@ -63537,10 +63923,6 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output layer: mandatory to choose an existing raster layer if the (*) option is selected</source>
-        <translation>出力レイヤ: (*)のオプションが選択されている場合は既存のラスタレイヤの選択が必須です</translation>
-    </message>
-    <message>
         <source>Nodata value</source>
         <translation>データ無しの値</translation>
     </message>
@@ -63569,9 +63951,13 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>BigTIFFか標準的なTIFFのどちらを作成するか制御する</translation>
     </message>
     <message>
-        <source>Force the generation of an associated ESRI world file (.tfw))</source>
+        <source>Force the generation of an associated ESRI world file (.tfw)</source>
         <translation>関連するESRIワールドファイル(.tfw)を作成する</translation>
     </message>
+    <message>
+        <source>Rasterized</source>
+        <translation>ラスタ化</translation>
+    </message>
 </context>
 <context>
     <name>rgb2pct</name>
@@ -63584,8 +63970,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>色数</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>RGB to PCT</source>
+        <translation>RGBをPCTに変換する</translation>
     </message>
 </context>
 <context>
@@ -63603,8 +63989,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>境界を計算する</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Roughness</source>
+        <translation>粗度</translation>
     </message>
 </context>
 <context>
@@ -63692,8 +64078,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>ピクセルの連結</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
+        <source>Sieved</source>
+        <translation>ふるいをかけた</translation>
     </message>
 </context>
 <context>
@@ -63723,8 +64109,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>比率(垂直単位の水平単位に対する比率)</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Slope</source>
+        <translation>傾斜</translation>
     </message>
 </context>
 <context>
@@ -63881,8 +64267,8 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>境界を計算する</translation>
     </message>
     <message>
-        <source>Output file</source>
-        <translation>出力ファイル</translation>
+        <source>Topographic Position Index</source>
+        <translation>トポロジカル位置インデックス</translation>
     </message>
 </context>
 <context>
@@ -63924,10 +64310,6 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
-    </message>
-    <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
         <translation>データなしの値, 空白の場合は入力から取得</translation>
     </message>
@@ -63959,6 +64341,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>関連するESRIワールドファイル(.tfw)を作成する</translation>
     </message>
+    <message>
+        <source>Translated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>tri</name>
@@ -64155,10 +64541,6 @@ Format a date type or string into a custom string format. Uses Qt data time form
         <translation>出力ラスタタイプ</translation>
     </message>
     <message>
-        <source>Output layer</source>
-        <translation>出力レイヤ</translation>
-    </message>
-    <message>
         <source>Nodata value, leave blank to take the nodata value from input</source>
         <translation>データなしの値, 空白の場合は入力から取得</translation>
     </message>
@@ -64190,5 +64572,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>関連するESRIワールドファイル(.tfw)を作成する</translation>
     </message>
+    <message>
+        <source>Warped</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
diff --git a/images/svg/shopping/shopping_alcohol.svg b/images/svg/shopping/shopping_alcohol.svg
index db639df..c66a6e6 100644
--- a/images/svg/shopping/shopping_alcohol.svg
+++ b/images/svg/shopping/shopping_alcohol.svg
@@ -37,10 +37,6 @@
 </g>
 <g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
 </g>
-<path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
 <path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d="M244.897,142.712c-5.551-3.063-12.103-6.376-18.884-9.163V29.944
 	c0-4.225-3.425-7.649-7.649-7.649h-37.893c-4.225,0-7.649,3.425-7.649,7.649v103.23c-17.422,6.57-35.835,17.419-44.24,27.374
 	c-6.854,8.117-8.216,15.891-7.848,21.666v333.124c0,7.179,3.334,13.95,9.025,18.327c18.134,13.947,55.303,15.453,70.441,15.453
diff --git a/images/svg/shopping/shopping_fish.svg b/images/svg/shopping/shopping_fish.svg
index 4fa9c86..fb6fdd7 100644
--- a/images/svg/shopping/shopping_fish.svg
+++ b/images/svg/shopping/shopping_fish.svg
@@ -32,10 +32,6 @@
 	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
 	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
 </g>
-<path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d="M31.851-224.099c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7
-	c1.069,0.422,2.191,0.629,3.308,0.629c1.811,0,3.606-0.545,5.137-1.606c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982
-	c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555
-	c-2.655,2.962-3.055,7.313-0.984,10.709L31.851-224.099z"/>
 <path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d="M540.531,306.188c6.14-18.828,12.433-41.819,20.688-59.938
 	c4.717-8.309,5.584-16.723,1.781-16.813c-0.629-0.015-3.282,0.963-6,2.219s-9.8,4.507-15.594,7.125s-12.849,6.712-15.688,9.188
 	c-16.914,11.087-35.235,16.465-55.812,15.594c-22.999-4.607-52.801-8.219-75.781-23.906c-35.322-18.993-38.363-20.479-53.031-25.656
diff --git a/mac/app.info.plist.in b/mac/app.info.plist.in
index e8e23f5..e6bc7b7 100644
--- a/mac/app.info.plist.in
+++ b/mac/app.info.plist.in
@@ -15,7 +15,7 @@
 	<key>CFBundleSignature</key>
 	<string>QGIS</string>
 	<key>CFBundleGetInfoString</key>
-	<string>${QGIS_APP_NAME} ${COMPLETE_VERSION}-${RELEASE_NAME} (${REVISION}), © 2002-2013 QGIS Development Team</string>
+	<string>${QGIS_APP_NAME} ${COMPLETE_VERSION}-${RELEASE_NAME} (${REVISION}), © 2002-2015 QGIS Development Team</string>
 	<key>CFBundleShortVersionString</key>
 	<string>${COMPLETE_VERSION}</string>
 	<key>CFBundleVersion</key>
diff --git a/mac/browser.info.plist.in b/mac/browser.info.plist.in
index 9c7528e..1b92f5d 100644
--- a/mac/browser.info.plist.in
+++ b/mac/browser.info.plist.in
@@ -15,7 +15,7 @@
 	<key>CFBundleSignature</key>
 	<string>QGSB</string>
 	<key>CFBundleGetInfoString</key>
-	<string>${QGIS_APP_NAME} Browser ${COMPLETE_VERSION}-${RELEASE_NAME} (${REVISION}), © 2002-2013 QGIS Development Team</string>
+	<string>${QGIS_APP_NAME} Browser ${COMPLETE_VERSION}-${RELEASE_NAME} (${REVISION}), © 2002-2015 QGIS Development Team</string>
 	<key>CFBundleShortVersionString</key>
 	<string>${COMPLETE_VERSION}</string>
 	<key>CFBundleVersion</key>
diff --git a/python/core/composer/qgscomposermap.sip b/python/core/composer/qgscomposermap.sip
index 4c05d2d..e1f86ac 100644
--- a/python/core/composer/qgscomposermap.sip
+++ b/python/core/composer/qgscomposermap.sip
@@ -757,9 +757,12 @@ class QgsComposerMap : QgsComposerItem
 
   public slots:
 
-    /**Called if map canvas has changed*/
+    /**Forces an update of the cached map image*/
     void updateCachedImage();
-    /**Call updateCachedImage if item is in render mode*/
+
+    /**Updates the cached map image if the map is set to Render mode
+     * @see updateCachedImage
+    */
     void renderModeUpdateCachedImage();
 
     /**Updates the bounding rect of this item. Call this function before doing any changes related to annotation out of the map rectangle */
@@ -769,4 +772,13 @@ class QgsComposerMap : QgsComposerItem
     void overviewExtentChanged();
 
     virtual void refreshDataDefinedProperty( const QgsComposerObject::DataDefinedProperty property = QgsComposerObject::AllProperties );
+
+  protected slots:
+
+    /**Called when layers are added or removed from the layer registry. Updates the maps
+     * layer set and redraws the map if required.
+     * @note added in QGIS 2.9
+    */
+    void layersChanged();
+
 };
diff --git a/python/core/dxf/qgsdxfexport.sip b/python/core/dxf/qgsdxfexport.sip
index c8fcbc8..2ca7812 100644
--- a/python/core/dxf/qgsdxfexport.sip
+++ b/python/core/dxf/qgsdxfexport.sip
@@ -63,31 +63,45 @@ class QgsDxfExport
     void writeGroup( int code, const QgsPoint &p, double z = 0.0, bool skipz = false ) /PyName=writeGroupPoint/;
     void writeGroup( QColor color, int exactMatch = 62, int rgbCode = 420, int transparencyCode = 440 );
 
+    //! Write handle
     int writeHandle( int code = 5, int handle = 0 );
 
-    //draw dxf primitives
+    //! Draw dxf primitives
     void writePolyline( const QgsPolyline &line, const QString &layer, const QString &lineStyleName, QColor color,
-                        double width = -1, bool polygon = false );
+                        double width = -1, bool unusedPolygonFlag = false );
 
+    //! Draw dxf polygon (HATCH)
     void writePolygon( const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, QColor color );
 
+    //! Draw solid
     void writeSolid( const QString &layer, QColor color, const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, const QgsPoint &pt4 );
 
-    //write line (as a polyline)
+    //! Write line (as a polyline)
     void writeLine( const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, QColor color, double width = -1 );
 
+    //! Write point
     void writePoint( const QString &layer, QColor color, const QgsPoint &pt );
 
+    //! Write filled circle (as hatch)
     void writeFilledCircle( const QString &layer, QColor color, const QgsPoint &pt, double radius );
 
+    //! Write circle (as polyline)
     void writeCircle( const QString &layer, QColor color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width );
 
+    //! Write text (TEXT)
     void writeText( const QString &layer, const QString &text, const QgsPoint &pt, double size, double angle, QColor color );
 
+    //! Write mtext (MTEXT)
     void writeMText( const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, QColor color );
 
     static double mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits );
 
+    //! Return cleaned layer name for use in DXF
     static QString dxfLayerName( const QString &name );
 
+    //! return DXF encoding for Qt encoding
+    static QString dxfEncoding( const QString &name );
+
+    //! return list of available DXF encodings
+    static QStringList encodings();
 };
diff --git a/python/core/layertree/qgslayertreemodellegendnode.sip b/python/core/layertree/qgslayertreemodellegendnode.sip
index 557adbd..2b73274 100644
--- a/python/core/layertree/qgslayertreemodellegendnode.sip
+++ b/python/core/layertree/qgslayertreemodellegendnode.sip
@@ -148,7 +148,7 @@ class QgsSimpleLegendNode : QgsLayerTreeModelLegendNode
 #include <qgslayertreemodellegendnode.h>
 %End
   public:
-    QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon(), QObject* parent /TransferThis/ = 0 );
+    QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon(), QObject* parent /TransferThis/ = 0, const QString& key = QString() );
 
     virtual QVariant data( int role ) const;
 };
diff --git a/python/core/qgsfeature.sip b/python/core/qgsfeature.sip
index 0554eab..69ea758 100644
--- a/python/core/qgsfeature.sip
+++ b/python/core/qgsfeature.sip
@@ -1,15 +1,13 @@
 
 typedef qint64 QgsFeatureId;
-
-// key = field index, value = field value
 typedef QMap<int, QVariant> QgsAttributeMap;
-
 typedef QVector<QVariant> QgsAttributes;
+
 // QgsAttributes is implemented as a Python list of Python objects.
 %MappedType QgsAttributes /DocType="list-of-attributes"/
 {
 %TypeHeaderCode
-#include <qvector.h>
+#include <qgsfeature.h>
 %End
 
 %ConvertFromTypeCode
@@ -53,7 +51,7 @@ typedef QVector<QVariant> QgsAttributes;
       return 1;
     }
 
-    QVector<QVariant> *qv = new QVector<QVariant>;
+    QgsAttributes* qv = new QgsAttributes;
 
     for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(sipPy); ++i)
     {
diff --git a/python/core/qgspallabeling.sip b/python/core/qgspallabeling.sip
index f2815b4..4322ce5 100644
--- a/python/core/qgspallabeling.sip
+++ b/python/core/qgspallabeling.sip
@@ -741,6 +741,15 @@ class QgsPalLabeling : QgsLabelingEngineInterface
     //! @deprecated since 2.4 - settings are always stored in project
     void setStoredWithProject( bool store ) /Deprecated/;
 
+    /** Splits a text string to a list of seperate lines, using a specified wrap character.
+     * The text string will be split on either newline characters or the wrap character.
+     * @param text text string to split
+     * @param wrapCharacter additional character to wrap on
+     * @returns list of text split to lines
+     * @note added in QGIS 2.9
+     */
+    static QStringList splitToLines( const QString& text, const QString& wrapCharacter );
+
   protected:
     // update temporary QgsPalLayerSettings with any data defined text style values
     void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr,
diff --git a/python/core/qgsvectorlayer.sip b/python/core/qgsvectorlayer.sip
index ee532a8..90c9df3 100644
--- a/python/core/qgsvectorlayer.sip
+++ b/python/core/qgsvectorlayer.sip
@@ -284,7 +284,7 @@ class QgsVectorLayer : QgsMapLayer
     /** Removes a vector layer join */
     void removeJoin( const QString& joinLayerId );
 
-    const QList< QgsVectorJoinInfo >& vectorJoins() const;
+    const QList< QgsVectorJoinInfo > vectorJoins() const;
 
     /**
      * Add a new field which is calculated by the expression specified
diff --git a/python/core/raster/qgsrasterblock.sip b/python/core/raster/qgsrasterblock.sip
index 75a620a..019b62e 100644
--- a/python/core/raster/qgsrasterblock.sip
+++ b/python/core/raster/qgsrasterblock.sip
@@ -180,6 +180,23 @@ class QgsRasterBlock
      *  @return true on success */
     bool setIsNoDataExcept( const QRect & theExceptRect );
 
+    /** \brief Remove no data flag on pixel. If the raster block does not have an explicit
+     * no data value set then an internal map of no data pixels is maintained for the block.
+     * In this case it is possible to reset a pixel to flag it as having valid data using this
+     * method. This method has no effect for raster blocks with an explicit no data value set.
+     *  @param row row index
+     *  @param column column index
+     *  @note added in QGIS 2.10 */
+    void setIsData( int row, int column );
+
+    /** \brief Remove no data flag on pixel. If the raster block does not have an explicit
+     * no data value set then an internal map of no data pixels is maintained for the block.
+     * In this case it is possible to reset a pixel to flag it as having valid data using this
+     * method. This method has no effect for raster blocks with an explicit no data value set.
+     *  @param index data matrix index (long type in Python)
+     *  @note added in QGIS 2.10 */
+    void setIsData( qgssize index );
+
     /** \brief Get pointer to data
      *  @param row row index
      *  @param column column index
diff --git a/python/core/symbology-ng/qgsfillsymbollayerv2.sip b/python/core/symbology-ng/qgsfillsymbollayerv2.sip
index acea620..d78f2f0 100644
--- a/python/core/symbology-ng/qgsfillsymbollayerv2.sip
+++ b/python/core/symbology-ng/qgsfillsymbollayerv2.sip
@@ -759,6 +759,8 @@ class QgsLinePatternFillSymbolLayer: QgsImageFillSymbolLayer
     bool setSubSymbol( QgsSymbolV2* symbol );
     QgsSymbolV2* subSymbol();
 
+    QSet<QString> usedAttributes() const;
+
 };
 
 class QgsPointPatternFillSymbolLayer : QgsImageFillSymbolLayer
diff --git a/python/core/symbology-ng/qgslinesymbollayerv2.sip b/python/core/symbology-ng/qgslinesymbollayerv2.sip
index 6a09707..8129353 100644
--- a/python/core/symbology-ng/qgslinesymbollayerv2.sip
+++ b/python/core/symbology-ng/qgslinesymbollayerv2.sip
@@ -207,6 +207,8 @@ class QgsMarkerLineSymbolLayerV2 : QgsLineSymbolLayerV2
     void setMapUnitScale( const QgsMapUnitScale& scale );
     QgsMapUnitScale mapUnitScale() const;
 
+    QSet<QString> usedAttributes() const;
+
   protected:
 
     void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
diff --git a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip
index 038b3e5..79df092 100644
--- a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip
+++ b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip
@@ -79,6 +79,7 @@ class QgsSimpleMarkerSymbolLayerV2 : QgsMarkerSymbolLayerV2
     void drawMarker( QPainter* p, QgsSymbolV2RenderContext& context );
 
     bool prepareShape( QString name = QString() );
+    bool prepareShape( QString name, QPolygonF &polygon ) const;
     bool preparePath( QString name = QString() );
 
     /**Prepares cache image
diff --git a/python/core/symbology-ng/qgssvgcache.sip b/python/core/symbology-ng/qgssvgcache.sip
index b1a245c..a574817 100644
--- a/python/core/symbology-ng/qgssvgcache.sip
+++ b/python/core/symbology-ng/qgssvgcache.sip
@@ -87,6 +87,10 @@ class QgsSvgCache : QObject
     /**Get image data*/
     QByteArray getImageData( const QString &path ) const;
 
+    /**Get SVG content*/
+    const QByteArray& svgContent( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
+                                  double widthScaleFactor, double rasterScaleFactor );
+
   signals:
     /** Emit a signal to be caught by qgisapp and display a msg on status bar */
     void statusChanged( const QString&  theStatusQString );
diff --git a/python/ext-libs/pyspatialite/src/connection.c b/python/ext-libs/pyspatialite/src/connection.c
index 668c818..09dc71d 100644
--- a/python/ext-libs/pyspatialite/src/connection.c
+++ b/python/ext-libs/pyspatialite/src/connection.c
@@ -29,6 +29,7 @@
 #include "prepare_protocol.h"
 #include "util.h"
 #include "sqlitecompat.h"
+#include "spatialite.h"
 
 #include "pythread.h"
 
@@ -81,7 +82,6 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
     }
 
     self->initialized = 1;
-    spatialite_init(0);
     self->begin_statement = NULL;
 
     self->statement_cache = NULL;
@@ -106,7 +106,15 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
         }
 
         Py_BEGIN_ALLOW_THREADS
+#if defined(SPATIALITE_HAS_INIT_EX)
+        self->slconn = spatialite_alloc_connection();
+#else
+        spatialite_init( 0 );
+#endif
         rc = sqlite3_open(PyString_AsString(database_utf8), &self->db);
+#if defined(SPATIALITE_HAS_INIT_EX)
+        spatialite_init_ex( self->db, self->slconn, 0 );
+#endif
         Py_END_ALLOW_THREADS
 
         Py_DECREF(database_utf8);
@@ -272,6 +280,9 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self)
     if (self->db) {
         Py_BEGIN_ALLOW_THREADS
         sqlite3_close(self->db);
+#if defined(SPATIALITE_HAS_INIT_EX)
+        spatialite_cleanup_ex( self->slconn );
+#endif
         Py_END_ALLOW_THREADS
     } else if (self->apsw_connection) {
         ret = PyObject_CallMethod(self->apsw_connection, "close", "");
@@ -372,6 +383,9 @@ PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args)
         } else {
             Py_BEGIN_ALLOW_THREADS
             rc = sqlite3_close(self->db);
+#if defined(SPATIALITE_HAS_INIT_EX)
+            spatialite_cleanup_ex( self->slconn );
+#endif
             Py_END_ALLOW_THREADS
 
             if (rc != SQLITE_OK) {
diff --git a/python/ext-libs/pyspatialite/src/connection.h b/python/ext-libs/pyspatialite/src/connection.h
index 18fd02a..6d52b03 100644
--- a/python/ext-libs/pyspatialite/src/connection.h
+++ b/python/ext-libs/pyspatialite/src/connection.h
@@ -33,12 +33,11 @@
 #include "sqlite3.h"
 #include "spatialite.h"
 
-// int spatialite_init(int verbose);
-
 typedef struct
 {
     PyObject_HEAD
     sqlite3* db;
+    void *slconn;
 
     /* 1 if we are currently within a transaction, i. e. if a BEGIN has been
      * issued */
diff --git a/python/plugins/db_manager/db_plugins/postgis/plugin.py b/python/plugins/db_manager/db_plugins/postgis/plugin.py
index 3acea12..bec3060 100644
--- a/python/plugins/db_manager/db_plugins/postgis/plugin.py
+++ b/python/plugins/db_manager/db_plugins/postgis/plugin.py
@@ -34,6 +34,8 @@ try:
 except ImportError:
         pass
 
+import re
+
 def classFactory():
         return PostGisDBPlugin
 
@@ -261,7 +263,7 @@ class PGRasterTable(PGTable, RasterTable):
                 return gdalUri
 
         def mimeUri(self):
-                uri = u"raster:gdal:%s:%s" % (self.name, self.gdalUri())
+                uri = u"raster:gdal:%s:%s" % (self.name, re.sub(":", "\:", self.gdalUri()))
                 return uri
 
         def toMapLayer(self):
diff --git a/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py b/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py
index f081380..074388a 100644
--- a/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py
+++ b/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py
@@ -81,7 +81,11 @@ def run(item, action, mainwindow):
             mainwindow.infoBar.pushMessage("Invalid topology", u'Schema "{0}" is not registered in topology.topology.'.format(item.schema().name), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout())
             return False
 
-        toposrid = str(res[0])
+        if ( res[0] < 0 ):
+          mainwindow.infoBar.pushMessage("WARNING", u'Topology "{0}" is registered as having a srid of {1} in topology.topology, we will assume 0 (for unknown)'.format(item.schema().name, res[0]), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout())
+          toposrid = '0'
+        else:
+          toposrid = str(res[0])
 
         # load layers into the current project
         toponame = item.schema().name
@@ -258,6 +262,16 @@ def run(item, action, mainwindow):
                 legend.setLayerExpanded(layer, False)
 
         finally:
+
+                # Set canvas extent to topology extent, if not yet initialized
+                canvas = iface.mapCanvas()
+                if ( canvas.fullExtent().isNull() ):
+                  ext = node_extent
+                  ext.combineExtentWith(edge_extent)
+                  # Grow by 1/20 of largest side
+                  ext = ext.buffer(max(ext.width(),ext.height())/20)
+                  canvas.setExtent(ext)
+
                 # restore canvas render flag
                 iface.mapCanvas().setRenderFlag( prevRenderFlagState )
 
diff --git a/python/plugins/db_manager/dlg_sql_window.py b/python/plugins/db_manager/dlg_sql_window.py
index 657eb30..9155491 100644
--- a/python/plugins/db_manager/dlg_sql_window.py
+++ b/python/plugins/db_manager/dlg_sql_window.py
@@ -101,7 +101,8 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
     self.presetCombo.setCurrentIndex(-1)
 
   def storePreset(self):
-    query = self.editSql.text()
+    query = self._getSqlQuery()
+    if query == "": return
     name = self.presetName.text()
     QgsProject.instance().writeEntry('DBManager','savedQueries/q'+str(name.__hash__())+'/name', name )
     QgsProject.instance().writeEntry('DBManager','savedQueries/q'+str(name.__hash__())+'/query', query )
@@ -140,12 +141,8 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
 
   def executeSql(self):
 
-    sql = self.editSql.selectedText()
-    if len(sql) == 0:
-        sql = self.editSql.text()
-
-    if sql == "":
-        return
+    sql = self._getSqlQuery()
+    if sql == "": return
 
     QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
 
@@ -184,9 +181,8 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
       QMessageBox.warning(self, self.tr( "DB Manager" ), self.tr( "You must fill the required fields: \ngeometry column - column with unique integer values" ) )
       return
 
-    query = self.editSql.text()
-    if query == "":
-      return
+    query = self._getSqlQuery()
+    if query == "": return
 
     # remove a trailing ';' from query if present
     if query.strip().endswith(';'):
@@ -219,7 +215,7 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
     QApplication.restoreOverrideCursor()
 
   def fillColumnCombos(self):
-    query = self.editSql.text()
+    query = self._getSqlQuery()
     if query == "": return
 
     QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
@@ -318,3 +314,9 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
 
     api.prepare()
     self.editSql.lexer().setAPIs(api)
+        
+  def _getSqlQuery(self):
+    sql = self.editSql.selectedText()
+    if len(sql) == 0:
+      sql = self.editSql.text()
+    return sql
diff --git a/python/plugins/processing/algs/grass7/Grass7Algorithm.py b/python/plugins/processing/algs/grass7/Grass7Algorithm.py
index cece40e..9498b46 100644
--- a/python/plugins/processing/algs/grass7/Grass7Algorithm.py
+++ b/python/plugins/processing/algs/grass7/Grass7Algorithm.py
@@ -78,7 +78,7 @@ class Grass7Algorithm(GeoAlgorithm):
         return QIcon(os.path.dirname(__file__) + '/../../images/grass.png')
 
     def help(self):
-        return False, 'http://grass.osgeo.org/grass70/manuals/' + self.grassName \
+        return False, 'http://grass.osgeo.org/grass70/manuals/' + self.grass7Name \
             + '.html'
 
     def getParameterDescriptions(self):
@@ -104,7 +104,7 @@ class Grass7Algorithm(GeoAlgorithm):
     def defineCharacteristicsFromFile(self):
         lines = open(self.descriptionFile)
         line = lines.readline().strip('\n').strip()
-        self.grassName = line
+        self.grass7Name = line
         line = lines.readline().strip('\n').strip()
         self.name = line
         line = lines.readline().strip('\n').strip()
@@ -288,7 +288,7 @@ class Grass7Algorithm(GeoAlgorithm):
 
         # 2: Set parameters and outputs
 
-        command = self.grassName
+        command = self.grass7Name
         for param in self.parameters:
             if param.value is None or param.value == '':
                 continue
@@ -358,7 +358,7 @@ class Grass7Algorithm(GeoAlgorithm):
                 commands.append('g.region raster=' + out.name + uniqueSufix)
                 outputCommands.append('g.region raster=' + out.name
                                       + uniqueSufix)
-                if self.grassName == 'r.composite':
+                if self.grass7Name == 'r.composite':
                     command = 'r.out.tiff -t --verbose' # FIXME r.out.tiff deprecated, use r.out.gdal
                     command += ' input='
                     command += out.name + uniqueSufix
@@ -369,7 +369,7 @@ class Grass7Algorithm(GeoAlgorithm):
                     command = 'r.out.gdal -c createopt="TFW=YES,COMPRESS=LZW"'
                     command += ' input='
 
-                if self.grassName == 'r.horizon':
+                if self.grass7Name == 'r.horizon':
                     command += out.name + uniqueSufix + '_0'
                 else:
                     command += out.name + uniqueSufix
diff --git a/python/plugins/processing/algs/qgis/ConvexHull.py b/python/plugins/processing/algs/qgis/ConvexHull.py
index 378ae8a..03f7cc8 100644
--- a/python/plugins/processing/algs/qgis/ConvexHull.py
+++ b/python/plugins/processing/algs/qgis/ConvexHull.py
@@ -64,7 +64,7 @@ class ConvexHull(GeoAlgorithm):
         useField = self.getParameterValue(self.METHOD) == 1
         fieldName = self.getParameterValue(self.FIELD)
 
-        f = QgsField('value')
+        f = QgsField('value', QVariant.String, '', 255)
         if useField:
             index = layer.fieldNameIndex(fieldName)
             fType = layer.pendingFields()[index].type()
@@ -79,12 +79,11 @@ class ConvexHull(GeoAlgorithm):
                 f.setType(QVariant.String)
                 f.setLength(255)
 
-        fields = [
-            QgsField('id', QVariant.Int, '', 20),
-            f,
-            QgsField('area', QVariant.Double, '', 20, 6),
-            QgsField('perim', QVariant.Double, '', 20, 6)
-        ]
+        fields = [QgsField('id', QVariant.Int, '', 20),
+                  f,
+                  QgsField('area', QVariant.Double, '', 20, 6),
+                  QgsField('perim', QVariant.Double, '', 20, 6)
+                 ]
 
         writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
             fields, QGis.WKBPolygon, layer.dataProvider().crs())
diff --git a/python/plugins/processing/algs/qgis/SelectByAttribute.py b/python/plugins/processing/algs/qgis/SelectByAttribute.py
index ea77b88..d4ec552 100644
--- a/python/plugins/processing/algs/qgis/SelectByAttribute.py
+++ b/python/plugins/processing/algs/qgis/SelectByAttribute.py
@@ -66,10 +66,11 @@ class SelectByAttribute(GeoAlgorithm):
             self.tr('Operator'), self.OPERATORS))
         self.addParameter(ParameterString(self.VALUE, self.tr('Value')))
 
-        self.addOutput(OutputVector(self.OUTPUT, self.tr('Output')))
+        self.addOutput(OutputVector(self.OUTPUT, self.tr('Output'), True))
 
     def processAlgorithm(self, progress):
-        layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
+        fileName = self.getParameterValue(self.INPUT)
+        layer = dataobjects.getObjectFromUri(fileName)
         fieldName = self.getParameterValue(self.FIELD)
         operator = self.OPERATORS[self.getParameterValue(self.OPERATOR)]
         value = self.getParameterValue(self.VALUE)
@@ -119,4 +120,4 @@ class SelectByAttribute(GeoAlgorithm):
             progress.setPercentage(int(count * total))
 
         layer.setSelectedFeatures(selected)
-        self.setOutputValue(self.OUTPUT, self.getParameterValue(self.INPUT))
+        self.setOutputValue(self.OUTPUT, fileName)
diff --git a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
index 810d1bd..8ba83b0 100644
--- a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
+++ b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py
@@ -62,8 +62,8 @@ class VectorLayerScatterplot(GeoAlgorithm):
     def processAlgorithm(self, progress):
         layer = dataobjects.getObjectFromUri(
             self.getParameterValue(self.INPUT))
-        xfieldname = self.getParameterValue(self.YFIELD)
-        yfieldname = self.getParameterValue(self.XFIELD)
+        xfieldname = self.getParameterValue(self.XFIELD)
+        yfieldname = self.getParameterValue(self.YFIELD)
 
         output = self.getOutputValue(self.OUTPUT)
 
diff --git a/python/plugins/processing/algs/qgis/scripts/Create_points_along_lines.py b/python/plugins/processing/algs/qgis/scripts/Create_points_along_lines.py
index 5f3eb18..9adc561 100644
--- a/python/plugins/processing/algs/qgis/scripts/Create_points_along_lines.py
+++ b/python/plugins/processing/algs/qgis/scripts/Create_points_along_lines.py
@@ -5,8 +5,8 @@
 ##endpoint=number 0
 ##output=output vector
 
-from qgis.core import QgsFeature, QgsField
 from PyQt4.QtCore import QVariant
+from qgis.core import QGis, QgsFeature, QgsField
 from processing.tools.vector import VectorWriter
 
 
diff --git a/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py b/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py
index 1e86fdb..b0bf8a9 100644
--- a/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py
+++ b/python/plugins/processing/algs/qgis/scripts/Number_of_unique_values_in_classes.py
@@ -4,6 +4,10 @@
 ##value_field=field input
 ##output=output vector
 
+from PyQt4.Qt import QVariant
+
+from qgis.core import QgsField, QgsFeature
+
 layer = processing.getObject(input)
 provider = layer.dataProvider()
 fields = provider.fields()
diff --git a/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py b/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py
index 06a76bb..9e66a9f 100644
--- a/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py
+++ b/python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py
@@ -81,6 +81,8 @@ class FieldsCalculatorDialog(QDialog, Ui_FieldsCalculator):
             self.cmbInputLayer.addItem(layer.name())
         self.cmbInputLayer.blockSignals(False)
 
+        self.builder.loadRecent('fieldcalc')
+
         self.updateLayer()
 
     def updateLayer(self):
@@ -90,7 +92,6 @@ class FieldsCalculatorDialog(QDialog, Ui_FieldsCalculator):
         self.builder.loadFieldNames()
 
         self.populateFields()
-        #populateOutputFieldTypes()
 
     def setupSpinboxes(self, index):
         if index != 0:
diff --git a/python/plugins/processing/algs/saga/CMakeLists.txt b/python/plugins/processing/algs/saga/CMakeLists.txt
index 61f86fd..ffd85f5 100644
--- a/python/plugins/processing/algs/saga/CMakeLists.txt
+++ b/python/plugins/processing/algs/saga/CMakeLists.txt
@@ -1,6 +1,6 @@
 FILE(GLOB PY_FILES *.py)
 FILE(GLOB DESCR212_FILES description/2.1.2/*.txt)
-FILE(GLOB DESCR213_FILES description/2.1.2/*.txt)
+FILE(GLOB DESCR213_FILES description/2.1.3/*.txt)
 FILE(GLOB HELP_FILES help/*.rst)
 
 ADD_SUBDIRECTORY(ext)
diff --git a/python/plugins/processing/algs/saga/SagaUtils.py b/python/plugins/processing/algs/saga/SagaUtils.py
index 76f684c..75b7daa 100644
--- a/python/plugins/processing/algs/saga/SagaUtils.py
+++ b/python/plugins/processing/algs/saga/SagaUtils.py
@@ -112,7 +112,10 @@ def getSagaInstalledVersion(runSaga=False):
         elif isMac():
             commands = [os.path.join(sagaPath(), "saga_cmd"), "-v"]
         else:
-            commands = ["saga_cmd", "-v"]
+            # for Linux use just one string instead of separated parameters as the list
+            # does not work well together with shell=True option
+            # (python docs advices to use subprocess32 instead of python2.7's subprocess)
+            commands = ["saga_cmd -v"]
         proc = subprocess.Popen(
             commands,
             shell=True,
diff --git a/python/plugins/processing/script/AddScriptFromFileAction.py b/python/plugins/processing/script/AddScriptFromFileAction.py
index 2a9e765..e4655a6 100644
--- a/python/plugins/processing/script/AddScriptFromFileAction.py
+++ b/python/plugins/processing/script/AddScriptFromFileAction.py
@@ -27,6 +27,8 @@ __revision__ = '$Format:%H$'
 
 import os
 from PyQt4.QtGui import QFileDialog, QIcon, QMessageBox
+from PyQt4.QtCore import QSettings, QFileInfo
+
 from processing.script.ScriptAlgorithm import ScriptAlgorithm
 from processing.gui.ToolboxAction import ToolboxAction
 from processing.script.WrongScriptException import WrongScriptException
@@ -45,13 +47,12 @@ class AddScriptFromFileAction(ToolboxAction):
         settings = QSettings()
         lastDir = settings.value('Processing/lastScriptsDir', '')
         filename = QFileDialog.getOpenFileName(self.toolbox,
-            self.tr('Script files', 'AddScriptFromFileAction'), None,
+            self.tr('Script files', 'AddScriptFromFileAction'), lastDir,
             self.tr('Script files (*.py *.PY)', 'AddScriptFromFileAction'))
         if filename:
             try:
                 settings.setValue('Processing/lastScriptsDir',
-                    QFileInfo(fileName).absoluteDir().absolutePath())
-
+                    QFileInfo(filename).absoluteDir().absolutePath())
                 script = ScriptAlgorithm(filename)
             except WrongScriptException:
                 QMessageBox.warning(self.toolbox,
diff --git a/python/user.py b/python/user.py
index d9cf419..1961899 100644
--- a/python/user.py
+++ b/python/user.py
@@ -1,8 +1,10 @@
 import os
 import sys
 import glob
+import traceback
 
-from qgis.core import QgsApplication
+from PyQt4.QtCore import QCoreApplication
+from qgis.core import QgsApplication, QgsMessageLog
 
 def load_user_expressions(path):
     """
@@ -14,9 +16,15 @@ def load_user_expressions(path):
     for name in names:
         if name == "__init__":
             continue
-        # As user expression functions should be registed with qgsfunction
+        # As user expression functions should be registered with qgsfunction
         # just importing the file is enough to get it to load the functions into QGIS
-        __import__("expressions.{0}".format(name), locals(), globals())
+        try:
+            __import__("expressions.{0}".format(name), locals(), globals())
+        except:
+            error = traceback.format_exc()
+            msgtitle = QCoreApplication.translate("UserExpressions", "User expressions")
+            msg = QCoreApplication.translate("UserExpressions", "The user expression {0} is not valid").format(name)
+            QgsMessageLog.logMessage(msg +"\n"+ error, msgtitle, QgsMessageLog.WARNING)
 
 
 userpythonhome = os.path.join(QgsApplication.qgisSettingsDirPath(), "python")
diff --git a/resources/function_help/NULL b/resources/function_help/NULL
new file mode 100644
index 0000000..5cb1804
--- /dev/null
+++ b/resources/function_help/NULL
@@ -0,0 +1,14 @@
+<h3>NULL value</h3>
+Equates to a null value.
+
+<h4>Syntax</h4>
+<pre>NULL</pre>
+
+<h4>Arguments</h4>
+None
+
+<h4>Example</h4>
+<pre> NULL → returns a null value </pre>
+
+<h4>Note:</h4>
+<p>To test for NULL use an <pre>IS NULL</pre> or <pre>IS NOT NULL</pre> expression.</p>
diff --git a/scripts/update_ts.sh b/scripts/update_ts.sh
index d75a2d5..954ae41 100755
--- a/scripts/update_ts.sh
+++ b/scripts/update_ts.sh
@@ -88,7 +88,7 @@ fi
 
 echo Updating python translations
 cd python
-pylupdate4 utils.py {console,pyplugin_installer}/*.{py,ui} -ts python-i18n.ts
+pylupdate4 user.py utils.py {console,pyplugin_installer}/*.{py,ui} -ts python-i18n.ts
 perl ../scripts/ts2cpp.pl python-i18n.ts python-i18n.cpp
 rm python-i18n.ts
 cd ..
diff --git a/src/analysis/network/CMakeLists.txt b/src/analysis/network/CMakeLists.txt
index eec3a7a..97e86b8 100644
--- a/src/analysis/network/CMakeLists.txt
+++ b/src/analysis/network/CMakeLists.txt
@@ -45,6 +45,10 @@ INCLUDE_DIRECTORIES(
 
 ADD_LIBRARY(qgis_networkanalysis SHARED ${QGIS_NETWORK_ANALYSIS_SRCS} ${QGIS_NETWORK_ANALYSIS_MOC_SRCS} ${QGIS_NETWORK_ANALYSIS_HDRS})
 
+IF(MSVC)
+  SET_TARGET_PROPERTIES(qgis_networkanalysis PROPERTIES LINK_FLAGS "/FORCE:MULTIPLE")
+ENDIF(MSVC)
+
 IF(NOT APPLE)
   INSTALL(FILES ${QGIS_NETWORK_ANALYSIS_HDRS} ${QGIS_NETWORK_ANALYSIS_MOC_HDRS} DESTINATION ${QGIS_INCLUDE_DIR})
 ELSE(NOT APPLE)
diff --git a/src/analysis/openstreetmap/qgsosmdatabase.cpp b/src/analysis/openstreetmap/qgsosmdatabase.cpp
index 0b15384..39640e4 100644
--- a/src/analysis/openstreetmap/qgsosmdatabase.cpp
+++ b/src/analysis/openstreetmap/qgsosmdatabase.cpp
@@ -14,14 +14,11 @@
  ***************************************************************************/
 
 #include "qgsosmdatabase.h"
-
-#include <spatialite.h>
-
+#include "qgsslconnect.h"
 #include "qgsgeometry.h"
 #include "qgslogger.h"
 
 
-
 QgsOSMDatabase::QgsOSMDatabase( const QString& dbFileName )
     : mDbFileName( dbFileName )
     , mDatabase( 0 )
@@ -32,7 +29,6 @@ QgsOSMDatabase::QgsOSMDatabase( const QString& dbFileName )
     , mStmtWayNodePoints( 0 )
     , mStmtWayTags( 0 )
 {
-
 }
 
 QgsOSMDatabase::~QgsOSMDatabase()
@@ -49,11 +45,8 @@ bool QgsOSMDatabase::isOpen() const
 
 bool QgsOSMDatabase::open()
 {
-  // load spatialite extension
-  spatialite_init( 0 );
-
   // open database
-  int res = sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE, 0 );
+  int res = QgsSLConnect::sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE, 0 );
   if ( res != SQLITE_OK )
   {
     mError = QString( "Failed to open database [%1]: %2" ).arg( res ).arg( mDbFileName );
@@ -93,7 +86,7 @@ bool QgsOSMDatabase::close()
   Q_ASSERT( mStmtNode == 0 );
 
   // close database
-  if ( sqlite3_close( mDatabase ) != SQLITE_OK )
+  if ( QgsSLConnect::sqlite3_close( mDatabase ) != SQLITE_OK )
   {
     //mError = ( char * ) "Closing SQLite3 database failed.";
     //return false;
diff --git a/src/analysis/openstreetmap/qgsosmimport.cpp b/src/analysis/openstreetmap/qgsosmimport.cpp
index 95f4668..1326f06 100644
--- a/src/analysis/openstreetmap/qgsosmimport.cpp
+++ b/src/analysis/openstreetmap/qgsosmimport.cpp
@@ -14,8 +14,7 @@
  ***************************************************************************/
 
 #include "qgsosmimport.h"
-
-#include <spatialite.h>
+#include "qgsslconnect.h"
 
 #include <QStringList>
 #include <QXmlStreamReader>
@@ -57,9 +56,6 @@ bool QgsOSMXmlImport::import()
     }
   }
 
-  // load spatialite extension
-  spatialite_init( 0 );
-
   if ( !createDatabase() )
   {
     // mError is set in createDatabase()
@@ -137,7 +133,7 @@ bool QgsOSMXmlImport::createDatabase()
 {
   char **results;
   int rows, columns;
-  if ( sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0 ) != SQLITE_OK )
+  if ( QgsSLConnect::sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0 ) != SQLITE_OK )
     return false;
 
   bool above41 = false;
@@ -238,7 +234,7 @@ bool QgsOSMXmlImport::closeDatabase()
 
   Q_ASSERT( mStmtInsertNode == 0 );
 
-  sqlite3_close( mDatabase );
+  QgsSLConnect::sqlite3_close( mDatabase );
   mDatabase = 0;
   return true;
 }
diff --git a/src/analysis/vector/qgszonalstatistics.cpp b/src/analysis/vector/qgszonalstatistics.cpp
index 8a2a9a4..65bacf4 100644
--- a/src/analysis/vector/qgszonalstatistics.cpp
+++ b/src/analysis/vector/qgszonalstatistics.cpp
@@ -302,20 +302,16 @@ void QgsZonalStatistics::statisticsFromMiddlePointTest( void* band, QgsGeometry*
     cellCenterX = rasterBBox.xMinimum() + pixelOffsetX * cellSizeX + cellSizeX / 2;
     for ( int j = 0; j < nCellsX; ++j )
     {
-      GEOSGeom_destroy_r( geosctxt, currentCellCenter );
-      cellCenterCoords = GEOSCoordSeq_create_r( geosctxt, 1, 2 );
-      GEOSCoordSeq_setX_r( geosctxt, cellCenterCoords, 0, cellCenterX );
-      GEOSCoordSeq_setY_r( geosctxt, cellCenterCoords, 0, cellCenterY );
-      currentCellCenter = GEOSGeom_createPoint_r( geosctxt, cellCenterCoords );
-
-      if ( scanLine[j] != mInputNodataValue ) //don't consider nodata values
+      if ( validPixel( scanLine[j] ) )
       {
+        GEOSGeom_destroy_r( geosctxt, currentCellCenter );
+        cellCenterCoords = GEOSCoordSeq_create_r( geosctxt, 1, 2 );
+        GEOSCoordSeq_setX_r( geosctxt, cellCenterCoords, 0, cellCenterX );
+        GEOSCoordSeq_setY_r( geosctxt, cellCenterCoords, 0, cellCenterY );
+        currentCellCenter = GEOSGeom_createPoint_r( geosctxt, cellCenterCoords );
         if ( GEOSPreparedContains_r( geosctxt, polyGeosPrepared, currentCellCenter ) )
         {
-          if ( !qIsNaN( scanLine[j] ) )
-          {
-            sum += scanLine[j];
-          }
+          sum += scanLine[j];
           ++count;
         }
       }
@@ -323,6 +319,7 @@ void QgsZonalStatistics::statisticsFromMiddlePointTest( void* band, QgsGeometry*
     }
     cellCenterY -= cellSizeY;
   }
+  GEOSGeom_destroy_r( geosctxt, currentCellCenter );
   CPLFree( scanLine );
   GEOSPreparedGeom_destroy_r( geosctxt, polyGeosPrepared );
 }
@@ -347,6 +344,9 @@ void QgsZonalStatistics::statisticsFromPreciseIntersection( void* band, QgsGeome
     for ( int col = 0; col < nCellsX; ++col )
     {
       GDALRasterIO( band, GF_Read, pixelOffsetX + col, pixelOffsetY + row, nCellsX, 1, pixelData, 1, 1, GDT_Float32, 0, 0 );
+      if ( !validPixel( *pixelData ) )
+        continue;
+
       pixelRectGeometry = QgsGeometry::fromRect( QgsRectangle( currentX - hCellSizeX, currentY - hCellSizeY, currentX + hCellSizeX, currentY + hCellSizeY ) );
       if ( pixelRectGeometry )
       {
@@ -373,6 +373,15 @@ void QgsZonalStatistics::statisticsFromPreciseIntersection( void* band, QgsGeome
   CPLFree( pixelData );
 }
 
+bool QgsZonalStatistics::validPixel( float value ) const
+{
+  if ( value == mInputNodataValue || qIsNaN( value ) )
+  {
+    return false;
+  }
+  return true;
+}
+
 QString QgsZonalStatistics::getUniqueFieldName( QString fieldName )
 {
   QgsVectorDataProvider* dp = mPolygonLayer->dataProvider();
diff --git a/src/analysis/vector/qgszonalstatistics.h b/src/analysis/vector/qgszonalstatistics.h
index c00f9fb..baf3e73 100644
--- a/src/analysis/vector/qgszonalstatistics.h
+++ b/src/analysis/vector/qgszonalstatistics.h
@@ -54,6 +54,9 @@ class ANALYSIS_EXPORT QgsZonalStatistics
     void statisticsFromPreciseIntersection( void* band, QgsGeometry* poly, int pixelOffsetX, int pixelOffsetY, int nCellsX, int nCellsY,
                                             double cellSizeX, double cellSizeY, const QgsRectangle& rasterBBox, double& sum, double& count );
 
+    /**Tests whether a pixel's value should be included in the result*/
+    bool validPixel( float value ) const;
+
     QString getUniqueFieldName( QString fieldName );
 
     QString mRasterFilePath;
@@ -63,6 +66,7 @@ class ANALYSIS_EXPORT QgsZonalStatistics
     QString mAttributePrefix;
     /**The nodata value of the input layer*/
     float mInputNodataValue;
+
 };
 
 #endif // QGSZONALSTATISTICS_H
diff --git a/src/app/composer/qgscomposer.cpp b/src/app/composer/qgscomposer.cpp
index d413498..eb375c0 100644
--- a/src/app/composer/qgscomposer.cpp
+++ b/src/app/composer/qgscomposer.cpp
@@ -105,6 +105,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
     : QMainWindow()
     , mTitle( title )
     , mQgis( qgis )
+    , mPrinter( 0 )
     , mUndoView( 0 )
     , mAtlasFeatureAction( 0 )
 {
@@ -645,6 +646,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
 QgsComposer::~QgsComposer()
 {
   deleteItemWidgets();
+  delete mPrinter;
 }
 
 void QgsComposer::setupTheme()
@@ -803,24 +805,38 @@ void QgsComposer::activate()
   }
 }
 
-#ifdef Q_OS_MAC
 void QgsComposer::changeEvent( QEvent* event )
 {
   QMainWindow::changeEvent( event );
   switch ( event->type() )
   {
+#ifdef Q_OS_MAC
     case QEvent::ActivationChange:
+    {
       if ( QApplication::activeWindow() == this )
       {
         mWindowAction->setChecked( true );
       }
       break;
-
+    }
+#endif
+    case QEvent::WindowStateChange:
+    {
+      /* Listen out for window un-minimisation and restore composer map states.
+       * We can't use showEvent to detect this due to QT Bug 36675 (see #6085).
+       */
+      QWindowStateChangeEvent* changeEv = static_cast< QWindowStateChangeEvent* >( event );
+      if ( changeEv->oldState() & Qt::WindowMinimized )
+      {
+        // Window restored, restore composers
+        restoreComposerMapStates();
+      }
+      break;
+    }
     default:
       break;
   }
 }
-#endif
 
 void QgsComposer::setTitle( const QString& title )
 {
@@ -1701,7 +1717,7 @@ void QgsComposer::printComposition( QgsComposer::OutputMode mode )
   }
 
   //orientation and page size are already set to QPrinter in the page setup dialog
-  QPrintDialog printDialog( &mPrinter, 0 );
+  QPrintDialog printDialog( printer(), 0 );
   if ( printDialog.exec() != QDialog::Accepted )
   {
     return;
@@ -1713,15 +1729,15 @@ void QgsComposer::printComposition( QgsComposer::OutputMode mode )
   QgsAtlasComposition* atlasMap = &mComposition->atlasComposition();
   if ( mode == QgsComposer::Single )
   {
-    mComposition->print( mPrinter, true );
+    mComposition->print( *printer(), true );
   }
   else
   {
     //prepare for first feature, so that we know paper size to begin with
     atlasMap->prepareForFeature( 0 );
 
-    mComposition->beginPrint( mPrinter, true );
-    QPainter painter( &mPrinter );
+    mComposition->beginPrint( *printer(), true );
+    QPainter painter( printer() );
 
     loadAtlasPredefinedScalesFromProject();
     if ( ! atlasMap->beginRender() && !atlasMap->featureFilterErrorString().isEmpty() )
@@ -1759,7 +1775,7 @@ void QgsComposer::printComposition( QgsComposer::OutputMode mode )
       }
 
       //start print on a new page if we're not on the first feature
-      mComposition->doPrint( mPrinter, painter, i > 0 );
+      mComposition->doPrint( *printer(), painter, i > 0 );
     }
     atlasMap->endRender();
     painter.end();
@@ -3003,21 +3019,16 @@ void QgsComposer::resizeEvent( QResizeEvent *e )
   saveWindowState();
 }
 
+#ifdef Q_OS_MAC
 void QgsComposer::showEvent( QShowEvent* event )
 {
-  if ( event->spontaneous() ) //event from the window system
-  {
-    restoreComposerMapStates();
-  }
-
-#ifdef Q_OS_MAC
   // add to menu if (re)opening window (event not due to unminimize)
   if ( !event->spontaneous() )
   {
     mQgis->addWindow( mWindowAction );
   }
-#endif
 }
+#endif
 
 void QgsComposer::saveWindowState()
 {
@@ -3556,21 +3567,24 @@ void QgsComposer::on_mActionPageSetup_triggered()
     return;
   }
 
-  QPageSetupDialog pageSetupDialog( &mPrinter, this );
+  QPageSetupDialog pageSetupDialog( printer(), this );
   pageSetupDialog.exec();
 }
 
 void QgsComposer::restoreComposerMapStates()
 {
-  //go through maps and restore original preview modes (show on demand after loading from project file)
-  QMap< QgsComposerMap*, int >::iterator mapIt = mMapsToRestore.begin();
-  for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
+  if ( !mMapsToRestore.isEmpty() )
   {
-    mapIt.key()->setPreviewMode(( QgsComposerMap::PreviewMode )( mapIt.value() ) );
-    mapIt.key()->cache();
-    mapIt.key()->update();
+    //go through maps and restore original preview modes (show on demand after loading from project file)
+    QMap< QgsComposerMap*, int >::iterator mapIt = mMapsToRestore.begin();
+    for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
+    {
+      mapIt.key()->setPreviewMode(( QgsComposerMap::PreviewMode )( mapIt.value() ) );
+      mapIt.key()->cache();
+      mapIt.key()->update();
+    }
+    mMapsToRestore.clear();
   }
-  mMapsToRestore.clear();
 }
 
 void QgsComposer::populatePrintComposersMenu()
@@ -3726,11 +3740,11 @@ void QgsComposer::setPrinterPageOrientation( QString orientation )
 {
   if ( orientation == tr( "Landscape" ) )
   {
-    mPrinter.setOrientation( QPrinter::Landscape );
+    printer()->setOrientation( QPrinter::Landscape );
   }
   else
   {
-    mPrinter.setOrientation( QPrinter::Portrait );
+    printer()->setOrientation( QPrinter::Portrait );
   }
 }
 
@@ -3742,11 +3756,11 @@ void QgsComposer::setPrinterPageDefaults()
   //set printer page orientation
   if ( paperWidth > paperHeight )
   {
-    mPrinter.setOrientation( QPrinter::Landscape );
+    printer()->setOrientation( QPrinter::Landscape );
   }
   else
   {
-    mPrinter.setOrientation( QPrinter::Portrait );
+    printer()->setOrientation( QPrinter::Portrait );
   }
 }
 
@@ -3799,3 +3813,13 @@ void QgsComposer::loadAtlasPredefinedScalesFromProject()
   atlasMap.setPredefinedScales( pScales );
 }
 
+QPrinter *QgsComposer::printer()
+{
+  //only create the printer on demand - creating a printer object can be very slow
+  //due to QTBUG-3033
+  if ( !mPrinter )
+    mPrinter = new QPrinter();
+
+  return mPrinter;
+}
+
diff --git a/src/app/composer/qgscomposer.h b/src/app/composer/qgscomposer.h
index b26a49c..a199b56 100644
--- a/src/app/composer/qgscomposer.h
+++ b/src/app/composer/qgscomposer.h
@@ -19,7 +19,6 @@
 #include "ui_qgscomposerbase.h"
 #include "qgscomposermap.h"
 #include "qgscontexthelp.h"
-#include <QPrinter>
 #include <QDockWidget>
 
 class QgisApp;
@@ -112,13 +111,12 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
     //! Resize event
     virtual void resizeEvent( QResizeEvent * ) override;
 
-    virtual void showEvent( QShowEvent* event ) override;
-
 #ifdef Q_OS_MAC
-    //! Change event (update window menu on ActivationChange)
-    virtual void changeEvent( QEvent * );
+    virtual void showEvent( QShowEvent* event ) override;
 #endif
 
+    virtual void changeEvent( QEvent *ev ) override;
+
   signals:
     //! Is emitted every time the view zoom has changed
     void zoomLevelChanged();
@@ -509,6 +507,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
     //! Load predefined scales from the project's properties
     void loadAtlasPredefinedScalesFromProject();
 
+    QPrinter* printer();
+
     /**Composer title*/
     QString mTitle;
 
@@ -558,7 +558,7 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
     QAction *mActionPaste;
 
     //! Page & Printer Setup
-    QPrinter mPrinter;
+    QPrinter* mPrinter;
 
     QUndoView* mUndoView;
 
diff --git a/src/app/gps/qgsgpsinformationwidget.cpp b/src/app/gps/qgsgpsinformationwidget.cpp
index 31abc34..21a3705 100644
--- a/src/app/gps/qgsgpsinformationwidget.cpp
+++ b/src/app/gps/qgsgpsinformationwidget.cpp
@@ -544,7 +544,10 @@ void QgsGPSInformationWidget::displayGPSInformation( const QgsGPSInformation& in
 #if (WITH_QWTPOLAR)
   if ( mStackedWidget->currentIndex() == 2 && info.satInfoComplete ) //satellites
   {
-    qDeleteAll( mMarkerList );
+    while ( !mMarkerList.isEmpty() )
+    {
+      delete mMarkerList.takeFirst();
+    }
   } //satellites
 #endif
   if ( mStackedWidget->currentIndex() == 4 ) //debug
diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp
index 743a68f..9497d93 100644
--- a/src/app/nodetool/qgsmaptoolnodetool.cpp
+++ b/src/app/nodetool/qgsmaptoolnodetool.cpp
@@ -137,6 +137,7 @@ void QgsMapToolNodeTool::createMovingRubberBands()
         vertexMap[vertex]->setRubberBandValues( true, lastRubberBand, index );
         index++;
       }
+      rb->show();
       mRubberBands.append( rb );
       lastRubberBand++;
     }
@@ -475,7 +476,6 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
         mSelectedFeature->deselectAllVertexes();
       }
     }
-
   }
 }
 
@@ -534,61 +534,58 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
       mSelectAnother = false;
     }
   }
-  else
+  else if ( mMoving )
   {
-    if ( mMoving )
-    {
-      mMoving = false;
-      QgsPoint releaseMapCoords, pressMapCoords;
+    mMoving = false;
+    QgsPoint releaseMapCoords, pressMapCoords;
 
-      QgsExcludePointFilter excludePointFilter( mClosestMapVertex );
-      QgsPointLocator::Match match = mCanvas->snappingUtils()->snapToMap( e->pos(), &excludePointFilter );
+    QgsExcludePointFilter excludePointFilter( mClosestMapVertex );
+    QgsPointLocator::Match match = mCanvas->snappingUtils()->snapToMap( e->pos(), &excludePointFilter );
 
-      if ( match.isValid() )
-      {
-        releaseMapCoords = match.point();
-        pressMapCoords = mClosestMapVertex;
-      }
-      else
-      {
-        releaseMapCoords = toMapCoordinates( e->pos() );
-        pressMapCoords = toMapCoordinates( mPressCoordinates );
-      }
+    if ( match.isValid() )
+    {
+      releaseMapCoords = match.point();
+      pressMapCoords = mClosestMapVertex;
+    }
+    else
+    {
+      releaseMapCoords = toMapCoordinates( e->pos() );
+      pressMapCoords = toMapCoordinates( mPressCoordinates );
+    }
 
-      QgsPoint releaseLayerCoords = toLayerCoordinates( vlayer, releaseMapCoords );
-      QgsPoint pressLayerCoords = toLayerCoordinates( vlayer, pressMapCoords );
+    QgsPoint releaseLayerCoords = toLayerCoordinates( vlayer, releaseMapCoords );
+    QgsPoint pressLayerCoords = toLayerCoordinates( vlayer, pressMapCoords );
 
-      if ( match.isValid() )
+    if ( match.isValid() )
+    {
+      int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 );
+      if ( topologicalEditing )
       {
-        int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 );
-        if ( topologicalEditing )
-        {
-          addTopologicalPoints( QList<QgsPoint>() << releaseMapCoords );
-        }
+        addTopologicalPoints( QList<QgsPoint>() << releaseMapCoords );
       }
-
-      mSelectedFeature->moveSelectedVertexes( releaseLayerCoords - pressLayerCoords );
-      mCanvas->refresh();
     }
-    else // selecting vertexes by rubberband
-    {
-      // coordinates has to be coordinates from layer not canvas
-      QgsRectangle r( toLayerCoordinates( vlayer, mPressCoordinates ),
-                      toLayerCoordinates( vlayer, e->pos() ) );
 
-      QList<QgsVertexEntry*> &vertexMap = mSelectedFeature->vertexMap();
-      if ( !mCtrl )
-      {
-        mSelectedFeature->deselectAllVertexes();
-      }
+    mSelectedFeature->moveSelectedVertexes( releaseLayerCoords - pressLayerCoords );
+    mCanvas->refresh();
+  }
+  else // selecting vertexes by rubberband
+  {
+    // coordinates has to be coordinates from layer not canvas
+    QgsRectangle r( toLayerCoordinates( vlayer, mPressCoordinates ),
+                    toLayerCoordinates( vlayer, e->pos() ) );
 
-      for ( int i = 0; i < vertexMap.size(); i++ )
+    QList<QgsVertexEntry*> &vertexMap = mSelectedFeature->vertexMap();
+    if ( !mCtrl )
+    {
+      mSelectedFeature->deselectAllVertexes();
+    }
+
+    for ( int i = 0; i < vertexMap.size(); i++ )
+    {
+      if ( r.contains( vertexMap[i]->point() ) )
       {
-        if ( r.contains( vertexMap[i]->point() ) )
-        {
-          // inverting selection is enough because all were deselected if ctrl is not pressed
-          mSelectedFeature->invertVertexSelection( i, false );
-        }
+        // inverting selection is enough because all were deselected if ctrl is not pressed
+        mSelectedFeature->invertVertexSelection( i, false );
       }
     }
   }
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index 68e2181..c8b140b 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -738,7 +738,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
     // enable Python in the Plugin Manager and pass the PythonUtils to it
     mPluginManager->setPythonUtils( mPythonUtils );
   }
-  else
+  else if ( mActionShowPythonDialog )
   {
     mActionShowPythonDialog->setVisible( false );
   }
@@ -800,7 +800,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
   mLastComposerId = 0;
 
   // Show a nice tip of the day
-  if ( settings.value( "/qgis/showTips", 1 ).toBool() )
+  if ( settings.value( QString( "/qgis/showTips%1" ).arg( QGis::QGIS_VERSION_INT / 100 ), true ).toBool() )
   {
     mSplash->hide();
     QgsTipGui myTip;
@@ -2929,7 +2929,15 @@ bool QgisApp::addVectorLayers( const QStringList &theLayerQStringList, const QSt
         QStringList sublayers = layer->dataProvider()->subLayers();
         QStringList elements = sublayers.at( 0 ).split( ":" );
         if ( layer->storageType() != "GeoJSON" )
+        {
+          while ( elements.size() > 4 )
+          {
+            elements[1] += ":" + elements[2];
+            elements.removeAt( 2 );
+          }
+
           layer->setLayerName( elements.at( 1 ) );
+        }
         myList << layer;
       }
       else
@@ -3254,8 +3262,20 @@ void QgisApp::loadOGRSublayers( QString layertype, QString uri, QStringList list
   for ( int i = 0; i < list.size(); i++ )
   {
     QString composedURI;
-    QString layerName = list.at( i ).split( ':' ).value( 0 );
-    QString layerType = list.at( i ).split( ':' ).value( 1 );
+    QStringList elements = list.at( i ).split( ":" );
+    while ( elements.size() > 2 )
+    {
+      elements[0] += ":" + elements[1];
+      elements.removeAt( 1 );
+    }
+
+    QString layerName = elements.value( 0 );
+    QString layerType = elements.value( 1 );
+    if ( layerType == "any" )
+    {
+      layerType = "";
+      elements.removeAt( 1 );
+    }
 
     if ( layertype != "GRASS" )
     {
@@ -5656,21 +5676,23 @@ void QgisApp::deletePrintComposers()
   QSet<QgsComposer*>::iterator it = mPrintComposers.begin();
   while ( it != mPrintComposers.end() )
   {
-    emit composerWillBeRemoved(( *it )->view() );
+    QgsComposer* c = ( *it );
+    emit composerWillBeRemoved( c->view() );
+    it = mPrintComposers.erase( it );
+    emit composerRemoved( c->view() );
 
     //save a reference to the composition
-    QgsComposition* composition = ( *it )->composition();
+    QgsComposition* composition = c->composition();
 
     //first, delete the composer. This must occur before deleting the composition as some of the cleanup code in
     //composer or in composer item widgets may require the composition to still be around
-    delete( *it );
+    delete( c );
 
     //next, delete the composition
     if ( composition )
     {
       delete composition;
     }
-    it = mPrintComposers.erase( it );
   }
   mLastComposerId = 0;
   markDirty();
@@ -6206,12 +6228,13 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
       // convert geometry to match destination layer
       QGis::GeometryType destType = pasteVectorLayer->geometryType();
       bool destIsMulti = QGis::isMultiType( pasteVectorLayer->wkbType() );
-      if ( pasteVectorLayer->storageType() == "ESRI Shapefile" && destType != QGis::Point )
+      if ( pasteVectorLayer->dataProvider() &&
+           !pasteVectorLayer->dataProvider()->doesStrictFeatureTypeCheck() )
       {
-        // force destination to multi if shapefile if it's not a point file
-        // Should we really force anything here?  Isn't it better to just transform?
+        // force destination to multi if provider doesn't do a feature strict check
         destIsMulti = true;
       }
+
       if ( destType != QGis::UnknownGeometry )
       {
         QgsGeometry* newGeometry = featureIt->geometry()->convertToType( destType, destIsMulti );
@@ -6927,14 +6950,23 @@ void QgisApp::showMouseCoordinate( const QgsPoint & p )
   {
     if ( mMapCanvas->mapUnits() == QGis::Degrees )
     {
+      if ( !mMapCanvas->mapSettings().destinationCrs().isValid() )
+        return;
+
+      QgsPoint geo = p;
+      if ( !mMapCanvas->mapSettings().destinationCrs().geographicFlag() )
+      {
+        QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), QgsCoordinateReferenceSystem( GEOSRID ) );
+        geo = ct.transform( p );
+      }
       QString format = QgsProject::instance()->readEntry( "PositionPrecision", "/DegreeFormat", "D" );
 
       if ( format == "DM" )
-        mCoordsEdit->setText( p.toDegreesMinutes( mMousePrecisionDecimalPlaces ) );
+        mCoordsEdit->setText( geo.toDegreesMinutes( mMousePrecisionDecimalPlaces ) );
       else if ( format == "DMS" )
-        mCoordsEdit->setText( p.toDegreesMinutesSeconds( mMousePrecisionDecimalPlaces ) );
+        mCoordsEdit->setText( geo.toDegreesMinutesSeconds( mMousePrecisionDecimalPlaces ) );
       else
-        mCoordsEdit->setText( p.toString( mMousePrecisionDecimalPlaces ) );
+        mCoordsEdit->setText( geo.toString( mMousePrecisionDecimalPlaces ) );
     }
     else
     {
@@ -7138,7 +7170,12 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
       }
       else if ( vlayer )
       {
-        dupLayer = new QgsVectorLayer( vlayer->source(), layerDupName, vlayer->providerType() );
+        QgsVectorLayer *dupVLayer = new QgsVectorLayer( vlayer->source(), layerDupName, vlayer->providerType() );
+        if ( vlayer->dataProvider() )
+        {
+          dupVLayer->setProviderEncoding( vlayer->dataProvider()->encoding() );
+        }
+        dupLayer = dupVLayer;
       }
     }
 
@@ -8026,7 +8063,7 @@ void QgisApp::embedLayers()
 {
   //dialog to select groups/layers from other project files
   QgsProjectLayerGroupDialog d( this );
-  if ( d.exec() == QDialog::Accepted )
+  if ( d.exec() == QDialog::Accepted && d.isValid() )
   {
     mMapCanvas->freeze( true );
 
diff --git a/src/app/qgsadvanceddigitizingdockwidget.cpp b/src/app/qgsadvanceddigitizingdockwidget.cpp
index 5f73567..64f57b9 100644
--- a/src/app/qgsadvanceddigitizingdockwidget.cpp
+++ b/src/app/qgsadvanceddigitizingdockwidget.cpp
@@ -92,6 +92,7 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas*
     , mCadPointList( QList<QgsPoint>() )
     , mSnappedToVertex( false )
     , mSnappedSegment( QList<QgsPoint>() )
+    , mErrorMessage( 0 )
 {
   setupUi( this );
 
@@ -136,11 +137,6 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas*
   connect( mXLineEdit, SIGNAL( returnPressed() ), this, SLOT( lockConstraint() ) );
   connect( mYLineEdit, SIGNAL( returnPressed() ), this, SLOT( lockConstraint() ) );
 
-  // errors messages
-  mErrorMessage = new QgsMessageBarItem( tr( "CAD tools" ),
-                                         tr( "Some constraints are incompatible. Resulting point might be incorrect." ),
-                                         QgsMessageBar::WARNING, 0 );
-  mErrorMessageDisplayed = false;
   mapToolChanged( NULL );
 
   // config menu
@@ -268,9 +264,10 @@ void QgsAdvancedDigitizingDockWidget::activateCad( bool enabled )
 {
   enabled &= mCurrentMapTool != 0;
 
-  if ( mErrorMessageDisplayed )
+  if ( mErrorMessage )
   {
     QgisApp::instance()->messageBar()->popWidget( mErrorMessage );
+    mErrorMessage = 0;
   }
   QSettings().setValue( "/Cad/SessionActive", enabled );
 
@@ -634,40 +631,40 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent* e )
     double cosa = qCos( angleValue );
     double sina = qSin( angleValue );
     double v = ( point.x() - previousPt.x() ) * cosa + ( point.y() - previousPt.y() ) * sina ;
-    if ( mXConstraint->isLocked() || mYConstraint->isLocked() )
+    if ( mXConstraint->isLocked() && mYConstraint->isLocked() )
     {
-      // perform both to detect errors in constraints
-      if ( mXConstraint->isLocked() )
+      // do nothing if both X,Y are already locked
+    }
+    else if ( mXConstraint->isLocked() )
+    {
+      if ( cosa == 0 )
       {
-        if ( cosa == 0 )
-        {
-          res = false;
-        }
-        else
-        {
-          double x = mXConstraint->value();
-          if ( !mXConstraint->relative() )
-          {
-            x -= previousPt.x();
-          }
-          point.setY( previousPt.y() + x * sina / cosa );
-        }
+        res = false;
       }
-      else if ( mYConstraint->isLocked() )
+      else
       {
-        if ( sina == 0 )
+        double x = mXConstraint->value();
+        if ( !mXConstraint->relative() )
         {
-          res = false;
+          x -= previousPt.x();
         }
-        else
+        point.setY( previousPt.y() + x * sina / cosa );
+      }
+    }
+    else if ( mYConstraint->isLocked() )
+    {
+      if ( sina == 0 )
+      {
+        res = false;
+      }
+      else
+      {
+        double y = mYConstraint->value();
+        if ( !mYConstraint->relative() )
         {
-          double y = mYConstraint->value();
-          if ( !mYConstraint->relative() )
-          {
-            y -= previousPt.y();
-          }
-          point.setX( previousPt.x() + y * cosa / sina );
+          y -= previousPt.y();
         }
+        point.setX( previousPt.x() + y * cosa / sina );
       }
     }
     else
@@ -866,10 +863,10 @@ bool QgsAdvancedDigitizingDockWidget::canvasReleaseEventFilter( QgsMapMouseEvent
   if ( !mCadEnabled )
     return false;
 
-  if ( mErrorMessageDisplayed )
+  if ( mErrorMessage )
   {
     QgisApp::instance()->messageBar()->popWidget( mErrorMessage );
-    mErrorMessageDisplayed = false;
+    mErrorMessage = 0;
   }
 
   if ( e->button() == Qt::RightButton )
@@ -915,16 +912,20 @@ bool QgsAdvancedDigitizingDockWidget::canvasMoveEventFilter( QgsMapMouseEvent* e
 
   if ( !applyConstraints( e ) )
   {
-    if ( !mErrorMessageDisplayed )
+    if ( !mErrorMessage )
     {
+      // errors messages
+      mErrorMessage = new QgsMessageBarItem( tr( "CAD tools" ),
+                                             tr( "Some constraints are incompatible. Resulting point might be incorrect." ),
+                                             QgsMessageBar::WARNING, 0 );
+
       QgisApp::instance()->messageBar()->pushItem( mErrorMessage );
-      mErrorMessageDisplayed = true;
     }
   }
-  else if ( mErrorMessageDisplayed )
+  else if ( mErrorMessage )
   {
     QgisApp::instance()->messageBar()->popWidget( mErrorMessage );
-    mErrorMessageDisplayed = false;
+    mErrorMessage = 0;
   }
 
   // perpendicular/parallel constraint
diff --git a/src/app/qgsadvanceddigitizingdockwidget.h b/src/app/qgsadvanceddigitizingdockwidget.h
index 595aba5..907b777 100644
--- a/src/app/qgsadvanceddigitizingdockwidget.h
+++ b/src/app/qgsadvanceddigitizingdockwidget.h
@@ -257,7 +257,6 @@ class APP_EXPORT QgsAdvancedDigitizingDockWidget : public QDockWidget, private U
 
     // error message
     QgsMessageBarItem* mErrorMessage;
-    bool mErrorMessageDisplayed;
 
     // UI
     QAction* mEnableAction;
diff --git a/src/app/qgsapplayertreeviewmenuprovider.cpp b/src/app/qgsapplayertreeviewmenuprovider.cpp
index b6d43d5..dcb57b1 100644
--- a/src/app/qgsapplayertreeviewmenuprovider.cpp
+++ b/src/app/qgsapplayertreeviewmenuprovider.cpp
@@ -62,17 +62,18 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
     }
     else if ( QgsLayerTree::isLayer( node ) )
     {
-      QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer();
+      QgsMapLayer *layer = QgsLayerTree::toLayer( node )->layer();
+      QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( layer );
+      QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
 
       menu->addAction( actions->actionZoomToLayer( mCanvas, menu ) );
       menu->addAction( actions->actionShowInOverview( menu ) );
 
-      if ( layer && layer->type() == QgsMapLayer::RasterLayer )
+      if ( rlayer )
       {
         menu->addAction( tr( "&Zoom to Best Scale (100%)" ), QgisApp::instance(), SLOT( legendLayerZoomNative() ) );
 
-        QgsRasterLayer* rasterLayer =  qobject_cast<QgsRasterLayer *>( layer );
-        if ( rasterLayer && rasterLayer->rasterType() != QgsRasterLayer::Palette )
+        if ( rlayer->rasterType() != QgsRasterLayer::Palette )
           menu->addAction( tr( "&Stretch Using Current Extent" ), QgisApp::instance(), SLOT( legendLayerStretchUsingCurrentExtent() ) );
       }
 
@@ -81,21 +82,24 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
       // duplicate layer
       QAction* duplicateLayersAction = menu->addAction( QgsApplication::getThemeIcon( "/mActionDuplicateLayer.svg" ), tr( "&Duplicate" ), QgisApp::instance(), SLOT( duplicateLayers() ) );
 
-      // set layer scale visibility
-      menu->addAction( tr( "&Set Layer Scale Visibility" ), QgisApp::instance(), SLOT( setLayerScaleVisibility() ) );
+      if ( !vlayer || vlayer->geometryType() != QGis::NoGeometry )
+      {
+        // set layer scale visibility
+        menu->addAction( tr( "&Set Layer Scale Visibility" ), QgisApp::instance(), SLOT( setLayerScaleVisibility() ) );
 
-      // set layer crs
-      menu->addAction( QgsApplication::getThemeIcon( "/mActionSetCRS.png" ), tr( "&Set Layer CRS" ), QgisApp::instance(), SLOT( setLayerCRS() ) );
+        // set layer crs
+        menu->addAction( QgsApplication::getThemeIcon( "/mActionSetCRS.png" ), tr( "&Set Layer CRS" ), QgisApp::instance(), SLOT( setLayerCRS() ) );
 
-      // assign layer crs to project
-      menu->addAction( QgsApplication::getThemeIcon( "/mActionSetProjectCRS.png" ), tr( "Set &Project CRS from Layer" ), QgisApp::instance(), SLOT( setProjectCRSFromLayer() ) );
+        // assign layer crs to project
+        menu->addAction( QgsApplication::getThemeIcon( "/mActionSetProjectCRS.png" ), tr( "Set &Project CRS from Layer" ), QgisApp::instance(), SLOT( setProjectCRSFromLayer() ) );
+      }
 
       // style-related actions
       if ( layer && mView->selectedLayerNodes().count() == 1 )
       {
-        QMenu* menuStyleManager = new QMenu( tr( "Styles" ) );
+        QMenu *menuStyleManager = new QMenu( tr( "Styles" ) );
 
-        QgisApp* app = QgisApp::instance();
+        QgisApp *app = QgisApp::instance();
         menuStyleManager->addAction( tr( "Copy Style" ), app, SLOT( copyStyle() ) );
         if ( app->clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) )
         {
@@ -110,10 +114,8 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
 
       menu->addSeparator();
 
-      if ( layer && layer->type() == QgsMapLayer::VectorLayer )
+      if ( vlayer )
       {
-        QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( layer );
-
         QAction *toggleEditingAction = QgisApp::instance()->actionToggleEditing();
         QAction *saveLayerEditsAction = QgisApp::instance()->actionSaveActiveLayerEdits();
         QAction *allEditsAction = QgisApp::instance()->actionAllEdits();
@@ -155,7 +157,7 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
 
         menu->addSeparator();
       }
-      else if ( layer && layer->type() == QgsMapLayer::RasterLayer )
+      else if ( rlayer )
       {
         menu->addAction( tr( "Save As..." ), QgisApp::instance(), SLOT( saveAsRasterFile() ) );
         menu->addAction( tr( "Save As Layer Definition File..." ), QgisApp::instance(), SLOT( saveAsLayerDefinition() ) );
diff --git a/src/app/qgsbookmarks.cpp b/src/app/qgsbookmarks.cpp
index cb076f0..7706d48 100644
--- a/src/app/qgsbookmarks.cpp
+++ b/src/app/qgsbookmarks.cpp
@@ -267,7 +267,7 @@ void QgsBookmarks::importFromXML()
 {
   QSettings settings;
 
-  QString lastUsedDir = settings.value( "/Bookmark/LastUsedDirectory", QVariant() ).toString();
+  QString lastUsedDir = settings.value( "/Windows/Bookmarks/LastUsedDirectory", QVariant() ).toString();
   QString fileName = QFileDialog::getOpenFileName( this, tr( "Import Bookmarks" ), lastUsedDir,
                      tr( "XML files (*.xml *XML)" ) );
   if ( fileName.isEmpty() )
@@ -343,7 +343,7 @@ void QgsBookmarks::exportToXML()
 {
   QSettings settings;
 
-  QString lastUsedDir = settings.value( "/Bookmark/LastUsedDirectory", QVariant() ).toString();
+  QString lastUsedDir = settings.value( "/Windows/Bookmarks/LastUsedDirectory", QVariant() ).toString();
   QString fileName = QFileDialog::getSaveFileName( this, tr( "Export bookmarks" ), lastUsedDir,
                      tr( "XML files( *.xml *.XML )" ) );
   if ( fileName.isEmpty() )
@@ -399,5 +399,5 @@ void QgsBookmarks::exportToXML()
   doc.save( out, 2 );
   f.close();
 
-  settings.setValue( "/Bookmark/LastUsedDirectory", QFileInfo( fileName ).path() );
+  settings.setValue( "/Windows/Bookmarks/LastUsedDirectory", QFileInfo( fileName ).path() );
 }
diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp
index 9a37bbf..c3dd043 100644
--- a/src/app/qgsdxfexportdialog.cpp
+++ b/src/app/qgsdxfexportdialog.cpp
@@ -25,7 +25,7 @@
 #include "qgis.h"
 #include "qgsfieldcombobox.h"
 #include "qgisapp.h"
-#include "qgsmapcanvas.h"
+#include "qgslayertreemapcanvasbridge.h"
 #include "qgsvisibilitypresets.h"
 
 #include <QFileDialog>
@@ -254,7 +254,7 @@ bool QgsVectorLayerAndAttributeModel::setData( const QModelIndex &index, const Q
 QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers() const
 {
   QList< QPair<QgsVectorLayer *, int> > layers;
-  QHash< QgsMapLayer *, int > layerIdx;
+  QHash< QString, int > layerIdx;
 
   foreach ( const QModelIndex &idx, mCheckedLeafs )
   {
@@ -265,9 +265,9 @@ QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers()
       {
         QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( treeLayer->layer() );
         Q_ASSERT( vl );
-        if ( !layerIdx.contains( vl ) )
+        if ( !layerIdx.contains( vl->id() ) )
         {
-          layerIdx.insert( vl, layers.size() );
+          layerIdx.insert( vl->id(), layers.size() );
           layers << qMakePair<QgsVectorLayer *, int>( vl, mAttributeIdx.value( vl, -1 ) );
         }
       }
@@ -276,15 +276,16 @@ QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers()
     {
       QgsVectorLayer *vl = qobject_cast< QgsVectorLayer *>( QgsLayerTree::toLayer( node )->layer() );
       Q_ASSERT( vl );
-      if ( !layerIdx.contains( vl ) )
+      if ( !layerIdx.contains( vl->id() ) )
       {
-        layerIdx.insert( vl, layers.size() );
+        layerIdx.insert( vl->id(), layers.size() );
         layers << qMakePair<QgsVectorLayer *, int>( vl, mAttributeIdx.value( vl, -1 ) );
       }
     }
   }
 
-  QList<QgsMapLayer*> inDrawingOrder = QgisApp::instance()->mapCanvas()->layers();
+  QgsLayerTreeMapCanvasBridge* bridge = QgisApp::instance()->layerTreeCanvasBridge();
+  QStringList inDrawingOrder = bridge->hasCustomLayerOrder() ? bridge->customLayerOrder() : bridge->defaultLayerOrder();
   QList< QPair<QgsVectorLayer *, int> > layersInROrder;
 
   for ( int i = inDrawingOrder.size() - 1; i >= 0; i-- )
diff --git a/src/app/qgsloadstylefromdbdialog.cpp b/src/app/qgsloadstylefromdbdialog.cpp
index 6a8bf33..acc1faf 100644
--- a/src/app/qgsloadstylefromdbdialog.cpp
+++ b/src/app/qgsloadstylefromdbdialog.cpp
@@ -20,7 +20,7 @@ QgsLoadStyleFromDBDialog::QgsLoadStyleFromDBDialog( QWidget *parent )
 {
   setupUi( this );
   setWindowTitle( "Load style from database" );
-  mSelectedStyleId = tr( "" );
+  mSelectedStyleId = "";
 
   mLoadButton->setDisabled( true );
   mRelatedTable->setEditTriggers( QTableWidget::NoEditTriggers );
@@ -35,10 +35,8 @@ QgsLoadStyleFromDBDialog::QgsLoadStyleFromDBDialog( QWidget *parent )
 
   connect( mRelatedTable, SIGNAL( cellClicked( int, int ) ), this, SLOT( cellSelectedRelatedTable( int ) ) );
   connect( mOthersTable, SIGNAL( cellClicked( int, int ) ), this, SLOT( cellSelectedOthersTable( int ) ) );
-  connect( mRelatedTable, SIGNAL( doubleClicked( QModelIndex ) ),
-           this, SLOT( accept() ) );
-  connect( mOthersTable, SIGNAL( doubleClicked( QModelIndex ) ),
-           this, SLOT( accept() ) );
+  connect( mRelatedTable, SIGNAL( doubleClicked( QModelIndex ) ), this, SLOT( accept() ) );
+  connect( mOthersTable, SIGNAL( doubleClicked( QModelIndex ) ), this, SLOT( accept() ) );
   connect( mCancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
   connect( mLoadButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
 
@@ -59,16 +57,13 @@ QgsLoadStyleFromDBDialog::~QgsLoadStyleFromDBDialog()
 
 void QgsLoadStyleFromDBDialog::initializeLists( QStringList ids, QStringList names, QStringList descriptions, int sectionLimit )
 {
-  mIds = ids;
-  mNames = names;
-  mDescriptions = descriptions;
   mSectionLimit = sectionLimit;
-  int relatedTableNOfCols = ( sectionLimit > 0 ) ? 2 : 1;
-  int othersTableNOfCols = ( ids.count() - sectionLimit > 0 ) ? 2 : 1;
+  int relatedTableNOfCols = sectionLimit > 0 ? 2 : 1;
+  int othersTableNOfCols = ids.count() - sectionLimit > 0 ? 2 : 1;
   QString twoColsHeader( "Name;Description" );
   QString oneColsHeader( "No styles found in the database" );
-  QString relatedTableHeader = ( relatedTableNOfCols == 1 ) ? oneColsHeader : twoColsHeader;
-  QString othersTableHeader = ( othersTableNOfCols == 1 ) ? oneColsHeader : twoColsHeader;
+  QString relatedTableHeader = relatedTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
+  QString othersTableHeader = othersTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
 
   mRelatedTable->setColumnCount( relatedTableNOfCols );
   mOthersTable->setColumnCount( othersTableNOfCols );
@@ -76,18 +71,22 @@ void QgsLoadStyleFromDBDialog::initializeLists( QStringList ids, QStringList nam
   mOthersTable->setHorizontalHeaderLabels( othersTableHeader.split( ";" ) );
   mRelatedTable->setRowCount( sectionLimit );
   mOthersTable->setRowCount( ids.count() - sectionLimit );
-  mRelatedTable->setDisabled(( relatedTableNOfCols == 1 ) );
-  mOthersTable->setDisabled(( othersTableNOfCols == 1 ) );
+  mRelatedTable->setDisabled( relatedTableNOfCols == 1 );
+  mOthersTable->setDisabled( othersTableNOfCols == 1 );
 
   for ( int i = 0; i < sectionLimit; i++ )
   {
-    mRelatedTable->setItem( i, 0, new QTableWidgetItem( names.value( i, "" ) ) );
+    QTableWidgetItem *item = new QTableWidgetItem( names.value( i, "" ) );
+    item->setData( Qt::UserRole, ids[i] );
+    mRelatedTable->setItem( i, 0, item );
     mRelatedTable->setItem( i, 1, new QTableWidgetItem( descriptions.value( i, "" ) ) );
   }
   for ( int i = sectionLimit; i < ids.count(); i++ )
   {
     int j = i - sectionLimit;
-    mOthersTable->setItem( j, 0, new QTableWidgetItem( names.value( i, "" ) ) );
+    QTableWidgetItem *item = new QTableWidgetItem( names.value( i, "" ) );
+    item->setData( Qt::UserRole, ids[i] );
+    mOthersTable->setItem( j, 0, item );
     mOthersTable->setItem( j, 1, new QTableWidgetItem( descriptions.value( i, "" ) ) );
   }
 }
@@ -100,11 +99,11 @@ QString QgsLoadStyleFromDBDialog::getSelectedStyleId()
 void QgsLoadStyleFromDBDialog::cellSelectedRelatedTable( int r )
 {
   mLoadButton->setEnabled( true );
-  mSelectedStyleId = mIds.value( r );
+  mSelectedStyleId = mRelatedTable->item( r, 0 )->data( Qt::UserRole ).toString();
 }
 
 void QgsLoadStyleFromDBDialog::cellSelectedOthersTable( int r )
 {
   mLoadButton->setEnabled( true );
-  mSelectedStyleId = mIds.value( r + mSectionLimit );
+  mSelectedStyleId = mOthersTable->item( r, 0 )->data( Qt::UserRole ).toString();
 }
diff --git a/src/app/qgsloadstylefromdbdialog.h b/src/app/qgsloadstylefromdbdialog.h
index d24305f..66471b5 100644
--- a/src/app/qgsloadstylefromdbdialog.h
+++ b/src/app/qgsloadstylefromdbdialog.h
@@ -18,7 +18,6 @@ class APP_EXPORT QgsLoadStyleFromDBDialog : public QDialog, private Ui::QgsLoadS
 {
     QString mSelectedStyleId;
     int mSectionLimit;
-    QStringList mIds, mNames, mDescriptions;
     QString qmlStyle;
     Q_OBJECT
   public:
diff --git a/src/app/qgsnewspatialitelayerdialog.cpp b/src/app/qgsnewspatialitelayerdialog.cpp
index 3873050..07d3ba4 100644
--- a/src/app/qgsnewspatialitelayerdialog.cpp
+++ b/src/app/qgsnewspatialitelayerdialog.cpp
@@ -24,10 +24,11 @@
 #include "qgsapplication.h"
 #include "qgsproviderregistry.h"
 #include "qgisapp.h" // <- for theme icons
-#include <qgsvectorlayer.h>
-#include <qgsmaplayerregistry.h>
+#include "qgsvectorlayer.h"
+#include "qgsmaplayerregistry.h"
 #include "qgscoordinatereferencesystem.h"
 #include "qgsgenericprojectionselector.h"
+#include "qgsslconnect.h"
 
 #include "qgslogger.h"
 
@@ -196,14 +197,11 @@ void QgsNewSpatialiteLayerDialog::on_pbnFindSRID_clicked()
   // to build filter for projection selector
   sqlite3 *db = 0;
   bool status = true;
-  if ( !db )
+  int rc = sqlite3_open_v2( mDatabaseComboBox->currentText().toUtf8(), &db, SQLITE_OPEN_READONLY, NULL );
+  if ( rc != SQLITE_OK )
   {
-    int rc = sqlite3_open_v2( mDatabaseComboBox->currentText().toUtf8(), &db, SQLITE_OPEN_READONLY, NULL );
-    if ( rc != SQLITE_OK )
-    {
-      QMessageBox::warning( this, tr( "SpatiaLite Database" ), tr( "Unable to open the database" ) );
-      return;
-    }
+    QMessageBox::warning( this, tr( "SpatiaLite Database" ), tr( "Unable to open the database" ) );
+    return;
   }
 
   // load up the srid table
@@ -213,7 +211,7 @@ void QgsNewSpatialiteLayerDialog::on_pbnFindSRID_clicked()
 
   QSet<QString> myCRSs;
 
-  int rc = sqlite3_prepare( db, sql.toUtf8(), sql.toUtf8().length(), &ppStmt, &pzTail );
+  rc = sqlite3_prepare( db, sql.toUtf8(), sql.toUtf8().length(), &ppStmt, &pzTail );
   // XXX Need to free memory from the error msg if one is set
   if ( rc == SQLITE_OK )
   {
@@ -381,10 +379,8 @@ bool QgsNewSpatialiteLayerDialog::apply()
                            .arg( quotedValue( leGeometryColumn->text() ) );
   QgsDebugMsg( sqlCreateIndex ); // OK
 
-  spatialite_init( 0 );
-
   sqlite3 *db;
-  int rc = sqlite3_open( mDatabaseComboBox->currentText().toUtf8(), &db );
+  int rc = QgsSLConnect::sqlite3_open( mDatabaseComboBox->currentText().toUtf8(), &db );
   if ( rc != SQLITE_OK )
   {
     QMessageBox::warning( this,
@@ -447,6 +443,8 @@ bool QgsNewSpatialiteLayerDialog::apply()
         }
       }
     }
+
+    QgsSLConnect::sqlite3_close( db );
   }
 
   return false;
diff --git a/src/app/qgsoptions.cpp b/src/app/qgsoptions.cpp
index 0048f8b..2498393 100644
--- a/src/app/qgsoptions.cpp
+++ b/src/app/qgsoptions.cpp
@@ -575,7 +575,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl ) :
   mLegendLayersBoldChkBx->setChecked( settings.value( "/qgis/legendLayersBold", true ).toBool() );
   mLegendGroupsBoldChkBx->setChecked( settings.value( "/qgis/legendGroupsBold", false ).toBool() );
   cbxHideSplash->setChecked( settings.value( "/qgis/hideSplash", false ).toBool() );
-  cbxShowTips->setChecked( settings.value( "/qgis/showTips", true ).toBool() );
+  cbxShowTips->setChecked( settings.value( QString( "/qgis/showTips%1" ).arg( QGis::QGIS_VERSION_INT / 100 ), true ).toBool() );
   cbxAttributeTableDocked->setChecked( settings.value( "/qgis/dockAttributeTable", false ).toBool() );
   cbxSnappingOptionsDocked->setChecked( settings.value( "/qgis/dockSnapping", false ).toBool() );
   cbxAddPostgisDC->setChecked( settings.value( "/qgis/addPostgisDC", false ).toBool() );
@@ -1082,7 +1082,7 @@ void QgsOptions::saveOptions()
   bool legendGroupsBold = settings.value( "/qgis/legendGroupsBold", false ).toBool();
   settings.setValue( "/qgis/legendGroupsBold", mLegendGroupsBoldChkBx->isChecked() );
   settings.setValue( "/qgis/hideSplash", cbxHideSplash->isChecked() );
-  settings.setValue( "/qgis/showTips", cbxShowTips->isChecked() );
+  settings.setValue( QString( "/qgis/showTips%1" ).arg( QGis::QGIS_VERSION_INT / 100 ), cbxShowTips->isChecked() );
   settings.setValue( "/qgis/dockAttributeTable", cbxAttributeTableDocked->isChecked() );
   settings.setValue( "/qgis/attributeTableBehaviour", cmbAttrTableBehaviour->itemData( cmbAttrTableBehaviour->currentIndex() ) );
   settings.setValue( "/qgis/attributeTableRowCache", spinBoxAttrTableRowCache->value() );
diff --git a/src/app/qgsprojectlayergroupdialog.cpp b/src/app/qgsprojectlayergroupdialog.cpp
index a3c2bd6..ca0efbd 100644
--- a/src/app/qgsprojectlayergroupdialog.cpp
+++ b/src/app/qgsprojectlayergroupdialog.cpp
@@ -102,6 +102,11 @@ QString QgsProjectLayerGroupDialog::selectedProjectFile() const
   return mProjectFileLineEdit->text();
 }
 
+bool QgsProjectLayerGroupDialog::isValid() const
+{
+  return mTreeView->layerTreeModel() != 0;
+}
+
 void QgsProjectLayerGroupDialog::on_mBrowseFileToolButton_clicked()
 {
   //line edit might emit editingFinished signal when loosing focus
diff --git a/src/app/qgsprojectlayergroupdialog.h b/src/app/qgsprojectlayergroupdialog.h
index 5f8540c..0077137 100644
--- a/src/app/qgsprojectlayergroupdialog.h
+++ b/src/app/qgsprojectlayergroupdialog.h
@@ -36,6 +36,8 @@ class APP_EXPORT QgsProjectLayerGroupDialog: public QDialog, private Ui::QgsProj
     QStringList selectedLayerNames() const;
     QString selectedProjectFile() const;
 
+    bool isValid() const;
+
   private slots:
     void on_mBrowseFileToolButton_clicked();
     void on_mProjectFileLineEdit_editingFinished();
diff --git a/src/app/qgstipgui.cpp b/src/app/qgstipgui.cpp
index f91ebc3..1574ffa 100644
--- a/src/app/qgstipgui.cpp
+++ b/src/app/qgstipgui.cpp
@@ -80,7 +80,7 @@ void QgsTipGui::on_cbxDisableTips_toggled( bool theFlag )
   QSettings settings;
   //note the ! below as when the cbx is checked (true) we want to
   //change the setting to false
-  settings.setValue( "/qgis/showTips", !theFlag );
+  settings.setValue( QString( "/qgis/showTips%1" ).arg( QGis::QGIS_VERSION_INT / 100 ), !theFlag );
   hide();
 }
 
diff --git a/src/browser/main.cpp b/src/browser/main.cpp
index 23b385a..01c5bf8 100644
--- a/src/browser/main.cpp
+++ b/src/browser/main.cpp
@@ -68,7 +68,7 @@ int main( int argc, char ** argv )
     gdalShares << QCoreApplication::applicationDirPath().append( "/share/gdal" )
     << appResources.append( "/share/gdal" )
     << appResources.append( "/gdal" );
-    Q_FOREACH ( const QString& gdalShare, gdalShares )
+    Q_FOREACH( const QString& gdalShare, gdalShares )
     {
       if ( QFile::exists( gdalShare ) )
       {
@@ -79,6 +79,39 @@ int main( int argc, char ** argv )
   }
 #endif
 
+  QString i18nPath = QgsApplication::i18nPath();
+  bool myLocaleOverrideFlag = settings.value( "locale/overrideFlag", false ).toBool();
+  QString myUserLocale = settings.value( "locale/userLocale", "" ).toString();
+  QString myTranslationCode = !myLocaleOverrideFlag || myUserLocale.isEmpty() ? QLocale::system().name() : myUserLocale;
+
+  QTranslator qgistor( 0 );
+  QTranslator qttor( 0 );
+  if ( myTranslationCode != "C" )
+  {
+    if ( qgistor.load( QString( "qgis_" ) + myTranslationCode, i18nPath ) )
+    {
+      a.installTranslator( &qgistor );
+    }
+    else
+    {
+      qWarning( "loading of qgis translation failed [%s]", QString( "%1/qgis_%2" ).arg( i18nPath ).arg( myTranslationCode ).toLocal8Bit().constData() );
+    }
+
+    /* Translation file for Qt.
+     * The strings from the QMenuBar context section are used by Qt/Mac to shift
+     * the About, Preferences and Quit items to the Mac Application menu.
+     * These items must be translated identically in both qt_ and qgis_ files.
+     */
+    if ( qttor.load( QString( "qt_" ) + myTranslationCode, QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ) )
+    {
+      a.installTranslator( &qttor );
+    }
+    else
+    {
+      qWarning( "loading of qt translation failed [%s]", QString( "%1/qt_%2" ).arg( QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ).arg( myTranslationCode ).toLocal8Bit().constData() );
+    }
+  }
+
   QgsBrowser w;
 
   a.connect( &a, SIGNAL( aboutToQuit() ), &w, SLOT( saveWindowState() ) );
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 55a1fce..fc83748 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -173,6 +173,8 @@ SET(QGIS_CORE_SRCS
   qgsvectorlayerundocommand.cpp
   qgsvectorsimplifymethod.cpp
   qgsxmlutils.cpp
+  qgsslconnect.cpp
+  qgslocalec.cpp
 
   composer/qgsaddremoveitemcommand.cpp
   composer/qgsaddremovemultiframecommand.cpp
@@ -551,6 +553,7 @@ SET(QGIS_CORE_HDRS
   qgsvectorlayerundocommand.h
   qgsvectorsimplifymethod.h
   qgsxmlutils.h
+  qgslocalec.h
 
   diagram/qgsdiagram.h
   diagram/qgspiediagram.h
diff --git a/src/core/composer/qgscomposermap.cpp b/src/core/composer/qgscomposermap.cpp
index a2104f8..dd2346e 100644
--- a/src/core/composer/qgscomposermap.cpp
+++ b/src/core/composer/qgscomposermap.cpp
@@ -486,9 +486,8 @@ bool QgsComposerMap::shouldDrawPart( PartType part ) const
   return true; // for Layer
 }
 
-void QgsComposerMap::updateCachedImage( void )
+void QgsComposerMap::updateCachedImage()
 {
-  syncLayerSet(); //layer list may have changed
   mCacheUpdated = false;
   cache();
   QGraphicsRectItem::update();
@@ -502,6 +501,12 @@ void QgsComposerMap::renderModeUpdateCachedImage()
   }
 }
 
+void QgsComposerMap::layersChanged()
+{
+  syncLayerSet();
+  renderModeUpdateCachedImage();
+}
+
 void QgsComposerMap::setCacheUpdated( bool u )
 {
   mCacheUpdated = u;
@@ -1169,8 +1174,8 @@ void QgsComposerMap::connectUpdateSlot()
   QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
   if ( layerRegistry )
   {
-    connect( layerRegistry, SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( updateCachedImage() ) );
-    connect( layerRegistry, SIGNAL( layerWasAdded( QgsMapLayer* ) ), this, SLOT( updateCachedImage() ) );
+    connect( layerRegistry, SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( layersChanged() ) );
+    connect( layerRegistry, SIGNAL( layerWasAdded( QgsMapLayer* ) ), this, SLOT( layersChanged() ) );
   }
 }
 
diff --git a/src/core/composer/qgscomposermap.h b/src/core/composer/qgscomposermap.h
index 5de3496..e87c2ea 100644
--- a/src/core/composer/qgscomposermap.h
+++ b/src/core/composer/qgscomposermap.h
@@ -796,9 +796,12 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
 
   public slots:
 
-    /**Called if map canvas has changed*/
+    /**Forces an update of the cached map image*/
     void updateCachedImage();
-    /**Call updateCachedImage if item is in render mode*/
+
+    /**Updates the cached map image if the map is set to Render mode
+     * @see updateCachedImage
+    */
     void renderModeUpdateCachedImage();
 
     /**Updates the bounding rect of this item. Call this function before doing any changes related to annotation out of the map rectangle */
@@ -809,6 +812,14 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
 
     virtual void refreshDataDefinedProperty( const QgsComposerObject::DataDefinedProperty property = QgsComposerObject::AllProperties ) override;
 
+  protected slots:
+
+    /**Called when layers are added or removed from the layer registry. Updates the maps
+     * layer set and redraws the map if required.
+     * @note added in QGIS 2.9
+    */
+    void layersChanged();
+
   private:
 
     /**Unique identifier*/
diff --git a/src/core/composer/qgscomposermapgrid.cpp b/src/core/composer/qgscomposermapgrid.cpp
index 7d790e6..979e470 100644
--- a/src/core/composer/qgscomposermapgrid.cpp
+++ b/src/core/composer/qgscomposermapgrid.cpp
@@ -664,7 +664,13 @@ void QgsComposerMapGrid::draw( QPainter* p )
   }
 
   p->restore();
+
   p->setClipping( false );
+#ifdef Q_OS_MAC
+  //QPainter::setClipping(false) seems to be broken on OSX (#12747). So we hack around it by
+  //setting a larger clip rect
+  p->setClipRect( mComposerMap->mapRectFromScene( mComposerMap->sceneBoundingRect() ).adjusted( -10, -10, 10, 10 ) );
+#endif
 
   if ( mGridFrameStyle != QgsComposerMapGrid::NoFrame )
   {
@@ -1638,6 +1644,9 @@ int QgsComposerMapGrid::xGridLinesCRSTransform( const QgsRectangle& bbox, const
     step = ( maxX + 360.0 - minX ) / 20;
   }
 
+  if ( step == 0 )
+    return 1;
+
   int gridLineCount = 0;
   while ( currentLevel >= bbox.yMinimum() && gridLineCount < MAX_GRID_LINES )
   {
@@ -1701,6 +1710,9 @@ int QgsComposerMapGrid::yGridLinesCRSTransform( const QgsRectangle& bbox, const
   double maxY = bbox.yMaximum();
   double step = ( maxY - minY ) / 20;
 
+  if ( step == 0 )
+    return 1;
+
   bool crosses180 = false;
   bool crossed180 = false;
   if ( mCRS.geographicFlag() && ( bbox.xMinimum() > bbox.xMaximum() ) )
diff --git a/src/core/dxf/qgsdxfexport.cpp b/src/core/dxf/qgsdxfexport.cpp
index a3655c9..ca59cc6 100644
--- a/src/core/dxf/qgsdxfexport.cpp
+++ b/src/core/dxf/qgsdxfexport.cpp
@@ -359,12 +359,10 @@ QgsDxfExport::QgsDxfExport()
     , mSymbolLayerCounter( 0 )
     , mNextHandleId( DXF_HANDSEED )
     , mBlockCounter( 0 )
-    , mModelSpaceBR( 0 )
 {
 }
 
 QgsDxfExport::QgsDxfExport( const QgsDxfExport& dxfExport )
-    : mModelSpaceBR( 0 )
 {
   *this = dxfExport;
 }
@@ -588,23 +586,15 @@ void QgsDxfExport::writeTables()
 
   writeGroup( 100, "AcDbSymbolTable" );
   writeGroup( 70, 0 );
-  writeGroup( 0, "BLOCK_RECORD" );
-  mModelSpaceBR = writeHandle();
-  writeGroup( 100, "AcDbSymbolTableRecord" );
-  writeGroup( 100, "AcDbBlockTableRecord" );
-  writeGroup( 2, "*Model_Space" );
 
-  writeGroup( 0, "BLOCK_RECORD" );
-  writeHandle();
-  writeGroup( 100, "AcDbSymbolTableRecord" );
-  writeGroup( 100, "AcDbBlockTableRecord" );
-  writeGroup( 2, "*Paper_Space" );
-
-  writeGroup( 0, "BLOCK_RECORD" );
-  writeHandle();
-  writeGroup( 100, "AcDbSymbolTableRecord" );
-  writeGroup( 100, "AcDbBlockTableRecord" );
-  writeGroup( 2, "*Paper_Space0" );
+  foreach ( QString block, QStringList() << "*Model_Space" << "*Paper_Space" << "*Paper_Space0" )
+  {
+    writeGroup( 0, "BLOCK_RECORD" );
+    mBlockHandles.insert( block, writeHandle() );
+    writeGroup( 100, "AcDbSymbolTableRecord" );
+    writeGroup( 100, "AcDbBlockTableRecord" );
+    writeGroup( 2, block );
+  }
 
   int i = 0;
   slIt = slList.constBegin();
@@ -617,11 +607,12 @@ void QgsDxfExport::writeTables()
     if ( hasDataDefinedProperties( ml, slIt->second ) )
       continue;
 
+    QString name = QString( "symbolLayer%1" ).arg( i++ );
     writeGroup( 0, "BLOCK_RECORD" );
-    writeHandle();
+    mBlockHandles.insert( name, writeHandle() );
     writeGroup( 100, "AcDbSymbolTableRecord" );
     writeGroup( 100, "AcDbBlockTableRecord" );
-    writeGroup( 2, QString( "symbolLayer%1" ).arg( i++ ) );
+    writeGroup( 2, name );
   }
 
   writeGroup( 0, "ENDTAB" );
@@ -802,53 +793,25 @@ void QgsDxfExport::writeBlocks()
   startSection();
   writeGroup( 2, "BLOCKS" );
 
-  writeGroup( 0, "BLOCK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockBegin" );
-  writeGroup( 2, "*Model_Space" );
-  writeGroup( 70, 0 );
-  writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
-  writeGroup( 3, "*Model_Space" );
-  writeGroup( 1, "" );
-  writeGroup( 0, "ENDBLK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockEnd" );
-
-  writeGroup( 0, "BLOCK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockBegin" );
-  writeGroup( 2, "*Paper_Space" );
-  writeGroup( 70, 0 );
-  writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
-  writeGroup( 3, "*Paper_Space" );
-  writeGroup( 1, "" );
-  writeGroup( 0, "ENDBLK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockEnd" );
-
-  writeGroup( 0, "BLOCK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockBegin" );
-  writeGroup( 2, "*Paper_Space0" );
-  writeGroup( 70, 0 );
-  writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
-  writeGroup( 3, "*Paper_Space0" );
-  writeGroup( 1, "" );
-  writeGroup( 0, "ENDBLK" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 8, "0" );
-  writeGroup( 100, "AcDbBlockEnd" );
+  foreach ( QString block, QStringList() << "*Model_Space" << "*Paper_Space" << "*Paper_Space0" )
+  {
+    writeGroup( 0, "BLOCK" );
+    writeHandle();
+    writeGroup( 330, QString( "%1" ).arg( mBlockHandles[ block ], 0, 16 ) );
+    writeGroup( 100, "AcDbEntity" );
+    writeGroup( 8, "0" );
+    writeGroup( 100, "AcDbBlockBegin" );
+    writeGroup( 2, block );
+    writeGroup( 70, 0 );
+    writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
+    writeGroup( 3, block );
+    writeGroup( 1, "" );
+    writeGroup( 0, "ENDBLK" );
+    writeHandle();
+    writeGroup( 100, "AcDbEntity" );
+    writeGroup( 8, "0" );
+    writeGroup( 100, "AcDbBlockEnd" );
+  }
 
   // Iterate through all layers and get symbol layer pointers
   QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > slList;
@@ -876,33 +839,36 @@ void QgsDxfExport::writeBlocks()
       // ml->stopRender( ctx );
     }
 
+    QString block( QString( "symbolLayer%1" ).arg( mBlockCounter++ ) );
+    mBlockHandle = QString( "%1" ).arg( mBlockHandles[ block ], 0, 16 );
+
     writeGroup( 0, "BLOCK" );
     writeHandle();
+    writeGroup( 330, mBlockHandle );
     writeGroup( 100, "AcDbEntity" );
     writeGroup( 8, "0" );
     writeGroup( 100, "AcDbBlockBegin" );
-
-    QString blockName = QString( "symbolLayer%1" ).arg( mBlockCounter++ );
-    writeGroup( 2, blockName );
+    writeGroup( 2, block );
     writeGroup( 70, 0 );
-    writeGroup( 1, "" );
 
     // x/y/z coordinates of reference point
     // todo: consider anchor point
     // double size = ml->size();
     // size *= mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits );
     writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
-    writeGroup( 3, blockName );
+    writeGroup( 3, block );
+    writeGroup( 1, "" );
 
-    ml->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits ), "0", &ctx, 0 ); // maplayer 0 -> block receives layer from INSERT statement
+    // maplayer 0 -> block receives layer from INSERT statement
+    ml->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits ), "0", &ctx, 0 );
 
     writeGroup( 0, "ENDBLK" );
     writeHandle();
     writeGroup( 100, "AcDbEntity" );
-    writeGroup( 100, "AcDbBlockEnd" );
     writeGroup( 8, "0" );
+    writeGroup( 100, "AcDbBlockEnd" );
 
-    mPointSymbolBlocks.insert( ml, blockName );
+    mPointSymbolBlocks.insert( ml, block );
     ml->stopRender( ctx );
   }
   endSection();
@@ -913,6 +879,8 @@ void QgsDxfExport::writeEntities()
   startSection();
   writeGroup( 2, "ENTITIES" );
 
+  mBlockHandle = QString( "%1" ).arg( mBlockHandles[ "*Model_Space" ], 0, 16 );
+
   // label engine
   QgsDxfPalLabeling labelEngine( this, mExtent.isEmpty() ? dxfExtent() : mExtent, mSymbologyScaleDenominator, mMapUnits );
   QgsRenderContext& ctx = labelEngine.renderContext();
@@ -3339,8 +3307,24 @@ void QgsDxfExport::writePoint( const QgsPoint& pt, const QString& layer, QColor
 }
 
 void QgsDxfExport::writePolyline( const QgsPolyline& line, const QString& layer, const QString& lineStyleName, QColor color,
-                                  double width, bool polygon )
+                                  double width, bool )
 {
+  int n = line.size();
+  if ( n == 0 )
+  {
+    QgsDebugMsg( QString( "writePolyline: empty line layer=%1 lineStyleName=%2" ).arg( layer ).arg( lineStyleName ) );
+    return;
+  }
+
+  bool polygon = line[0] == line[ line.size() - 1 ];
+  if ( polygon )
+    --n;
+  if ( n < 2 )
+  {
+    QgsDebugMsg( QString( "writePolyline: line too short layer=%1 lineStyleName=%2" ).arg( layer ).arg( lineStyleName ) );
+    return;
+  }
+
   writeGroup( 0, "LWPOLYLINE" );
   writeHandle();
   writeGroup( 8, layer );
@@ -3349,23 +3333,19 @@ void QgsDxfExport::writePolyline( const QgsPolyline& line, const QString& layer,
   writeGroup( 6, lineStyleName );
   writeGroup( color );
 
-  writeGroup( 90, line.size() );
-
+  writeGroup( 90, n );
   writeGroup( 70, polygon ? 1 : 0 );
   writeGroup( 43, width );
 
-  QgsPolyline::const_iterator lineIt = line.constBegin();
-  for ( ; lineIt != line.constEnd(); ++lineIt )
-  {
-    writeGroup( 0, *lineIt );
-  }
+  for ( int i = 0; i < n; i++ )
+    writeGroup( 0, line[i] );
 }
 
 void QgsDxfExport::writePolygon( const QgsPolygon& polygon, const QString& layer, const QString& hatchPattern, QColor color )
 {
   writeGroup( 0, "HATCH" );         // Entity type
   writeHandle();
-  writeGroup( 330, mModelSpaceBR );
+  writeGroup( 330, mBlockHandle );
   writeGroup( 100, "AcDbEntity" );
   writeGroup( 8, layer );           // Layer name
   writeGroup( color );              // Color
@@ -3423,19 +3403,19 @@ void QgsDxfExport::writeFilledCircle( const QString &layer, QColor color, const
 {
   writeGroup( 0, "HATCH" );                     // Entity type
   writeHandle();
-  writeGroup( 330, mModelSpaceBR );
+  writeGroup( 330, mBlockHandle );
   writeGroup( 100, "AcDbEntity" );
+  writeGroup( 8, layer );   // Layer name
+  writeGroup( color );       // Color (0 by block, 256 by layer)
   writeGroup( 100, "AcDbHatch" );
 
-  writeGroup( 8, layer );   // Layer name
-  writeGroup( 0, QgsPoint( 0, 0 ), 0.0 );  // Elevation point (in OCS)
+  writeGroup( 0, QgsPoint( 0, 0 ) ); // Elevation point (in OCS)
   writeGroup( 200, QgsPoint( 0, 0 ), 1.0 );
 
   writeGroup( 2, "SOLID" );  // Hatch pattern name
   writeGroup( 70, 1 );       // 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, 1 );       // Number of boundary paths (loops)
 
@@ -3463,7 +3443,7 @@ void QgsDxfExport::writeCircle( const QString& layer, QColor color, const QgsPoi
 {
   writeGroup( 0, "LWPOLYLINE" );
   writeHandle();
-  writeGroup( 330, mModelSpaceBR );
+  writeGroup( 330, mBlockHandle );
   writeGroup( 8, layer );
   writeGroup( 100, "AcDbEntity" );
   writeGroup( 100, "AcDbPolyline" );
@@ -3535,16 +3515,19 @@ void QgsDxfExport::writeMText( const QString& layer, const QString& text, const
 
 void QgsDxfExport::writeSolid( const QString& layer, QColor color, const QgsPoint& pt1, const QgsPoint& pt2, const QgsPoint& pt3, const QgsPoint& pt4 )
 {
-  writeGroup( 0, "SOLID" );
-  writeHandle();
-  writeGroup( 100, "AcDbEntity" );
-  writeGroup( 100, "AcDbTrace" );
-  writeGroup( 8, layer );
-  writeGroup( color );
-  writeGroup( 0, pt1 );
-  writeGroup( 1, pt2 );
-  writeGroup( 2, pt3 );
-  writeGroup( 3, pt4 );
+  // pt1 pt2
+  // pt3 pt4
+  int i = 0;
+  QgsPolygon p( 1 );
+  p[0].resize( pt3 != pt4 ? 5 : 4 );
+  p[0][i++] = pt1;
+  p[0][i++] = pt2;
+  p[0][i++] = pt4;
+  if ( p[0].size() == 5 )
+    p[0][i++] = pt3;
+  p[0][i] = pt1;
+
+  writePolygon( p, layer, "SOLID", color );
 }
 
 void QgsDxfExport::writeVertex( const QgsPoint& pt, const QString& layer )
diff --git a/src/core/dxf/qgsdxfexport.h b/src/core/dxf/qgsdxfexport.h
index 8378caf..86545d3 100644
--- a/src/core/dxf/qgsdxfexport.h
+++ b/src/core/dxf/qgsdxfexport.h
@@ -76,32 +76,40 @@ class CORE_EXPORT QgsDxfExport
     void writeGroup( int code, const QgsPoint &p, double z = 0.0, bool skipz = false );
     void writeGroup( QColor color, int exactMatch = 62, int rgbCode = 420, int transparencyCode = 440 );
 
+    //! Write handle
     int writeHandle( int code = 5, int handle = 0 );
 
     //! draw dxf primitives
     void writePolyline( const QgsPolyline &line, const QString &layer, const QString &lineStyleName, QColor color,
-                        double width = -1, bool polygon = false );
+                        double width = -1, bool unusedPolygonFlag = false );
 
+    //! Draw dxf polygon (HATCH)
     void writePolygon( const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, QColor color );
 
+    //! Draw solid
     void writeSolid( const QString &layer, QColor color, const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, const QgsPoint &pt4 );
 
-    //! write line (as a polyline)
+    //! Write line (as a polyline)
     void writeLine( const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, QColor color, double width = -1 );
 
+    //! Write point
     void writePoint( const QString &layer, QColor color, const QgsPoint &pt );
 
+    //! Write filled circle (as hatch)
     void writeFilledCircle( const QString &layer, QColor color, const QgsPoint &pt, double radius );
 
+    //! Write circle (as polyline)
     void writeCircle( const QString &layer, QColor color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width );
 
+    //! Write text (TEXT)
     void writeText( const QString &layer, const QString &text, const QgsPoint &pt, double size, double angle, QColor color );
 
+    //! Write mtext (MTEXT)
     void writeMText( const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, QColor color );
 
     static double mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits );
 
-    //! return cleaned layer name for use in DXF
+    //! Return cleaned layer name for use in DXF
     static QString dxfLayerName( const QString &name );
 
     //! return DXF encoding for Qt encoding
@@ -174,7 +182,8 @@ class CORE_EXPORT QgsDxfExport
     static QString lineNameFromPenStyle( Qt::PenStyle style );
     bool layerIsScaleBasedVisible( const QgsMapLayer *layer ) const;
 
-    int mModelSpaceBR;
+    QHash<QString, int> mBlockHandles;
+    QString mBlockHandle;
 };
 
 #endif // QGSDXFEXPORT_H
diff --git a/src/core/dxf/qgsdxfpaintengine.cpp b/src/core/dxf/qgsdxfpaintengine.cpp
index 7edaa5f..dd209c8 100644
--- a/src/core/dxf/qgsdxfpaintengine.cpp
+++ b/src/core/dxf/qgsdxfpaintengine.cpp
@@ -22,7 +22,8 @@
 
 QgsDxfPaintEngine::QgsDxfPaintEngine( const QgsDxfPaintDevice* dxfDevice, QgsDxfExport* dxf )
     : QPaintEngine( QPaintEngine::AllFeatures /*QPaintEngine::PainterPaths | QPaintEngine::PaintOutsidePaintEvent*/ )
-    , mPaintDevice( dxfDevice ), mDxf( dxf )
+    , mPaintDevice( dxfDevice )
+    , mDxf( dxf )
 {
 }
 
@@ -48,70 +49,48 @@ QPaintEngine::Type QgsDxfPaintEngine::type() const
 
 void QgsDxfPaintEngine::drawPixmap( const QRectF& r, const QPixmap& pm, const QRectF& sr )
 {
-  Q_UNUSED( r ); Q_UNUSED( pm ); Q_UNUSED( sr );
+  Q_UNUSED( r );
+  Q_UNUSED( pm );
+  Q_UNUSED( sr );
 }
 
 void QgsDxfPaintEngine::updateState( const QPaintEngineState& state )
 {
   if ( state.state() & QPaintEngine::DirtyTransform )
-  {
     mTransform = state.transform();
-  }
+
   if ( state.state() & QPaintEngine::DirtyPen )
-  {
     mPen = state.pen();
-  }
+
   if ( state.state() & QPaintEngine::DirtyBrush )
-  {
     mBrush = state.brush();
-  }
+}
+
+void QgsDxfPaintEngine::setRing( QgsPolyline &polyline, const QPointF *points, int pointCount )
+{
+  polyline.resize( pointCount );
+  for ( int i = 0; i < pointCount; ++i )
+    polyline[i] = toDxfCoordinates( points[i] );
 }
 
 void QgsDxfPaintEngine::drawPolygon( const QPointF *points, int pointCount, PolygonDrawMode mode )
 {
   Q_UNUSED( mode );
   if ( !mDxf || !mPaintDevice )
-  {
     return;
-  }
 
   QgsPolygon polygon( 1 );
-  polygon[0].resize( pointCount );
-
-  QgsPolyline &polyline = polygon[0];
-  for ( int i = 0; i < pointCount; ++i )
-  {
-    polyline[i] = toDxfCoordinates( points[i] );
-  }
+  setRing( polygon[0], points, pointCount );
 
   if ( mode == QPaintEngine::PolylineMode )
   {
-    mDxf->writePolyline( polyline, mLayer, "CONTINUOUS", mPen.color(), currentWidth(), true );
+    if ( mPen.style() != Qt::NoPen && mPen.brush().style() != Qt::NoBrush )
+      mDxf->writePolyline( polygon[0], mLayer, "CONTINUOUS", mPen.color(), currentWidth() );
   }
   else
   {
-    mDxf->writePolygon( polygon, mLayer, "SOLID", mBrush.color() );
-  }
-}
-
-void QgsDxfPaintEngine::drawRects( const QRectF* rects, int rectCount )
-{
-  if ( !mDxf || !mPaintDevice || !rects || mBrush.style() == Qt::NoBrush )
-  {
-    return;
-  }
-
-  for ( int i = 0; i < rectCount; ++i )
-  {
-    double left = rects[i].left();
-    double right = rects[i].right();
-    double top = rects[i].top();
-    double bottom = rects[i].bottom();
-    QgsPoint pt1 = toDxfCoordinates( QPointF( left, bottom ) );
-    QgsPoint pt2 = toDxfCoordinates( QPointF( right, bottom ) );
-    QgsPoint pt3 = toDxfCoordinates( QPointF( left, top ) );
-    QgsPoint pt4 = toDxfCoordinates( QPointF( right, top ) );
-    mDxf->writeSolid( mLayer, mBrush.color(), pt1, pt2, pt3, pt4 );
+    if ( mBrush.style() != Qt::NoBrush )
+      mDxf->writePolygon( polygon, mLayer, "SOLID", mBrush.color() );
   }
 }
 
@@ -140,6 +119,11 @@ void QgsDxfPaintEngine::drawPath( const QPainterPath& path )
   }
   endCurve();
   endPolygon();
+
+  if ( mPolygon.size() > 0 && mBrush.style() != Qt::NoBrush )
+    mDxf->writePolygon( mPolygon, mLayer, "SOLID", mBrush.color() );
+
+  mPolygon.clear();
 }
 
 void QgsDxfPaintEngine::moveTo( double dx, double dy )
@@ -159,9 +143,8 @@ void QgsDxfPaintEngine::curveTo( double dx, double dy )
 {
   endCurve();
   if ( mCurrentPolygon.size() > 0 )
-  {
     mCurrentCurve.append( mCurrentPolygon.last() );
-  }
+
   mCurrentCurve.append( QPointF( dx, dy ) );
 }
 
@@ -171,8 +154,9 @@ void QgsDxfPaintEngine::endPolygon()
   {
     if ( mPen.style() != Qt::NoPen )
       drawPolygon( mCurrentPolygon.constData(), mCurrentPolygon.size(), QPaintEngine::PolylineMode );
-    if ( mBrush.style() != Qt::NoBrush )
-      drawPolygon( mCurrentPolygon.constData(), mCurrentPolygon.size(), QPaintEngine::OddEvenMode );
+
+    mPolygon.resize( mPolygon.size() + 1 );
+    setRing( mPolygon[ mPolygon.size() - 1 ], mCurrentPolygon.constData(), mCurrentPolygon.size() );
   }
   mCurrentPolygon.clear();
 }
@@ -180,20 +164,18 @@ void QgsDxfPaintEngine::endPolygon()
 void QgsDxfPaintEngine::endCurve()
 {
   if ( mCurrentCurve.size() < 1 )
-  {
     return;
-  }
+
   if ( mCurrentPolygon.size() < 1 )
   {
     mCurrentCurve.clear();
     return;
   }
-  //mCurrentCurve.prepend( mCurrentPolygon.last() );
 
   if ( mCurrentCurve.size() >= 3 )
   {
     double t = 0.05;
-    for ( int i = 1; i < 20; ++i ) //approximate curve with 20 segments
+    for ( int i = 1; i <= 20; ++i ) //approximate curve with 20 segments
     {
       mCurrentPolygon.append( bezierPoint( mCurrentCurve, t ) );
       t += 0.05;
@@ -209,9 +191,7 @@ void QgsDxfPaintEngine::endCurve()
 void QgsDxfPaintEngine::drawLines( const QLineF* lines, int lineCount )
 {
   if ( !mDxf || !mPaintDevice || !lines || mPen.style() == Qt::NoPen )
-  {
     return;
-  }
 
   for ( int i = 0; i < lineCount; ++i )
   {
@@ -224,9 +204,7 @@ void QgsDxfPaintEngine::drawLines( const QLineF* lines, int lineCount )
 QgsPoint QgsDxfPaintEngine::toDxfCoordinates( const QPointF& pt ) const
 {
   if ( !mPaintDevice || !mDxf )
-  {
     return QgsPoint( pt.x(), pt.y() );
-  }
 
   QPointF dxfPt = mPaintDevice->dxfCoordinates( mTransform.map( pt ) ) + mShift;
   return QgsPoint( dxfPt.x(), dxfPt.y() );
@@ -236,9 +214,7 @@ QgsPoint QgsDxfPaintEngine::toDxfCoordinates( const QPointF& pt ) const
 double QgsDxfPaintEngine::currentWidth() const
 {
   if ( !mPaintDevice )
-  {
     return 1;
-  }
 
   return mPen.widthF() * mPaintDevice->widthScaleFactor();
 }
@@ -266,9 +242,7 @@ QPointF QgsDxfPaintEngine::bezierPoint( const QList<QPointF>& controlPolygon, do
 double QgsDxfPaintEngine::bernsteinPoly( int n, int i, double t )
 {
   if ( i < 0 )
-  {
     return 0;
-  }
 
   return lower( n, i )*power( t, i )*power(( 1 - t ), ( n - i ) );
 }
@@ -288,41 +262,31 @@ int QgsDxfPaintEngine::lower( int n, int i )
 double QgsDxfPaintEngine::power( double a, int b )
 {
   if ( b == 0 )
-  {
     return 1;
-  }
+
   double tmp = a;
   for ( int i = 2; i <= qAbs(( double )b ); i++ )
-  {
     a *= tmp;
-  }
+
   if ( b > 0 )
-  {
     return a;
-  }
   else
-  {
     return 1.0 / a;
-  }
 }
 
 int QgsDxfPaintEngine::faculty( int n )
 {
   if ( n < 0 )//Is faculty also defined for negative integers?
-  {
     return 0;
-  }
+
   int i;
   int result = n;
 
   if ( n == 0 || n == 1 )
-  {
-    return 1;
-  }//faculty of 0 is 1!
+    return 1;  //faculty of 0 is 1!
 
   for ( i = n - 1; i >= 2; i-- )
-  {
     result *= i;
-  }
+
   return result;
 }
diff --git a/src/core/dxf/qgsdxfpaintengine.h b/src/core/dxf/qgsdxfpaintengine.h
index a799005..5d6b248 100644
--- a/src/core/dxf/qgsdxfpaintengine.h
+++ b/src/core/dxf/qgsdxfpaintengine.h
@@ -19,6 +19,7 @@
 #define QGSDXFPAINTENGINE_H
 
 #include <QPaintEngine>
+#include <qgsgeometry.h>
 
 class QgsDxfExport;
 class QgsDxfPaintDevice;
@@ -38,7 +39,6 @@ class CORE_EXPORT QgsDxfPaintEngine: public QPaintEngine
     void drawPixmap( const QRectF& r, const QPixmap& pm, const QRectF& sr ) override;
 
     void drawPolygon( const QPointF * points, int pointCount, PolygonDrawMode mode ) override;
-    void drawRects( const QRectF * rects, int rectCount ) override;
     void drawPath( const QPainterPath& path ) override;
     void drawLines( const QLineF* lines, int lineCount ) override;
 
@@ -57,6 +57,7 @@ class CORE_EXPORT QgsDxfPaintEngine: public QPaintEngine
     QBrush mBrush;
     QString mLayer;
     QPointF mShift;
+    QgsPolygon mPolygon;
     QPolygonF mCurrentPolygon;
     QList<QPointF> mCurrentCurve;
 
@@ -69,6 +70,8 @@ class CORE_EXPORT QgsDxfPaintEngine: public QPaintEngine
     void endPolygon();
     void endCurve();
 
+    void setRing( QgsPolyline &polyline, const QPointF * points, int pointCount );
+
     //utils for bezier curve calculation
     static QPointF bezierPoint( const QList<QPointF>& controlPolygon, double t );
     static double bernsteinPoly( int n, int i, double t );
diff --git a/src/core/dxf/qgsdxfpallabeling.cpp b/src/core/dxf/qgsdxfpallabeling.cpp
index fdfcef5..27c556f 100644
--- a/src/core/dxf/qgsdxfpallabeling.cpp
+++ b/src/core/dxf/qgsdxfpallabeling.cpp
@@ -79,8 +79,7 @@ void QgsDxfPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext&
       return;
 
     //label text
-    QString text = g->text();
-    QString txt = label->getPartId() == -1 ? text : QString( text[ label->getPartId()] );
+    QString txt = g->text( label->getPartId() );
 
     //angle
     double angle = label->getAlpha() * 180 / M_PI;
diff --git a/src/core/gps/qgsgpsdetector.cpp b/src/core/gps/qgsgpsdetector.cpp
index e69a040..8f584a3 100644
--- a/src/core/gps/qgsgpsdetector.cpp
+++ b/src/core/gps/qgsgpsdetector.cpp
@@ -38,10 +38,11 @@ QList< QPair<QString, QString> > QgsGPSDetector::availablePorts()
 #ifdef HAVE_QT_MOBILITY_LOCATION
   devs << QPair<QString, QString>( "internalGPS", tr( "internal GPS" ) );
 #endif
+
   // try local gpsd first
   devs << QPair<QString, QString>( "localhost:2947:", tr( "local gpsd" ) );
 
-#ifdef linux
+#ifdef Q_OS_LINUX
   // look for linux serial devices
   foreach ( QString linuxDev, QStringList() << "/dev/ttyS%1" << "/dev/ttyUSB%1" << "/dev/rfcomm%1" << "/dev/ttyACM%1" )
   {
@@ -55,7 +56,7 @@ QList< QPair<QString, QString> > QgsGPSDetector::availablePorts()
   }
 #endif
 
-#ifdef __FreeBSD__ // freebsd
+#ifdef Q_OS_FREEBSD
   // and freebsd devices (untested)
   foreach ( QString freebsdDev, QStringList() << "/dev/cuaa%1" << "/dev/ucom%1" )
   {
@@ -69,7 +70,7 @@ QList< QPair<QString, QString> > QgsGPSDetector::availablePorts()
   }
 #endif
 
-#ifdef sparc
+#ifdef Q_OS_SOLARIS
   // and solaris devices (also untested)
   QString solarisDev( "/dev/cua/%1" );
   for ( char i = 'a'; i < 'k'; ++i )
@@ -161,7 +162,6 @@ void QgsGPSDetector::advance()
       qWarning( "QT_MOBILITY_LOCATION not found and mPortList matches internalGPS, this should never happen" );
 #endif
     }
-
     else
     {
       QextSerialPort *serial = new QextSerialPort( mPortList[ mPortIndex ].first, QextSerialPort::EventDriven );
diff --git a/src/core/layertree/qgslayertreemodellegendnode.cpp b/src/core/layertree/qgslayertreemodellegendnode.cpp
index c1352a1..7250f80 100644
--- a/src/core/layertree/qgslayertreemodellegendnode.cpp
+++ b/src/core/layertree/qgslayertreemodellegendnode.cpp
@@ -392,19 +392,22 @@ void QgsSymbolV2LegendNode::updateLabel()
 // -------------------------------------------------------------------------
 
 
-QgsSimpleLegendNode::QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon, QObject* parent )
+QgsSimpleLegendNode::QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon, QObject* parent, const QString& key )
     : QgsLayerTreeModelLegendNode( nodeLayer, parent )
     , mLabel( label )
     , mIcon( icon )
+    , mKey( key )
 {
 }
 
 QVariant QgsSimpleLegendNode::data( int role ) const
 {
   if ( role == Qt::DisplayRole || role == Qt::EditRole )
-    return mLabel;
+    return mUserLabel.isEmpty() ? mLabel : mUserLabel;
   else if ( role == Qt::DecorationRole )
     return mIcon;
+  else if ( role == RuleKeyRole && !mKey.isEmpty() )
+    return mKey;
   else
     return QVariant();
 }
diff --git a/src/core/layertree/qgslayertreemodellegendnode.h b/src/core/layertree/qgslayertreemodellegendnode.h
index fe590b1..175daff 100644
--- a/src/core/layertree/qgslayertreemodellegendnode.h
+++ b/src/core/layertree/qgslayertreemodellegendnode.h
@@ -181,7 +181,7 @@ class CORE_EXPORT QgsSymbolV2LegendNode : public QgsLayerTreeModelLegendNode
 class CORE_EXPORT QgsSimpleLegendNode : public QgsLayerTreeModelLegendNode
 {
   public:
-    QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon(), QObject* parent = 0 );
+    QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon(), QObject* parent = 0, const QString& key = QString() );
 
     virtual QVariant data( int role ) const override;
 
@@ -189,6 +189,7 @@ class CORE_EXPORT QgsSimpleLegendNode : public QgsLayerTreeModelLegendNode
     QString mLabel;
     QString mId;
     QIcon mIcon;
+    QString mKey;
 };
 
 
diff --git a/src/core/qgis.h b/src/core/qgis.h
index eac17a2..392e42d 100644
--- a/src/core/qgis.h
+++ b/src/core/qgis.h
@@ -318,7 +318,10 @@ inline void ( *cast_to_fptr( void *p ) )()
 //
 inline QString qgsDoubleToString( const double &a, const int &precision = 17 )
 {
-  return QString::number( a, 'f', precision ).remove( QRegExp( "\\.?0+$" ) );
+  if ( precision )
+    return QString::number( a, 'f', precision ).remove( QRegExp( "\\.?0+$" ) );
+  else
+    return QString::number( a, 'f', precision );
 }
 
 //
diff --git a/src/core/qgscolorscheme.h b/src/core/qgscolorscheme.h
index 28081a9..b0096c5 100644
--- a/src/core/qgscolorscheme.h
+++ b/src/core/qgscolorscheme.h
@@ -183,7 +183,7 @@ class CORE_EXPORT QgsRecentColorScheme : public QgsColorScheme
 
     virtual ~QgsRecentColorScheme();
 
-    virtual QString schemeName() const override { return QT_TR_NOOP( "Recent colors" ); }
+    virtual QString schemeName() const override { return QObject::tr( "Recent colors" ); }
 
     virtual SchemeFlags flags() const override { return ShowInAllContexts; }
 
@@ -206,7 +206,7 @@ class CORE_EXPORT QgsCustomColorScheme : public QgsColorScheme
 
     virtual ~QgsCustomColorScheme();
 
-    virtual QString schemeName() const override { return QT_TR_NOOP( "Standard colors" ); }
+    virtual QString schemeName() const override { return QObject::tr( "Standard colors" ); }
 
     virtual SchemeFlags flags() const override { return ShowInAllContexts; }
 
@@ -233,7 +233,7 @@ class CORE_EXPORT QgsProjectColorScheme : public QgsColorScheme
 
     virtual ~QgsProjectColorScheme();
 
-    virtual QString schemeName() const override { return QT_TR_NOOP( "Project colors" ); }
+    virtual QString schemeName() const override { return QObject::tr( "Project colors" ); }
 
     virtual SchemeFlags flags() const override { return ShowInAllContexts; }
 
diff --git a/src/core/qgscoordinatereferencesystem.cpp b/src/core/qgscoordinatereferencesystem.cpp
index f9e14df..2c8a27a 100644
--- a/src/core/qgscoordinatereferencesystem.cpp
+++ b/src/core/qgscoordinatereferencesystem.cpp
@@ -34,6 +34,7 @@
 #include "qgslogger.h"
 #include "qgsmessagelog.h"
 #include "qgis.h" //const vals declared here
+#include "qgslocalec.h"
 
 #include <sqlite3.h>
 #include <proj_api.h>
@@ -921,26 +922,18 @@ void QgsCoordinateReferenceSystem::setDescription( QString theDescription )
 void QgsCoordinateReferenceSystem::setProj4String( QString theProj4String )
 {
   mProj4 = theProj4String;
-  char *oldlocale = setlocale( LC_NUMERIC, NULL );
-  /* the next setlocale() invalides the return of previous setlocale() */
-  if ( oldlocale )
-    oldlocale = strdup( oldlocale );
 
-  setlocale( LC_NUMERIC, "C" );
+  QgsLocaleNumC l;
+
   OSRDestroySpatialReference( mCRS );
   mCRS = OSRNewSpatialReference( NULL );
-  mIsValidFlag =
-    OSRImportFromProj4( mCRS, theProj4String.trimmed().toLatin1().constData() )
-    == OGRERR_NONE;
+  mIsValidFlag = OSRImportFromProj4( mCRS, theProj4String.trimmed().toLatin1().constData() ) == OGRERR_NONE;
   mWkt.clear();
   setMapUnits();
 
 #if defined(QGISDEBUG) && QGISDEBUG>=3
   debugPrint();
 #endif
-
-  setlocale( LC_NUMERIC, oldlocale );
-  free( oldlocale );
 }
 void QgsCoordinateReferenceSystem::setGeographicFlag( bool theGeoFlag )
 {
diff --git a/src/core/qgsdataitem.cpp b/src/core/qgsdataitem.cpp
index e40ef15..7e8b640 100644
--- a/src/core/qgsdataitem.cpp
+++ b/src/core/qgsdataitem.cpp
@@ -297,14 +297,14 @@ QVector<QgsDataItem*> QgsDataItem::createChildren()
   return QVector<QgsDataItem*>();
 }
 
-void QgsDataItem::populate()
+void QgsDataItem::populate( bool foreground )
 {
   if ( state() == Populated || state() == Populating )
     return;
 
   QgsDebugMsg( "mPath = " + mPath );
 
-  if ( capabilities2() & QgsDataItem::Fast )
+  if ( capabilities2() & QgsDataItem::Fast || foreground )
   {
     populate( createChildren() );
   }
@@ -337,7 +337,7 @@ QVector<QgsDataItem*> QgsDataItem::runCreateChildren( QgsDataItem* item )
     QgsDebugMsg( "moveToThread child " + child->path() );
     child->moveToThread( QApplication::instance()->thread() ); // moves also children
   }
-  QgsDebugMsg( "finished path = " + item->path() );
+  QgsDebugMsg( QString( "finished path %1: %2 children" ).arg( item->path() ).arg( children.size() ) );
   return children;
 }
 
diff --git a/src/core/qgsdataitem.h b/src/core/qgsdataitem.h
index 99e6db3..7655dbf 100644
--- a/src/core/qgsdataitem.h
+++ b/src/core/qgsdataitem.h
@@ -207,7 +207,8 @@ class CORE_EXPORT QgsDataItem : public QObject
     virtual void deleteLater();
 
     // Populate children using children vector created by createChildren()
-    virtual void populate();
+    // @param foreground run createChildren in foreground
+    virtual void populate( bool foreground = false );
 
     /** Remove children recursively and set as not populated. This is used when refreshing collapsed items. */
     virtual void depopulate();
diff --git a/src/core/qgsdistancearea.cpp b/src/core/qgsdistancearea.cpp
index 87f27da..b0697e3 100644
--- a/src/core/qgsdistancearea.cpp
+++ b/src/core/qgsdistancearea.cpp
@@ -232,10 +232,11 @@ bool QgsDistanceArea::setEllipsoid( const QString& ellipsoid )
   // set transformation from project CRS to ellipsoid coordinates
   mCoordTransform->setDestCRS( destCRS );
 
+  mEllipsoid = ellipsoid;
+
   // precalculate some values for area calculations
   computeAreaInit();
 
-  mEllipsoid = ellipsoid;
   return true;
 }
 
diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp
index dd5ace5..c271856 100644
--- a/src/core/qgsexpression.cpp
+++ b/src/core/qgsexpression.cpp
@@ -175,7 +175,13 @@ inline bool isDoubleSafe( const QVariant& v )
   if ( v.type() == QVariant::UInt ) return true;
   if ( v.type() == QVariant::LongLong ) return true;
   if ( v.type() == QVariant::ULongLong ) return true;
-  if ( v.type() == QVariant::String ) { bool ok; v.toString().toDouble( &ok ); return ok; }
+  if ( v.type() == QVariant::String )
+  {
+    bool ok;
+    double val = v.toString().toDouble( &ok );
+    ok = ok && qIsFinite( val ) && !qIsNaN( val );
+    return ok;
+  }
   return false;
 }
 
@@ -238,7 +244,7 @@ static double getDoubleValue( const QVariant& value, QgsExpression* parent )
 {
   bool ok;
   double x = value.toDouble( &ok );
-  if ( !ok )
+  if ( !ok || qIsNaN( x ) || !qIsFinite( x ) )
   {
     parent->setEvalErrorString( QObject::tr( "Cannot convert '%1' to double" ).arg( value.toString() ) );
     return 0;
@@ -1345,6 +1351,11 @@ static QVariant fcnFormatNumber( const QVariantList& values, const QgsFeature*,
 {
   double value = getDoubleValue( values.at( 0 ), parent );
   int places = getIntValue( values.at( 1 ), parent );
+  if ( places < 0 )
+  {
+    parent->setEvalErrorString( QObject::tr( "Number of places must be positive" ) );
+    return QVariant();
+  }
   return QString( "%L1" ).arg( value, 0, 'f', places );
 }
 
diff --git a/src/core/qgsfeature.h b/src/core/qgsfeature.h
index 7ce6c0f..8d1e4a6 100644
--- a/src/core/qgsfeature.h
+++ b/src/core/qgsfeature.h
@@ -97,7 +97,50 @@ typedef int QgsFeatureId;
 // key = field index, value = field value
 typedef QMap<int, QVariant> QgsAttributeMap;
 
-typedef QVector<QVariant> QgsAttributes;
+/**
+ * A vector of attributes. Mostly equal to QVector<QVariant>.
+ */
+class CORE_EXPORT QgsAttributes : public QVector<QVariant>
+{
+  public:
+    QgsAttributes()
+        : QVector<QVariant>()
+    {}
+    QgsAttributes( int size )
+        : QVector<QVariant>( size )
+    {}
+    QgsAttributes( int size, const QVariant& v )
+        : QVector<QVariant>( size, v )
+    {}
+
+    QgsAttributes( const QVector<QVariant>& v )
+        : QVector<QVariant>( v )
+    {}
+
+    /**
+     * @brief Compares two vectors of attributes.
+     * They are considered equal if all their members contain the same value and NULL flag.
+     * This was introduced because the default Qt implementation of QVariant comparison does not
+     * handle NULL values for certain types (like int).
+     *
+     * @param v The attributes to compare
+     * @return True if v is equal
+     */
+    bool operator==( const QgsAttributes &v ) const
+    {
+      if ( size() != v.size() )
+        return false;
+      const QVariant* b = constData();
+      const QVariant* i = b + size();
+      const QVariant* j = v.constData() + size();
+      while ( i != b )
+        if ( !( *--i == *--j && i->isNull() == j->isNull() ) )
+          return false;
+      return true;
+    }
+
+    inline bool operator!=( const QgsAttributes &v ) const { return !( *this == v ); }
+};
 
 class QgsField;
 
diff --git a/src/core/qgsfield.cpp b/src/core/qgsfield.cpp
index 9a2cb5c..bc207b3 100644
--- a/src/core/qgsfield.cpp
+++ b/src/core/qgsfield.cpp
@@ -203,8 +203,12 @@ void QgsFields::remove( int fieldIdx )
   if ( !exists( fieldIdx ) )
     return;
 
-  mNameToIndex.remove( mFields[fieldIdx].field.name() );
   mFields.remove( fieldIdx );
+  mNameToIndex.clear();
+  for ( int idx = 0; idx < count(); ++idx )
+  {
+    mNameToIndex.insert( mFields[idx].field.name(), idx );
+  }
 }
 
 void QgsFields::extend( const QgsFields& other )
diff --git a/src/core/qgsgeometry.h b/src/core/qgsgeometry.h
index 46f4a7f..2946054 100644
--- a/src/core/qgsgeometry.h
+++ b/src/core/qgsgeometry.h
@@ -289,7 +289,7 @@ class CORE_EXPORT QgsGeometry
      @return 0 in case of success*/
     int translate( double dx, double dy );
 
-    /**Transform this geometry as described by CoordinateTranasform ct
+    /**Transform this geometry as described by CoordinateTransform ct
      @return 0 in case of success*/
     int transform( const QgsCoordinateTransform& ct );
 
diff --git a/src/core/qgsgeometryvalidator.cpp b/src/core/qgsgeometryvalidator.cpp
index f038642..055a3f3 100644
--- a/src/core/qgsgeometryvalidator.cpp
+++ b/src/core/qgsgeometryvalidator.cpp
@@ -62,7 +62,9 @@ void QgsGeometryValidator::checkRingIntersections(
         if ( d >= 0 && d <= v.length() )
         {
           d = -distLine2Point( ring1[j], w.perpVector(), s );
-          if ( d > 0 && d < w.length() )
+          if ( d > 0 && d < w.length() &&
+               ring0[i+1] != ring1[j+1] && ring0[i+1] != ring1[j] &&
+               ring0[i+0] != ring1[j+1] && ring0[i+0] != ring1[j] )
           {
             QString msg = QObject::tr( "segment %1 of ring %2 of polygon %3 intersects segment %4 of ring %5 of polygon %6 at %7" )
                           .arg( i0 ).arg( i ).arg( p0 )
diff --git a/src/core/qgsgml.cpp b/src/core/qgsgml.cpp
index 630cc49..0f7f74b 100644
--- a/src/core/qgsgml.cpp
+++ b/src/core/qgsgml.cpp
@@ -369,6 +369,7 @@ void QgsGml::endElement( const XML_Char* el )
     if ( mCurrentWKBSize > 0 )
     {
       mCurrentFeature->setGeometryAndOwnership( mCurrentWKB, mCurrentWKBSize );
+      mCurrentWKB = 0;
     }
     else if ( !mCurrentExtent.isEmpty() )
     {
diff --git a/src/core/qgslayerdefinition.cpp b/src/core/qgslayerdefinition.cpp
index b4f6754..09a8125 100644
--- a/src/core/qgslayerdefinition.cpp
+++ b/src/core/qgslayerdefinition.cpp
@@ -49,7 +49,7 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsLayerTreeGrou
     // Strip the date part because we will replace it.
     QString layername = oldid.left( oldid.length() - 17 );
     QDateTime dt = QDateTime::currentDateTime();
-    QString newid = layername + dt.toString( "yyyyMMddhhmmsszzz" );
+    QString newid = layername + dt.toString( "yyyyMMddhhmmsszzz" ) + QString::number( qrand() );
     idElem.firstChild().setNodeValue( newid );
     QDomNodeList treeLayerNodes = doc.elementsByTagName( "layer-tree-layer" );
 
diff --git a/src/core/qgslocalec.cpp b/src/core/qgslocalec.cpp
new file mode 100644
index 0000000..25263d3
--- /dev/null
+++ b/src/core/qgslocalec.cpp
@@ -0,0 +1,43 @@
+/***************************************************************************
+                          qgslocalec.h - temporary C numeric locale
+                          -------------------
+    begin                : Jun 15th 2015
+    copyright            : (C) 2015 by Juergen E. Fischer
+    email                : jef at norbit dot de
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 <qgslocalec.h>
+
+#include <locale.h>
+#include <QByteArray>
+
+QMutex QgsLocaleNumC::sLocaleLock;
+
+QgsLocaleNumC::QgsLocaleNumC()
+{
+  sLocaleLock.lock();
+
+  mOldlocale = setlocale( LC_NUMERIC, NULL );
+  if ( mOldlocale )
+    mOldlocale = qstrdup( mOldlocale );
+
+  setlocale( LC_NUMERIC, "C" );
+}
+
+QgsLocaleNumC::~QgsLocaleNumC()
+{
+  setlocale( LC_NUMERIC, mOldlocale );
+  if ( mOldlocale )
+    delete [] mOldlocale;
+
+  sLocaleLock.unlock();
+}
diff --git a/src/providers/postgres/qgspostgresconnpool.cpp b/src/core/qgslocalec.h
similarity index 54%
copy from src/providers/postgres/qgspostgresconnpool.cpp
copy to src/core/qgslocalec.h
index de8bf7e..6102c17 100644
--- a/src/providers/postgres/qgspostgresconnpool.cpp
+++ b/src/core/qgslocalec.h
@@ -1,10 +1,12 @@
 /***************************************************************************
-    qgspostgresconnpool.cpp
-    ---------------------
-    begin                : January 2014
-    copyright            : (C) 2014 by Martin Dobias
-    email                : wonder dot sk at gmail dot com
- ***************************************************************************
+                          qgslocalec.h - temporary C numeric locale
+                             -------------------
+    begin                : Jun 15th 2015
+    copyright            : (C) 2015 by Juergen E. Fischer
+    email                : jef at norbit dot de
+ ***************************************************************************/
+
+/***************************************************************************
  *                                                                         *
  *   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  *
@@ -13,24 +15,20 @@
  *                                                                         *
  ***************************************************************************/
 
-#include "qgspostgresconnpool.h"
+#ifndef QGSLOCALENUMC_H
+#define QGSLOCALENUMC_H
 
-#include "qgspostgresconn.h"
+#include <QMutex>
 
-
-QgsPostgresConnPool* QgsPostgresConnPool::instance()
+class CORE_EXPORT QgsLocaleNumC
 {
-  static QgsPostgresConnPool sInstance;
-  return &sInstance;
-}
+    char *mOldlocale;
+    static QMutex sLocaleLock;
 
-QgsPostgresConnPool::QgsPostgresConnPool() : QgsConnectionPool<QgsPostgresConn*, QgsPostgresConnPoolGroup>()
-{
-  QgsDebugCall;
-}
+  public:
+    QgsLocaleNumC();
+    ~QgsLocaleNumC();
 
-QgsPostgresConnPool::~QgsPostgresConnPool()
-{
-  QgsDebugCall;
-}
+};
 
+#endif // QGSLOCALENUMC_H
diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp
index 1dad18e..5babf69 100644
--- a/src/core/qgsmaplayer.cpp
+++ b/src/core/qgsmaplayer.cpp
@@ -46,15 +46,16 @@
 #include "qgsrectangle.h"
 #include "qgsvectorlayer.h"
 
+
 QgsMapLayer::QgsMapLayer( QgsMapLayer::LayerType type,
                           QString lyrname,
-                          QString source ) :
-    mValid( false ), // assume the layer is invalid
-    mDataSource( source ),
-    mLayerOrigName( lyrname ), // store the original name
-    mID( "" ),
-    mLayerType( type ),
-    mBlendMode( QPainter::CompositionMode_SourceOver ) // Default to normal blending
+                          QString source )
+    : mValid( false ) // assume the layer is invalid
+    , mDataSource( source )
+    , mLayerOrigName( lyrname ) // store the original name
+    , mID( "" )
+    , mLayerType( type )
+    , mBlendMode( QPainter::CompositionMode_SourceOver ) // Default to normal blending
     , mLegend( 0 )
     , mStyleManager( new QgsMapLayerStyleManager( this ) )
 {
@@ -293,7 +294,67 @@ bool QgsMapLayer::readLayerXML( const QDomElement& layerElement )
   }
   else
   {
-    mDataSource = QgsProject::instance()->readPath( mDataSource );
+    bool handled = false;
+
+    if ( provider == "gdal" )
+    {
+      if ( mDataSource.startsWith( "NETCDF:" ) )
+      {
+        // NETCDF:filename:variable
+        // filename can be quoted with " as it can contain colons
+        QRegExp r( "NETCDF:(.+):([^:]+)" );
+        if ( r.exactMatch( mDataSource ) )
+        {
+          QString filename = r.cap( 1 );
+          if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+            filename = filename.mid( 1, filename.length() - 2 );
+          mDataSource = "NETCDF:\"" + QgsProject::instance()->readPath( filename ) + "\":" + r.cap( 2 );
+          handled = true;
+        }
+      }
+      else if ( mDataSource.startsWith( "HDF4_SDS:" ) )
+      {
+        // HDF4_SDS:subdataset_type:file_name:subdataset_index
+        // filename can be quoted with " as it can contain colons
+        QRegExp r( "HDF4_SDS:([^:]+):(.+):([^:]+)" );
+        if ( r.exactMatch( mDataSource ) )
+        {
+          QString filename = r.cap( 2 );
+          if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+            filename = filename.mid( 1, filename.length() - 2 );
+          mDataSource = "HDF4_SDS:" + r.cap( 1 ) + ":\"" + QgsProject::instance()->readPath( filename ) + "\":" + r.cap( 3 );
+          handled = true;
+        }
+      }
+      else if ( mDataSource.startsWith( "HDF5:" ) )
+      {
+        // HDF5:file_name:subdataset
+        // filename can be quoted with " as it can contain colons
+        QRegExp r( "HDF5:(.+):([^:]+)" );
+        if ( r.exactMatch( mDataSource ) )
+        {
+          QString filename = r.cap( 1 );
+          if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+            filename = filename.mid( 1, filename.length() - 2 );
+          mDataSource = "HDF5:\"" + QgsProject::instance()->readPath( filename ) + "\":" + r.cap( 2 );
+          handled = true;
+        }
+      }
+      else if ( mDataSource.contains( QRegExp( "^(NITF_IM|RADARSAT_2_CALIB):" ) ) )
+      {
+        // NITF_IM:0:filename
+        // RADARSAT_2_CALIB:?:filename
+        QRegExp r( "([^:]+):([^:]+):(.+)" );
+        if ( r.exactMatch( mDataSource ) )
+        {
+          mDataSource = r.cap( 1 ) + ":" + r.cap( 2 ) + ":" + QgsProject::instance()->readPath( r.cap( 3 ) );
+          handled = true;
+        }
+      }
+    }
+
+    if ( !handled )
+      mDataSource = QgsProject::instance()->readPath( mDataSource );
   }
 
   // Set the CRS from project file, asking the user if necessary.
@@ -490,7 +551,72 @@ bool QgsMapLayer::writeLayerXML( QDomElement& layerElement, QDomDocument& docume
   }
   else
   {
-    src = QgsProject::instance()->writePath( src, relativeBasePath );
+    bool handled = false;
+
+    if ( !vlayer )
+    {
+      QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( this );
+      // Update path for subdataset
+      if ( rlayer && rlayer->providerType() == "gdal" )
+      {
+        if ( src.startsWith( "NETCDF:" ) )
+        {
+          // NETCDF:filename:variable
+          // filename can be quoted with " as it can contain colons
+          QRegExp r( "NETCDF:(.+):([^:]+)" );
+          if ( r.exactMatch( src ) )
+          {
+            QString filename = r.cap( 1 );
+            if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+              filename = filename.mid( 1, filename.length() - 2 );
+            src = "NETCDF:\"" + QgsProject::instance()->writePath( filename, relativeBasePath ) + "\":" + r.cap( 2 );
+            handled = true;
+          }
+        }
+        else if ( src.startsWith( "HDF4_SDS:" ) )
+        {
+          // HDF4_SDS:subdataset_type:file_name:subdataset_index
+          // filename can be quoted with " as it can contain colons
+          QRegExp r( "HDF4_SDS:([^:]+):(.+):([^:]+)" );
+          if ( r.exactMatch( src ) )
+          {
+            QString filename = r.cap( 2 );
+            if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+              filename = filename.mid( 1, filename.length() - 2 );
+            src = "HDF4_SDS:" + r.cap( 1 ) + ":\"" + QgsProject::instance()->writePath( filename, relativeBasePath ) + "\":" + r.cap( 3 );
+            handled = true;
+          }
+        }
+        else if ( src.startsWith( "HDF5:" ) )
+        {
+          // HDF5:file_name:subdataset
+          // filename can be quoted with " as it can contain colons
+          QRegExp r( "HDF5:(.+):([^:]+)" );
+          if ( r.exactMatch( src ) )
+          {
+            QString filename = r.cap( 1 );
+            if ( filename.startsWith( '"' ) && filename.endsWith( '"' ) )
+              filename = filename.mid( 1, filename.length() - 2 );
+            src = "HDF5:\"" + QgsProject::instance()->writePath( filename, relativeBasePath ) + "\":" + r.cap( 2 );
+            handled = true;
+          }
+        }
+        else if ( src.contains( QRegExp( "^(NITF_IM|RADARSAT_2_CALIB):" ) ) )
+        {
+          // NITF_IM:0:filename
+          // RADARSAT_2_CALIB:?:filename
+          QRegExp r( "([^:]+):([^:]+):(.+)" );
+          if ( r.exactMatch( src ) )
+          {
+            src = r.cap( 1 ) + ":" + r.cap( 2 ) + ":" + QgsProject::instance()->writePath( r.cap( 3 ), relativeBasePath );
+            handled = true;
+          }
+        }
+      }
+    }
+
+    if ( !handled )
+      src = QgsProject::instance()->writePath( src, relativeBasePath );
   }
 
   QDomText dataSourceText = document.createTextNode( src );
diff --git a/src/core/qgsofflineediting.cpp b/src/core/qgsofflineediting.cpp
index ed82b3c..b843a04 100644
--- a/src/core/qgsofflineediting.cpp
+++ b/src/core/qgsofflineediting.cpp
@@ -29,6 +29,7 @@
 #include "qgsvectordataprovider.h"
 #include "qgsvectorlayereditbuffer.h"
 #include "qgsvectorlayerjoinbuffer.h"
+#include "qgsslconnect.h"
 
 #include <QDir>
 #include <QDomDocument>
@@ -74,9 +75,8 @@ bool QgsOfflineEditing::convertToOfflineProject( const QString& offlineDataPath,
   QString dbPath = QDir( offlineDataPath ).absoluteFilePath( offlineDbFile );
   if ( createSpatialiteDB( dbPath ) )
   {
-    spatialite_init( 0 );
     sqlite3* db;
-    int rc = sqlite3_open( dbPath.toUtf8().constData(), &db );
+    int rc = QgsSLConnect::sqlite3_open( dbPath.toUtf8().constData(), &db );
     if ( rc != SQLITE_OK )
     {
       showWarning( tr( "Could not open the spatialite database" ) );
@@ -156,7 +156,7 @@ bool QgsOfflineEditing::convertToOfflineProject( const QString& offlineDataPath,
 
       emit progressStopped();
 
-      sqlite3_close( db );
+      QgsSLConnect::sqlite3_close( db );
 
       // save offline project
       QString projectTitle = QgsProject::instance()->title();
@@ -380,8 +380,7 @@ bool QgsOfflineEditing::createSpatialiteDB( const QString& offlineDbPath )
 
   // creating/opening the new database
   QString dbPath = newDb.fileName();
-  spatialite_init( 0 );
-  ret = sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
+  ret = QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
   if ( ret )
   {
     // an error occurred
@@ -397,13 +396,13 @@ bool QgsOfflineEditing::createSpatialiteDB( const QString& offlineDbPath )
   {
     showWarning( tr( "Unable to activate FOREIGN_KEY constraints" ) );
     sqlite3_free( errMsg );
-    sqlite3_close( sqlite_handle );
+    QgsSLConnect::sqlite3_close( sqlite_handle );
     return false;
   }
   initializeSpatialMetadata( sqlite_handle );
 
   // all done: closing the DB connection
-  sqlite3_close( sqlite_handle );
+  QgsSLConnect::sqlite3_close( sqlite_handle );
 
   return true;
 }
diff --git a/src/core/qgspalgeometry.h b/src/core/qgspalgeometry.h
index 904d830..e41c1e2 100644
--- a/src/core/qgspalgeometry.h
+++ b/src/core/qgspalgeometry.h
@@ -4,6 +4,7 @@
 #include "qgsgeometry.h"
 #include <pal/feature.h>
 #include <pal/palgeometry.h>
+#include <QTextBoundaryFinder>
 
 using namespace pal;
 
@@ -49,6 +50,19 @@ class QgsPalGeometry : public PalGeometry
     const char* strId() { return mStrId.data(); }
     QString text() { return mText; }
 
+    /** Returns the text component corresponding to a specified label part
+     * @param partId Set to -1 for labels which are not broken into parts (eg, non-curved labels), or the required
+     * part index for labels which are broken into parts (curved labels)
+     * @note added in QGIS 2.10
+     */
+    QString text( int partId ) const
+    {
+      if ( partId == -1 )
+        return mText;
+      else
+        return mClusters.at( partId );
+    }
+
     pal::LabelInfo* info( QFontMetricsF* fm, const QgsMapToPixel* xform, double fontScale, double maxinangle, double maxoutangle )
     {
       if ( mInfo )
@@ -74,29 +88,45 @@ class QgsPalGeometry : public PalGeometry
       // (non-curved spacings handled by Qt in QgsPalLayerSettings/QgsPalLabeling)
       qreal charWidth;
       qreal wordSpaceFix;
-      mInfo = new pal::LabelInfo( mText.count(), labelHeight, maxinangle, maxoutangle );
-      for ( int i = 0; i < mText.count(); i++ )
+
+      //split string by valid grapheme boundaries - required for certain scripts (see #6883)
+      QTextBoundaryFinder boundaryFinder( QTextBoundaryFinder::Grapheme, mText );
+      int currentBoundary = -1;
+      int previousBoundary = 0;
+      while (( currentBoundary = boundaryFinder.toNextBoundary() ) > 0 )
       {
-        mInfo->char_info[i].chr = mText[i].unicode();
+        mClusters << mText.mid( previousBoundary, currentBoundary - previousBoundary );
+        previousBoundary = currentBoundary;
+      }
+
+      mInfo = new pal::LabelInfo( mClusters.count(), labelHeight, maxinangle, maxoutangle );
+      for ( int i = 0; i < mClusters.count(); i++ )
+      {
+        //doesn't appear to be used anywhere:
+        //mInfo->char_info[i].chr = textClusters[i].unicode();
 
         // reconstruct how Qt creates word spacing, then adjust per individual stored character
         // this will allow PAL to create each candidate width = character width + correct spacing
-        charWidth = fm->width( mText[i] );
+        charWidth = fm->width( mClusters[i] );
         if ( mCurvedLabeling )
         {
           wordSpaceFix = qreal( 0.0 );
-          if ( mText[i] == QString( " " )[0] )
+          if ( mClusters[i] == QString( " " ) )
           {
             // word spacing only gets added once at end of consecutive run of spaces, see QTextEngine::shapeText()
             int nxt = i + 1;
-            wordSpaceFix = ( nxt < mText.count() && mText[nxt] != QString( " " )[0] ) ? mWordSpacing : qreal( 0.0 );
+            wordSpaceFix = ( nxt < mClusters.count() && mClusters[nxt] != QString( " " ) ) ? mWordSpacing : qreal( 0.0 );
           }
-          if ( fm->width( QString( mText[i] ) ) - fm->width( mText[i] ) - mLetterSpacing != qreal( 0.0 ) )
+          // this workaround only works for clusters with a single character. Not sure how it should be handled
+          // with multi-character clusters.
+          if ( mClusters[i].length() == 1 &&
+               !qgsDoubleNear( fm->width( QString( mClusters[i].at( 0 ) ) ), fm->width( mClusters[i].at( 0 ) ) + mLetterSpacing ) )
           {
             // word spacing applied when it shouldn't be
             wordSpaceFix -= mWordSpacing;
           }
-          charWidth = fm->width( QString( mText[i] ) ) + wordSpaceFix;
+
+          charWidth = fm->width( QString( mClusters[i] ) ) + wordSpaceFix;
         }
 
         double labelWidth = mapScale * charWidth / fontScale;
@@ -135,6 +165,7 @@ class QgsPalGeometry : public PalGeometry
   protected:
     GEOSGeometry* mG;
     QString mText;
+    QStringList mClusters;
     QByteArray mStrId;
     QgsFeatureId mId;
     LabelInfo* mInfo;
@@ -145,10 +176,10 @@ class QgsPalGeometry : public PalGeometry
     qreal mLetterSpacing; // for use with curved labels
     qreal mWordSpacing; // for use with curved labels
     bool mCurvedLabeling; // whether the geometry is to be used for curved labeling placement
-    /**Stores attribute values for data defined properties*/
+    /** Stores attribute values for data defined properties*/
     QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant > mDataDefinedValues;
 
-    /**Stores attribute values for diagram rendering*/
+    /** Stores attribute values for diagram rendering*/
     QgsAttributes mDiagramAttributes;
 
     QString mDxfLayer;
diff --git a/src/core/qgspallabeling.cpp b/src/core/qgspallabeling.cpp
index 309c8b3..cf01124 100644
--- a/src/core/qgspallabeling.cpp
+++ b/src/core/qgspallabeling.cpp
@@ -1205,7 +1205,7 @@ bool QgsPalLayerSettings::dataDefinedEvaluate( DataDefinedProperties p, QVariant
 
   QVariant result = dataDefinedValue( p, *mCurFeat, *mCurFields );
 
-  if ( result.isValid() ) // filter NULL values? i.e. && !result.isNull()
+  if ( result.isValid() && !result.isNull() )
   {
     //QgsDebugMsgLevel( QString( "result type:" ) + QString( result.typeName() ), 4 );
     //QgsDebugMsgLevel( QString( "result string:" ) + result.toString(), 4 );
@@ -1405,12 +1405,12 @@ void QgsPalLayerSettings::calculateLabelSize( const QFontMetricsF* fm, QString t
     }
     else
     {
-      text.prepend( dirSym + wrapchr ); // SymbolAbove or SymbolBelow
+      text.prepend( dirSym + QString( "\n" ) ); // SymbolAbove or SymbolBelow
     }
   }
 
   double w = 0.0, h = 0.0;
-  QStringList multiLineSplit = text.split( wrapchr );
+  QStringList multiLineSplit = QgsPalLabeling::splitToLines( text, wrapchr );
   int lines = multiLineSplit.size();
 
   double labelHeight = fm->ascent() + fm->descent(); // ignore +1 for baseline
@@ -2175,17 +2175,12 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
     }
   }
 
-  if ( repeatDist != 0 )
+  if ( !qgsDoubleNear( repeatDist, 0.0 ) )
   {
-    if ( repeatdistinmapunit ) //convert distance from mm/map units to pixels
+    if ( !repeatdistinmapunit )
     {
-      repeatDist /= repeatDistanceMapUnitScale.computeMapUnitsPerPixel( context ) * context.scaleFactor();
+      repeatDist *= mapUntsPerMM; //convert repeat distance from mm to map units
     }
-    else //mm
-    {
-      repeatDist *= vectorScaleFactor;
-    }
-    repeatDist *= qAbs( ptOne.x() - ptZero.x() );
   }
 
   //  feature to the layer
@@ -3410,6 +3405,25 @@ void QgsPalLabeling::registerFeature( const QString& layerID, QgsFeature& f, con
   lyr.registerFeature( f, context, dxfLayer );
 }
 
+QStringList QgsPalLabeling::splitToLines( const QString &text, const QString &wrapCharacter )
+{
+  QStringList multiLineSplit;
+  if ( !wrapCharacter.isEmpty() && wrapCharacter != QString( "\n" ) )
+  {
+    //wrap on both the wrapchr and new line characters
+    foreach ( QString line, text.split( wrapCharacter ) )
+    {
+      multiLineSplit.append( line.split( QString( "\n" ) ) );
+    }
+  }
+  else
+  {
+    multiLineSplit = text.split( "\n" );
+  }
+
+  return multiLineSplit;
+}
+
 void QgsPalLabeling::registerDiagramFeature( const QString& layerID, QgsFeature& feat, const QgsRenderContext& context )
 {
   //get diagram layer settings, diagram renderer
@@ -4305,12 +4319,9 @@ void QgsPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& con
   {
 
     // TODO: optimize access :)
-    QString text = (( QgsPalGeometry* )label->getFeaturePart()->getUserGeometry() )->text();
-    QString txt = ( label->getPartId() == -1 ? text : QString( text[label->getPartId()] ) );
+    QString txt = (( QgsPalGeometry* )label->getFeaturePart()->getUserGeometry() )->text( label->getPartId() );
     QFontMetricsF* labelfm = (( QgsPalGeometry* )label->getFeaturePart()->getUserGeometry() )->getLabelFontMetrics();
 
-    QString wrapchr = !tmpLyr.wrapChar.isEmpty() ? tmpLyr.wrapChar : QString( "\n" );
-
     //add the direction symbol if needed
     if ( !txt.isEmpty() && tmpLyr.placement == QgsPalLayerSettings::Line &&
          tmpLyr.addDirectionSymbol )
@@ -4341,12 +4352,12 @@ void QgsPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& con
       if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolAbove )
       {
         prependSymb = true;
-        symb = symb + wrapchr;
+        symb = symb + QString( "\n" );
       }
       else if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolBelow )
       {
         prependSymb = false;
-        symb = wrapchr + symb;
+        symb = QString( "\n" ) + symb;
       }
 
       if ( prependSymb )
@@ -4360,8 +4371,7 @@ void QgsPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& con
     }
 
     //QgsDebugMsgLevel( "drawLabel " + txt, 4 );
-
-    QStringList multiLineList = txt.split( wrapchr );
+    QStringList multiLineList = QgsPalLabeling::splitToLines( txt, tmpLyr.wrapChar );
     int lines = multiLineList.size();
 
     double labelWidest = 0.0;
diff --git a/src/core/qgspallabeling.h b/src/core/qgspallabeling.h
index 12f72d2..35a3725 100644
--- a/src/core/qgspallabeling.h
+++ b/src/core/qgspallabeling.h
@@ -815,6 +815,15 @@ class CORE_EXPORT QgsPalLabeling : public QgsLabelingEngineInterface
     //! @deprecated since 2.4 - settings are always stored in project
     Q_DECL_DEPRECATED void setStoredWithProject( bool store ) { Q_UNUSED( store ); }
 
+  /** Splits a text string to a list of seperate lines, using a specified wrap character.
+     * The text string will be split on either newline characters or the wrap character.
+     * @param text text string to split
+     * @param wrapCharacter additional character to wrap on
+     * @returns list of text split to lines
+     * @note added in QGIS 2.9
+     */
+    static QStringList splitToLines( const QString& text, const QString& wrapCharacter );
+
   protected:
     // update temporary QgsPalLayerSettings with any data defined text style values
     void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr,
diff --git a/src/core/qgspoint.cpp b/src/core/qgspoint.cpp
index 3a6ae69..f45ecad 100644
--- a/src/core/qgspoint.cpp
+++ b/src/core/qgspoint.cpp
@@ -153,13 +153,25 @@ QString QgsPoint::toDegreesMinutesSeconds( int thePrecision, const bool useSuffi
     myWrappedX = myWrappedX + 360.0;
   }
 
+  //first, limit latitude to -180 to 180 degree range
+  double myWrappedY = fmod( m_y, 180.0 );
+  //next, wrap around latitudes > 90 or < -90 degrees, so that eg "110S" -> "70N"
+  if ( myWrappedY > 90.0 )
+  {
+    myWrappedY = myWrappedY - 180.0;
+  }
+  else if ( myWrappedY < -90.0 )
+  {
+    myWrappedY = myWrappedY + 180.0;
+  }
+
   int myDegreesX = int( qAbs( myWrappedX ) );
   double myFloatMinutesX = double(( qAbs( myWrappedX ) - myDegreesX ) * 60 );
   int myIntMinutesX = int( myFloatMinutesX );
   double mySecondsX = double( myFloatMinutesX - myIntMinutesX ) * 60;
 
-  int myDegreesY = int( qAbs( m_y ) );
-  double myFloatMinutesY = double(( qAbs( m_y ) - myDegreesY ) * 60 );
+  int myDegreesY = int( qAbs( myWrappedY ) );
+  double myFloatMinutesY = double(( qAbs( myWrappedY ) - myDegreesY ) * 60 );
   int myIntMinutesY = int( myFloatMinutesY );
   double mySecondsY = double( myFloatMinutesY - myIntMinutesY ) * 60;
 
@@ -192,7 +204,7 @@ QString QgsPoint::toDegreesMinutesSeconds( int thePrecision, const bool useSuffi
   if ( useSuffix )
   {
     myXHemisphere = myWrappedX < 0 ? QObject::tr( "W" ) : QObject::tr( "E" );
-    myYHemisphere = m_y < 0 ? QObject::tr( "S" ) : QObject::tr( "N" );
+    myYHemisphere = myWrappedY < 0 ? QObject::tr( "S" ) : QObject::tr( "N" );
   }
   else
   {
@@ -200,7 +212,7 @@ QString QgsPoint::toDegreesMinutesSeconds( int thePrecision, const bool useSuffi
     {
       myXSign = QObject::tr( "-" );
     }
-    if ( m_y < 0 )
+    if ( myWrappedY < 0 )
     {
       myYSign = QObject::tr( "-" );
     }
diff --git a/src/core/qgspointlocator.cpp b/src/core/qgspointlocator.cpp
index 931c4bb..6fcf0be 100644
--- a/src/core/qgspointlocator.cpp
+++ b/src/core/qgspointlocator.cpp
@@ -632,11 +632,14 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
     QgsRectangle rect = *mExtent;
     if ( mTransform )
     {
-      try {
+      try
+      {
         rect = mTransform->transformBoundingBox( rect, QgsCoordinateTransform::ReverseTransform );
-      } catch (const QgsException& e) {
+      }
+      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()) );
+        QgsDebugMsg( QString( "could not transform bounding box to map, skipping the snap filter (%1)" ).arg( e.what() ) );
       }
     }
     request.setFilterRect( rect );
@@ -650,11 +653,14 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
 
     if ( mTransform )
     {
-      try {
+      try
+      {
         f.geometry()->transform( *mTransform );
-      } catch (const QgsException& e) {
+      }
+      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()) );
+        QgsDebugMsg( QString( "could not transform geometry to map, skipping the snap for it (%1)" ).arg( e.what() ) );
         continue;
       }
     }
@@ -700,8 +706,8 @@ void QgsPointLocator::destroyIndex()
 
   mIsEmptyLayer = false;
 
-  foreach ( QgsGeometry* g, mGeoms )
-    delete g;
+  qDeleteAll( mGeoms );
+
   mGeoms.clear();
 }
 
@@ -722,18 +728,25 @@ void QgsPointLocator::onFeatureAdded( QgsFeatureId fid )
 
     if ( mTransform )
     {
-      try {
+      try
+      {
         f.geometry()->transform( *mTransform );
-      } catch (const QgsException& e) {
+      }
+      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()) );
+        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() );
-    mGeoms[fid] = new QgsGeometry( *f.geometry() );
+    QgsRectangle bbox = f.geometry()->boundingBox();
+    if ( !bbox.isNull() )
+    {
+      SpatialIndex::Region r( rect2region( bbox ) );
+      mRTree->insertData( 0, 0, r, f.id() );
+      mGeoms[fid] = new QgsGeometry( *f.geometry() );
+    }
   }
 }
 
diff --git a/src/core/qgsproject.cpp b/src/core/qgsproject.cpp
index 9fba409..ca1933e 100644
--- a/src/core/qgsproject.cpp
+++ b/src/core/qgsproject.cpp
@@ -1479,7 +1479,7 @@ QString QgsProject::writePath( QString src, QString relativeBasePath ) const
 
   QFileInfo srcFileInfo( src );
   QFileInfo projFileInfo( fileName() );
-  QString srcPath = srcFileInfo.canonicalFilePath();
+  QString srcPath = srcFileInfo.exists() ? srcFileInfo.canonicalFilePath() : src;
   QString projPath = projFileInfo.canonicalFilePath();
 
   if ( !relativeBasePath.isNull() )
diff --git a/src/core/qgsrectangle.cpp b/src/core/qgsrectangle.cpp
index 35bd3a5..cf82e84 100644
--- a/src/core/qgsrectangle.cpp
+++ b/src/core/qgsrectangle.cpp
@@ -77,6 +77,9 @@ void QgsRectangle::set( double xmin_, double ymin_, double xmax_, double ymax_ )
 
 void QgsRectangle::normalize()
 {
+  if ( isNull() )
+    return;
+
   if ( xmin > xmax )
   {
     std::swap( xmin, xmax );
diff --git a/src/core/qgsrenderchecker.cpp b/src/core/qgsrenderchecker.cpp
index b425df8..5bb22fd 100644
--- a/src/core/qgsrenderchecker.cpp
+++ b/src/core/qgsrenderchecker.cpp
@@ -27,16 +27,16 @@
 #include <QDebug>
 #include <QBuffer>
 
-QgsRenderChecker::QgsRenderChecker() :
-    mReport( "" ),
-    mMatchTarget( 0 ),
-    mElapsedTime( 0 ),
-    mRenderedImageFile( "" ),
-    mExpectedImageFile( "" ),
-    mMismatchCount( 0 ),
-    mColorTolerance( 0 ),
-    mElapsedTimeTarget( 0 ),
-    mBufferDashMessages( false )
+QgsRenderChecker::QgsRenderChecker()
+    : mReport( "" )
+    , mMatchTarget( 0 )
+    , mElapsedTime( 0 )
+    , mRenderedImageFile( "" )
+    , mExpectedImageFile( "" )
+    , mMismatchCount( 0 )
+    , mColorTolerance( 0 )
+    , mElapsedTimeTarget( 0 )
+    , mBufferDashMessages( false )
 {
 }
 
@@ -359,7 +359,6 @@ bool QgsRenderChecker::compareImages( QString theTestName,
   //
   emitDashMessage( "Rendered Image " + theTestName + prefix, QgsDartMeasurement::ImagePng, mRenderedImageFile );
   emitDashMessage( "Expected Image " + theTestName + prefix, QgsDartMeasurement::ImagePng, mExpectedImageFile );
-  emitDashMessage( "Difference Image " + theTestName + prefix, QgsDartMeasurement::ImagePng, myDiffImageFile );
 
   //
   // Put the same info to debug too
@@ -430,6 +429,7 @@ bool QgsRenderChecker::compareImages( QString theTestName,
   //save the diff image to disk
   //
   myDifferenceImage.save( myDiffImageFile );
+  emitDashMessage( "Difference Image " + theTestName + prefix, QgsDartMeasurement::ImagePng, myDiffImageFile );
   delete maskImage;
 
   //
diff --git a/src/core/qgsslconnect.cpp b/src/core/qgsslconnect.cpp
new file mode 100644
index 0000000..9ccfe75
--- /dev/null
+++ b/src/core/qgsslconnect.cpp
@@ -0,0 +1,89 @@
+/***************************************************************************
+    qgsslconnect.cpp - thin wrapper class to connect to spatialite databases
+    ----------------------
+    begin                : May 2015
+    copyright            : (C) 2015 by Jürgen fischer
+    email                : jef at norbit dot de
+ ***************************************************************************
+ *                                                                         *
+ *   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 "qgsslconnect.h"
+
+#include <sqlite3.h>
+#include <spatialite.h>
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+QHash<sqlite3 *, void *> QgsSLConnect::mSLconns;
+#endif
+
+int QgsSLConnect::sqlite3_open( const char *filename, sqlite3 **ppDb )
+{
+#if defined(SPATIALITE_HAS_INIT_EX)
+  void *conn = spatialite_alloc_connection();
+#else
+  spatialite_init( 0 );
+#endif
+
+  int res = ::sqlite3_open( filename, ppDb );
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+  if ( res == SQLITE_OK )
+  {
+    spatialite_init_ex( *ppDb, conn, 0 );
+    mSLconns.insert( *ppDb, conn );
+  }
+#endif
+
+  return res;
+}
+
+int QgsSLConnect::sqlite3_close( sqlite3 *db )
+{
+  int res = ::sqlite3_close( db );
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+  if ( mSLconns.contains( db ) )
+    spatialite_cleanup_ex( mSLconns.take( db ) );
+#endif
+
+  return res;
+}
+
+int QgsSLConnect::sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const char *zVfs )
+{
+#if defined(SPATIALITE_HAS_INIT_EX)
+  void *conn = spatialite_alloc_connection();
+#else
+  spatialite_init( 0 );
+#endif
+
+  int res = ::sqlite3_open_v2( filename, ppDb, flags, zVfs );
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+  if ( res == SQLITE_OK )
+  {
+    spatialite_init_ex( *ppDb, conn, 0 );
+    mSLconns.insert( *ppDb, conn );
+  }
+#endif
+
+  return res;
+}
+
+int QgsSLConnect::sqlite3_close_v2( sqlite3 *db )
+{
+  int res = ::sqlite3_close( db );
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+  if ( mSLconns.contains( db ) )
+    spatialite_cleanup_ex( mSLconns.take( db ) );
+#endif
+
+  return res;
+}
diff --git a/src/core/qgsslconnect.h b/src/core/qgsslconnect.h
new file mode 100644
index 0000000..6613765
--- /dev/null
+++ b/src/core/qgsslconnect.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+    qgsslconnect.h - thin wrapper class to connect to spatialite databases
+    ----------------------
+    begin                : May 2015
+    copyright            : (C) 2015 by Jürgen fischer
+    email                : jef at norbit dot de
+ ***************************************************************************
+ *                                                                         *
+ *   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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef QGSSLCONNECT_H
+#define QGSSLCONNECT_H
+
+#include <QHash>
+
+struct sqlite3;
+
+class CORE_EXPORT QgsSLConnect
+{
+  public:
+    static int sqlite3_open( const char *filename, sqlite3 **ppDb );
+    static int sqlite3_close( sqlite3* );
+
+    static int sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
+    static int sqlite3_close_v2( sqlite3* );
+
+#if defined(SPATIALITE_HAS_INIT_EX)
+  private:
+    static QHash<sqlite3 *, void *> mSLconns;
+#endif
+};
+
+#endif
+
diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp
index 5753ccb..494a437 100644
--- a/src/core/qgsvectorfilewriter.cpp
+++ b/src/core/qgsvectorfilewriter.cpp
@@ -27,6 +27,7 @@
 #include "qgsrendererv2.h"
 #include "qgssymbollayerv2.h"
 #include "qgsvectordataprovider.h"
+#include "qgslocalec.h"
 
 #include <QFile>
 #include <QSettings>
@@ -344,6 +345,9 @@ QgsVectorFileWriter::QgsVectorFileWriter(
     OGRFieldType ogrType = OFTString; //default to string
     int ogrWidth = attrField.length();
     int ogrPrecision = attrField.precision();
+    if ( ogrPrecision > 0 )
+      ++ogrWidth;
+
     switch ( attrField.type() )
     {
       case QVariant::LongLong:
@@ -1625,6 +1629,8 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2*
 
 OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature )
 {
+  QgsLocaleNumC l;
+
   OGRFeatureH poFeature = OGR_F_Create( OGR_L_GetLayerDefn( mLayer ) );
 
   qint64 fid = FID_TO_NUMBER( feature.id() );
@@ -1665,6 +1671,8 @@ OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature )
         OGR_F_SetFieldDouble( poFeature, ogrField, attrValue.toDouble() );
         break;
       case QVariant::LongLong:
+      case QVariant::UInt:
+      case QVariant::ULongLong:
       case QVariant::String:
         OGR_F_SetFieldString( poFeature, ogrField, mCodec->fromUnicode( attrValue.toString() ).data() );
         break;
@@ -1685,13 +1693,21 @@ OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature )
                                 attrValue.toDateTime().time().second(),
                                 0 );
         break;
+      case QVariant::Time:
+        OGR_F_SetFieldDateTime( poFeature, ogrField,
+                                0, 0, 0,
+                                attrValue.toDateTime().time().hour(),
+                                attrValue.toDateTime().time().minute(),
+                                attrValue.toDateTime().time().second(),
+                                0 );
+        break;
       case QVariant::Invalid:
         break;
       default:
         mErrorMessage = QObject::tr( "Invalid variant type for field %1[%2]: received %3 with type %4" )
                         .arg( mFields[fldIdx].name() )
                         .arg( ogrField )
-                        .arg( QMetaType::typeName( attrValue.type() ) )
+                        .arg( attrValue.typeName() )
                         .arg( attrValue.toString() );
         QgsMessageLog::logMessage( mErrorMessage, QObject::tr( "OGR" ) );
         mError = ErrFeatureWriteFailed;
@@ -1856,8 +1872,9 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::writeAsVectorFormat( QgsVe
   }
 
   QGis::WkbType wkbType = layer->wkbType();
+  QgsFields fields = skipAttributeCreation ? QgsFields() : layer->pendingFields();
 
-  if ( layer->providerType() == "ogr" )
+  if ( layer->providerType() == "ogr" && layer->dataProvider() )
   {
     QStringList theURIParts = layer->dataProvider()->dataSourceUri().split( "|" );
     QString srcFileName = theURIParts[0];
@@ -1888,9 +1905,24 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::writeAsVectorFormat( QgsVe
       }
     }
   }
+  else if ( layer->providerType() == "spatialite" )
+  {
+    for ( int i = 0; i < fields.size(); i++ )
+    {
+      if ( fields[i].type() == QVariant::LongLong )
+      {
+        QVariant min = layer->minimumValue( i );
+        QVariant max = layer->maximumValue( i );
+        if ( qMax( qAbs( min.toLongLong() ), qAbs( max.toLongLong() ) ) < INT_MAX )
+        {
+          fields[i].setType( QVariant::Int );
+        }
+      }
+    }
+  }
 
   QgsVectorFileWriter* writer =
-    new QgsVectorFileWriter( fileName, fileEncoding, skipAttributeCreation ? QgsFields() : layer->pendingFields(), wkbType, outputCRS, driverName, datasourceOptions, layerOptions, newFilename, symbologyExport );
+    new QgsVectorFileWriter( fileName, fileEncoding, fields, wkbType, outputCRS, driverName, datasourceOptions, layerOptions, newFilename, symbologyExport );
   writer->setSymbologyScaleDenominator( symbologyScale );
 
   if ( newFilename )
diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp
index 5b075f2..9209bc7 100644
--- a/src/core/qgsvectorlayer.cpp
+++ b/src/core/qgsvectorlayer.cpp
@@ -1611,14 +1611,22 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
     QDomElement singleCatDiagramElem = node.firstChildElement( "SingleCategoryDiagramRenderer" );
     if ( !singleCatDiagramElem.isNull() )
     {
-      mDiagramRenderer = new QgsSingleCategoryDiagramRenderer();
-      mDiagramRenderer->readXML( singleCatDiagramElem, this );
+      QDomElement catElem = singleCatDiagramElem.firstChildElement( "DiagramCategory" );
+      if ( !catElem.isNull() && catElem.attribute( "enabled", "1" ) != "0" )
+      {
+        mDiagramRenderer = new QgsSingleCategoryDiagramRenderer();
+        mDiagramRenderer->readXML( singleCatDiagramElem, this );
+      }
     }
     QDomElement linearDiagramElem = node.firstChildElement( "LinearlyInterpolatedDiagramRenderer" );
     if ( !linearDiagramElem.isNull() )
     {
-      mDiagramRenderer = new QgsLinearlyInterpolatedDiagramRenderer();
-      mDiagramRenderer->readXML( linearDiagramElem, this );
+      QDomElement catElem = linearDiagramElem.firstChildElement( "DiagramCategory" );
+      if ( !catElem.isNull() && catElem.attribute( "enabled", "1" ) != "0" )
+      {
+        mDiagramRenderer = new QgsLinearlyInterpolatedDiagramRenderer();
+        mDiagramRenderer->readXML( linearDiagramElem, this );
+      }
     }
 
     if ( mDiagramRenderer )
@@ -2115,6 +2123,9 @@ const QString QgsVectorLayer::editorWidgetV2( const QString& fieldName ) const
 
 const QgsEditorWidgetConfig QgsVectorLayer::editorWidgetV2Config( int fieldIdx ) const
 {
+  if ( fieldIdx < 0 || fieldIdx >= mUpdatedFields.count() )
+    return QgsEditorWidgetConfig();
+
   return mEditorWidgetV2Configs.value( mUpdatedFields[fieldIdx].name() );
 }
 
@@ -2344,7 +2355,7 @@ QgsFeatureList QgsVectorLayer::selectedFeatures()
   {
     // for small amount of selected features, fetch them directly
     // because request with FilterFids would go iterate over the whole layer
-    foreach ( int fid, mSelectedFeatureIds )
+    foreach ( QgsFeatureId fid, mSelectedFeatureIds )
     {
       getFeatures( QgsFeatureRequest( fid ) ).nextFeature( f );
       features << f;
@@ -2613,6 +2624,9 @@ bool QgsVectorLayer::isModified() const
 
 QgsVectorLayer::EditType QgsVectorLayer::editType( int idx )
 {
+  if ( idx < 0 || idx >= mUpdatedFields.count() )
+    return Hidden;
+
   Q_NOWARN_DEPRECATED_PUSH
   return QgsLegacyHelpers::convertEditType( editorWidgetV2( idx ), editorWidgetV2Config( idx ), this, mUpdatedFields[ idx ].name() );
   Q_NOWARN_DEPRECATED_POP
@@ -2620,6 +2634,9 @@ QgsVectorLayer::EditType QgsVectorLayer::editType( int idx )
 
 void QgsVectorLayer::setEditType( int idx, EditType type )
 {
+  if ( idx < 0 || idx >= mUpdatedFields.count() )
+    return;
+
   QgsEditorWidgetConfig cfg;
 
   Q_NOWARN_DEPRECATED_PUSH
@@ -2642,11 +2659,17 @@ void QgsVectorLayer::setEditorLayout( EditorLayout editorLayout )
 
 void QgsVectorLayer::setEditorWidgetV2( int attrIdx, const QString& widgetType )
 {
+  if ( attrIdx < 0 || attrIdx >= mUpdatedFields.count() )
+    return;
+
   mEditorWidgetV2Types[ mUpdatedFields[ attrIdx ].name()] = widgetType;
 }
 
 void QgsVectorLayer::setEditorWidgetV2Config( int attrIdx, const QgsEditorWidgetConfig& config )
 {
+  if ( attrIdx < 0 || attrIdx >= mUpdatedFields.count() )
+    return;
+
   mEditorWidgetV2Configs[ mUpdatedFields[ attrIdx ].name()] = config;
 }
 
@@ -2825,7 +2848,7 @@ int QgsVectorLayer::fieldNameIndex( const QString& fieldName ) const
 
 bool QgsVectorLayer::addJoin( const QgsVectorJoinInfo& joinInfo )
 {
-  return mJoinBuffer->addJoin( joinInfo );
+  return mJoinBuffer && mJoinBuffer->addJoin( joinInfo );
 }
 
 void QgsVectorLayer::checkJoinLayerRemove( QString theLayerId )
@@ -2835,12 +2858,16 @@ void QgsVectorLayer::checkJoinLayerRemove( QString theLayerId )
 
 void QgsVectorLayer::removeJoin( const QString& joinLayerId )
 {
-  mJoinBuffer->removeJoin( joinLayerId );
+  if ( mJoinBuffer )
+    mJoinBuffer->removeJoin( joinLayerId );
 }
 
-const QList< QgsVectorJoinInfo >& QgsVectorLayer::vectorJoins() const
+const QList< QgsVectorJoinInfo > QgsVectorLayer::vectorJoins() const
 {
-  return mJoinBuffer->vectorJoins();
+  if ( mJoinBuffer )
+    return mJoinBuffer->vectorJoins();
+  else
+    return QList< QgsVectorJoinInfo >();
 }
 
 void QgsVectorLayer::addExpressionField( const QString& exp, const QgsField& fld )
diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h
index ca4d692..487aeb5 100644
--- a/src/core/qgsvectorlayer.h
+++ b/src/core/qgsvectorlayer.h
@@ -647,7 +647,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
     /** Removes a vector layer join */
     void removeJoin( const QString& joinLayerId );
 
-    const QList< QgsVectorJoinInfo >& vectorJoins() const;
+    const QList<QgsVectorJoinInfo> vectorJoins() const;
 
     /**
      * Add a new field which is calculated by the expression specified
diff --git a/src/core/qgsvectorlayereditbuffer.cpp b/src/core/qgsvectorlayereditbuffer.cpp
index 00b4095..a80a9d9 100644
--- a/src/core/qgsvectorlayereditbuffer.cpp
+++ b/src/core/qgsvectorlayereditbuffer.cpp
@@ -162,9 +162,6 @@ bool QgsVectorLayerEditBuffer::deleteFeature( QgsFeatureId fid )
 
 bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* geom )
 {
-  if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
-    return false;
-
   if ( !L->hasGeometryType() )
   {
     return false;
@@ -175,6 +172,8 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
     if ( !mAddedFeatures.contains( fid ) )
       return false;
   }
+  else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
+    return false;
 
   // TODO: check compatible geometry
 
@@ -185,14 +184,15 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
 
 bool QgsVectorLayerEditBuffer::changeAttributeValue( QgsFeatureId fid, int field, const QVariant &newValue, const QVariant &oldValue )
 {
-  if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) )
-    return false;
-
   if ( FID_IS_NEW( fid ) )
   {
     if ( !mAddedFeatures.contains( fid ) )
       return false;
   }
+  else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) )
+  {
+    return false;
+  }
 
   if ( field < 0 || field >= L->pendingFields().count() ||
        L->pendingFields().fieldOrigin( field ) == QgsFields::OriginJoin ||
diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp
index c9b3d56..38fa791 100644
--- a/src/core/qgsvectorlayerfeatureiterator.cpp
+++ b/src/core/qgsvectorlayerfeatureiterator.cpp
@@ -90,13 +90,12 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
     , mFetchedFid( false )
     , mEditGeometrySimplifier( 0 )
 {
+  prepareExpressions();
 
   // prepare joins: may add more attributes to fetch (in order to allow join)
   if ( mSource->mJoinBuffer->containsJoins() )
     prepareJoins();
 
-  prepareExpressions();
-
   mHasVirtualAttributes = !mFetchJoinInfo.isEmpty() || !mExpressionFieldInfo.isEmpty();
 
   // by default provider's request is the same
@@ -507,7 +506,7 @@ void QgsVectorLayerFeatureIterator::prepareExpressions()
         if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes )
         {
           QgsAttributeList attrs;
-          Q_FOREACH ( const QString& col, exp->referencedColumns() )
+          Q_FOREACH( const QString& col, exp->referencedColumns() )
           {
             attrs.append( mSource->mFields.fieldNameIndex( col ) );
           }
diff --git a/src/core/qgsvectorlayerjoinbuffer.cpp b/src/core/qgsvectorlayerjoinbuffer.cpp
index 2308299..49dd171 100644
--- a/src/core/qgsvectorlayerjoinbuffer.cpp
+++ b/src/core/qgsvectorlayerjoinbuffer.cpp
@@ -237,7 +237,8 @@ void QgsVectorLayerJoinBuffer::updateFields( QgsFields& fields )
         continue;
 
       //skip the join field to avoid double field names (fields often have the same name)
-      if ( joinFields[idx].name() != joinFieldName )
+      // when using subset of field, use all the selected fields
+      if ( hasSubset || joinFields[idx].name() != joinFieldName )
       {
         QgsField f = joinFields[idx];
         f.setName( prefix + f.name() );
diff --git a/src/core/raster/qgsrasterblock.cpp b/src/core/raster/qgsrasterblock.cpp
index cbfcf8c..78aece3 100644
--- a/src/core/raster/qgsrasterblock.cpp
+++ b/src/core/raster/qgsrasterblock.cpp
@@ -633,6 +633,33 @@ bool QgsRasterBlock::setIsNoDataExcept( const QRect & theExceptRect )
   }
 }
 
+void QgsRasterBlock::setIsData( int row, int column )
+{
+  setIsData(( qgssize )row*mWidth + column );
+}
+
+void QgsRasterBlock::setIsData( qgssize index )
+{
+  if ( mHasNoDataValue )
+  {
+    //no data value set, so mNoDataBitmap is not being used
+    return;
+  }
+
+  if ( mNoDataBitmap == 0 )
+  {
+    return;
+  }
+
+  // TODO: optimize
+  int row = ( int ) index / mWidth;
+  int column = index % mWidth;
+  qgssize byte = ( qgssize )row * mNoDataBitmapWidth + column / 8;
+  int bit = column % 8;
+  int nodata = 0x80 >> bit;
+  mNoDataBitmap[byte] = mNoDataBitmap[byte] & ~nodata;
+}
+
 char * QgsRasterBlock::bits( qgssize index )
 {
   // Not testing type to avoid too much overhead because this method is called per pixel
diff --git a/src/core/raster/qgsrasterblock.h b/src/core/raster/qgsrasterblock.h
index d720d85..c36a796 100644
--- a/src/core/raster/qgsrasterblock.h
+++ b/src/core/raster/qgsrasterblock.h
@@ -242,6 +242,23 @@ class CORE_EXPORT QgsRasterBlock
      *  @return true on success */
     bool setIsNoDataExcept( const QRect & theExceptRect );
 
+    /** \brief Remove no data flag on pixel. If the raster block does not have an explicit
+     * no data value set then an internal map of no data pixels is maintained for the block.
+     * In this case it is possible to reset a pixel to flag it as having valid data using this
+     * method. This method has no effect for raster blocks with an explicit no data value set.
+     *  @param row row index
+     *  @param column column index
+     *  @note added in QGIS 2.10 */
+    void setIsData( int row, int column );
+
+    /** \brief Remove no data flag on pixel. If the raster block does not have an explicit
+     * no data value set then an internal map of no data pixels is maintained for the block.
+     * In this case it is possible to reset a pixel to flag it as having valid data using this
+     * method. This method has no effect for raster blocks with an explicit no data value set.
+     *  @param index data matrix index (long type in Python)
+     *  @note added in QGIS 2.10 */
+    void setIsData( qgssize index );
+
     /** \brief Get pointer to data
      *  @param row row index
      *  @param column column index
diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp
index ee0b496..ed49885 100644
--- a/src/core/raster/qgsrasterlayer.cpp
+++ b/src/core/raster/qgsrasterlayer.cpp
@@ -708,7 +708,19 @@ void QgsRasterLayer::setDataProvider( QString const & provider )
   QgsDebugMsg( "dataType = " + QString::number( mDataProvider->dataType( 1 ) ) );
   if (( mDataProvider->bandCount() > 1 ) )
   {
-    mRasterType = Multiband;
+    // handle singleband gray with alpha
+    if ( mDataProvider->bandCount() == 2
+         && (( mDataProvider->colorInterpretation( 1 ) == QgsRaster::GrayIndex
+               && mDataProvider->colorInterpretation( 2 ) == QgsRaster::AlphaBand )
+             || ( mDataProvider->colorInterpretation( 1 ) == QgsRaster::AlphaBand
+                  && mDataProvider->colorInterpretation( 2 ) == QgsRaster::GrayIndex ) ) )
+    {
+      mRasterType = GrayOrUndefined;
+    }
+    else
+    {
+      mRasterType = Multiband;
+    }
   }
   else if ( mDataProvider->dataType( 1 ) == QGis::ARGB32
             ||  mDataProvider->dataType( 1 ) == QGis::ARGB32_Premultiplied )
diff --git a/src/core/raster/qgsrasterprojector.cpp b/src/core/raster/qgsrasterprojector.cpp
index e1786ac..6c38ee8 100644
--- a/src/core/raster/qgsrasterprojector.cpp
+++ b/src/core/raster/qgsrasterprojector.cpp
@@ -934,6 +934,7 @@ QgsRasterBlock * QgsRasterProjector::block( int bandNo, QgsRectangle  const & ex
         continue;
       }
       memcpy( destBits, srcBits, pixelSize );
+      outputBlock->setIsData( i, j );
     }
   }
 
diff --git a/src/core/raster/qgssinglebandcolordatarenderer.cpp b/src/core/raster/qgssinglebandcolordatarenderer.cpp
index f5c8f1b..8da3a41 100644
--- a/src/core/raster/qgssinglebandcolordatarenderer.cpp
+++ b/src/core/raster/qgssinglebandcolordatarenderer.cpp
@@ -87,13 +87,15 @@ QgsRasterBlock* QgsSingleBandColorDataRenderer::block( int bandNo, QgsRectangle
     return outputBlock;
   }
 
+  // make sure input is also premultiplied!
+  inputBlock->convert( QGis::ARGB32_Premultiplied );
+
+  QRgb* inputBits = ( QRgb* )inputBlock->bits();
+  QRgb* outputBits = ( QRgb* )outputBlock->bits();
   for ( qgssize i = 0; i < ( qgssize )width*height; i++ )
   {
-    QRgb pixelColor;
-    QRgb c = inputBlock->color( i );
-    double alpha = qAlpha( c );
-    pixelColor = qRgba( mOpacity * qRed( c ), mOpacity * qGreen( c ), mOpacity * qBlue( c ), mOpacity * alpha );
-    outputBlock->setColor( i,  pixelColor );
+    QRgb c = inputBits[i];
+    outputBits[i] = qRgba( mOpacity * qRed( c ), mOpacity * qGreen( c ), mOpacity * qBlue( c ), mOpacity * qAlpha( c ) );
   }
 
   delete inputBlock;
diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
index 6b52eef..224af8c 100644
--- a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
@@ -25,8 +25,17 @@
 #include <QDomDocument>
 #include <QDomElement>
 
-QgsEllipseSymbolLayerV2::QgsEllipseSymbolLayerV2(): mSymbolName( "circle" ), mSymbolWidth( 4 ), mSymbolWidthUnit( QgsSymbolV2::MM ), mSymbolHeight( 3 ),
-    mSymbolHeightUnit( QgsSymbolV2::MM ), mFillColor( Qt::white ), mOutlineColor( Qt::black ), mOutlineStyle( Qt::SolidLine ), mOutlineWidth( 0 ), mOutlineWidthUnit( QgsSymbolV2::MM )
+QgsEllipseSymbolLayerV2::QgsEllipseSymbolLayerV2()
+    : mSymbolName( "circle" )
+    , mSymbolWidth( 4 )
+    , mSymbolWidthUnit( QgsSymbolV2::MM )
+    , mSymbolHeight( 3 )
+    , mSymbolHeightUnit( QgsSymbolV2::MM )
+    , mFillColor( Qt::white )
+    , mOutlineColor( Qt::black )
+    , mOutlineStyle( Qt::SolidLine )
+    , mOutlineWidth( 0 )
+    , mOutlineWidthUnit( QgsSymbolV2::MM )
 {
   mPen.setColor( mOutlineColor );
   mPen.setStyle( mOutlineStyle );
@@ -623,7 +632,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
   QgsExpression* heightExpression = expression( "height" );
   if ( heightExpression ) //1. priority: data defined setting on symbol layer level
   {
-    symbolHeight =  heightExpression->evaluate( const_cast<QgsFeature*>( f ) ).toDouble();
+    symbolHeight = heightExpression->evaluate( const_cast<QgsFeature*>( f ) ).toDouble();
   }
   else if ( context->renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level
   {
@@ -722,41 +731,52 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
       }
       //close ellipse with first point
       line.push_back( line.at( 0 ) );
-      e.writePolyline( line, layerName, "SOLID", oc, outlineWidth, true );
+      if ( mBrush.style() != Qt::NoBrush )
+        e.writePolygon( QgsPolygon() << line, layerName, "SOLID", fc );
+      if ( mPen.style() != Qt::NoPen )
+        e.writePolyline( line, layerName, "CONTINUOUS", oc, outlineWidth );
     }
   }
   else if ( symbolName == "rectangle" )
   {
-    QPointF pt1( t.map( QPointF( -halfWidth, -halfHeight ) ) );
-    QPointF pt2( t.map( QPointF( halfWidth, -halfHeight ) ) );
-    QPointF pt3( t.map( QPointF( -halfWidth, halfHeight ) ) );
-    QPointF pt4( t.map( QPointF( halfWidth, halfHeight ) ) );
-    e.writeSolid( layerName, fc, pt1, pt2, pt3, pt4 );
+    QgsPolygon p( 1 );
+    p[0].resize( 5 );
+    p[0][0] = t.map( QPointF( -halfWidth, -halfHeight ) );
+    p[0][1] = t.map( QPointF( halfWidth, -halfHeight ) );
+    p[0][2] = t.map( QPointF( halfWidth, halfHeight ) );
+    p[0][3] = t.map( QPointF( -halfWidth, halfHeight ) );
+    p[0][4] = p[0][0];
+    if ( mBrush.style() != Qt::NoBrush )
+      e.writePolygon( p, layerName, "SOLID", fc );
+    if ( mPen.style() != Qt::NoPen )
+      e.writePolyline( p[0], layerName, "CONTINUOUS", oc, outlineWidth );
     return true;
   }
-  else if ( symbolName == "cross" )
+  else if ( symbolName == "cross" && mPen.style() != Qt::NoPen )
   {
-    QgsPolyline line1( 2 );
-    QPointF pt1( t.map( QPointF( -halfWidth, 0 ) ) );
-    QPointF pt2( t.map( QPointF( halfWidth, 0 ) ) );
-    line1[0] = pt1;
-    line1[1] = pt2;
-    e.writePolyline( line1, layerName, "CONTINUOUS", oc, outlineWidth, false );
-    QgsPolyline line2( 2 );
-    QPointF pt3( t.map( QPointF( 0, halfHeight ) ) );
-    QPointF pt4( t.map( QPointF( 0, -halfHeight ) ) );
-    line2[0] = pt3;
-    line2[1] = pt4;
-    e.writePolyline( line2, layerName, "CONTINUOUS", oc, outlineWidth, false );
+    QgsPolyline line( 2 );
+    line[0] = t.map( QPointF( -halfWidth, 0 ) );
+    line[1] = t.map( QPointF( halfWidth, 0 ) );
+    e.writePolyline( line, layerName, "CONTINUOUS", oc, outlineWidth );
+
+    line[0] = t.map( QPointF( 0, halfHeight ) );
+    line[1] = t.map( QPointF( 0, -halfHeight ) );
+    e.writePolyline( line, layerName, "CONTINUOUS", oc, outlineWidth );
+
     return true;
   }
   else if ( symbolName == "triangle" )
   {
-    QPointF pt1( t.map( QPointF( -halfWidth, -halfHeight ) ) );
-    QPointF pt2( t.map( QPointF( halfWidth, -halfHeight ) ) );
-    QPointF pt3( t.map( QPointF( 0, halfHeight ) ) );
-    QPointF pt4( t.map( QPointF( 0, halfHeight ) ) );
-    e.writeSolid( layerName, fc, pt1, pt2, pt3, pt4 );
+    QgsPolygon p( 1 );
+    p[0].resize( 4 );
+    p[0][0] = QPointF( t.map( QPointF( -halfWidth, -halfHeight ) ) );
+    p[0][1] = QPointF( t.map( QPointF( halfWidth, -halfHeight ) ) );
+    p[0][2] = QPointF( t.map( QPointF( 0, halfHeight ) ) );
+    p[0][3] = p[0][0];
+    if ( mBrush.style() != Qt::NoBrush )
+      e.writePolygon( p, layerName, "SOLID", fc );
+    if ( mPen.style() != Qt::NoPen )
+      e.writePolyline( p[0], layerName, "CONTINUOUS", oc, outlineWidth );
     return true;
   }
 
diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
index 87866ec..a997ee8 100644
--- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
@@ -2314,6 +2314,14 @@ QgsSymbolV2* QgsLinePatternFillSymbolLayer::subSymbol()
   return mFillLineSymbol;
 }
 
+QSet<QString> QgsLinePatternFillSymbolLayer::usedAttributes() const
+{
+  QSet<QString> attr = QgsFillSymbolLayerV2::usedAttributes();
+  if ( mFillLineSymbol )
+    attr.unite( mFillLineSymbol->usedAttributes() );
+  return attr;
+}
+
 double QgsLinePatternFillSymbolLayer::estimateMaxBleed() const
 {
   return 0;
diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h
index 6e46a53..c7d6308 100644
--- a/src/core/symbology-ng/qgsfillsymbollayerv2.h
+++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h
@@ -925,6 +925,8 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer
     bool setSubSymbol( QgsSymbolV2* symbol ) override;
     QgsSymbolV2* subSymbol() override;
 
+    QSet<QString> usedAttributes() const override;
+
   protected:
     /**Distance (in mm or map units) between lines*/
     double mDistance;
diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp
index 33adf94..aede9cc 100644
--- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp
@@ -1495,6 +1495,14 @@ QgsMapUnitScale QgsMarkerLineSymbolLayerV2::mapUnitScale() const
   return QgsMapUnitScale();
 }
 
+QSet<QString> QgsMarkerLineSymbolLayerV2::usedAttributes() const
+{
+  QSet<QString> attr = QgsLineSymbolLayerV2::usedAttributes();
+  if ( mMarker )
+    attr.unite( mMarker->usedAttributes() );
+  return attr;
+}
+
 double QgsMarkerLineSymbolLayerV2::estimateMaxBleed() const
 {
   return ( mMarker->size() / 2.0 ) + mOffset;
diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.h b/src/core/symbology-ng/qgslinesymbollayerv2.h
index f2627a0..840c6bd 100644
--- a/src/core/symbology-ng/qgslinesymbollayerv2.h
+++ b/src/core/symbology-ng/qgslinesymbollayerv2.h
@@ -256,6 +256,8 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2
     void setMapUnitScale( const QgsMapUnitScale& scale ) override;
     QgsMapUnitScale mapUnitScale() const override;
 
+    QSet<QString> usedAttributes() const override;
+
   protected:
 
     void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
index 13e3b4d..2b01815 100644
--- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
@@ -365,27 +365,27 @@ void QgsSimpleMarkerSymbolLayerV2::stopRender( QgsSymbolV2RenderContext& context
 
 bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
 {
-  mPolygon.clear();
+  return prepareShape( name.isNull() ? mName : name, mPolygon );
+}
 
-  if ( name.isNull() )
-  {
-    name = mName;
-  }
+bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name, QPolygonF &polygon ) const
+{
+  polygon.clear();
 
   if ( name == "square" || name == "rectangle" )
   {
-    mPolygon = QPolygonF( QRectF( QPointF( -1, -1 ), QPointF( 1, 1 ) ) );
+    polygon = QPolygonF( QRectF( QPointF( -1, -1 ), QPointF( 1, 1 ) ) );
     return true;
   }
   else if ( name == "diamond" )
   {
-    mPolygon << QPointF( -1, 0 ) << QPointF( 0, 1 )
+    polygon << QPointF( -1, 0 ) << QPointF( 0, 1 )
     << QPointF( 1, 0 ) << QPointF( 0, -1 );
     return true;
   }
   else if ( name == "pentagon" )
   {
-    mPolygon << QPointF( sin( DEG2RAD( 288.0 ) ), - cos( DEG2RAD( 288.0 ) ) )
+    polygon << QPointF( sin( DEG2RAD( 288.0 ) ), - cos( DEG2RAD( 288.0 ) ) )
     << QPointF( sin( DEG2RAD( 216.0 ) ), - cos( DEG2RAD( 216.0 ) ) )
     << QPointF( sin( DEG2RAD( 144.0 ) ), - cos( DEG2RAD( 144.0 ) ) )
     << QPointF( sin( DEG2RAD( 72.0 ) ), - cos( DEG2RAD( 72.0 ) ) )
@@ -394,12 +394,12 @@ bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
   }
   else if ( name == "triangle" )
   {
-    mPolygon << QPointF( -1, 1 ) << QPointF( 1, 1 ) << QPointF( 0, -1 );
+    polygon << QPointF( -1, 1 ) << QPointF( 1, 1 ) << QPointF( 0, -1 );
     return true;
   }
   else if ( name == "equilateral_triangle" )
   {
-    mPolygon << QPointF( sin( DEG2RAD( 240.0 ) ), - cos( DEG2RAD( 240.0 ) ) )
+    polygon << QPointF( sin( DEG2RAD( 240.0 ) ), - cos( DEG2RAD( 240.0 ) ) )
     << QPointF( sin( DEG2RAD( 120.0 ) ), - cos( DEG2RAD( 120.0 ) ) )
     << QPointF( 0, -1 );
     return true;
@@ -408,7 +408,7 @@ bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
   {
     double sixth = 1.0 / 3;
 
-    mPolygon << QPointF( 0, -1 )
+    polygon << QPointF( 0, -1 )
     << QPointF( -sixth, -sixth )
     << QPointF( -1, -sixth )
     << QPointF( -sixth, 0 )
@@ -424,7 +424,7 @@ bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
   {
     double inner_r = cos( DEG2RAD( 72.0 ) ) / cos( DEG2RAD( 36.0 ) );
 
-    mPolygon << QPointF( inner_r * sin( DEG2RAD( 324.0 ) ), - inner_r * cos( DEG2RAD( 324.0 ) ) )  // 324
+    polygon << QPointF( inner_r * sin( DEG2RAD( 324.0 ) ), - inner_r * cos( DEG2RAD( 324.0 ) ) )  // 324
     << QPointF( sin( DEG2RAD( 288.0 ) ), - cos( DEG2RAD( 288 ) ) )    // 288
     << QPointF( inner_r * sin( DEG2RAD( 252.0 ) ), - inner_r * cos( DEG2RAD( 252.0 ) ) )   // 252
     << QPointF( sin( DEG2RAD( 216.0 ) ), - cos( DEG2RAD( 216.0 ) ) )   // 216
@@ -438,8 +438,7 @@ bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
   }
   else if ( name == "arrow" )
   {
-    mPolygon
-    << QPointF( 0, -1 )
+    polygon << QPointF( 0, -1 )
     << QPointF( 0.5,  -0.5 )
     << QPointF( 0.25, -0.5 )
     << QPointF( 0.25,  1 )
@@ -450,7 +449,7 @@ bool QgsSimpleMarkerSymbolLayerV2::prepareShape( QString name )
   }
   else if ( name == "filled_arrowhead" )
   {
-    mPolygon << QPointF( 0, 0 ) << QPointF( -1, 1 ) << QPointF( -1, -1 );
+    polygon << QPointF( 0, 0 ) << QPointF( -1, 1 ) << QPointF( -1, -1 );
     return true;
   }
 
@@ -842,7 +841,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
   {
     if ( sizeExpression )
     {
-      size = sizeExpression->evaluate( const_cast<QgsFeature*>( context->feature() ) ).toDouble();
+      size = sizeExpression->evaluate( *f ).toDouble();
     }
 
     switch ( mScaleMethod )
@@ -867,7 +866,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
   QgsExpression* outlineWidthExpression = expression( "outline_width" );
   if ( context && outlineWidthExpression )
   {
-    outlineWidth = outlineWidthExpression->evaluate( const_cast<QgsFeature*>( context->feature() ) ).toDouble();
+    outlineWidth = outlineWidthExpression->evaluate( *f ).toDouble();
   }
   if ( mSizeUnit == QgsSymbolV2::MM )
   {
@@ -904,8 +903,16 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
   QgsExpression* angleExpression = expression( "angle" );
   if ( context && angleExpression )
   {
-    angle = angleExpression->evaluate( const_cast<QgsFeature*>( context->feature() ) ).toDouble();
+    angle = angleExpression->evaluate( *f ).toDouble();
   }
+
+  QString name( mName );
+  QgsExpression* nameExpression = expression( "name" );
+  if ( context && nameExpression )
+  {
+    name = nameExpression->evaluate( *f ).toString();
+  }
+
   angle = -angle; //rotation in Qt is counterclockwise
   if ( angle )
     off = _rotatedOffset( off, angle );
@@ -921,134 +928,82 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
   if ( angle != 0 )
     t.rotate( angle );
 
-  //data defined symbol name
-
-  if ( mName == "circle" )
+  QPolygonF polygon;
+  if ( prepareShape( name, polygon ) )
   {
-    if ( mBrush.style() != Qt::NoBrush )
-      e.writeFilledCircle( layerName, bc, shift, halfSize );
-    if ( mPen.style() != Qt::NoPen )
-      e.writeCircle( layerName, pc, shift, halfSize, "CONTINUOUS", outlineWidth );
-  }
-  else if ( mName == "square" || mName == "rectangle" )
-  {
-    // pt1 pt2
-    // pt3 pt4
-    QPointF pt1 = t.map( QPointF( -halfSize, -halfSize ) );
-    QPointF pt2 = t.map( QPointF( halfSize, -halfSize ) );
-    QPointF pt3 = t.map( QPointF( -halfSize, halfSize ) );
-    QPointF pt4 = t.map( QPointF( halfSize, halfSize ) );
+    t.scale( halfSize, -halfSize );
 
-    if ( mBrush.style() != Qt::NoBrush )
-      e.writeSolid( layerName, bc, pt1, pt2, pt3, pt4 );
+    polygon = t.map( polygon );
 
-    if ( mPen.style() != Qt::NoPen )
-    {
-      e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt2, pt4, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt4, pt3, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt3, pt1, layerName, "CONTINUOUS", pc, outlineWidth );
-    }
-  }
-  else if ( mName == "diamond" )
-  {
-    QPointF pt1 = t.map( QPointF( -halfSize, 0 ) );
-    QPointF pt2 = t.map( QPointF( 0, -halfSize ) );
-    QPointF pt3 = t.map( QPointF( 0, halfSize ) );
-    QPointF pt4 = t.map( QPointF( halfSize, 0 ) );
+    QgsPolygon p( 1 );
+    p.resize( 1 );
+    p[0].resize( polygon.size() + 1 );
+    int i = 0;
+    for ( i = 0; i < polygon.size(); i++ )
+      p[0][i] = polygon[i];
+    p[0][i] = p[0][0];
 
     if ( mBrush.style() != Qt::NoBrush )
-      e.writeSolid( layerName, bc, pt1, pt2, pt3, pt4 );
-
+      e.writePolygon( p, layerName, "SOLID", bc );
     if ( mPen.style() != Qt::NoPen )
-    {
-      e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt2, pt3, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt3, pt4, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt4, pt1, layerName, "CONTINUOUS", pc, outlineWidth );
-    }
+      e.writePolyline( p[0], layerName, "CONTINUOUS", pc, outlineWidth );
   }
-  else if ( mName == "triangle" )
+  else if ( name == "circle" )
   {
-    QPointF pt1 = t.map( QPointF( -halfSize, -halfSize ) );
-    QPointF pt2 = t.map( QPointF( halfSize, -halfSize ) );
-    QPointF pt3 = t.map( QPointF( 0, halfSize ) );
-
     if ( mBrush.style() != Qt::NoBrush )
-      e.writeSolid( layerName, bc, pt1, pt2, pt3, pt3 );
-
+      e.writeFilledCircle( layerName, bc, shift, halfSize );
     if ( mPen.style() != Qt::NoPen )
-    {
-      e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt2, pt3, layerName, "CONTINUOUS", pc, outlineWidth );
-      e.writeLine( pt3, pt1, layerName, "CONTINUOUS", pc, outlineWidth );
-    }
-  }
-#if 0
-  else if ( mName == "equilateral_triangle" )
-  {
-
+      e.writeCircle( layerName, pc, shift, halfSize, "CONTINUOUS", outlineWidth );
   }
-#endif
-  else if ( mName == "line" )
+  else if ( name == "line" )
   {
-    QPointF pt1 = t.map( QPointF( 0, halfSize ) );
-    QPointF pt2 = t.map( QPointF( 0, -halfSize ) );
+    QPointF pt1 = t.map( QPointF( 0, -halfSize ) );
+    QPointF pt2 = t.map( QPointF( 0, halfSize ) );
 
     if ( mPen.style() != Qt::NoPen )
       e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
   }
-  else if ( mName == "cross" )
+  else if ( name == "cross" )
   {
-    QPointF pt1 = t.map( QPointF( -halfSize, 0 ) );
-    QPointF pt2 = t.map( QPointF( halfSize, 0 ) );
-    QPointF pt3 = t.map( QPointF( 0, -halfSize ) );
-    QPointF pt4 = t.map( QPointF( 0, halfSize ) );
-
     if ( mPen.style() != Qt::NoPen )
     {
+      QPointF pt1 = t.map( QPointF( -halfSize, 0 ) );
+      QPointF pt2 = t.map( QPointF( halfSize, 0 ) );
+      QPointF pt3 = t.map( QPointF( 0, -halfSize ) );
+      QPointF pt4 = t.map( QPointF( 0, halfSize ) );
+
       e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
       e.writeLine( pt3, pt4, layerName, "CONTINUOUS", pc, outlineWidth );
     }
   }
-  else if ( mName == "x" || mName == "cross2" )
+  else if ( name == "x" || name == "cross2" )
   {
-    QPointF pt1 = t.map( QPointF( -halfSize, -halfSize ) );
-    QPointF pt2 = t.map( QPointF( halfSize, halfSize ) );
-    QPointF pt3 = t.map( QPointF( -halfSize, halfSize ) );
-    QPointF pt4 = t.map( QPointF( halfSize, -halfSize ) );
-
     if ( mPen.style() != Qt::NoPen )
     {
+      QPointF pt1 = t.map( QPointF( -halfSize, -halfSize ) );
+      QPointF pt2 = t.map( QPointF( halfSize, halfSize ) );
+      QPointF pt3 = t.map( QPointF( halfSize, -halfSize ) );
+      QPointF pt4 = t.map( QPointF( -halfSize, halfSize ) );
+
       e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
       e.writeLine( pt3, pt4, layerName, "CONTINUOUS", pc, outlineWidth );
     }
   }
-  else if ( mName == "arrowhead" )
+  else if ( name == "arrowhead" )
   {
-    QPointF pt1 = t.map( QPointF( -halfSize, halfSize ) );
-    QPointF pt2 = t.map( QPointF( 0, 0 ) );
-    QPointF pt3 = t.map( QPointF( -halfSize, -halfSize ) );
-
     if ( mPen.style() != Qt::NoPen )
     {
+      QPointF pt1 = t.map( QPointF( -halfSize, halfSize ) );
+      QPointF pt2 = t.map( QPointF( 0, 0 ) );
+      QPointF pt3 = t.map( QPointF( -halfSize, -halfSize ) );
+
       e.writeLine( pt1, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
       e.writeLine( pt3, pt2, layerName, "CONTINUOUS", pc, outlineWidth );
     }
   }
-  else if ( mName == "filled_arrowhead" )
-  {
-    QPointF pt1 = t.map( QPointF( -halfSize, halfSize ) );
-    QPointF pt2 = t.map( QPointF( 0, 0 ) );
-    QPointF pt3 = t.map( QPointF( -halfSize, -halfSize ) );
-
-    if ( mBrush.style() != Qt::NoBrush )
-    {
-      e.writeSolid( layerName, bc, pt1, pt2, pt3, pt3 );
-    }
-  }
   else
   {
+    QgsDebugMsg( QString( "Unsupported dxf marker name %1" ).arg( name ) );
     return false;
   }
 
@@ -1608,15 +1563,6 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
   Q_UNUSED( layerName );
   Q_UNUSED( shift ); //todo...
 
-  QSvgRenderer r( mPath );
-  if ( !r.isValid() )
-  {
-    return false;
-  }
-
-  QgsDxfPaintDevice pd( &e );
-  pd.setDrawingSize( QSizeF( r.defaultSize() ) );
-
   //size
   double size = mSize;
   QgsExpression* sizeExpression = expression( "size" );
@@ -1651,7 +1597,7 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
   QgsExpression* offsetExpression = expression( "offset" );
   if ( offsetExpression )
   {
-    QString offsetString =  offsetExpression->evaluate( *f ).toString();
+    QString offsetString = offsetExpression->evaluate( *f ).toString();
     offset = QgsSymbolLayerV2Utils::decodePoint( offsetString );
   }
   double offsetX = offset.x();
@@ -1674,6 +1620,54 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
   if ( angle )
     outputOffset = _rotatedOffset( outputOffset, angle );
 
+  QString path = mPath;
+  QgsExpression *nameExpression = expression( "name" );
+  if ( nameExpression )
+  {
+    path = nameExpression->evaluate( *f ).toString();
+  }
+
+  double outlineWidth = mOutlineWidth;
+  QgsExpression *outlineWidthExpression = expression( "outline_width" );
+  if ( outlineWidthExpression )
+  {
+    outlineWidth = outlineWidthExpression->evaluate( *f ).toDouble();
+  }
+
+  QColor fillColor = mFillColor;
+  QgsExpression *fillExpression = expression( "fill" );
+  if ( fillExpression )
+  {
+    QString colorString = fillExpression->evaluate( *f ).toString();
+    if ( !fillExpression->hasEvalError() )
+      fillColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
+  }
+
+  QColor outlineColor = mOutlineColor;
+  QgsExpression *outlineExpression = expression( "outline" );
+  if ( outlineExpression )
+  {
+    QString colorString = outlineExpression->evaluate( *f ).toString();
+    if ( !outlineExpression->hasEvalError() )
+      outlineColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
+  }
+
+  const QByteArray &svgContent = QgsSvgCache::instance()->svgContent( path, size, fillColor, outlineColor, outlineWidth,
+                                 context->renderContext().scaleFactor(),
+                                 context->renderContext().rasterScaleFactor() );
+
+  //if current entry image is 0: cache image for entry
+  // checks to see if image will fit into cache
+  //update stats for memory usage
+  QSvgRenderer r( svgContent );
+  if ( !r.isValid() )
+  {
+    return false;
+  }
+
+  QgsDxfPaintDevice pd( &e );
+  pd.setDrawingSize( QSizeF( r.defaultSize() ) );
+
   QPainter p;
   p.begin( &pd );
   if ( !qgsDoubleNear( angle, 0.0 ) )
diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.h b/src/core/symbology-ng/qgsmarkersymbollayerv2.h
index e5905e9..857604f 100644
--- a/src/core/symbology-ng/qgsmarkersymbollayerv2.h
+++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.h
@@ -108,9 +108,10 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2
     void drawMarker( QPainter* p, QgsSymbolV2RenderContext& context );
 
     bool prepareShape( QString name = QString() );
+    bool prepareShape( QString name, QPolygonF &polygon ) const;
     bool preparePath( QString name = QString() );
 
-    /**Prepares cache image
+    /** Prepares cache image
     @return true in case of success, false if cache image size too large*/
     bool prepareCache( QgsSymbolV2RenderContext& context );
 
diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp
index ac89ef1..afc4785 100644
--- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp
+++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp
@@ -85,6 +85,12 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender
   if ( !feature.geometry() )
     return false;
 
+  QgsSymbolV2* symbol = firstSymbolForFeature( mRenderer, feature );
+
+  //if the feature has no symbol (eg, no matching rule in a rule-based renderer), skip it
+  if ( !symbol )
+    return false;
+
   //point position in screen coords
   QgsGeometry* geom = feature.geometry();
   QGis::WkbType geomType = geom->wkbType();
@@ -103,7 +109,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender
     mSpatialIndex->insertFeature( feature );
     // create new group
     DisplacementGroup newGroup;
-    newGroup.insert( feature.id(), feature );
+    newGroup.insert( feature.id(), qMakePair( feature, symbol ) );
     mDisplacementGroups.push_back( newGroup );
     // add to group index
     mGroupIndex.insert( feature.id(), mDisplacementGroups.count() - 1 );
@@ -117,7 +123,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender
   DisplacementGroup& group = mDisplacementGroups[groupIdx];
 
   // add to a group
-  group.insert( feature.id(), feature );
+  group.insert( feature.id(), qMakePair( feature, symbol ) );
   // add to group index
   mGroupIndex.insert( feature.id(), groupIdx );
   return true;
@@ -125,7 +131,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender
 
 void QgsPointDisplacementRenderer::drawGroup( const DisplacementGroup& group, QgsRenderContext& context )
 {
-  const QgsFeature& feature = group.begin().value();
+  const QgsFeature& feature = group.begin().value().first;
   bool selected = mSelectedFeatures.contains( feature.id() ); // maybe we should highlight individual features instead of the whole group?
 
   QPointF pt;
@@ -137,9 +143,8 @@ void QgsPointDisplacementRenderer::drawGroup( const DisplacementGroup& group, Qg
 
   for ( DisplacementGroup::const_iterator attIt = group.constBegin(); attIt != group.constEnd(); ++attIt )
   {
-    labelAttributeList << ( mDrawLabels ? getLabel( attIt.value() ) : QString() );
-    QgsFeature& f = const_cast<QgsFeature&>( attIt.value() ); // other parts of API use non-const ref to QgsFeature :-/
-    symbolList << dynamic_cast<QgsMarkerSymbolV2*>( firstSymbolForFeature( mRenderer, f ) );
+    labelAttributeList << ( mDrawLabels ? getLabel( attIt.value().first ) : QString() );
+    symbolList << dynamic_cast<QgsMarkerSymbolV2*>( attIt.value().second );
   }
 
   //draw symbol
@@ -413,7 +418,7 @@ void QgsPointDisplacementRenderer::printInfoDisplacementGroups()
   for ( int i = 0; i < nGroups; ++i )
   {
     QgsDebugMsg( "***************displacement group " + QString::number( i ) );
-    QMap<QgsFeatureId, QgsFeature>::const_iterator it = mDisplacementGroups.at( i ).constBegin();
+    DisplacementGroup::const_iterator it = mDisplacementGroups.at( i ).constBegin();
     for ( ; it != mDisplacementGroups.at( i ).constEnd(); ++it )
     {
       QgsDebugMsg( FID_TO_STRING( it.key() ) );
diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.h b/src/core/symbology-ng/qgspointdisplacementrenderer.h
index 5e19c58..e429925 100644
--- a/src/core/symbology-ng/qgspointdisplacementrenderer.h
+++ b/src/core/symbology-ng/qgspointdisplacementrenderer.h
@@ -143,7 +143,7 @@ class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2
     /**Maximum scale denominator for label display. Negative number means no scale limitation*/
     double mMaxLabelScaleDenominator;
 
-    typedef QMap<QgsFeatureId, QgsFeature> DisplacementGroup;
+    typedef QMap<QgsFeatureId, QPair< QgsFeature, QgsSymbolV2* > > DisplacementGroup;
     /**Groups of features that have the same position*/
     QList<DisplacementGroup> mDisplacementGroups;
     /**Mapping from feature ID to its group index*/
diff --git a/src/core/symbology-ng/qgssvgcache.cpp b/src/core/symbology-ng/qgssvgcache.cpp
index 2028e87..26eb223 100644
--- a/src/core/symbology-ng/qgssvgcache.cpp
+++ b/src/core/symbology-ng/qgssvgcache.cpp
@@ -36,13 +36,33 @@
 #include <QNetworkReply>
 #include <QNetworkRequest>
 
-QgsSvgCacheEntry::QgsSvgCacheEntry(): file( QString() ), size( 0.0 ), outlineWidth( 0 ), widthScaleFactor( 1.0 ), rasterScaleFactor( 1.0 ), fill( Qt::black ),
-    outline( Qt::black ), image( 0 ), picture( 0 ), nextEntry( 0 ), previousEntry( 0 )
+QgsSvgCacheEntry::QgsSvgCacheEntry()
+    : file( QString() )
+    , size( 0.0 )
+    , outlineWidth( 0 )
+    , widthScaleFactor( 1.0 )
+    , rasterScaleFactor( 1.0 )
+    , fill( Qt::black )
+    , outline( Qt::black )
+    , image( 0 )
+    , picture( 0 )
+    , nextEntry( 0 )
+    , previousEntry( 0 )
 {
 }
 
-QgsSvgCacheEntry::QgsSvgCacheEntry( const QString& f, double s, double ow, double wsf, double rsf, const QColor& fi, const QColor& ou ): file( f ), size( s ), outlineWidth( ow ),
-    widthScaleFactor( wsf ), rasterScaleFactor( rsf ), fill( fi ), outline( ou ), image( 0 ), picture( 0 ), nextEntry( 0 ), previousEntry( 0 )
+QgsSvgCacheEntry::QgsSvgCacheEntry( const QString& f, double s, double ow, double wsf, double rsf, const QColor& fi, const QColor& ou )
+    : file( f )
+    , size( s )
+    , outlineWidth( ow )
+    , widthScaleFactor( wsf )
+    , rasterScaleFactor( rsf )
+    , fill( fi )
+    , outline( ou )
+    , image( 0 )
+    , picture( 0 )
+    , nextEntry( 0 )
+    , previousEntry( 0 )
 {
 }
 
@@ -55,8 +75,8 @@ QgsSvgCacheEntry::~QgsSvgCacheEntry()
 
 bool QgsSvgCacheEntry::operator==( const QgsSvgCacheEntry& other ) const
 {
-  return ( other.file == file && other.size == size && other.outlineWidth == outlineWidth && other.widthScaleFactor == widthScaleFactor
-           && other.rasterScaleFactor == rasterScaleFactor && other.fill == fill && other.outline == outline );
+  return other.file == file && other.size == size && other.outlineWidth == outlineWidth && other.widthScaleFactor == widthScaleFactor
+         && other.rasterScaleFactor == rasterScaleFactor && other.fill == fill && other.outline == outline;
 }
 
 int QgsSvgCacheEntry::dataSize() const
@@ -73,14 +93,6 @@ int QgsSvgCacheEntry::dataSize() const
   return size;
 }
 
-QString file;
-double size;
-double outlineWidth;
-double widthScaleFactor;
-double rasterScaleFactor;
-QColor fill;
-QColor outline;
-
 QgsSvgCache* QgsSvgCache::instance()
 {
   static QgsSvgCache mInstance;
@@ -169,6 +181,16 @@ const QPicture& QgsSvgCache::svgAsPicture( const QString& file, double size, con
   return *( currentEntry->picture );
 }
 
+const QByteArray& QgsSvgCache::svgContent( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
+    double widthScaleFactor, double rasterScaleFactor )
+{
+  QMutexLocker locker( &mMutex );
+
+  QgsSvgCacheEntry *currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor );
+
+  return currentEntry->svgContent;
+}
+
 QgsSvgCacheEntry* QgsSvgCache::insertSVG( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
     double widthScaleFactor, double rasterScaleFactor )
 {
diff --git a/src/core/symbology-ng/qgssvgcache.h b/src/core/symbology-ng/qgssvgcache.h
index 0e4be3b..5bccdeb 100644
--- a/src/core/symbology-ng/qgssvgcache.h
+++ b/src/core/symbology-ng/qgssvgcache.h
@@ -112,6 +112,10 @@ class CORE_EXPORT QgsSvgCache : public QObject
     /**Get image data*/
     QByteArray getImageData( const QString &path ) const;
 
+    /**Get SVG content*/
+    const QByteArray& svgContent( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
+                                  double widthScaleFactor, double rasterScaleFactor );
+
   signals:
     /** Emit a signal to be caught by qgisapp and display a msg on status bar */
     void statusChanged( const QString&  theStatusQString );
diff --git a/src/gui/attributetable/qgsattributetablefiltermodel.cpp b/src/gui/attributetable/qgsattributetablefiltermodel.cpp
index 5d6d910..cd12058 100644
--- a/src/gui/attributetable/qgsattributetablefiltermodel.cpp
+++ b/src/gui/attributetable/qgsattributetablefiltermodel.cpp
@@ -48,11 +48,11 @@ bool QgsAttributeTableFilterModel::lessThan( const QModelIndex &left, const QMod
 
     if ( leftSelected && !rightSelected )
     {
-      return true;
+      return sortOrder() == Qt::AscendingOrder;
     }
     else if ( rightSelected && !leftSelected )
     {
-      return false;
+      return sortOrder() == Qt::DescendingOrder;
     }
   }
 
diff --git a/src/gui/attributetable/qgsattributetableview.cpp b/src/gui/attributetable/qgsattributetableview.cpp
index 0bb84c0..2fb08f2 100644
--- a/src/gui/attributetable/qgsattributetableview.cpp
+++ b/src/gui/attributetable/qgsattributetableview.cpp
@@ -65,30 +65,7 @@ QgsAttributeTableView::~QgsAttributeTableView()
 {
   delete mActionPopup;
 }
-#if 0
-void QgsAttributeTableView::setCanvasAndLayerCache( QgsMapCanvas *canvas, QgsVectorLayerCache *layerCache )
-{
-  QgsAttributeTableModel* oldModel = mMasterModel;
-  QgsAttributeTableFilterModel* filterModel = mFilterModel;
-
-  mMasterModel = new QgsAttributeTableModel( layerCache, this );
-
-  mLayerCache = layerCache;
-
-  mMasterModel->loadLayer();
 
-  mFilterModel = new QgsAttributeTableFilterModel( canvas, mMasterModel, mMasterModel );
-  setModel( mFilterModel );
-  delete mFeatureSelectionModel;
-  mFeatureSelectionModel = new QgsFeatureSelectionModel( mFilterModel, mFilterModel, new QgsVectorLayerSelectionManager( layerCache->layer(), mFilterModel ), mFilterModel );
-  connect( mFeatureSelectionModel, SIGNAL( requestRepaint( QModelIndexList ) ), this, SLOT( repaintRequested( QModelIndexList ) ) );
-  connect( mFeatureSelectionModel, SIGNAL( requestRepaint() ), this, SLOT( repaintRequested() ) );
-  setSelectionModel( mFeatureSelectionModel );
-
-  delete oldModel;
-  delete filterModel;
-}
-#endif
 bool QgsAttributeTableView::eventFilter( QObject *object, QEvent *event )
 {
   if ( object == verticalHeader()->viewport() )
diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp
index 5c40c65..54fcba5 100644
--- a/src/gui/attributetable/qgsdualview.cpp
+++ b/src/gui/attributetable/qgsdualview.cpp
@@ -79,6 +79,7 @@ void QgsDualView::init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const Qg
   mAttributeForm->hideButtonBox();
 
   connect( mAttributeForm, SIGNAL( attributeChanged( QString, QVariant ) ), this, SLOT( featureFormAttributeChanged() ) );
+  connect( mMasterModel, SIGNAL( modelChanged() ), mAttributeForm, SLOT( refreshFeature() ) );
 
   if ( mFeatureListPreviewButton->defaultAction() )
     mFeatureList->setDisplayExpression( mDisplayExpression );
diff --git a/src/gui/editorwidgets/qgsdatetimeedit.cpp b/src/gui/editorwidgets/qgsdatetimeedit.cpp
index f55f0e3..f94a790 100644
--- a/src/gui/editorwidgets/qgsdatetimeedit.cpp
+++ b/src/gui/editorwidgets/qgsdatetimeedit.cpp
@@ -106,6 +106,7 @@ void QgsDateTimeEdit::setDateTime( const QDateTime& dateTime )
   else
   {
     QDateTimeEdit::setDateTime( dateTime );
+    mIsNull = false;
   }
 }
 
diff --git a/src/gui/editorwidgets/qgsrangeconfigdlg.cpp b/src/gui/editorwidgets/qgsrangeconfigdlg.cpp
index ced73b9..7e4495e 100644
--- a/src/gui/editorwidgets/qgsrangeconfigdlg.cpp
+++ b/src/gui/editorwidgets/qgsrangeconfigdlg.cpp
@@ -17,8 +17,8 @@
 
 #include "qgsvectorlayer.h"
 
-QgsRangeConfigDlg::QgsRangeConfigDlg( QgsVectorLayer* vl, int fieldIdx, QWidget *parent ) :
-    QgsEditorConfigWidget( vl, fieldIdx, parent )
+QgsRangeConfigDlg::QgsRangeConfigDlg( QgsVectorLayer* vl, int fieldIdx, QWidget *parent )
+    : QgsEditorConfigWidget( vl, fieldIdx, parent )
 {
   setupUi( this );
 
@@ -28,28 +28,14 @@ QgsRangeConfigDlg::QgsRangeConfigDlg( QgsVectorLayer* vl, int fieldIdx, QWidget
   {
     case QVariant::Int:
     case QVariant::LongLong:
-    {
-      rangeStackedWidget->setCurrentIndex( 0 );
-
-      rangeWidget->clear();
-      rangeWidget->addItem( tr( "Editable" ), "SpinBox" );
-      rangeWidget->addItem( tr( "Slider" ), "Slider" );
-      rangeWidget->addItem( tr( "Dial" ), "Dial" );
-
-      QVariant min = vl->minimumValue( fieldIdx );
-      QVariant max = vl->maximumValue( fieldIdx );
-
-      text = tr( "Current minimum for this value is %1 and current maximum is %2." ).arg( min.toString() ).arg( max.toString() );
-      break;
-    }
-
     case QVariant::Double:
     {
-      rangeStackedWidget->setCurrentIndex( 1 );
+      rangeStackedWidget->setCurrentIndex( vl->pendingFields()[fieldIdx].type() == QVariant::Double ? 1 : 0 );
 
       rangeWidget->clear();
       rangeWidget->addItem( tr( "Editable" ), "SpinBox" );
       rangeWidget->addItem( tr( "Slider" ), "Slider" );
+      rangeWidget->addItem( tr( "Dial" ), "Dial" );
 
       QVariant min = vl->minimumValue( fieldIdx );
       QVariant max = vl->maximumValue( fieldIdx );
@@ -59,10 +45,8 @@ QgsRangeConfigDlg::QgsRangeConfigDlg( QgsVectorLayer* vl, int fieldIdx, QWidget
     }
 
     default:
-    {
       text = tr( "Attribute has no integer or real type, therefore range is not usable." );
       break;
-    }
   }
 
   valuesLabel->setText( text );
diff --git a/src/gui/editorwidgets/qgsrangewidgetfactory.cpp b/src/gui/editorwidgets/qgsrangewidgetfactory.cpp
index 203eb3f..123e59f 100644
--- a/src/gui/editorwidgets/qgsrangewidgetfactory.cpp
+++ b/src/gui/editorwidgets/qgsrangewidgetfactory.cpp
@@ -41,9 +41,9 @@ QgsEditorWidgetConfig QgsRangeWidgetFactory::readConfig( const QDomElement& conf
   QMap<QString, QVariant> cfg;
 
   cfg.insert( "Style", configElement.attribute( "Style" ) );
-  cfg.insert( "Min", configElement.attribute( "Min" ).toInt() );
-  cfg.insert( "Max", configElement.attribute( "Max" ).toInt() );
-  cfg.insert( "Step", configElement.attribute( "Step" ).toInt() );
+  cfg.insert( "Min", configElement.attribute( "Min" ) );
+  cfg.insert( "Max", configElement.attribute( "Max" ) );
+  cfg.insert( "Step", configElement.attribute( "Step" ) );
   cfg.insert( "AllowNull", configElement.attribute( "AllowNull" ) == "1" );
 
   if ( configElement.hasAttribute( "Suffix" ) )
@@ -61,9 +61,9 @@ void QgsRangeWidgetFactory::writeConfig( const QgsEditorWidgetConfig& config, QD
   Q_UNUSED( fieldIdx );
 
   configElement.setAttribute( "Style", config["Style"].toString() );
-  configElement.setAttribute( "Min", config["Min"].toInt() );
-  configElement.setAttribute( "Max", config["Max"].toInt() );
-  configElement.setAttribute( "Step", config["Step"].toInt() );
+  configElement.setAttribute( "Min", config["Min"].toString() );
+  configElement.setAttribute( "Max", config["Max"].toString() );
+  configElement.setAttribute( "Step", config["Step"].toString() );
   configElement.setAttribute( "AllowNull", config["AllowNull"].toBool() );
   if ( config.contains( "Suffix" ) )
   {
diff --git a/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp b/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp
index 4d1639c..ed099cf 100644
--- a/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp
@@ -21,11 +21,13 @@
 #include "qgsvectorlayer.h"
 
 QgsRangeWidgetWrapper::QgsRangeWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QWidget* parent )
-    :  QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
+    : QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
     , mIntSpinBox( 0 )
     , mDoubleSpinBox( 0 )
     , mSlider( 0 )
     , mDial( 0 )
+    , mQgsSlider( 0 )
+    , mQgsDial( 0 )
 {
 }
 
@@ -68,6 +70,8 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor )
   mIntSpinBox = qobject_cast<QSpinBox*>( editor );
   mDial = qobject_cast<QDial*>( editor );
   mSlider = qobject_cast<QSlider*>( editor );
+  mQgsDial = qobject_cast<QgsDial*>( editor );
+  mQgsSlider = qobject_cast<QgsSlider*>( editor );
 
   bool allowNull = config( "AllowNull" ).toBool();
 
@@ -131,15 +135,40 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor )
     connect( mIntSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) );
   }
 
-  if ( mDial )
+  if ( mQgsDial || mQgsSlider )
+  {
+    QVariant min( config( "Min" ) );
+    QVariant max( config( "Max" ) );
+    QVariant step( config( "Step" ) );
+
+    field().convertCompatible( min );
+    field().convertCompatible( max );
+    field().convertCompatible( step );
+
+    if ( mQgsSlider )
+    {
+      mQgsSlider->setMinimum( min );
+      mQgsSlider->setMaximum( max );
+      mQgsSlider->setSingleStep( step );
+    }
+
+    if ( mQgsDial )
+    {
+      mQgsDial->setMinimum( min );
+      mQgsDial->setMaximum( max );
+      mQgsDial->setSingleStep( step );
+    }
+
+    connect( editor, SIGNAL( valueChanged( QVariant ) ), this, SLOT( valueChanged( QVariant ) ) );
+  }
+  else if ( mDial )
   {
     mDial->setMinimum( config( "Min" ).toInt() );
     mDial->setMaximum( config( "Max" ).toInt() );
     mDial->setSingleStep( config( "Step" ).toInt() );
     connect( mDial, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) );
   }
-
-  if ( mSlider )
+  else if ( mSlider )
   {
     mSlider->setMinimum( config( "Min" ).toInt() );
     mSlider->setMaximum( config( "Max" ).toInt() );
@@ -148,6 +177,14 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor )
   }
 }
 
+void QgsRangeWidgetWrapper::valueChanged( QVariant v )
+{
+  if ( v.type() == QVariant::Int )
+    valueChanged( v.toInt() );
+  if ( v.type() == QVariant::Double )
+    valueChanged( v.toDouble() );
+}
+
 QVariant QgsRangeWidgetWrapper::value()
 {
   QVariant value;
@@ -168,6 +205,14 @@ QVariant QgsRangeWidgetWrapper::value()
       value = QVariant( field().type() );
     }
   }
+  else if ( mQgsDial )
+  {
+    value = mQgsDial->variantValue();
+  }
+  else if ( mQgsSlider )
+  {
+    value = mQgsSlider->variantValue();
+  }
   else if ( mDial )
   {
     value = mDial->value();
@@ -205,13 +250,21 @@ void QgsRangeWidgetWrapper::setValue( const QVariant& value )
       mIntSpinBox->setValue( value.toInt() );
     }
   }
-  if ( mDial )
+
+  if ( mQgsDial )
+  {
+    mQgsDial->setValue( value );
+  }
+  else if ( mQgsSlider )
+  {
+    mQgsSlider->setValue( value );
+  }
+  else if ( mDial )
   {
     mDial->setValue( value.toInt() );
   }
-  if ( mSlider )
+  else if ( mSlider )
   {
     mSlider->setValue( value.toInt() );
   }
 }
-
diff --git a/src/gui/editorwidgets/qgsrangewidgetwrapper.h b/src/gui/editorwidgets/qgsrangewidgetwrapper.h
index 206bb4c..d96d27e 100644
--- a/src/gui/editorwidgets/qgsrangewidgetwrapper.h
+++ b/src/gui/editorwidgets/qgsrangewidgetwrapper.h
@@ -54,11 +54,16 @@ class GUI_EXPORT QgsRangeWidgetWrapper : public QgsEditorWidgetWrapper
   public slots:
     virtual void setValue( const QVariant& value ) override;
 
+  public slots:
+    void valueChanged( QVariant );
+
   private:
     QSpinBox* mIntSpinBox;
     QDoubleSpinBox* mDoubleSpinBox;
     QSlider* mSlider;
     QDial* mDial;
+    QgsSlider* mQgsSlider;
+    QgsDial* mQgsDial;
 };
 
 #endif // QGSRANGEWIDGETWRAPPER_H
diff --git a/src/gui/editorwidgets/qgstexteditwrapper.cpp b/src/gui/editorwidgets/qgstexteditwrapper.cpp
index 6439e7e..f0f34ce 100644
--- a/src/gui/editorwidgets/qgstexteditwrapper.cpp
+++ b/src/gui/editorwidgets/qgstexteditwrapper.cpp
@@ -119,27 +119,33 @@ void QgsTextEditWrapper::initWidget( QWidget* editor )
   }
 }
 
-void QgsTextEditWrapper::setValue( const QVariant& value )
+void QgsTextEditWrapper::setValue( const QVariant& val )
 {
   QString v;
-  if ( value.isNull() )
+  if ( val.isNull() )
   {
     if ( !( field().type() == QVariant::Int || field().type() == QVariant::Double || field().type() == QVariant::LongLong || field().type() == QVariant::Date ) )
       v = QSettings().value( "qgis/nullValue", "NULL" ).toString();
   }
   else
-    v = value.toString();
+    v = val.toString();
 
   if ( mTextEdit )
   {
-    if ( config( "UseHtml" ).toBool() )
-      mTextEdit->setHtml( v );
-    else
-      mTextEdit->setPlainText( v );
+    if ( val != value() )
+    {
+      if ( config( "UseHtml" ).toBool() )
+        mTextEdit->setHtml( v );
+      else
+        mTextEdit->setPlainText( v );
+    }
   }
 
   if ( mPlainTextEdit )
-    mPlainTextEdit->setPlainText( v );
+  {
+    if ( val != value() )
+      mPlainTextEdit->setPlainText( v );
+  }
 
   if ( mLineEdit )
     mLineEdit->setText( v );
diff --git a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp
index aac3931..4173060 100644
--- a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp
+++ b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp
@@ -82,14 +82,31 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder( const QStringList& order
     return;
 
   // verify that the new order is correct
-  QStringList defOrder = defaultLayerOrder();
-  QStringList sortedNewOrder = order;
+  QStringList defOrder( defaultLayerOrder() );
+  QStringList newOrder( order );
+  QStringList sortedNewOrder( order );
   qSort( defOrder );
   qSort( sortedNewOrder );
+
+  if ( defOrder.size() < sortedNewOrder.size() )
+  {
+    // might contain bad layers, but also duplicates
+    QSet<QString> ids( defOrder.toSet() );
+
+    for ( int i = 0; i < sortedNewOrder.size(); i++ )
+    {
+      if ( !ids.contains( sortedNewOrder[i] ) )
+      {
+        newOrder.removeAll( sortedNewOrder[i] );
+        sortedNewOrder.removeAt( i-- );
+      }
+    }
+  }
+
   if ( defOrder != sortedNewOrder )
     return; // must be permutation of the default order
 
-  mCustomLayerOrder = order;
+  mCustomLayerOrder = newOrder;
   emit customLayerOrderChanged( mCustomLayerOrder );
 
   if ( mHasCustomLayerOrder )
@@ -182,6 +199,8 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
 
 void QgsLayerTreeMapCanvasBridge::readProject( const QDomDocument& doc )
 {
+  mFirstCRS = QgsCoordinateReferenceSystem(); // invalidate on project load
+
   QDomElement elem = doc.documentElement().firstChildElement( "layer-tree-canvas" );
   if ( elem.isNull() )
   {
diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp
index d91f03e..15f92af 100644
--- a/src/gui/qgsattributeform.cpp
+++ b/src/gui/qgsattributeform.cpp
@@ -299,6 +299,20 @@ void QgsAttributeForm::onAttributeDeleted( int idx )
   setFeature( mFeature );
 }
 
+void QgsAttributeForm::refreshFeature()
+{
+  if ( mLayer->isEditable() || !mFeature.isValid() )
+    return;
+
+  // reload feature if layer changed although not editable
+  // (datasource probably changed bypassing QgsVectorLayer)
+  if ( !mLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeature.id() ) ).nextFeature( mFeature ) )
+    return;
+
+  init();
+  setFeature( mFeature );
+}
+
 void QgsAttributeForm::synchronizeEnabledState()
 {
   bool isEditable = ( mFeature.isValid() || mIsAddDialog ) && mLayer->isEditable();
@@ -530,7 +544,8 @@ void QgsAttributeForm::initPython()
     QString numArgs;
     QgsPythonRunner::eval( QString( "len(inspect.getargspec(%1)[0])" ).arg( module ), numArgs );
 
-    mPyFormVarName = QString( "_qgis_featureform_%1" ).arg( mFormNr );
+    static int sFormId = 0;
+    mPyFormVarName = QString( "_qgis_featureform_%1_%2" ).arg( mFormNr ).arg( sFormId++ );
 
     QString form = QString( "%1 = sip.wrapinstance( %2, qgis.gui.QgsAttributeForm )" )
                    .arg( mPyFormVarName )
@@ -665,7 +680,7 @@ QWidget* QgsAttributeForm::createWidgetFromDef( const QgsAttributeEditorElement
 
         ++index;
       }
-      gbLayout->addItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ), index, 0 );
+      gbLayout->addItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Preferred ), index, 0 );
 
       labelText = QString::null;
       labelOnTop = true;
diff --git a/src/gui/qgsattributeform.h b/src/gui/qgsattributeform.h
index db7471d..185e04b 100644
--- a/src/gui/qgsattributeform.h
+++ b/src/gui/qgsattributeform.h
@@ -164,6 +164,11 @@ class GUI_EXPORT QgsAttributeForm : public QWidget
      */
     void resetValues();
 
+    /**
+     * reload current feature
+     */
+    void refreshFeature();
+
   private slots:
     void onAttributeChanged( const QVariant& value );
     void onAttributeAdded( int idx );
diff --git a/src/gui/qgsattributeformlegacyinterface.cpp b/src/gui/qgsattributeformlegacyinterface.cpp
index 950e389..7c4f920 100644
--- a/src/gui/qgsattributeformlegacyinterface.cpp
+++ b/src/gui/qgsattributeformlegacyinterface.cpp
@@ -27,7 +27,8 @@ QgsAttributeFormLegacyInterface::QgsAttributeFormLegacyInterface( const QString&
     , mPyFunctionName( function )
     , mPyFormVarName( pyFormName )
 {
-  mPyLayerVarName = QString( "_qgis_layer_%1" ).arg( form->layer()->id() );
+  static int sLayerCounter = 0;
+  mPyLayerVarName = QString( "_qgis_layer_%1_%2" ).arg( form->layer()->id() ).arg( sLayerCounter++ );
   mPyLayerVarName.replace( QRegExp( "[^a-zA-Z0-9_]" ), "_" ); // clean identifier
 
   QString initLayer = QString( "%1 = sip.wrapinstance( %2, qgis.core.QgsVectorLayer )" )
diff --git a/src/gui/qgscomposerruler.cpp b/src/gui/qgscomposerruler.cpp
index 1f32746..48a9123 100644
--- a/src/gui/qgscomposerruler.cpp
+++ b/src/gui/qgscomposerruler.cpp
@@ -25,7 +25,7 @@ QgsComposerRuler::QgsComposerRuler( QgsComposerRuler::Direction d ) : QWidget( 0
   mRulerFont->setPointSize( RULER_FONT_SIZE );
   mRulerFontMetrics = new QFontMetrics( *mRulerFont );
 
-  //calculate ruler sizes and marker seperations
+  //calculate ruler sizes and marker separations
 
   //minimum gap required between major ticks is 3 digits * 250%, based on appearance
   mScaleMinPixelsWidth = mRulerFontMetrics->width( "000" ) * 2.5;
@@ -345,7 +345,7 @@ int QgsComposerRuler::optimumNumberDivisions( double rulerScale, int scaleMultip
   {
     //find pixel size for this small division
     double candidateSize = largeDivisionSize / ( *divisions_it );
-    //check if this seperation is more then allowed min seperation
+    //check if this separation is more then allowed min separation
     if ( candidateSize >= mMinPixelsPerDivision )
     {
       //found a good candidate, return it
diff --git a/src/gui/qgsdatumtransformdialog.cpp b/src/gui/qgsdatumtransformdialog.cpp
index f60adbd..75c43e5 100644
--- a/src/gui/qgsdatumtransformdialog.cpp
+++ b/src/gui/qgsdatumtransformdialog.cpp
@@ -230,6 +230,9 @@ void QgsDatumTransformDialog::on_mHideDeprecatedCheckBox_stateChanged( int )
 
 void QgsDatumTransformDialog::on_mDatumTransformTreeWidget_currentItemChanged( QTreeWidgetItem *current, QTreeWidgetItem * )
 {
+  if ( !current )
+    return;
+
   mLabelSrcDescription->setText( current->toolTip( 0 ) );
   mLabelDstDescription->setText( current->toolTip( 1 ) );
 }
diff --git a/src/gui/qgsdial.cpp b/src/gui/qgsdial.cpp
index 27f8fca..a94517d 100644
--- a/src/gui/qgsdial.cpp
+++ b/src/gui/qgsdial.cpp
@@ -1,6 +1,27 @@
+/***************************************************************************
+                             qgsdial.cpp
+                             -------------------
+    begin                : July 2013
+    copyright            : (C) 2013 by Daniel Vaz
+    email                : danielvaz 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
 #include "qgsdial.h"
+#include "qgslogger.h"
 
+#include <QPaintEvent>
+#include <QPainter>
 #include <QRect>
+#include <qmath.h>
 
 QgsDial::QgsDial( QWidget *parent ) : QDial( parent )
 {
@@ -14,6 +35,102 @@ void QgsDial::paintEvent( QPaintEvent *event )
   QRect rect = geometry();
   painter.setPen( QPen( palette().color( QPalette::WindowText ) ) );
   painter.drawText( QRectF( 0, rect.height() * 0.65, rect.width(), rect.height() ),
-                    Qt::AlignHCenter, QString::number( value() ), 0 );
+                    Qt::AlignHCenter, variantValue().toString(), 0 );
   painter.end();
 }
+
+void QgsDial::setMinimum( const QVariant &min )
+{
+  mMin = min;
+  update();
+}
+
+void QgsDial::setMaximum( const QVariant &max )
+{
+  mMax = max;
+  update();
+}
+
+void QgsDial::setSingleStep( const QVariant &step )
+{
+  mStep = step;
+  update();
+}
+
+void QgsDial::setValue( const QVariant &value )
+{
+  mValue = value;
+  update();
+}
+
+void QgsDial::update()
+{
+  if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
+    return;
+
+  if ( mValue.isNull() )
+    mValue = mMin;
+
+  if ( mMin.type() == QVariant::Int &&
+       mMax.type() == QVariant::Int &&
+       mStep.type() == QVariant::Int &&
+       mValue.type() == QVariant::Int )
+  {
+    QDial::setMinimum( mMin.toInt() );
+    QDial::setMaximum( mMax.toInt() );
+    QDial::setSingleStep( mStep.toInt() );
+    QDial::setValue( mValue.toInt() );
+  }
+
+  if ( mMin.type() == QVariant::Double &&
+       mMax.type() == QVariant::Double &&
+       mStep.type() == QVariant::Double &&
+       mValue.type() == QVariant::Double )
+  {
+    if ( minimum() != 0 )
+      QDial::setMinimum( 0 );
+
+    int max = qCeil(( mMax.toDouble() - mMin.toDouble() ) / mStep.toDouble() );
+    if ( maximum() != max )
+      QDial::setMaximum( max );
+
+    if ( singleStep() != 1 )
+      QDial::setSingleStep( 1 );
+
+    QDial::setValue( qCeil(( mValue.toDouble() - mMin.toDouble() ) / mStep.toDouble() ) );
+  }
+
+  connect( this, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) );
+}
+
+QVariant QgsDial::variantValue() const
+{
+  return mValue;
+}
+
+void QgsDial::valueChanged( int value )
+{
+  if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
+  {
+    mValue = QVariant();
+    return;
+  }
+
+  if ( mMin.type() == QVariant::Int &&
+       mMax.type() == QVariant::Int &&
+       mStep.type() == QVariant::Int &&
+       mValue.type() == QVariant::Int )
+  {
+    mValue = value;
+    return;
+  }
+
+  if ( mMin.type() == QVariant::Double &&
+       mMax.type() == QVariant::Double &&
+       mStep.type() == QVariant::Double &&
+       mValue.type() == QVariant::Double )
+  {
+    mValue = QVariant( mMin.toDouble() + value * mStep.toDouble() );
+    return;
+  }
+}
diff --git a/src/gui/qgsdial.h b/src/gui/qgsdial.h
index 3f079b7..9c3db6b 100644
--- a/src/gui/qgsdial.h
+++ b/src/gui/qgsdial.h
@@ -1,13 +1,48 @@
+/***************************************************************************
+                             qgsdial.h
+                             -------------------
+    begin                : July 2013
+    copyright            : (C) 2013 by Daniel Vaz
+    email                : danielvaz 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
 #include <QDial>
-#include <QPainter>
-#include <QPaintEvent>
-#include <QSize>
+#include <QVariant>
+
+class QPaintEvent;
 
 class GUI_EXPORT QgsDial : public QDial
 {
     Q_OBJECT
   public:
     QgsDial( QWidget *parent = 0 );
+
+    void setMinimum( const QVariant &min );
+    void setMaximum( const QVariant &max );
+    void setSingleStep( const QVariant &step );
+    void setValue( const QVariant &value );
+    QVariant variantValue() const;
+
+  signals:
+    void valueChanged( QVariant );
+
+  protected slots:
+    void valueChanged( int );
+
   protected:
     virtual void paintEvent( QPaintEvent * event ) override;
+
+  private:
+    void update();
+
+    QVariant mMin, mMax, mStep, mValue;
 };
diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp
index 49a434d..8ae02b0 100644
--- a/src/gui/qgsexpressionbuilderwidget.cpp
+++ b/src/gui/qgsexpressionbuilderwidget.cpp
@@ -81,6 +81,11 @@ QgsExpressionBuilderWidget::QgsExpressionBuilderWidget( QWidget *parent )
   {
     tab_2->setEnabled( false );
   }
+
+  // select the first item in the function list 
+  // in order to avoid a blank help widget
+  QModelIndex firstItem = mProxyModel->index( 0, 0, QModelIndex() );
+  expressionTree->setCurrentIndex( firstItem );
 }
 
 
@@ -132,6 +137,8 @@ void QgsExpressionBuilderWidget::runPythonCode( QString code )
     QgsPythonRunner::run( pythontext );
   }
   updateFunctionTree();
+  loadFieldNames();
+  loadRecent( mRecentKey );
 }
 
 void QgsExpressionBuilderWidget::saveFunctionFile( QString fileName )
@@ -347,6 +354,7 @@ void QgsExpressionBuilderWidget::saveToRecent( QString key )
 
 void QgsExpressionBuilderWidget::loadRecent( QString key )
 {
+  mRecentKey = key;
   QString name = tr( "Recent (%1)" ).arg( key );
   if ( mExpressionGroups.contains( name ) )
   {
@@ -399,6 +407,8 @@ void QgsExpressionBuilderWidget::updateFunctionTree()
   registerItem( "Conditionals", "CASE", casestring );
   registerItem( "Conditionals", "CASE ELSE", caseelsestring );
 
+  registerItem( "Fields and Values", "NULL", "NULL" );
+
   // Load the functions from the QgsExpression class
   int count = QgsExpression::functionCount();
   for ( int i = 0; i < count; i++ )
@@ -467,7 +477,7 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
     {
       QVariant value = exp.evaluate( &mFeature, mLayer->pendingFields() );
       if ( !exp.hasEvalError() )
-        lblPreview->setText( value.toString() );
+        lblPreview->setText( formatPreviewString( value.toString() ) );
     }
     else
     {
@@ -482,7 +492,7 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
     QVariant value = exp.evaluate();
     if ( !exp.hasEvalError() )
     {
-      lblPreview->setText( value.toString() );
+      lblPreview->setText( formatPreviewString( value.toString() ) );
     }
   }
 
@@ -508,6 +518,18 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
   }
 }
 
+QString QgsExpressionBuilderWidget::formatPreviewString( const QString& previewString ) const
+{
+  if ( previewString.length() > 63 )
+  {
+    return QString( tr( "%1..." ) ).arg( previewString.left( 60 ) );
+  }
+  else
+  {
+    return previewString;
+  }
+}
+
 void QgsExpressionBuilderWidget::on_txtSearchEdit_textChanged()
 {
   mProxyModel->setFilterWildcard( txtSearchEdit->text() );
diff --git a/src/gui/qgsexpressionbuilderwidget.h b/src/gui/qgsexpressionbuilderwidget.h
index 442063e..1752d95 100644
--- a/src/gui/qgsexpressionbuilderwidget.h
+++ b/src/gui/qgsexpressionbuilderwidget.h
@@ -203,6 +203,12 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
     void fillFieldValues( int fieldIndex, int countLimit );
     QString loadFunctionHelp( QgsExpressionItem* functionName );
 
+    /** Formats an expression preview result for display in the widget
+     * by truncating the string
+     * @param previewString expression preview result to format
+     */
+    QString formatPreviewString( const QString &previewString ) const;
+
     QString mFunctionsPath;
     QgsVectorLayer *mLayer;
     QStandardItemModel *mModel;
@@ -212,6 +218,8 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
     QgsExpressionHighlighter* highlighter;
     bool mExpressionValid;
     QgsDistanceArea mDa;
+    QString mRecentKey;
+
 };
 
 #endif // QGSEXPRESSIONBUILDER_H
diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp
index ec09d3a..289277e 100644
--- a/src/gui/qgsmapcanvas.cpp
+++ b/src/gui/qgsmapcanvas.cpp
@@ -555,6 +555,12 @@ void QgsMapCanvas::setCachingEnabled( bool enabled )
   if ( enabled == isCachingEnabled() )
     return;
 
+  if ( mJob && mJob->isActive() )
+  {
+    // wait for the current rendering to finish, before touching the cache
+    mJob->waitForFinished();
+  }
+
   if ( enabled )
   {
     mCache = new QgsMapRendererCache;
diff --git a/src/gui/qgsmapcanvassnapper.cpp b/src/gui/qgsmapcanvassnapper.cpp
index fb588e7..2063c50 100644
--- a/src/gui/qgsmapcanvassnapper.cpp
+++ b/src/gui/qgsmapcanvassnapper.cpp
@@ -108,7 +108,8 @@ int QgsMapCanvasSnapper::snapToCurrentLayer( const QPoint& p, QList<QgsSnappingR
   snapLayers.append( snapLayer );
   mSnapper->setSnapLayers( snapLayers );
 
-  if ( mSnapper->snapMapPoint( p, results, excludePoints ) != 0 )
+  QgsPoint mapPoint = mMapCanvas->mapSettings().mapToPixel().toMapCoordinates( p );
+  if ( mSnapper->snapMapPoint( mapPoint, results, excludePoints ) != 0 )
     return 4;
 
   return 0;
@@ -305,10 +306,12 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
       QVector<QgsPoint> vertexPoints;
       vertexPoints.append( iSegIt->beforeVertex );
       vertexPoints.append( iSegIt->afterVertex );
-      QgsGeometry* lineB = QgsGeometry::fromPolyline( vertexPoints );
 
+      QgsGeometry* lineB = QgsGeometry::fromPolyline( vertexPoints );
       QgsGeometry* intersectionPoint = lineA->intersection( lineB );
-      if ( intersectionPoint->type()  == QGis::Point )
+      delete lineB;
+
+      if ( intersectionPoint && intersectionPoint->type() == QGis::Point )
       {
         //We have to check the intersection point is inside the tolerance distance for both layers
         double toleranceA = 0;
@@ -331,8 +334,13 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
           iSegIt->snappedVertex = intersectionPoint->asPoint();
           myResults.append( *iSegIt );
         }
+        delete cursorPoint;
       }
+      delete intersectionPoint;
+
     }
+
+    delete lineA;
   }
 
   if ( myResults.length() > 0 )
diff --git a/src/gui/qgsmaptoolzoom.cpp b/src/gui/qgsmaptoolzoom.cpp
index 49df93d..ef35f4c 100644
--- a/src/gui/qgsmaptoolzoom.cpp
+++ b/src/gui/qgsmaptoolzoom.cpp
@@ -103,6 +103,9 @@ void QgsMapToolZoom::canvasReleaseEvent( QMouseEvent * e )
     mZoomRect.setRight( e->pos().x() );
     mZoomRect.setBottom( e->pos().y() );
 
+    //account for bottom right -> top left dragging
+    mZoomRect = mZoomRect.normalized();
+
     // set center and zoom
     const QSize& zoomRectSize = mZoomRect.size();
     const QgsMapSettings& mapSettings = mCanvas->mapSettings();
@@ -114,8 +117,7 @@ void QgsMapToolZoom::canvasReleaseEvent( QMouseEvent * e )
     const QgsMapToPixel* m2p = mCanvas->getCoordinateTransform();
     QgsPoint c = m2p->toMapCoordinates( mZoomRect.center() );
 
-    mCanvas->setCenter( c );
-    mCanvas->zoomByFactor( mZoomOut ? 1.0 / sf : sf );
+    mCanvas->zoomByFactor( mZoomOut ? 1.0 / sf : sf, &c );
 
     mCanvas->refresh();
   }
diff --git a/src/gui/qgsnewhttpconnection.cpp b/src/gui/qgsnewhttpconnection.cpp
index f3a42a1..9d12e2e 100644
--- a/src/gui/qgsnewhttpconnection.cpp
+++ b/src/gui/qgsnewhttpconnection.cpp
@@ -158,7 +158,7 @@ void QgsNewHttpConnection::accept()
   QString credentialsKey = "/Qgis/" + mCredentialsBaseKey + "/" + txtName->text();
 
   // warn if entry was renamed to an existing connection
-  if (( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) &&
+  if (( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) &&
       settings.contains( key + "/url" ) &&
       QMessageBox::question( this,
                              tr( "Save connection" ),
@@ -182,6 +182,7 @@ void QgsNewHttpConnection::accept()
   {
     settings.remove( mBaseKey + mOriginalConnName );
     settings.remove( "/Qgis/" + mCredentialsBaseKey + "/" + mOriginalConnName );
+    settings.sync();
   }
 
   QUrl url( txtUrl->text().trimmed() );
diff --git a/src/gui/qgsrasterlayersaveasdialog.cpp b/src/gui/qgsrasterlayersaveasdialog.cpp
index 33d6086..94b6ed1 100644
--- a/src/gui/qgsrasterlayersaveasdialog.cpp
+++ b/src/gui/qgsrasterlayersaveasdialog.cpp
@@ -203,6 +203,11 @@ void QgsRasterLayerSaveAsDialog::on_mBrowseButton_clicked()
 
   if ( !fileName.isEmpty() )
   {
+    // ensure the user never ommited the extension from the file name
+    if ( !fileName.toLower().endsWith( ".tif" ) && !fileName.toLower().endsWith( ".tiff" ) )
+    {
+      fileName += ".tif";
+    }
     mSaveAsLineEdit->setText( fileName );
   }
 }
diff --git a/src/gui/qgsslider.cpp b/src/gui/qgsslider.cpp
index 2616534..03f0050 100644
--- a/src/gui/qgsslider.cpp
+++ b/src/gui/qgsslider.cpp
@@ -1,6 +1,27 @@
+/***************************************************************************
+                             qgsslider.cpp
+                             -------------------
+    begin                : July 2013
+    copyright            : (C) 2013 by Daniel Vaz
+    email                : danielvaz 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
 #include "qgsslider.h"
+#include "qgslogger.h"
 
+#include <QPaintEvent>
+#include <QPainter>
 #include <QRect>
+#include <qmath.h>
 
 QgsSlider::QgsSlider( QWidget * parent ) : QSlider( parent )
 {
@@ -19,6 +40,102 @@ void QgsSlider::paintEvent( QPaintEvent *event )
   QRect rect = geometry();
   painter.setPen( QPen( palette().color( QPalette::WindowText ) ) );
   painter.drawText( QRectF( 0, rect.height() * 0.5, rect.width(), rect.height() ),
-                    Qt::AlignHCenter, QString::number( value() ), 0 );
+                    Qt::AlignHCenter, variantValue().toString(), 0 );
   painter.end();
 }
+
+void QgsSlider::setMinimum( const QVariant &min )
+{
+  mMin = min;
+  update();
+}
+
+void QgsSlider::setMaximum( const QVariant &max )
+{
+  mMax = max;
+  update();
+}
+
+void QgsSlider::setSingleStep( const QVariant &step )
+{
+  mStep = step;
+  update();
+}
+
+void QgsSlider::setValue( const QVariant &value )
+{
+  mValue = value;
+  update();
+}
+
+void QgsSlider::update()
+{
+  if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
+    return;
+
+  if ( mValue.isNull() )
+    mValue = mMin;
+
+  if ( mMin.type() == QVariant::Int &&
+       mMax.type() == QVariant::Int &&
+       mStep.type() == QVariant::Int &&
+       mValue.type() == QVariant::Int )
+  {
+    QSlider::setMinimum( mMin.toInt() );
+    QSlider::setMaximum( mMax.toInt() );
+    QSlider::setSingleStep( mStep.toInt() );
+    QSlider::setValue( mValue.toInt() );
+  }
+
+  if ( mMin.type() == QVariant::Double &&
+       mMax.type() == QVariant::Double &&
+       mStep.type() == QVariant::Double &&
+       mValue.type() == QVariant::Double )
+  {
+    if ( minimum() != 0 )
+      QSlider::setMinimum( 0 );
+
+    int max = qCeil(( mMax.toDouble() - mMin.toDouble() ) / mStep.toDouble() );
+    if ( maximum() != max )
+      QSlider::setMaximum( max );
+
+    if ( singleStep() != 1 )
+      QSlider::setSingleStep( 1 );
+
+    QSlider::setValue( qCeil(( mValue.toDouble() - mMin.toDouble() ) / mStep.toDouble() ) );
+  }
+
+  connect( this, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) );
+}
+
+QVariant QgsSlider::variantValue() const
+{
+  return mValue;
+}
+
+void QgsSlider::valueChanged( int value )
+{
+  if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
+  {
+    mValue = QVariant();
+    return;
+  }
+
+  if ( mMin.type() == QVariant::Int &&
+       mMax.type() == QVariant::Int &&
+       mStep.type() == QVariant::Int &&
+       mValue.type() == QVariant::Int )
+  {
+    mValue = value;
+    return;
+  }
+
+  if ( mMin.type() == QVariant::Double &&
+       mMax.type() == QVariant::Double &&
+       mStep.type() == QVariant::Double &&
+       mValue.type() == QVariant::Double )
+  {
+    mValue = QVariant( mMin.toDouble() + value * mStep.toDouble() );
+    return;
+  }
+}
diff --git a/src/gui/qgsslider.h b/src/gui/qgsslider.h
index 54af646..76c3701 100644
--- a/src/gui/qgsslider.h
+++ b/src/gui/qgsslider.h
@@ -1,7 +1,24 @@
-#include <QPainter>
-#include <QPaintEvent>
-#include <QSize>
+/***************************************************************************
+                              qgsslider.h
+                             -------------------
+    begin                : July 2013
+    copyright            : (C) 2013 by Daniel Vaz
+    email                : danielvaz 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
 #include <QSlider>
+#include <QVariant>
+
+class QPaintEvent;
 
 class GUI_EXPORT QgsSlider : public QSlider
 {
@@ -9,6 +26,24 @@ class GUI_EXPORT QgsSlider : public QSlider
   public:
     QgsSlider( QWidget *parent = 0 );
     QgsSlider( Qt::Orientation orientation, QWidget * parent = 0 );
+
+    void setMinimum( const QVariant &min );
+    void setMaximum( const QVariant &max );
+    void setSingleStep( const QVariant &step );
+    void setValue( const QVariant &value );
+    QVariant variantValue() const;
+
+  signals:
+    void valueChanged( QVariant );
+
+  protected slots:
+    void valueChanged( int );
+
   protected:
     virtual void paintEvent( QPaintEvent * event ) override;
+
+  private:
+    void update();
+
+    QVariant mMin, mMax, mStep, mValue;
 };
diff --git a/src/gui/qgssublayersdialog.cpp b/src/gui/qgssublayersdialog.cpp
index 80fefab..729f1a1 100644
--- a/src/gui/qgssublayersdialog.cpp
+++ b/src/gui/qgssublayersdialog.cpp
@@ -81,10 +81,16 @@ QStringList QgsSublayersDialog::selectionNames()
         count++;
       }
     }
+
     if ( count > 1 )
     {
       name += ":" + layersTable->selectedItems().at( i )->text( 3 );
     }
+    else
+    {
+      name += ":any";
+    }
+
     list << name;
   }
   return list;
@@ -104,7 +110,13 @@ void QgsSublayersDialog::populateLayerTable( QStringList theList, QString delim
 {
   foreach ( QString item, theList )
   {
-    layersTable->addTopLevelItem( new QTreeWidgetItem( item.split( delim ) ) );
+    QStringList elements = item.split( delim );
+    while ( elements.size() > 4 )
+    {
+      elements[1] += delim + elements[2];
+      elements.removeAt( 2 );
+    }
+    layersTable->addTopLevelItem( new QTreeWidgetItem( elements ) );
   }
 
   // resize columns
diff --git a/src/gui/symbology-ng/characterwidget.cpp b/src/gui/symbology-ng/characterwidget.cpp
index b87f71c..83efbbe 100644
--- a/src/gui/symbology-ng/characterwidget.cpp
+++ b/src/gui/symbology-ng/characterwidget.cpp
@@ -114,6 +114,12 @@ void CharacterWidget::updateColumns( int cols )
   update();
 }
 
+void CharacterWidget::setCharacter( const QChar& character )
+{
+  lastKey = character.unicode();
+  update();
+}
+
 //! [3]
 QSize CharacterWidget::sizeHint() const
 {
diff --git a/src/gui/symbology-ng/characterwidget.h b/src/gui/symbology-ng/characterwidget.h
index 870b866..11fcdaa 100644
--- a/src/gui/symbology-ng/characterwidget.h
+++ b/src/gui/symbology-ng/characterwidget.h
@@ -76,6 +76,7 @@ class GUI_EXPORT CharacterWidget : public QWidget
     void updateStyle( const QString &fontStyle );
     void updateFontMerging( bool enable );
     void updateColumns( int cols );
+    void setCharacter( const QChar& character );
 
   signals:
     void characterSelected( const QChar &character );
diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
index 3881edb..70bcdf1 100644
--- a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
+++ b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
@@ -2491,9 +2491,10 @@ void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
   // layer type is correct, we can do the cast
   mLayer = static_cast<QgsFontMarkerSymbolLayerV2*>( layer );
 
+  QFont layerFont( mLayer->fontFamily() );
   // set values
   cboFont->blockSignals( true );
-  cboFont->setCurrentFont( QFont( mLayer->fontFamily() ) );
+  cboFont->setCurrentFont( layerFont );
   cboFont->blockSignals( false );
   spinSize->blockSignals( true );
   spinSize->setValue( mLayer->size() );
@@ -2505,6 +2506,11 @@ void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
   spinAngle->setValue( mLayer->angle() );
   spinAngle->blockSignals( false );
 
+  widgetChar->blockSignals( true );
+  widgetChar->updateFont( layerFont );
+  widgetChar->setCharacter( mLayer->character() );
+  widgetChar->blockSignals( false );
+
   //block
   spinOffsetX->blockSignals( true );
   spinOffsetX->setValue( mLayer->offset().x() );
diff --git a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp
index 6e1c420..c38d760 100644
--- a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp
+++ b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp
@@ -19,6 +19,9 @@
 QgsVectorFieldSymbolLayerWidget::QgsVectorFieldSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent ): QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 )
 {
   setupUi( this );
+
+  mDistanceUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 );
+
   if ( mVectorLayer )
   {
     const QgsFields& fm = mVectorLayer->pendingFields();
@@ -201,13 +204,18 @@ void QgsVectorFieldSymbolLayerWidget::on_mCounterclockwiseFromEastRadioButton_to
   }
 }
 
-void QgsVectorFieldSymbolLayerWidget::on_mDistanceUnitComboBox_currentIndexChanged( int index )
+void QgsVectorFieldSymbolLayerWidget::on_mDistanceUnitWidget_changed()
 {
-  if ( mLayer )
+  if ( !mLayer )
   {
-    mLayer->setDistanceUnit(( QgsSymbolV2::OutputUnit ) index );
-    emit changed();
+    return;
   }
+
+  QgsSymbolV2::OutputUnit unit = static_cast<QgsSymbolV2::OutputUnit>( mDistanceUnitWidget->getUnit() );
+  mLayer->setDistanceUnit( unit );
+  mLayer->setDistanceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() );
+  emit changed();
 }
 
 
+
diff --git a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.h b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.h
index 6ecb7ec..f92c5a2 100644
--- a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.h
+++ b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.h
@@ -47,7 +47,7 @@ class GUI_EXPORT QgsVectorFieldSymbolLayerWidget: public QgsSymbolLayerV2Widget,
     void on_mRadiansRadioButton_toggled( bool checked );
     void on_mClockwiseFromNorthRadioButton_toggled( bool checked );
     void on_mCounterclockwiseFromEastRadioButton_toggled( bool checked );
-    void on_mDistanceUnitComboBox_currentIndexChanged( int index );
+    void on_mDistanceUnitWidget_changed();
 };
 
 #endif // QGSVECTORFIELDSYMBOLLAYERWIDGET_H
diff --git a/src/plugins/grass/qgsgrassnewmapset.cpp b/src/plugins/grass/qgsgrassnewmapset.cpp
index aa6c079..027db4e 100644
--- a/src/plugins/grass/qgsgrassnewmapset.cpp
+++ b/src/plugins/grass/qgsgrassnewmapset.cpp
@@ -25,6 +25,7 @@
 #include "qgsmapcanvas.h"
 #include "qgsproject.h"
 #include "qgsprojectionselector.h"
+#include "qgslocalec.h"
 
 #include <QCloseEvent>
 #include <QFileDialog>
@@ -427,10 +428,12 @@ void QgsGrassNewMapset::setGrassProjection()
     OGRSpatialReferenceH hCRS = NULL;
     hCRS = OSRNewSpatialReference( NULL );
     int errcode;
-    const char *oldlocale = setlocale( LC_NUMERIC, NULL );
-    setlocale( LC_NUMERIC, "C" );
-    errcode = OSRImportFromProj4( hCRS, proj4.toUtf8() );
-    setlocale( LC_NUMERIC, oldlocale );
+
+    {
+      QgsLocaleNumC l;
+      errcode = OSRImportFromProj4( hCRS, proj4.toUtf8() );
+    }
+
     if ( errcode != OGRERR_NONE )
     {
       QgsDebugMsg( QString( "OGR can't parse PROJ.4-style parameter string:\n%1\nOGR Error code was %2" ).arg( proj4 ).arg( errcode ) );
diff --git a/src/plugins/grass/qgsgrassplugin.cpp b/src/plugins/grass/qgsgrassplugin.cpp
index 4313b15..f272747 100644
--- a/src/plugins/grass/qgsgrassplugin.cpp
+++ b/src/plugins/grass/qgsgrassplugin.cpp
@@ -310,7 +310,7 @@ void QgsGrassPlugin::saveMapset()
 
   // Save working mapset in project file
   QgsProject::instance()->writeEntry( "GRASS", "/WorkingGisdbase",
-                                      QgsGrass::getDefaultGisdbase() );
+                                      QgsProject::instance()->writePath( QgsGrass::getDefaultGisdbase() ) );
 
   QgsProject::instance()->writeEntry( "GRASS", "/WorkingLocation",
                                       QgsGrass::getDefaultLocation() );
@@ -802,8 +802,10 @@ void QgsGrassPlugin::projectRead()
   QgsDebugMsg( "entered." );
 
   bool ok;
-  QString gisdbase = QgsProject::instance()->readEntry(
-                       "GRASS", "/WorkingGisdbase", "", &ok ).trimmed();
+  QString gisdbase = QgsProject::instance()->readPath(
+                       QgsProject::instance()->readEntry(
+                         "GRASS", "/WorkingGisdbase", "", &ok ).trimmed()
+                     );
   QString location = QgsProject::instance()->readEntry(
                        "GRASS", "/WorkingLocation", "", &ok ).trimmed();
   QString mapset = QgsProject::instance()->readEntry(
diff --git a/src/plugins/spatialquery/qgsspatialquerydialog.cpp b/src/plugins/spatialquery/qgsspatialquerydialog.cpp
index b05d952..bbc2efc 100644
--- a/src/plugins/spatialquery/qgsspatialquerydialog.cpp
+++ b/src/plugins/spatialquery/qgsspatialquerydialog.cpp
@@ -268,7 +268,7 @@ QString QgsSpatialQueryDialog::getSubsetFIDs( const QgsFeatureIds *fids, QString
   QString qReturn  = qFormat.arg( fieldFID ).arg( lstFID.join( "," ) );
   lstFID.clear();
   return qReturn;
-} // QString QgsSpatialQueryDialog::getSubsetFIDs( const QSet< int > *fids, QString fieldFID )
+} // QString QgsSpatialQueryDialog::getSubsetFIDs( const QgsFeatureIds *fids, QString fieldFID )
 
 QgsSpatialQueryDialog::TypeVerifyCreateSubset QgsSpatialQueryDialog::verifyCreateSubset( QString &msg, QString &fieldFID )
 {
@@ -656,7 +656,7 @@ void QgsSpatialQueryDialog::changeLwFeature( QgsVectorLayer* lyr, QgsFeatureId f
   }
   lwFeatures->setEnabled( true );
   lwFeatures->setFocus();
-} // void QgsSpatialQueryDialog::changeLwFeature( QListWidget *listWidget, QgsVectorLayer* lyr, int fid )
+} // void QgsSpatialQueryDialog::changeLwFeature( QgsVectorLayer* lyr, QgsFeatureId fid )
 
 void QgsSpatialQueryDialog::zoomFeature( QgsVectorLayer* lyr, QgsFeatureId fid )
 {
@@ -711,7 +711,7 @@ void QgsSpatialQueryDialog::zoomFeature( QgsVectorLayer* lyr, QgsFeatureId fid )
     mIface->mapCanvas()->setExtent( rectExtent );
   }
   mIface->mapCanvas()->refresh();
-} // void QgsSpatialQueryDialog::zoomFeatureTarget(QgsVectorLayer* lyr, int fid)
+} // void QgsSpatialQueryDialog::zoomFeature( QgsVectorLayer* lyr, QgsFeatureId fid )
 
 void QgsSpatialQueryDialog::showRubberFeature( QgsVectorLayer* lyr, QgsFeatureId id )
 {
diff --git a/src/providers/gdal/qgsgdaldataitems.cpp b/src/providers/gdal/qgsgdaldataitems.cpp
index dc290c8..ea0c450 100644
--- a/src/providers/gdal/qgsgdaldataitems.cpp
+++ b/src/providers/gdal/qgsgdaldataitems.cpp
@@ -38,6 +38,12 @@ QgsGdalLayerItem::QgsGdalLayerItem( QgsDataItem* parent,
   }
   else
     setState( Populated );
+
+  GDALAllRegister();
+  GDALDatasetH hDS = GDALOpen( TO8F( mPath ), GA_Update );
+
+  if ( hDS )
+    mCapabilities |= SetCrs;
 }
 
 QgsGdalLayerItem::~QgsGdalLayerItem()
@@ -46,32 +52,23 @@ QgsGdalLayerItem::~QgsGdalLayerItem()
 
 QgsLayerItem::Capability QgsGdalLayerItem::capabilities()
 {
-  // Check if data source can be opened for update
-  QgsDebugMsg( "mPath = " + mPath );
-  GDALAllRegister();
-  GDALDatasetH hDS = GDALOpen( TO8F( mPath ), GA_Update );
-
-  if ( !hDS )
-    return NoCapabilities;
-
-  return SetCrs;
+  return mCapabilities & SetCrs ? SetCrs : NoCapabilities;
 }
 
 bool QgsGdalLayerItem::setCrs( QgsCoordinateReferenceSystem crs )
 {
-  QgsDebugMsg( "mPath = " + mPath );
-  GDALAllRegister();
   GDALDatasetH hDS = GDALOpen( TO8F( mPath ), GA_Update );
-
   if ( !hDS )
     return false;
 
   QString wkt = crs.toWkt();
   if ( GDALSetProjection( hDS, wkt.toLocal8Bit().data() ) != CE_None )
   {
+    GDALClose( hDS );
     QgsDebugMsg( "Could not set CRS" );
     return false;
   }
+
   GDALClose( hDS );
   return true;
 }
diff --git a/src/providers/grass/qgsgrass.cpp b/src/providers/grass/qgsgrass.cpp
index bb97873..c7fcf50 100644
--- a/src/providers/grass/qgsgrass.cpp
+++ b/src/providers/grass/qgsgrass.cpp
@@ -23,6 +23,7 @@
 #include "qgscoordinatereferencesystem.h"
 #include "qgsrectangle.h"
 #include "qgsconfig.h"
+#include "qgslocalec.h"
 
 #include <QFileDialog>
 #include <QMessageBox>
@@ -1409,31 +1410,29 @@ QgsCoordinateReferenceSystem GRASS_LIB_EXPORT QgsGrass::crsDirect( QString gisdb
   QgsGrass::resetError();
   QgsGrass::setLocation( gisdbase, location );
 
-  const char *oldlocale = setlocale( LC_NUMERIC, NULL );
-  setlocale( LC_NUMERIC, "C" );
-
-  G_TRY
-  {
-    G_get_default_window( &cellhd );
-  }
-  G_CATCH( QgsGrass::Exception &e )
   {
-    Q_UNUSED( e );
-    setlocale( LC_NUMERIC, oldlocale );
-    QgsDebugMsg( QString( "Cannot get default window: %1" ).arg( e.what() ) );
-    return QgsCoordinateReferenceSystem();
-  }
+    QgsLocaleNumC l;
 
-  if ( cellhd.proj != PROJECTION_XY )
-  {
-    struct Key_Value *projinfo = G_get_projinfo();
-    struct Key_Value *projunits = G_get_projunits();
-    char *wkt = GPJ_grass_to_wkt( projinfo, projunits, 0, 0 );
-    Wkt = QString( wkt );
-    G_free( wkt );
-  }
+    G_TRY
+    {
+      G_get_default_window( &cellhd );
+    }
+    G_CATCH( QgsGrass::Exception &e )
+    {
+      Q_UNUSED( e );
+      QgsDebugMsg( QString( "Cannot get default window: %1" ).arg( e.what() ) );
+      return QgsCoordinateReferenceSystem();
+    }
 
-  setlocale( LC_NUMERIC, oldlocale );
+    if ( cellhd.proj != PROJECTION_XY )
+    {
+      struct Key_Value *projinfo = G_get_projinfo();
+      struct Key_Value *projunits = G_get_projunits();
+      char *wkt = GPJ_grass_to_wkt( projinfo, projunits, 0, 0 );
+      Wkt = QString( wkt );
+      G_free( wkt );
+    }
+  }
 
   QgsCoordinateReferenceSystem srs;
   srs.createFromWkt( Wkt );
diff --git a/src/providers/mssql/qgsmssqlgeometryparser.cpp b/src/providers/mssql/qgsmssqlgeometryparser.cpp
index 48c3aed..af5e4a8 100644
--- a/src/providers/mssql/qgsmssqlgeometryparser.cpp
+++ b/src/providers/mssql/qgsmssqlgeometryparser.cpp
@@ -493,9 +493,9 @@ unsigned char* QgsMssqlGeometryParser::ParseSqlGeometry( unsigned char* pszInput
 
   chProps = ReadByte( 5 );
 
-  if ( chProps & SP_HASMVALUES )
+  if ( chProps & SP_HASZVALUES && chProps & SP_HASMVALUES )
     nPointSize = 32;
-  else if ( chProps & SP_HASZVALUES )
+  else if ( chProps & SP_HASZVALUES || chProps & SP_HASMVALUES)
     nPointSize = 24;
   else
     nPointSize = 16;
diff --git a/src/providers/mssql/qgsmssqlnewconnection.cpp b/src/providers/mssql/qgsmssqlnewconnection.cpp
index 76a18d7..5f29ca8 100644
--- a/src/providers/mssql/qgsmssqlnewconnection.cpp
+++ b/src/providers/mssql/qgsmssqlnewconnection.cpp
@@ -58,18 +58,6 @@ QgsMssqlNewConnection::QgsMssqlNewConnection( QWidget *parent, const QString& co
       chkStorePassword->setChecked( true );
     }
 
-    // Old save setting
-    if ( settings.contains( key + "/save" ) )
-    {
-      txtUsername->setText( settings.value( key + "/username" ).toString() );
-      chkStoreUsername->setChecked( !txtUsername->text().isEmpty() );
-
-      if ( settings.value( key + "/save" ).toString() == "true" )
-        txtPassword->setText( settings.value( key + "/password" ).toString() );
-
-      chkStorePassword->setChecked( true );
-    }
-
     txtName->setText( connName );
   }
   on_cb_trustedConnection_clicked();
@@ -91,7 +79,7 @@ void QgsMssqlNewConnection::accept()
   }
 
   // warn if entry was renamed to an existing connection
-  if (( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) &&
+  if (( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) &&
       ( settings.contains( baseKey + txtName->text() + "/service" ) ||
         settings.contains( baseKey + txtName->text() + "/host" ) ) &&
       QMessageBox::question( this,
@@ -105,8 +93,8 @@ void QgsMssqlNewConnection::accept()
   // on rename delete the original entry first
   if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() )
   {
-
     settings.remove( baseKey + mOriginalConnName );
+    settings.sync();
   }
 
   baseKey += txtName->text();
diff --git a/src/providers/mssql/qgsmssqlprovider.cpp b/src/providers/mssql/qgsmssqlprovider.cpp
index ed11f89..8dbe863 100644
--- a/src/providers/mssql/qgsmssqlprovider.cpp
+++ b/src/providers/mssql/qgsmssqlprovider.cpp
@@ -132,7 +132,9 @@ QgsMssqlProvider::QgsMssqlProvider( QString uri )
       mGeometryColName = anUri.geometryColumn();
 
     if ( mSRId < 0 || mWkbType == QGis::WKBUnknown || mGeometryColName.isEmpty() )
+    {
       loadMetadata();
+    }
     loadFields();
     UpdateStatistics( mUseEstimatedMetadata );
 
@@ -309,16 +311,16 @@ QVariant::Type QgsMssqlProvider::DecodeSqlType( QString sqlTypeName )
   {
     type = QVariant::ByteArray;
   }
-  else if ( sqlTypeName.startsWith( "date", Qt::CaseInsensitive ) )
-  {
-    type = QVariant::Date;
-  }
   else if ( sqlTypeName.startsWith( "datetime", Qt::CaseInsensitive ) ||
             sqlTypeName.startsWith( "smalldatetime", Qt::CaseInsensitive ) ||
             sqlTypeName.startsWith( "datetime2", Qt::CaseInsensitive ) )
   {
     type = QVariant::DateTime;
   }
+  else if ( sqlTypeName.startsWith( "date", Qt::CaseInsensitive ) )
+  {
+    type = QVariant::Date;
+  }
   else if ( sqlTypeName.startsWith( "time", Qt::CaseInsensitive ) ||
             sqlTypeName.startsWith( "timestamp", Qt::CaseInsensitive ) )
   {
@@ -877,6 +879,21 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList & flist )
         // binding a TEXT value
         query.addBindValue( attrs[i].toString() );
       }
+      else if ( type == QVariant::Time )
+      {
+        // binding a TIME value
+        query.addBindValue( attrs[i].toTime().toString( Qt::ISODate ) );
+      }
+      else if ( type == QVariant::Date )
+      {
+        // binding a DATE value
+        query.addBindValue( attrs[i].toDate().toString( Qt::ISODate ) );
+      }
+      else if ( type == QVariant::DateTime )
+      {
+        // binding a DATETIME value
+        query.addBindValue( attrs[i].toDateTime().toString( Qt::ISODate ) );
+      }
       else
       {
         query.addBindValue( attrs[i] );
@@ -1117,6 +1134,21 @@ bool QgsMssqlProvider::changeAttributeValues( const QgsChangedAttributesMap &att
         // binding a TEXT value
         query.addBindValue( it2->toString() );
       }
+      else if ( type == QVariant::DateTime )
+      {
+        // binding a DATETIME value
+        query.addBindValue( it2->toDateTime().toString( Qt::ISODate ) );
+      }
+      else if ( type == QVariant::Date )
+      {
+        // binding a DATE value
+        query.addBindValue( it2->toDate().toString( Qt::ISODate ) );
+      }
+      else if ( type == QVariant::Time )
+      {
+        // binding a TIME value
+        query.addBindValue( it2->toTime().toString( Qt::ISODate ) );
+      }
       else
       {
         query.addBindValue( *it2 );
@@ -1324,7 +1356,11 @@ QgsCoordinateReferenceSystem QgsMssqlProvider::crs()
 {
   if ( !mCrs.isValid() && mSRId > 0 )
   {
-    // try to load crs
+    mCrs.createFromSrid( mSRId );
+    if ( mCrs.isValid() )
+      return mCrs;
+ 
+    // try to load crs from the database tables as a fallback
     QSqlQuery query = QSqlQuery( mDatabase );
     query.setForwardOnly( true );
     bool execOk = query.exec( QString( "select srtext from spatial_ref_sys where srid = %1" ).arg( QString::number( mSRId ) ) );
@@ -1336,6 +1372,8 @@ QgsCoordinateReferenceSystem QgsMssqlProvider::crs()
       query.finish();
     }
     query.clear();
+
+    // Look in the system reference table for the data if we can't find it yet
     execOk = query.exec( QString( "select well_known_text from sys.spatial_reference_systems where spatial_reference_id = %1" ).arg( QString::number( mSRId ) ) );
     if ( execOk && query.isActive() && query.next() && mCrs.createFromWkt( query.value( 0 ).toString() ) )
       return mCrs;
diff --git a/src/providers/mssql/qgsmssqlsourceselect.cpp b/src/providers/mssql/qgsmssqlsourceselect.cpp
index e2d2475..836c930 100644
--- a/src/providers/mssql/qgsmssqlsourceselect.cpp
+++ b/src/providers/mssql/qgsmssqlsourceselect.cpp
@@ -519,6 +519,31 @@ void QgsMssqlSourceSelect::on_btnConnect_clicked()
 
   QString connectionName = db.connectionName();
 
+  // Test for geometry columns table first.  Don't use it if not found.
+  QSqlQuery q = QSqlQuery( db );
+  q.setForwardOnly( true );
+
+  if ( useGeometryColumns )
+  {
+    QString testquery( "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'geometry_columns'" );
+    q.exec( testquery );
+    q.first();
+    int count = q.value( 0 ).toInt();
+    bool geometryColumnsFound = count != 0;
+    if ( !geometryColumnsFound )
+    {
+      QMessageBox::StandardButtons reply;
+      reply = QMessageBox::question( this, "Scan full database?",
+                                     "No geometry_columns table found. \nWould you like to search full database (might be slower)? ",
+                                     QMessageBox::Yes | QMessageBox::No
+                                   );
+      if ( reply == QMessageBox::Yes )
+        useGeometryColumns = false;
+      else
+        return;
+    }
+  }
+
   // Read supported layers from database
   QApplication::setOverrideCursor( Qt::WaitCursor );
 
@@ -539,7 +564,7 @@ void QgsMssqlSourceSelect::on_btnConnect_clicked()
   }
 
   // issue the sql query
-  QSqlQuery q = QSqlQuery( db );
+  q = QSqlQuery( db );
   q.setForwardOnly( true );
   ( void )q.exec( query );
 
diff --git a/src/providers/ogr/qgsogrdataitems.cpp b/src/providers/ogr/qgsogrdataitems.cpp
index 5b0c025..2920ec4 100644
--- a/src/providers/ogr/qgsogrdataitems.cpp
+++ b/src/providers/ogr/qgsogrdataitems.cpp
@@ -37,90 +37,76 @@ QgsOgrLayerItem::QgsOgrLayerItem( QgsDataItem* parent,
 {
   mToolTip = uri;
   setState( Populated ); // children are not expected
-}
-
-QgsOgrLayerItem::~QgsOgrLayerItem()
-{
-}
 
-QgsLayerItem::Capability QgsOgrLayerItem::capabilities()
-{
-  QgsDebugMsg( "mPath = " + mPath );
   OGRRegisterAll();
   OGRSFDriverH hDriver;
   OGRDataSourceH hDataSource = OGROpen( TO8F( mPath ), true, &hDriver );
 
-  if ( !hDataSource )
-    return NoCapabilities;
+  if ( hDataSource )
+  {
+    QString driverName = OGR_Dr_GetName( hDriver );
+    OGR_DS_Destroy( hDataSource );
 
-  QString  driverName = OGR_Dr_GetName( hDriver );
-  OGR_DS_Destroy( hDataSource );
+    if ( driverName == "ESRI Shapefile" )
+      mCapabilities |= SetCrs;
 
-  if ( driverName == "ESRI Shapefile" )
-    return SetCrs;
+    // It it is impossible to assign a crs to an existing layer
+    // No OGR_L_SetSpatialRef : http://trac.osgeo.org/gdal/ticket/4032
+  }
+}
 
-  return NoCapabilities;
+QgsOgrLayerItem::~QgsOgrLayerItem()
+{
 }
 
-bool QgsOgrLayerItem::setCrs( QgsCoordinateReferenceSystem crs )
+QgsLayerItem::Capability QgsOgrLayerItem::capabilities()
 {
-  QgsDebugMsg( "mPath = " + mPath );
-  OGRRegisterAll();
-  OGRSFDriverH hDriver;
-  OGRDataSourceH hDataSource = OGROpen( TO8F( mPath ), true, &hDriver );
+  return mCapabilities & SetCrs ? SetCrs : NoCapabilities;
+}
 
-  if ( !hDataSource )
+bool QgsOgrLayerItem::setCrs( QgsCoordinateReferenceSystem crs )
+{
+  if ( !( mCapabilities & SetCrs ) )
     return false;
 
-  QString  driverName = OGR_Dr_GetName( hDriver );
-  OGR_DS_Destroy( hDataSource );
+  QString layerName = mPath.left( mPath.indexOf( ".shp", Qt::CaseInsensitive ) );
+  QString wkt = crs.toWkt();
 
-  // we are able to assign CRS only to shapefiles :-(
-  if ( driverName == "ESRI Shapefile" )
+  // save ordinary .prj file
+  OGRSpatialReferenceH hSRS = OSRNewSpatialReference( wkt.toLocal8Bit().data() );
+  OSRMorphToESRI( hSRS ); // this is the important stuff for shapefile .prj
+  char* pszOutWkt = NULL;
+  OSRExportToWkt( hSRS, &pszOutWkt );
+  QFile prjFile( layerName + ".prj" );
+  if ( prjFile.open( QIODevice::WriteOnly ) )
   {
-    QString layerName = mPath.left( mPath.indexOf( ".shp", Qt::CaseInsensitive ) );
-    QString wkt = crs.toWkt();
-
-    // save ordinary .prj file
-    OGRSpatialReferenceH hSRS = OSRNewSpatialReference( wkt.toLocal8Bit().data() );
-    OSRMorphToESRI( hSRS ); // this is the important stuff for shapefile .prj
-    char* pszOutWkt = NULL;
-    OSRExportToWkt( hSRS, &pszOutWkt );
-    QFile prjFile( layerName + ".prj" );
-    if ( prjFile.open( QIODevice::WriteOnly ) )
-    {
-      QTextStream prjStream( &prjFile );
-      prjStream << pszOutWkt << endl;
-      prjFile.close();
-    }
-    else
-    {
-      QgsMessageLog::logMessage( tr( "Couldn't open file %1.prj" ).arg( layerName ), tr( "OGR" ) );
-      return false;
-    }
-    OSRDestroySpatialReference( hSRS );
-    CPLFree( pszOutWkt );
-
-    // save qgis-specific .qpj file (maybe because of better wkt compatibility?)
-    QFile qpjFile( layerName + ".qpj" );
-    if ( qpjFile.open( QIODevice::WriteOnly ) )
-    {
-      QTextStream qpjStream( &qpjFile );
-      qpjStream << wkt.toLocal8Bit().data() << endl;
-      qpjFile.close();
-    }
-    else
-    {
-      QgsMessageLog::logMessage( tr( "Couldn't open file %1.qpj" ).arg( layerName ), tr( "OGR" ) );
-      return false;
-    }
+    QTextStream prjStream( &prjFile );
+    prjStream << pszOutWkt << endl;
+    prjFile.close();
+  }
+  else
+  {
+    QgsMessageLog::logMessage( tr( "Couldn't open file %1.prj" ).arg( layerName ), tr( "OGR" ) );
+    return false;
+  }
+  OSRDestroySpatialReference( hSRS );
+  CPLFree( pszOutWkt );
 
-    return true;
+  // save qgis-specific .qpj file (maybe because of better wkt compatibility?)
+  QFile qpjFile( layerName + ".qpj" );
+  if ( qpjFile.open( QIODevice::WriteOnly ) )
+  {
+    QTextStream qpjStream( &qpjFile );
+    qpjStream << wkt.toLocal8Bit().data() << endl;
+    qpjFile.close();
+  }
+  else
+  {
+    QgsMessageLog::logMessage( tr( "Couldn't open file %1.qpj" ).arg( layerName ), tr( "OGR" ) );
+    return false;
   }
 
-  // It it is impossible to assign a crs to an existing layer
-  // No OGR_L_SetSpatialRef : http://trac.osgeo.org/gdal/ticket/4032
-  return false;
+  return true;
 }
 
 QString QgsOgrLayerItem::layerName() const
diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp
index 8534dd5..d04525b 100644
--- a/src/providers/ogr/qgsogrprovider.cpp
+++ b/src/providers/ogr/qgsogrprovider.cpp
@@ -19,6 +19,7 @@ email                : sherman at mrcc.com
 #include "qgsogrfeatureiterator.h"
 #include "qgslogger.h"
 #include "qgsmessagelog.h"
+#include "qgslocalec.h"
 
 #define CPL_SUPRESS_CPLUSPLUS
 #include <gdal.h>         // to collect version information
@@ -45,6 +46,7 @@ email                : sherman at mrcc.com
 #include "qgsgeometry.h"
 #include "qgscoordinatereferencesystem.h"
 #include "qgsvectorlayerimport.h"
+#include "qgslocalec.h"
 
 static const QString TEXT_PROVIDER_KEY = "ogr";
 static const QString TEXT_PROVIDER_DESCRIPTION =
@@ -82,6 +84,8 @@ bool QgsOgrProvider::convertField( QgsField &field, const QTextCodec &encoding )
   OGRFieldType ogrType = OFTString; //default to string
   int ogrWidth = field.length();
   int ogrPrecision = field.precision();
+  if ( ogrPrecision > 0 )
+    ogrWidth += 1;
   switch ( field.type() )
   {
     case QVariant::LongLong:
@@ -366,6 +370,11 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri )
   QgsDebugMsg( "mSubsetString: " + mSubsetString );
   CPLSetConfigOption( "OGR_ORGANIZE_POLYGONS", "ONLY_CCW" );  // "SKIP" returns MULTIPOLYGONs for multiringed POLYGONs
 
+  if ( mFilePath.startsWith( "MySQL:" ) && !mLayerName.isEmpty() )
+  {
+    mFilePath += ",tables=" + mLayerName;
+  }
+
   // first try to open in update mode (unless specified otherwise)
   if ( !openReadOnly )
     ogrDataSource = OGROpen( TO8F( mFilePath ), true, &ogrDriver );
@@ -786,6 +795,11 @@ void QgsOgrProvider::loadFields()
         }
       }
 
+      int width = OGR_Fld_GetWidth( fldDef );
+      int prec = OGR_Fld_GetPrecision( fldDef );
+      if ( prec > 0 )
+        width -= 1;
+
       mAttributeFields.append(
         QgsField(
           name,
@@ -795,8 +809,9 @@ void QgsOgrProvider::loadFields()
 #else
           mEncoding->toUnicode( OGR_GetFieldTypeName( ogrType ) ),
 #endif
-          OGR_Fld_GetWidth( fldDef ),
-          OGR_Fld_GetPrecision( fldDef ) ) );
+          width, prec
+        )
+      );
     }
   }
 }
@@ -990,11 +1005,7 @@ bool QgsOgrProvider::addFeature( QgsFeature& f )
 
   const QgsAttributes& attrs = f.attributes();
 
-  char *oldlocale = setlocale( LC_NUMERIC, NULL );
-  if ( oldlocale )
-    oldlocale = strdup( oldlocale );
-
-  setlocale( LC_NUMERIC, "C" );
+  QgsLocaleNumC l;
 
   //add possible attribute information
   for ( int targetAttributeId = 0; targetAttributeId < attrs.count(); ++targetAttributeId )
@@ -1067,14 +1078,12 @@ bool QgsOgrProvider::addFeature( QgsFeature& f )
   }
   else
   {
-    f.setFeatureId( OGR_F_GetFID( feature ) );
+    long id = OGR_F_GetFID( feature );
+    if ( id >= 0 )
+      f.setFeatureId( id );
   }
   OGR_F_Destroy( feature );
 
-  setlocale( LC_NUMERIC, oldlocale );
-  if ( oldlocale )
-    free( oldlocale );
-
   return returnValue;
 }
 
@@ -1137,7 +1146,10 @@ bool QgsOgrProvider::addAttributes( const QList<QgsField> &attributes )
     }
 
     OGRFieldDefnH fielddefn = OGR_Fld_Create( mEncoding->fromUnicode( iter->name() ).constData(), type );
-    OGR_Fld_SetWidth( fielddefn, iter->length() );
+    int width = iter->length();
+    if ( iter->precision() )
+      width += 1;
+    OGR_Fld_SetWidth( fielddefn, width );
     OGR_Fld_SetPrecision( fielddefn, iter->precision() );
 
     if ( OGR_L_CreateField( ogrLayer, fielddefn, true ) != OGRERR_NONE )
@@ -1206,10 +1218,7 @@ bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
       continue;
     }
 
-    char *oldlocale = setlocale( LC_NUMERIC, NULL );
-    if ( oldlocale )
-      oldlocale = strdup( oldlocale );
-    setlocale( LC_NUMERIC, "C" );
+    QgsLocaleNumC l;
 
     for ( QgsAttributeMap::const_iterator it2 = attr.begin(); it2 != attr.end(); ++it2 )
     {
@@ -1271,10 +1280,6 @@ bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
     {
       pushError( tr( "OGR error setting feature %1: %2" ).arg( fid ).arg( CPLGetLastErrorMsg() ) );
     }
-
-    setlocale( LC_NUMERIC, oldlocale );
-    if ( oldlocale )
-      free( oldlocale );
   }
 
   if ( OGR_L_SyncToDisk( ogrLayer ) != OGRERR_NONE )
@@ -2165,6 +2170,8 @@ QGISEXTERN bool createEmptyDataSource( const QString &uri,
 
     int width = fields.size() > 1 ? fields[1].toInt() : -1;
     int precision = fields.size() > 2 ? fields[2].toInt() : -1;
+    if ( precision > 0 )
+      width += 1;
 
     OGRFieldDefnH field;
     if ( fields[0] == "Real" )
@@ -2519,6 +2526,12 @@ void QgsOgrProvider::recalculateFeatureCount()
   }
 }
 
+bool QgsOgrProvider::doesStrictFeatureTypeCheck() const
+{
+  // FIXME probably other drivers too...
+  return ogrDriverName != "ESRI Shapefile" || geomType == wkbPoint;
+}
+
 OGRwkbGeometryType QgsOgrProvider::ogrWkbSingleFlatten( OGRwkbGeometryType type )
 {
   type = wkbFlatten( type );
diff --git a/src/providers/ogr/qgsogrprovider.h b/src/providers/ogr/qgsogrprovider.h
index 6c11c8c..632f54e 100644
--- a/src/providers/ogr/qgsogrprovider.h
+++ b/src/providers/ogr/qgsogrprovider.h
@@ -243,9 +243,9 @@ class QgsOgrProvider : public QgsVectorDataProvider
     QString description() const override;
 
     /** Returns true if the provider is strict about the type of inserted features
-          (e.g. no multipolygon in a polygon layer)
-          */
-    virtual bool doesStrictFeatureTypeCheck() const override { return false;}
+        (e.g. no multipolygon in a polygon layer)
+      */
+    virtual bool doesStrictFeatureTypeCheck() const override;
 
     /** return OGR geometry type */
     static OGRwkbGeometryType getOgrGeomType( OGRLayerH ogrLayer );
diff --git a/src/providers/oracle/qgsoraclefeatureiterator.cpp b/src/providers/oracle/qgsoraclefeatureiterator.cpp
index 39318bf..a33c2e8 100644
--- a/src/providers/oracle/qgsoraclefeatureiterator.cpp
+++ b/src/providers/oracle/qgsoraclefeatureiterator.cpp
@@ -137,7 +137,7 @@ bool QgsOracleFeatureIterator::fetchFeature( QgsFeature& feature )
     int col = 0;
 
     if ((( mRequest.flags() & QgsFeatureRequest::NoGeometry ) == 0 && !mSource->mGeometryColumn.isNull() ) ||
-        (( mRequest.flags() & QgsFeatureRequest::ExactIntersect ) != 0 && !mConnection->hasSpatial() ) )
+        (( mRequest.flags() & QgsFeatureRequest::ExactIntersect ) != 0 && ( !mConnection->hasSpatial() || !mSource->mHasSpatialIndex ) ) )
     {
       QByteArray *ba = static_cast<QByteArray*>( mQry.value( col++ ).data() );
       unsigned char *copy = new unsigned char[ba->size()];
diff --git a/src/providers/oracle/qgsoraclenewconnection.cpp b/src/providers/oracle/qgsoraclenewconnection.cpp
index 7bca5df..324e4f4 100644
--- a/src/providers/oracle/qgsoraclenewconnection.cpp
+++ b/src/providers/oracle/qgsoraclenewconnection.cpp
@@ -95,7 +95,7 @@ void QgsOracleNewConnection::accept()
   }
 
   // warn if entry was renamed to an existing connection
-  if (( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) &&
+  if (( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) &&
       ( settings.contains( baseKey + txtName->text() + "/service" ) ||
         settings.contains( baseKey + txtName->text() + "/host" ) ) &&
       QMessageBox::question( this,
@@ -109,8 +109,8 @@ void QgsOracleNewConnection::accept()
   // on rename delete the original entry first
   if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() )
   {
-
     settings.remove( baseKey + mOriginalConnName );
+    settings.sync();
   }
 
   baseKey += txtName->text();
@@ -128,9 +128,6 @@ void QgsOracleNewConnection::accept()
   settings.setValue( baseKey + "/savePassword", chkStorePassword->isChecked() ? "true" : "false" );
   settings.setValue( baseKey + "/dboptions", txtOptions->text() );
 
-  // remove old save setting
-  settings.remove( baseKey + "/save" );
-
   QDialog::accept();
 }
 
diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp
index 5f4c36c..3a63558 100644
--- a/src/providers/oracle/qgsoracleprovider.cpp
+++ b/src/providers/oracle/qgsoracleprovider.cpp
@@ -1169,7 +1169,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
 
   try
   {
-    QSqlQuery qry( db );
+    QSqlQuery ins( db ), getfid( db );
 
     if ( !db.transaction() )
     {
@@ -1193,14 +1193,24 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
 
     if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap )
     {
+      QString keys, kdelim = "";
+
       foreach ( int idx, mPrimaryKeyAttrs )
       {
-        insert += delim + quotedIdentifier( field( idx ).name() );
+        const QgsField &fld = field( idx );
+        insert += delim + quotedIdentifier( fld.name() );
+        keys += kdelim + quotedIdentifier( fld.name() );
         values += delim + "?";
         delim = ",";
+        kdelim = ",";
         fieldId << idx;
         defaultValues << defaultValue( idx ).toString();
       }
+
+      if ( !getfid.prepare( QString( "SELECT %1 FROM %2 WHERE ROWID=?" ).arg( keys ).arg( mQuery ) ) )
+      {
+        throw OracleException( tr( "Could not prepare get feature id statement" ), getfid );
+      }
     }
 
     const QgsAttributes &attributevec = flist[0].attributes();
@@ -1276,9 +1286,9 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
     insert += values + ")";
 
     QgsDebugMsgLevel( QString( "SQL prepare: %1" ).arg( insert ), 4 );
-    if ( !qry.prepare( insert ) )
+    if ( !ins.prepare( insert ) )
     {
-      throw OracleException( tr( "Could not prepare insert statement" ), qry );
+      throw OracleException( tr( "Could not prepare insert statement" ), ins );
     }
 
     for ( QgsFeatureList::iterator features = flist.begin(); features != flist.end(); ++features )
@@ -1289,7 +1299,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
 
       if ( !mGeometryColumn.isNull() )
       {
-        appendGeomParam( features->geometry(), qry );
+        appendGeomParam( features->geometry(), ins );
       }
 
       for ( int i = 0; i < fieldId.size(); i++ )
@@ -1315,20 +1325,37 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
         }
 
         QgsDebugMsgLevel( QString( "addBindValue: %1" ).arg( v ), 4 );
-        qry.addBindValue( v );
+        ins.addBindValue( v );
       }
 
-      if ( !qry.exec() )
-        throw OracleException( tr( "Could not insert feature %1" ).arg( features->id() ), qry );
+      if ( !ins.exec() )
+        throw OracleException( tr( "Could not insert feature %1" ).arg( features->id() ), ins );
 
       if ( mPrimaryKeyType == pktRowId )
       {
-        features->setFeatureId( mShared->lookupFid( QList<QVariant>() << QVariant( qry.lastInsertId() ) ) );
+        features->setFeatureId( mShared->lookupFid( QList<QVariant>() << QVariant( ins.lastInsertId() ) ) );
         QgsDebugMsgLevel( QString( "new fid=%1" ).arg( features->id() ), 4 );
       }
+      else if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap )
+      {
+        getfid.addBindValue( QVariant( ins.lastInsertId() ) );
+        if ( !getfid.exec() || !getfid.next() )
+          throw OracleException( tr( "Could not retrieve feature id %1" ).arg( features->id() ), getfid );
+
+        int col = 0;
+        foreach ( int idx, mPrimaryKeyAttrs )
+        {
+          const QgsField &fld = field( idx );
+
+          QVariant v = getfid.value( col++ );
+          if ( v.type() != fld.type() )
+            v = QgsVectorDataProvider::convertValue( fld.type(), v.toString() );
+          features->setAttribute( idx, v );
+        }
+      }
     }
 
-    qry.finish();
+    ins.finish();
 
     if ( !db.commit() )
     {
diff --git a/src/providers/ows/qgsowsdataitems.cpp b/src/providers/ows/qgsowsdataitems.cpp
index 67eedad..5b82839 100644
--- a/src/providers/ows/qgsowsdataitems.cpp
+++ b/src/providers/ows/qgsowsdataitems.cpp
@@ -69,7 +69,7 @@ QVector<QgsDataItem*> QgsOWSConnectionItem::createChildren()
       continue;
     }
 
-    item->populate();
+    item->populate( true ); // populate in foreground - this is already run in a thread
 
     layerCount += item->rowCount();
     if ( item->rowCount() > 0 )
diff --git a/src/providers/postgres/qgspgnewconnection.cpp b/src/providers/postgres/qgspgnewconnection.cpp
index 083dd95..4943ea5 100644
--- a/src/providers/postgres/qgspgnewconnection.cpp
+++ b/src/providers/postgres/qgspgnewconnection.cpp
@@ -105,7 +105,7 @@ void QgsPgNewConnection::accept()
   }
 
   // warn if entry was renamed to an existing connection
-  if (( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) &&
+  if (( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) &&
       ( settings.contains( baseKey + txtName->text() + "/service" ) ||
         settings.contains( baseKey + txtName->text() + "/host" ) ) &&
       QMessageBox::question( this,
@@ -119,8 +119,8 @@ void QgsPgNewConnection::accept()
   // on rename delete the original entry first
   if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() )
   {
-
     settings.remove( baseKey + mOriginalConnName );
+    settings.sync();
   }
 
   baseKey += txtName->text();
diff --git a/src/providers/postgres/qgspgtablemodel.cpp b/src/providers/postgres/qgspgtablemodel.cpp
index 9c12f67..050165d 100644
--- a/src/providers/postgres/qgspgtablemodel.cpp
+++ b/src/providers/postgres/qgspgtablemodel.cpp
@@ -68,6 +68,10 @@ void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty& layerProper
     {
       tip = tr( "Enter a SRID" );
     }
+    else if ( layerProperty.pkCols.size() > 0 )
+    {
+      tip = tr( "Select a primary key" );
+    }
 
     QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName );
     QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsPostgresConn::displayStringForWkbType( wkbType ) );
@@ -88,20 +92,17 @@ void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty& layerProper
       sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable );
     }
 
-    QString pkCol = "";
+    QStandardItem *pkItem = new QStandardItem( "" );
     if ( layerProperty.pkCols.size() > 0 )
     {
-      pkCol = layerProperty.pkCols[0];
-    }
-
-    QStandardItem *pkItem = new QStandardItem( pkCol );
-    if ( layerProperty.pkCols.size() > 1 )
+      pkItem->setText( tr( "Select..." ) );
       pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable );
+    }
     else
       pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable );
 
     pkItem->setData( layerProperty.pkCols, Qt::UserRole + 1 );
-    pkItem->setData( pkCol, Qt::UserRole + 2 );
+    pkItem->setData( "", Qt::UserRole + 2 );
 
     QStandardItem *selItem = new QStandardItem( "" );
     selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable );
diff --git a/src/providers/postgres/qgspostgresconnpool.cpp b/src/providers/postgres/qgspostgresconnpool.cpp
index de8bf7e..6dc9b68 100644
--- a/src/providers/postgres/qgspostgresconnpool.cpp
+++ b/src/providers/postgres/qgspostgresconnpool.cpp
@@ -14,13 +14,12 @@
  ***************************************************************************/
 
 #include "qgspostgresconnpool.h"
-
 #include "qgspostgresconn.h"
 
+QgsPostgresConnPool QgsPostgresConnPool::sInstance;
 
 QgsPostgresConnPool* QgsPostgresConnPool::instance()
 {
-  static QgsPostgresConnPool sInstance;
   return &sInstance;
 }
 
diff --git a/src/providers/postgres/qgspostgresconnpool.h b/src/providers/postgres/qgspostgresconnpool.h
index ec73747..6124d00 100644
--- a/src/providers/postgres/qgspostgresconnpool.h
+++ b/src/providers/postgres/qgspostgresconnpool.h
@@ -17,7 +17,6 @@
 #define QGSPOSTGRESCONNPOOL_H
 
 #include "qgsconnectionpool.h"
-
 #include "qgspostgresconn.h"
 
 
@@ -66,6 +65,8 @@ class QgsPostgresConnPool : public QgsConnectionPool<QgsPostgresConn*, QgsPostgr
   private:
     QgsPostgresConnPool();
     ~QgsPostgresConnPool();
+
+    static QgsPostgresConnPool sInstance;
 };
 
 
diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp
index 34228b2..12a47d3 100644
--- a/src/providers/postgres/qgspostgresdataitems.cpp
+++ b/src/providers/postgres/qgspostgresdataitems.cpp
@@ -123,6 +123,11 @@ void QgsPGConnectionItem::editConnection()
 
 void QgsPGConnectionItem::deleteConnection()
 {
+  if ( QMessageBox::question( 0, QObject::tr( "Delete Connection" ),
+                              QObject::tr( "Are you sure you want to delete the connection to %1?" ).arg( mName ),
+                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
+    return;
+
   QgsPostgresConn::deleteConnection( mName );
   // the parent should be updated
   if ( mParent )
@@ -227,7 +232,7 @@ QList<QAction*> QgsPGLayerItem::actions()
 {
   QList<QAction*> lst;
 
-  QAction* actionDeleteLayer = new QAction( tr( "Delete layer" ), this );
+  QAction* actionDeleteLayer = new QAction( tr( "Delete Layer" ), this );
   connect( actionDeleteLayer, SIGNAL( triggered() ), this, SLOT( deleteLayer() ) );
   lst.append( actionDeleteLayer );
 
@@ -236,15 +241,20 @@ QList<QAction*> QgsPGLayerItem::actions()
 
 void QgsPGLayerItem::deleteLayer()
 {
+  if ( QMessageBox::question( 0, QObject::tr( "Delete Object" ),
+                              QObject::tr( "Are you sure you want to delete %1.%2?" ).arg( mLayerProperty.schemaName ).arg( mLayerProperty.tableName ),
+                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
+    return;
+
   QString errCause;
   bool res = ::deleteLayer( mUri, errCause );
   if ( !res )
   {
-    QMessageBox::warning( 0, tr( "Delete layer" ), errCause );
+    QMessageBox::warning( 0, tr( "Delete Layer" ), errCause );
   }
   else
   {
-    QMessageBox::information( 0, tr( "Delete layer" ), tr( "Layer deleted successfully." ) );
+    QMessageBox::information( 0, tr( "Delete Layer" ), tr( "Layer deleted successfully." ) );
     if ( mParent )
       mParent->refresh();
   }
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index f82b378..5db4b98 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -1234,8 +1234,8 @@ QVariant QgsPostgresProvider::minimumValue( int index )
   {
     // get the field name
     const QgsField &fld = field( index );
-    QString sql = QString( "SELECT %1 FROM %2" )
-                  .arg( connectionRO()->fieldExpression( fld, "min(%1)" ) )
+    QString sql = QString( "SELECT min(%1) AS %1 FROM %2" )
+                  .arg( quotedIdentifier( fld.name() ) )
                   .arg( mQuery );
 
     if ( !mSqlWhereClause.isEmpty() )
@@ -1243,6 +1243,8 @@ QVariant QgsPostgresProvider::minimumValue( int index )
       sql += QString( " WHERE %1" ).arg( mSqlWhereClause );
     }
 
+    sql = QString( "SELECT %1 FROM (%2) foo" ).arg( connectionRO()->fieldExpression( fld ) ).arg( sql );
+
     QgsPostgresResult rmin = connectionRO()->PQexec( sql );
     return convertValue( fld.type(), rmin.PQgetvalue( 0, 0 ) );
   }
@@ -1262,7 +1264,7 @@ void QgsPostgresProvider::uniqueValues( int index, QList<QVariant> &uniqueValues
     // get the field name
     const QgsField &fld = field( index );
     QString sql = QString( "SELECT DISTINCT %1 FROM %2" )
-                  .arg( connectionRO()->fieldExpression( fld ) )
+                  .arg( quotedIdentifier( fld.name() ) )
                   .arg( mQuery );
 
     if ( !mSqlWhereClause.isEmpty() )
@@ -1270,13 +1272,15 @@ void QgsPostgresProvider::uniqueValues( int index, QList<QVariant> &uniqueValues
       sql += QString( " WHERE %1" ).arg( mSqlWhereClause );
     }
 
-    sql +=  QString( " ORDER BY %1" ).arg( connectionRO()->fieldExpression( fld ) );
+    sql +=  QString( " ORDER BY %1" ).arg( quotedIdentifier( fld.name() ) );
 
     if ( limit >= 0 )
     {
       sql += QString( " LIMIT %1" ).arg( limit );
     }
 
+    sql = QString( "SELECT %1 FROM (%2) foo" ).arg( connectionRO()->fieldExpression( fld ) ).arg( sql );
+
     QgsPostgresResult res = connectionRO()->PQexec( sql );
     if ( res.PQresultStatus() == PGRES_TUPLES_OK )
     {
@@ -1406,8 +1410,8 @@ QVariant QgsPostgresProvider::maximumValue( int index )
   {
     // get the field name
     const QgsField &fld = field( index );
-    QString sql = QString( "SELECT %1 FROM %2" )
-                  .arg( connectionRO()->fieldExpression( fld, "max(%1)" ) )
+    QString sql = QString( "SELECT max(%1) AS %1 FROM %2" )
+                  .arg( quotedIdentifier( fld.name() ) )
                   .arg( mQuery );
 
     if ( !mSqlWhereClause.isEmpty() )
@@ -1415,6 +1419,8 @@ QVariant QgsPostgresProvider::maximumValue( int index )
       sql += QString( " WHERE %1" ).arg( mSqlWhereClause );
     }
 
+    sql = QString( "SELECT %1 FROM (%2) foo" ).arg( connectionRO()->fieldExpression( fld ) ).arg( sql );
+
     QgsPostgresResult rmax = connectionRO()->PQexec( sql );
     return convertValue( fld.type(), rmax.PQgetvalue( 0, 0 ) );
   }
@@ -1884,7 +1890,7 @@ bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds & id )
       dropOrphanedTopoGeoms();
     }
 
-    mShared->addFeaturesCounted( id.size() );
+    mShared->addFeaturesCounted( -id.size() );
   }
   catch ( PGException &e )
   {
diff --git a/src/providers/spatialite/CMakeLists.txt b/src/providers/spatialite/CMakeLists.txt
index 17f9a52..0416d68 100644
--- a/src/providers/spatialite/CMakeLists.txt
+++ b/src/providers/spatialite/CMakeLists.txt
@@ -30,14 +30,6 @@ SET(SPATIALITE_MOC_HDRS
 
 QT4_WRAP_CPP(SPATIALITE_MOC_SRCS ${SPATIALITE_MOC_HDRS})
 
-IF(SPATIALITE_VERSION_GE_4_0_0)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_GE_4_0_0")
-ENDIF(SPATIALITE_VERSION_GE_4_0_0)
-IF(SPATIALITE_VERSION_G_4_1_1)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_G_4_1_1")
-ENDIF(SPATIALITE_VERSION_G_4_1_1)
-
-
 INCLUDE_DIRECTORIES(
   ${QSCINTILLA_INCLUDE_DIR}
   ../../core
diff --git a/src/providers/spatialite/qgsspatialiteconnection.cpp b/src/providers/spatialite/qgsspatialiteconnection.cpp
index 73af4af..b6d6c5e 100644
--- a/src/providers/spatialite/qgsspatialiteconnection.cpp
+++ b/src/providers/spatialite/qgsspatialiteconnection.cpp
@@ -13,6 +13,7 @@
  *                                                                         *
  ***************************************************************************/
 #include "qgsspatialiteconnection.h"
+#include "qgsslconnect.h"
 
 #include <QFileInfo>
 #include <QSettings>
@@ -67,7 +68,7 @@ QgsSpatiaLiteConnection::Error QgsSpatiaLiteConnection::fetchTables( bool loadGe
     return NotExists;
   }
 
-  sqlite3* handle = openSpatiaLiteDb( fi.canonicalFilePath() );
+  sqlite3 *handle = openSpatiaLiteDb( fi.canonicalFilePath() );
   if ( handle == NULL )
   {
     return FailedToOpen;
@@ -138,11 +139,8 @@ sqlite3 *QgsSpatiaLiteConnection::openSpatiaLiteDb( QString path )
 {
   sqlite3 *handle = NULL;
   int ret;
-  // activating the SpatiaLite library
-  spatialite_init( 0 );
-
   // trying to open the SQLite DB
-  ret = sqlite3_open_v2( path.toUtf8().constData(), &handle, SQLITE_OPEN_READWRITE, NULL );
+  ret = QgsSLConnect::sqlite3_open_v2( path.toUtf8().constData(), &handle, SQLITE_OPEN_READWRITE, NULL );
   if ( ret )
   {
     // failure
@@ -155,7 +153,7 @@ sqlite3 *QgsSpatiaLiteConnection::openSpatiaLiteDb( QString path )
 void QgsSpatiaLiteConnection::closeSpatiaLiteDb( sqlite3 * handle )
 {
   if ( handle )
-    sqlite3_close( handle );
+    QgsSLConnect::sqlite3_close( handle );
 }
 
 int QgsSpatiaLiteConnection::checkHasMetadataTables( sqlite3* handle )
@@ -745,7 +743,7 @@ QgsSqliteHandle* QgsSqliteHandle::openDb( const QString & dbPath, bool shared )
   }
 
   QgsDebugMsg( QString( "New sqlite connection for " ) + dbPath );
-  if ( sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, shared ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX, NULL ) )
+  if ( QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, shared ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX, NULL ) )
   {
     // failure
     QgsDebugMsg( QString( "Failure while connecting to: %1\n%2" )
@@ -759,7 +757,7 @@ QgsSqliteHandle* QgsSqliteHandle::openDb( const QString & dbPath, bool shared )
   {
     // failure
     QgsDebugMsg( QString( "Failure while connecting to: %1\n\ninvalid metadata tables" ).arg( dbPath ) );
-    sqlite3_close( sqlite_handle );
+    QgsSLConnect::sqlite3_close( sqlite_handle );
     return NULL;
   }
   // activating Foreign Key constraints
@@ -818,7 +816,7 @@ void QgsSqliteHandle::sqliteClose()
 {
   if ( sqlite_handle )
   {
-    sqlite3_close( sqlite_handle );
+    QgsSLConnect::sqlite3_close( sqlite_handle );
     sqlite_handle = NULL;
   }
 }
diff --git a/src/providers/spatialite/qgsspatialiteconnection.h b/src/providers/spatialite/qgsspatialiteconnection.h
index bc464f4..f4b1a23 100644
--- a/src/providers/spatialite/qgsspatialiteconnection.h
+++ b/src/providers/spatialite/qgsspatialiteconnection.h
@@ -124,8 +124,6 @@ class QgsSpatiaLiteConnection : public QObject
     QList<TableEntry> mTables;
 };
 
-
-
 class QgsSqliteHandle
 {
     //
diff --git a/src/providers/spatialite/qgsspatialiteconnpool.cpp b/src/providers/spatialite/qgsspatialiteconnpool.cpp
index eaaf615..f7d1abf 100644
--- a/src/providers/spatialite/qgsspatialiteconnpool.cpp
+++ b/src/providers/spatialite/qgsspatialiteconnpool.cpp
@@ -15,9 +15,9 @@
 
 #include "qgsspatialiteconnpool.h"
 
+QgsSpatiaLiteConnPool QgsSpatiaLiteConnPool::sInstance;
 
 QgsSpatiaLiteConnPool* QgsSpatiaLiteConnPool::instance()
 {
-  static QgsSpatiaLiteConnPool sInstance;
   return &sInstance;
 }
diff --git a/src/providers/spatialite/qgsspatialiteconnpool.h b/src/providers/spatialite/qgsspatialiteconnpool.h
index 7110c12..545d653 100644
--- a/src/providers/spatialite/qgsspatialiteconnpool.h
+++ b/src/providers/spatialite/qgsspatialiteconnpool.h
@@ -17,7 +17,6 @@
 #define QGSSPATIALITECONPOOL_H
 
 #include "qgsconnectionpool.h"
-
 #include "qgsspatialiteconnection.h"
 
 inline QString qgsConnectionPool_ConnectionToName( QgsSqliteHandle* c )
@@ -56,9 +55,9 @@ class QgsSpatiaLiteConnPoolGroup : public QObject, public QgsConnectionPoolGroup
 /** SpatiaLite connection pool - singleton */
 class QgsSpatiaLiteConnPool : public QgsConnectionPool<QgsSqliteHandle*, QgsSpatiaLiteConnPoolGroup>
 {
+    static QgsSpatiaLiteConnPool sInstance;
   public:
     static QgsSpatiaLiteConnPool* instance();
-
 };
 
 
diff --git a/src/providers/spatialite/qgsspatialitedataitems.cpp b/src/providers/spatialite/qgsspatialitedataitems.cpp
index d908b82..8cc9a99 100644
--- a/src/providers/spatialite/qgsspatialitedataitems.cpp
+++ b/src/providers/spatialite/qgsspatialitedataitems.cpp
@@ -39,7 +39,7 @@ QList<QAction*> QgsSLLayerItem::actions()
 {
   QList<QAction*> lst;
 
-  QAction* actionDeleteLayer = new QAction( tr( "Delete layer" ), this );
+  QAction* actionDeleteLayer = new QAction( tr( "Delete Layer" ), this );
   connect( actionDeleteLayer, SIGNAL( triggered() ), this, SLOT( deleteLayer() ) );
   lst.append( actionDeleteLayer );
 
@@ -48,16 +48,21 @@ QList<QAction*> QgsSLLayerItem::actions()
 
 void QgsSLLayerItem::deleteLayer()
 {
+  if ( QMessageBox::question( 0, QObject::tr( "Delete Object" ),
+                              QObject::tr( "Are you sure you want to delete %1?" ).arg( mName ),
+                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
+    return;
+
   QgsDataSourceURI uri( mUri );
   QString errCause;
   bool res = ::deleteLayer( uri.database(), uri.table(), errCause );
   if ( !res )
   {
-    QMessageBox::warning( 0, tr( "Delete layer" ), errCause );
+    QMessageBox::warning( 0, tr( "Delete Layer" ), errCause );
   }
   else
   {
-    QMessageBox::information( 0, tr( "Delete layer" ), tr( "Layer deleted successfully." ) );
+    QMessageBox::information( 0, tr( "Delete Layer" ), tr( "Layer deleted successfully." ) );
     mParent->refresh();
   }
 }
@@ -167,6 +172,11 @@ void QgsSLConnectionItem::editConnection()
 
 void QgsSLConnectionItem::deleteConnection()
 {
+  if ( QMessageBox::question( 0, QObject::tr( "Delete Connection" ),
+                              QObject::tr( "Are you sure you want to delete the connection to %1?" ).arg( mName ),
+                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
+    return;
+
   QgsSpatiaLiteConnection::deleteConnection( mName );
   // the parent should be updated
   mParent->refresh();
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
index 988b646..cfaefc7 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
@@ -354,8 +354,16 @@ QVariant QgsSpatiaLiteFeatureIterator::getFeatureAttribute( sqlite3_stmt* stmt,
 {
   if ( sqlite3_column_type( stmt, ic ) == SQLITE_INTEGER )
   {
-    // INTEGER value
-    return sqlite3_column_int( stmt, ic );
+    if ( type == QVariant::Int )
+    {
+      // INTEGER value
+      return sqlite3_column_int( stmt, ic );
+    }
+    else
+    {
+      // INTEGER value
+      return ( qint64 ) sqlite3_column_int64( stmt, ic );
+    }
   }
 
   if ( sqlite3_column_type( stmt, ic ) == SQLITE_FLOAT )
diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp
index 58c1492..f97b203 100644
--- a/src/providers/spatialite/qgsspatialiteprovider.cpp
+++ b/src/providers/spatialite/qgsspatialiteprovider.cpp
@@ -14,24 +14,23 @@ email                : a.furieri at lqt.it
  *                                                                         *
  ***************************************************************************/
 
-#include <qgis.h>
-#include <qgsapplication.h>
-#include <qgsfeature.h>
-#include <qgsfield.h>
-#include <qgsgeometry.h>
-#include <qgsmessageoutput.h>
-#include <qgsrectangle.h>
-#include <qgscoordinatereferencesystem.h>
+#include "qgis.h"
+#include "qgsapplication.h"
+#include "qgsfeature.h"
+#include "qgsfield.h"
+#include "qgsgeometry.h"
+#include "qgsmessageoutput.h"
+#include "qgsrectangle.h"
+#include "qgscoordinatereferencesystem.h"
 #include "qgslogger.h"
 #include "qgsmessagelog.h"
 #include "qgsvectorlayerimport.h"
-
-#include <QMessageBox>
-
+#include "qgsslconnect.h"
 #include "qgsspatialiteprovider.h"
 #include "qgsspatialiteconnpool.h"
 #include "qgsspatialitefeatureiterator.h"
 
+#include <QMessageBox>
 #include <QFileInfo>
 #include <QDir>
 
@@ -43,8 +42,6 @@ const QString SPATIALITE_KEY = "spatialite";
 const QString SPATIALITE_DESCRIPTION = "SpatiaLite data provider";
 
 
-
-
 bool QgsSpatiaLiteProvider::convertField( QgsField &field )
 {
   QString fieldType = "TEXT"; //default to string
@@ -96,6 +93,7 @@ bool QgsSpatiaLiteProvider::convertField( QgsField &field )
   return true;
 }
 
+
 QgsVectorLayerImport::ImportError
 QgsSpatiaLiteProvider::createEmptyLayer(
   const QString& uri,
@@ -133,9 +131,8 @@ QgsSpatiaLiteProvider::createEmptyLayer(
     QString sql;
 
     // trying to open the SQLite DB
-    spatialite_init( 0 );
     handle = QgsSqliteHandle::openDb( sqlitePath );
-    if ( handle == NULL )
+    if ( !handle )
     {
       QgsDebugMsg( "Connection to database failed. Import of layer aborted." );
       if ( errorMessage )
@@ -153,7 +150,7 @@ QgsSpatiaLiteProvider::createEmptyLayer(
       QString pk = primaryKey = "pk";
       for ( int fldIdx = 0; fldIdx < fields.count(); ++fldIdx )
       {
-        if ( fields[fldIdx].name() == pk )
+        if ( fields[fldIdx].name() == primaryKey )
         {
           // it already exists, try again with a new name
           primaryKey = QString( "%1_%2" ).arg( pk ).arg( index++ );
@@ -182,12 +179,13 @@ QgsSpatiaLiteProvider::createEmptyLayer(
     if ( primaryKeyType.isEmpty() )
     {
       primaryKeyType = "INTEGER";
-      /* TODO
+#if 0 // TODO
       // check the feature count to choose if create a bigint pk field
       if ( layer->featureCount() > 0xFFFFFF )
       {
         primaryKeyType = "BIGINT";
-      }*/
+      }
+#endif
     }
 
     try
@@ -408,7 +406,6 @@ QgsSpatiaLiteProvider::createEmptyLayer(
 }
 
 
-
 QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
     : QgsVectorDataProvider( uri )
     , valid( false )
@@ -439,9 +436,8 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
   mQuery = mTableName;
 
   // trying to open the SQLite DB
-  spatialite_init( 0 );
   handle = QgsSqliteHandle::openDb( mSqlitePath );
-  if ( handle == NULL )
+  if ( !handle )
   {
     return;
   }
@@ -5058,15 +5054,14 @@ QGISEXTERN bool createDb( const QString& dbPath, QString& errCause )
   QDir().mkpath( path.absolutePath() );
 
   // creating/opening the new database
-  spatialite_init( 0 );
   sqlite3 *sqlite_handle;
-  int ret = sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
+  int ret = QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
   if ( ret )
   {
     // an error occurred
     errCause = QObject::tr( "Could not create a new database\n" );
     errCause += QString::fromUtf8( sqlite3_errmsg( sqlite_handle ) );
-    sqlite3_close( sqlite_handle );
+    QgsSLConnect::sqlite3_close( sqlite_handle );
     return false;
   }
   // activating Foreign Key constraints
@@ -5076,13 +5071,13 @@ QGISEXTERN bool createDb( const QString& dbPath, QString& errCause )
   {
     errCause = QObject::tr( "Unable to activate FOREIGN_KEY constraints [%1]" ).arg( errMsg );
     sqlite3_free( errMsg );
-    sqlite3_close( sqlite_handle );
+    QgsSLConnect::sqlite3_close( sqlite_handle );
     return false;
   }
   bool init_res = ::initializeSpatialMetadata( sqlite_handle, errCause );
 
   // all done: closing the DB connection
-  sqlite3_close( sqlite_handle );
+  QgsSLConnect::sqlite3_close( sqlite_handle );
 
   return init_res;
 }
@@ -5093,7 +5088,6 @@ QGISEXTERN bool deleteLayer( const QString& dbPath, const QString& tableName, QS
 {
   QgsDebugMsg( "deleting layer " + tableName );
 
-  spatialite_init( 0 );
   QgsSqliteHandle* hndl = QgsSqliteHandle::openDb( dbPath );
   if ( !hndl )
   {
@@ -5174,9 +5168,8 @@ QGISEXTERN bool saveStyle( const QString& uri, const QString& qmlStyle, const QS
   QgsDebugMsg( "Database is: " + sqlitePath );
 
   // trying to open the SQLite DB
-  spatialite_init( 0 );
   handle = QgsSqliteHandle::openDb( sqlitePath );
-  if ( NULL == handle )
+  if ( !handle )
   {
     QgsDebugMsg( "Connection to database failed. Save style aborted." );
     errCause = QObject::tr( "Connection to database failed" );
@@ -5364,9 +5357,8 @@ QGISEXTERN QString loadStyle( const QString& uri, QString& errCause )
   QgsDebugMsg( "Database is: " + sqlitePath );
 
   // trying to open the SQLite DB
-  spatialite_init( 0 );
   handle = QgsSqliteHandle::openDb( sqlitePath );
-  if ( NULL == handle )
+  if ( !handle )
   {
     QgsDebugMsg( "Connection to database failed. Save style aborted." );
     errCause = QObject::tr( "Connection to database failed" );
@@ -5420,7 +5412,6 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na
   QgsDebugMsg( "Database is: " + sqlitePath );
 
   // trying to open the SQLite DB
-  spatialite_init( 0 );
   handle = QgsSqliteHandle::openDb( sqlitePath );
   if ( NULL == handle )
   {
@@ -5533,9 +5524,8 @@ QGISEXTERN QString getStyleById( const QString& uri, QString styleId, QString& e
   QgsDebugMsg( "Database is: " + sqlitePath );
 
   // trying to open the SQLite DB
-  spatialite_init( 0 );
   handle = QgsSqliteHandle::openDb( sqlitePath );
-  if ( NULL == handle )
+  if ( !handle )
   {
     QgsDebugMsg( "Connection to database failed. Save style aborted." );
     errCause = QObject::tr( "Connection to database failed" );
diff --git a/src/providers/spatialite/qspatialite/CMakeLists.txt b/src/providers/spatialite/qspatialite/CMakeLists.txt
index f3750a5..3bf91b6 100644
--- a/src/providers/spatialite/qspatialite/CMakeLists.txt
+++ b/src/providers/spatialite/qspatialite/CMakeLists.txt
@@ -17,6 +17,7 @@ TARGET_LINK_LIBRARIES(qsqlspatialite
 	${QT_QTSQL_LIBRARY}
 	${SQLITE3_LIBRARY}
 	${SPATIALITE_LIBRARY}
+	qgis_core
 )
 
 INSTALL(TARGETS qsqlspatialite
diff --git a/src/providers/spatialite/qspatialite/qsql_spatialite.cpp b/src/providers/spatialite/qspatialite/qsql_spatialite.cpp
index 96a786c..d9523a1 100644
--- a/src/providers/spatialite/qspatialite/qsql_spatialite.cpp
+++ b/src/providers/spatialite/qspatialite/qsql_spatialite.cpp
@@ -58,7 +58,7 @@
 #endif
 
 #include <sqlite3.h>
-#include <spatialite.h>
+#include <qgsslconnect.h>
 
 Q_DECLARE_METATYPE(sqlite3*)
 Q_DECLARE_METATYPE(sqlite3_stmt*)
@@ -548,8 +548,6 @@ bool QSpatiaLiteDriver::open(const QString & db, const QString &, const QString
     if (db.isEmpty())
         return false;
 
-    spatialite_init(0);
-
     bool sharedCache = false;
     int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000;
     QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';'));
@@ -568,7 +566,7 @@ bool QSpatiaLiteDriver::open(const QString & db, const QString &, const QString
 
     sqlite3_enable_shared_cache(sharedCache);
 
-    if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
+    if (QgsSLConnect::sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
         sqlite3_busy_timeout(d->access, timeOut);
         setOpen(true);
         setOpenError(false);
@@ -587,7 +585,7 @@ void QSpatiaLiteDriver::close()
         foreach (QSpatiaLiteResult *result, d->results)
             result->d->finalize();
 
-        if (sqlite3_close(d->access) != SQLITE_OK)
+        if (QgsSLConnect::sqlite3_close(d->access) != SQLITE_OK)
             setLastError(qMakeError(d->access, tr("Error closing database"),
                                     QSqlError::ConnectionError));
         d->access = 0;
diff --git a/src/providers/wcs/qgswcsprovider.cpp b/src/providers/wcs/qgswcsprovider.cpp
index 77022ac..f1b7923 100644
--- a/src/providers/wcs/qgswcsprovider.cpp
+++ b/src/providers/wcs/qgswcsprovider.cpp
@@ -913,6 +913,12 @@ QList<QgsColorRampShader::ColorRampItem> QgsWcsProvider::colorTable( int theBand
   return mColorTables.value( theBandNumber - 1 );
 }
 
+int QgsWcsProvider::colorInterpretation( int bandNo ) const
+{
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mCachedGdalDataset, bandNo );
+  return colorInterpretationFromGdal( GDALGetRasterColorInterpretation( myGdalBand ) );
+}
+
 
 bool QgsWcsProvider::parseServiceExceptionReportDom( QByteArray const & xml, const QString& wcsVersion, QString& errorTitle, QString& errorText )
 {
diff --git a/src/providers/wcs/qgswcsprovider.h b/src/providers/wcs/qgswcsprovider.h
index 467b65a..5c72310 100644
--- a/src/providers/wcs/qgswcsprovider.h
+++ b/src/providers/wcs/qgswcsprovider.h
@@ -178,6 +178,8 @@ class QgsWcsProvider : public QgsRasterDataProvider, QgsGdalProviderBase
     void reloadData() override;
     QList<QgsColorRampShader::ColorRampItem> colorTable( int bandNo )const override;
 
+    int colorInterpretation( int bandNo ) const override;
+
     static QMap<QString, QString> supportedMimes();
 
     /**
diff --git a/src/providers/wms/qgswmscapabilities.cpp b/src/providers/wms/qgswmscapabilities.cpp
index b13b4dc..9f92e89 100644
--- a/src/providers/wms/qgswmscapabilities.cpp
+++ b/src/providers/wms/qgswmscapabilities.cpp
@@ -1381,6 +1381,8 @@ void QgsWmsCapabilities::parseWMTSContents( QDomElement const &e )
         bb.crs = DEFAULT_LATLON_CRS;
         bb.box = QgsRectangle( QgsPoint( ll[0].toDouble(), ll[1].toDouble() ),
                                QgsPoint( ur[0].toDouble(), ur[1].toDouble() ) );
+
+        l.boundingBoxes << bb;
       }
     }
 
@@ -1836,6 +1838,18 @@ bool QgsWmsCapabilities::shouldInvertAxisOrientation( const QString& ogcCrs )
   return changeXY;
 }
 
+int QgsWmsCapabilities::identifyCapabilities() const
+{
+  int capability = QgsRasterInterface::NoCapabilities;
+
+  foreach ( QgsRaster::IdentifyFormat f, mIdentifyFormats.keys() )
+  {
+    capability |= QgsRasterDataProvider::identifyFormatToCapability( f );
+  }
+
+  return capability;
+}
+
 
 
 // -----------------
diff --git a/src/providers/wms/qgswmscapabilities.h b/src/providers/wms/qgswmscapabilities.h
index 4915674..c15ade7 100644
--- a/src/providers/wms/qgswmscapabilities.h
+++ b/src/providers/wms/qgswmscapabilities.h
@@ -530,7 +530,7 @@ class QgsWmsSettings
 };
 
 
-/** keeps information about capabilities of particular URI */
+/** Keeps information about capabilities of particular URI */
 class QgsWmsCapabilities
 {
   public:
@@ -577,6 +577,9 @@ class QgsWmsCapabilities
     /** Find out whether to invert axis orientation when parsing/writing coordinates */
     bool shouldInvertAxisOrientation( const QString& ogcCrs );
 
+    /** Find out identify capabilities */
+    int identifyCapabilities() const;
+
   protected:
     bool parseCapabilitiesDom( QByteArray const &xml, QgsWmsCapabilitiesProperty& capabilitiesProperty );
 
@@ -674,7 +677,7 @@ class QgsWmsCapabilities
 
 
 
-/** class that handles download of capabilities */
+/** Class that handles download of capabilities */
 class QgsWmsCapabilitiesDownload : public QObject
 {
     Q_OBJECT
diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp
index 236d32b..eb2c151 100644
--- a/src/providers/wms/qgswmsdataitems.cpp
+++ b/src/providers/wms/qgswmsdataitems.cpp
@@ -20,13 +20,9 @@
 #include "qgswmscapabilities.h"
 #include "qgswmsconnection.h"
 #include "qgswmssourceselect.h"
-
 #include "qgsnewhttpconnection.h"
-
 #include "qgstilescalewidget.h"
 
-#include "qgsapplication.h"
-
 // ---------------------------------------------------------------------------
 QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path, QString uri )
     : QgsDataCollectionItem( parent, name, path )
@@ -46,19 +42,7 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
 
   QgsDataSourceURI uri;
   uri.setEncodedUri( mUri );
-#if 0
-  if ( mPath.contains( "url=" ) )
-  {
-    encodedUri = mPath;
-    uri.setEncodedUri( encodedUri );
-  }
-  else
-  {
-    QgsWMSConnection connection( mName );
-    uri = connection.uri();
-    encodedUri = uri.encodedUri();
-  }
-#endif
+
   QgsDebugMsg( "mUri = " + mUri );
 
   QgsWmsSettings wmsSettings;
@@ -70,25 +54,6 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
 
   QgsWmsCapabilitiesDownload capDownload( wmsSettings.baseUrl(), wmsSettings.authorization() );
 
-#if 0
-  QWidget *mainWindow = 0;
-
-  QWidgetList topLevelWidgets = qApp->topLevelWidgets();
-  for ( QWidgetList::iterator it = topLevelWidgets.begin(); it != topLevelWidgets.end(); ++it )
-  {
-    if (( *it )->objectName() == "QgisApp" )
-    {
-      mainWindow = *it;
-      break;
-    }
-  }
-
-  if ( mainWindow )
-  {
-    connect( &capDownload, SIGNAL( statusChanged( QString ) ), mainWindow, SLOT( showStatusMessage( QString ) ) );
-  }
-#endif
-
   bool res = capDownload.downloadCapabilities();
 
   if ( !res )
@@ -402,6 +367,7 @@ QWidget * QgsWMSRootItem::paramWidget()
   connect( select, SIGNAL( connectionsChanged() ), this, SLOT( connectionsChanged() ) );
   return select;
 }
+
 void QgsWMSRootItem::connectionsChanged()
 {
   refresh();
diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp
index 8fa0970..bb34671 100644
--- a/src/providers/wms/qgswmsprovider.cpp
+++ b/src/providers/wms/qgswmsprovider.cpp
@@ -1323,7 +1323,7 @@ int QgsWmsProvider::capabilities() const
 
   if ( canIdentify )
   {
-    capability = identifyCapabilities();
+    capability = mCaps.identifyCapabilities();
     if ( capability )
     {
       capability |= Identify;
@@ -1334,19 +1334,6 @@ int QgsWmsProvider::capabilities() const
   return capability;
 }
 
-int QgsWmsProvider::identifyCapabilities() const
-{
-  int capability = NoCapabilities;
-
-  foreach ( QgsRaster::IdentifyFormat f, mCaps.mIdentifyFormats.keys() )
-  {
-    capability |= identifyFormatToCapability( f );
-  }
-
-  QgsDebugMsg( QString( "capability = %1" ).arg( capability ) );
-  return capability;
-}
-
 QString QgsWmsProvider::layerMetadata( QgsWmsLayerProperty &layer )
 {
   QString metadata;
@@ -3054,6 +3041,7 @@ QImage QgsWmsProvider::getLegendGraphic( double scale, bool forceRefresh, const
   mLegendGraphicFetcher.reset( new QgsWmsLegendDownloadHandler( *QgsNetworkAccessManager::instance(), mSettings, url ) );
   if ( ! mLegendGraphicFetcher ) return QImage();
   connect( mLegendGraphicFetcher.data(), SIGNAL( finish( const QImage& ) ), this, SLOT( getLegendGraphicReplyFinished( const QImage& ) ) );
+  connect( mLegendGraphicFetcher.data(), SIGNAL( error( const QString& ) ), this, SLOT( getLegendGraphicReplyErrored( const QString& ) ) );
   connect( mLegendGraphicFetcher.data(), SIGNAL( progress( qint64, qint64 ) ), this, SLOT( getLegendGraphicReplyProgress( qint64, qint64 ) ) );
   mLegendGraphicFetcher->start( );
 
@@ -3132,6 +3120,21 @@ void QgsWmsProvider::getLegendGraphicReplyFinished( const QImage& img )
   }
 }
 
+void QgsWmsProvider::getLegendGraphicReplyErrored( const QString& message )
+{
+  QgsDebugMsg( QString( "get legend failed: %1" ).arg( message ) );
+
+  QObject* reply = sender();
+
+  if ( reply == mLegendGraphicFetcher.data() )
+  {
+    QEventLoop *loop = qobject_cast< QEventLoop *>( reply->property( "eventLoop" ).value< QObject *>() );
+    if ( loop )
+      QMetaObject::invokeMethod( loop, "quit", Qt::QueuedConnection );
+    mLegendGraphicFetcher.reset();
+  }
+}
+
 void QgsWmsProvider::getLegendGraphicReplyProgress( qint64 bytesReceived, qint64 bytesTotal )
 {
   QString msg = tr( "%1 of %2 bytes of GetLegendGraphic downloaded." ).arg( bytesReceived ).arg( bytesTotal < 0 ? QString( "unknown number of" ) : QString::number( bytesTotal ) );
diff --git a/src/providers/wms/qgswmsprovider.h b/src/providers/wms/qgswmsprovider.h
index 51bce92..c31e419 100644
--- a/src/providers/wms/qgswmsprovider.h
+++ b/src/providers/wms/qgswmsprovider.h
@@ -128,7 +128,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
     QgsRasterInterface * clone() const override;
 
 
-    /*! Get the QgsCoordinateReferenceSystem for this layer
+    /** Get the QgsCoordinateReferenceSystem for this layer
      * @note Must be reimplemented by each provider.
      * If the provider isn't capable of returning
      * its projection an empty srs will be return, ti will return 0
@@ -176,26 +176,26 @@ class QgsWmsProvider : public QgsRasterDataProvider
     */
     virtual QgsRectangle extent() override;
 
-    /**Returns true if layer is valid
+    /** Returns true if layer is valid
      */
     bool isValid() override;
 
 #if 0
-    /**Returns true if layer has tile set profiles
+    /** Returns true if layer has tile set profiles
      */
     virtual bool hasTiles() const;
 #endif
 
-    /**Returns the GetMap url */
+    /** Returns the GetMap url */
     virtual QString getMapUrl() const;
 
-    /**Returns the GetFeatureInfo url */
+    /** Returns the GetFeatureInfo url */
     virtual QString getFeatureInfoUrl() const;
 
-    /**Return the GetTile url */
+    /** Return the GetTile url */
     virtual QString getTileUrl() const;
 
-    /**Return the GetLegendGraphic url
+    /** Return the GetLegendGraphic url
      * @added in 2.1
      */
     virtual QString getLegendGraphicUrl() const;
@@ -265,9 +265,6 @@ class QgsWmsProvider : public QgsRasterDataProvider
       */
     int capabilities() const override;
 
-    /** Server identify capabilities, used by source select. */
-    int identifyCapabilities() const;
-
     QGis::DataType dataType( int bandNo ) const override;
     QGis::DataType srcDataType( int bandNo ) const override;
     int bandCount() const override;
@@ -305,7 +302,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
      */
     QString lastErrorFormat() override;
 
-    /** return a provider name
+    /** Return a provider name
 
     Essentially just returns the provider key.  Should be used to build file
     dialogs so that providers can be shown with their supported types. Thus
@@ -322,7 +319,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
     QString name() const override;
 
 
-    /** return description
+    /** Return description
 
     Return a terse string describing what the provider is.
 
@@ -335,7 +332,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
     */
     QString description() const override;
 
-    /**Reloads the data from the source. Needs to be implemented by providers with data caches to
+    /** Reloads the data from the source. Needs to be implemented by providers with data caches to
       synchronize with changes in the data source*/
     virtual void reloadData() override;
 
@@ -370,6 +367,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
   private slots:
     void identifyReplyFinished();
     void getLegendGraphicReplyFinished( const QImage& );
+    void getLegendGraphicReplyErrored( const QString& message );
     void getLegendGraphicReplyProgress( qint64, qint64 );
 
   private:
@@ -433,7 +431,7 @@ class QgsWmsProvider : public QgsRasterDataProvider
 
   private:
 
-    /**Return the full url to request legend graphic
+    /** Return the full url to request legend graphic
      * The visibleExtent isi only used if provider supports contextual
      * legends according to the QgsWmsSettings
      * @added in 2.8
diff --git a/src/providers/wms/qgswmssourceselect.cpp b/src/providers/wms/qgswmssourceselect.cpp
index 17b4a75..408258a 100644
--- a/src/providers/wms/qgswmssourceselect.cpp
+++ b/src/providers/wms/qgswmssourceselect.cpp
@@ -475,6 +475,8 @@ void QgsWMSSourceSelect::on_btnConnect_clicked()
     return;
   }
 
+  mFeatureCount->setEnabled( caps.identifyCapabilities() != QgsRasterInterface::NoCapabilities );
+
   populateLayerList( caps );
 }
 
diff --git a/src/server/qgsconfigcache.cpp b/src/server/qgsconfigcache.cpp
index 22d793d..6e07073 100644
--- a/src/server/qgsconfigcache.cpp
+++ b/src/server/qgsconfigcache.cpp
@@ -166,9 +166,12 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
 
 void QgsConfigCache::removeChangedEntry( const QString& path )
 {
-  mXmlDocumentCache.remove( path );
   mWMSConfigCache.remove( path );
   mWFSConfigCache.remove( path );
   mWCSConfigCache.remove( path );
+
+  //xml document must be removed last, as other config cache destructors may require it
+  mXmlDocumentCache.remove( path );
+
   mFileSystemWatcher.removePath( path );
 }
diff --git a/src/server/qgshttprequesthandler.cpp b/src/server/qgshttprequesthandler.cpp
index 7d13d46..11d9961 100644
--- a/src/server/qgshttprequesthandler.cpp
+++ b/src/server/qgshttprequesthandler.cpp
@@ -461,7 +461,7 @@ bool QgsHttpRequestHandler::startGetFeatureResponse( QByteArray* ba, const QStri
   else
     format = "text/xml";
 
-  setHeader( "Content-Type", format );
+  setInfoFormat( format );
   appendBody( *ba );
   // Streaming
   sendResponse();
diff --git a/src/server/qgsserverprojectparser.cpp b/src/server/qgsserverprojectparser.cpp
index 80378bc..0fd5b38 100644
--- a/src/server/qgsserverprojectparser.cpp
+++ b/src/server/qgsserverprojectparser.cpp
@@ -86,7 +86,7 @@ QgsServerProjectParser::QgsServerProjectParser()
 
 QgsServerProjectParser::~QgsServerProjectParser()
 {
-  delete mXMLDoc;
+
 }
 
 void QgsServerProjectParser::projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const
diff --git a/src/server/qgsserverprojectparser.h b/src/server/qgsserverprojectparser.h
index ef4bcbc..3cad16a 100644
--- a/src/server/qgsserverprojectparser.h
+++ b/src/server/qgsserverprojectparser.h
@@ -32,7 +32,7 @@ class QDomDocument;
 class QgsServerProjectParser
 {
   public:
-    /**Takes ownership of the document*/
+
     QgsServerProjectParser( QDomDocument* xmlDoc, const QString& filePath );
     ~QgsServerProjectParser();
 
diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp
index 373bb34..6d3e425 100644
--- a/src/server/qgswfsserver.cpp
+++ b/src/server/qgswfsserver.cpp
@@ -1641,7 +1641,7 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
       fid = fidElem.attribute( "fid" );
       if ( fid.contains( "." ) )
         fid = fid.section( ".", 1, 1 );
-      fids.insert( fid.toInt( &conversionSuccess ) );
+      fids.insert( fid.toLongLong( &conversionSuccess ) );
     }
   }
   else
diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp
index ed89bf0..488d645 100644
--- a/src/server/qgswmsprojectparser.cpp
+++ b/src/server/qgswmsprojectparser.cpp
@@ -20,6 +20,7 @@
 #include "qgsconfigparserutils.h"
 #include "qgslogger.h"
 #include "qgsmaplayer.h"
+#include "qgsmaplayerregistry.h"
 #include "qgsmaplayerstylemanager.h"
 #include "qgsmapserviceexception.h"
 #include "qgspallabeling.h"
@@ -38,6 +39,7 @@
 #include "qgscomposerscalebar.h"
 #include "qgscomposershape.h"
 #include "qgslayertreegroup.h"
+#include "qgslayertreelayer.h"
 
 #include <QFileInfo>
 #include <QTextDocument>
@@ -442,17 +444,52 @@ QgsComposition* QgsWMSProjectParser::initComposition( const QString& composerTem
     QgsComposerLegend* legend = dynamic_cast< QgsComposerLegend *>( *itemIt );
     if ( legend )
     {
-#if 0
       QgsLegendModelV2* model = legend->modelV2();
+#if 0
       QgsLayerTreeGroup* root = model->rootGroup();
       QStringList layerIds = root->findLayerIds();
       throw QgsMapServiceException( "Error", "Composer legend layerIds " + layerIds.join( " ," ) );
 #endif
       if ( legend->autoUpdateModel() )
       {
-        QgsLegendModelV2* model = legend->modelV2();
         model->setRootGroup( projectLayerTreeGroup() );
       }
+      // if the legend has no map
+      // we will load all layers
+      const QgsComposerMap* map = legend->composerMap();
+      if ( !map )
+      {
+        QgsLayerTreeGroup* root = model->rootGroup();
+        QStringList layerIds = root->findLayerIds();
+        // foreach layer find in the layer tree
+        // load it if the layer id is not QgsMapLayerRegistry
+        foreach ( QString layerId, layerIds )
+        {
+          QgsMapLayer * layer = QgsMapLayerRegistry::instance()->mapLayer( layerId );
+          if ( layer )
+          {
+            continue;
+          }
+          
+          QgsLayerTreeLayer* nodeLayer = root->findLayer( layerId );
+          if ( !nodeLayer )
+          {
+            continue;
+          }
+          layer = nodeLayer->layer();
+          if ( !layer )
+          {
+            const QHash< QString, QDomElement > &projectLayerElements = mProjectParser->projectLayerElementsById();
+            QHash< QString, QDomElement >::const_iterator layerElemIt = projectLayerElements.find( layerId );
+            if ( layerElemIt != projectLayerElements.constEnd() )
+            {
+              layer = mProjectParser->createLayerFromElement( layerElemIt.value(), true );
+            }
+          }
+          QgsMapLayerRegistry::instance()->addMapLayer( layer );
+        }
+        legend->updateLegend();
+      }
       legendList.push_back( legend );
       continue;
     }
diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp
index dda39fd..81ffba4 100644
--- a/src/server/qgswmsserver.cpp
+++ b/src/server/qgswmsserver.cpp
@@ -1492,6 +1492,11 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, QString version )
       {
         continue;
       }
+      QgsMapLayer * registeredMapLayer = QgsMapLayerRegistry::instance()->mapLayer( currentLayer->id() );
+      if ( registeredMapLayer )
+      {
+        currentLayer = registeredMapLayer;
+      }
 
       //skip layer if not visible at current map scale
       bool useScaleConstraint = ( scaleDenominator > 0 && currentLayer->hasScaleBasedVisibility() );
diff --git a/src/ui/symbollayer/widget_vectorfield.ui b/src/ui/symbollayer/widget_vectorfield.ui
index aabec3f..8306b8f 100644
--- a/src/ui/symbollayer/widget_vectorfield.ui
+++ b/src/ui/symbollayer/widget_vectorfield.ui
@@ -14,7 +14,16 @@
    <string>Form</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>1</number>
+   </property>
+   <property name="topMargin">
+    <number>1</number>
+   </property>
+   <property name="rightMargin">
+    <number>1</number>
+   </property>
+   <property name="bottomMargin">
     <number>1</number>
    </property>
    <item>
@@ -108,10 +117,19 @@
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
+       <property name="decimals">
+        <number>2</number>
+       </property>
+       <property name="maximum">
+        <double>9999999.000000000000000</double>
+       </property>
        <property name="singleStep">
         <double>0.200000000000000</double>
        </property>
-       <property name="showClearButton">
+       <property name="value">
+        <double>1.000000000000000</double>
+       </property>
+       <property name="showClearButton" stdset="0">
         <bool>false</bool>
        </property>
       </widget>
diff --git a/tests/src/core/CMakeLists.txt b/tests/src/core/CMakeLists.txt
index fe5f040..ac7f4b3 100644
--- a/tests/src/core/CMakeLists.txt
+++ b/tests/src/core/CMakeLists.txt
@@ -149,3 +149,5 @@ ADD_QGIS_TEST(maplayerstylemanager testqgsmaplayerstylemanager.cpp )
 ADD_QGIS_TEST(pointlocatortest testqgspointlocator.cpp )
 ADD_QGIS_TEST(snappingutilstest testqgssnappingutils.cpp )
 ADD_QGIS_TEST(imageoperationtest testqgsimageoperation.cpp)
+ADD_QGIS_TEST(pallabelingtest testqgspallabeling.cpp)
+
diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp
index 54fc25a..1b7124d 100644
--- a/tests/src/core/testqgsexpression.cpp
+++ b/tests/src/core/testqgsexpression.cpp
@@ -171,7 +171,10 @@ class TestQgsExpression: public QObject
       QTest::newRow( "plus double" ) << "1+1.3" << false << QVariant( 2.3 );
       QTest::newRow( "plus with null" ) << "null+3" << false << QVariant();
       QTest::newRow( "plus invalid" ) << "1+'foo'" << true << QVariant();
+
       QTest::newRow( "minus int" ) << "1-3" << false << QVariant( -2 );
+      QTest::newRow( "minus nan" ) << "1-'nan'" << true << QVariant();
+      QTest::newRow( "minus inf" ) << "1-'inf'" << true << QVariant();
       QTest::newRow( "mul int" ) << "8*7" << false << QVariant( 56 );
       QTest::newRow( "div int" ) << "5/2" << false << QVariant( 2.5 );
       QTest::newRow( "mod int" ) << "20%6" << false << QVariant( 2 );
@@ -207,6 +210,10 @@ class TestQgsExpression: public QObject
       QTest::newRow( "ge int 2" ) << "3 >= 3" << false << QVariant( 1 );
       QTest::newRow( "lt text 1" ) << "'bar' < 'foo'" << false << QVariant( 1 );
       QTest::newRow( "lt text 2" ) << "'foo' < 'bar'" << false << QVariant( 0 );
+      QTest::newRow( "'nan'='nan'" ) << "'nan'='nan'" << false << QVariant( 1 );
+      QTest::newRow( "'nan'='x'" ) << "'nan'='x'" << false << QVariant( 0 );
+      QTest::newRow( "'inf'='inf'" ) << "'inf'='inf'" << false << QVariant( 1 );
+      QTest::newRow( "'inf'='x'" ) << "'inf'='x'" << false << QVariant( 0 );
 
       // is, is not
       QTest::newRow( "is null,null" ) << "null is null" << false << QVariant( 1 );
diff --git a/tests/src/core/testqgsfields.cpp b/tests/src/core/testqgsfields.cpp
new file mode 100644
index 0000000..797c28d
--- /dev/null
+++ b/tests/src/core/testqgsfields.cpp
@@ -0,0 +1,404 @@
+/***************************************************************************
+     testqgsfields.cpp
+     -----------------
+    Date                 : May 2015
+    Copyright            : (C) 2015 Nyall Dawson
+    Email                : nyall dot dawson 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+#include <QtTest/QtTest>
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QSettings>
+#include <QSharedPointer>
+
+#include "qgsfield.h"
+
+class TestQgsFields: 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 create();//test creating a data defined container
+    void copy();// test cpy destruction (double delete)
+    void assignment();
+    void equality(); //test equality operators
+    void asVariant(); //test conversion to and from a QVariant
+    void clear();
+    void exists();
+    void count();
+    void isEmpty();
+    void remove();
+    void extend();
+    void byIndex();
+    void byName();
+    void fieldOrigin();
+    void fieldOriginIndex();
+    void indexFromName();
+    void toList();
+    void allAttrsList();
+    void appendExpressionField();
+
+  private:
+};
+
+void TestQgsFields::initTestCase()
+{
+
+}
+
+void TestQgsFields::cleanupTestCase()
+{
+
+}
+
+void TestQgsFields::init()
+{
+
+}
+
+void TestQgsFields::cleanup()
+{
+
+}
+
+void TestQgsFields::create()
+{
+  QgsFields fields;
+  QCOMPARE( fields.count(), 0 );
+}
+
+void TestQgsFields::copy()
+{
+  QgsFields original;
+  //add field
+  QgsField field( "testfield" );
+  original.append( field );
+  QCOMPARE( original.count(), 1 );
+  QgsFields copy( original );
+  QCOMPARE( copy.count(), 1 );
+  QVERIFY( copy == original );
+
+  QgsField copyfield( "copyfield" );
+  copy.append( copyfield );
+  QCOMPARE( copy.count(), 2 );
+  QCOMPARE( original.count(), 1 );
+  QVERIFY( copy != original );
+}
+
+void TestQgsFields::assignment()
+{
+  QgsFields original;
+  //add field
+  QgsField field( "testfield" );
+  original.append( field );
+
+  QgsFields copy;
+  copy = original;
+  QVERIFY( copy == original );
+
+  QgsField copyfield( "copyfield" );
+  copy.append( copyfield );
+  QCOMPARE( original.count(), 1 );
+  QCOMPARE( copy.count(), 2 );
+  QVERIFY( copy != original );
+}
+
+void TestQgsFields::equality()
+{
+  //compare two empty QgsFields
+  QgsFields fields1;
+  QgsFields fields2;
+  QVERIFY( fields1 == fields2 );
+  QVERIFY( !( fields1 != fields2 ) );
+
+  //append an identical fields to both and retest
+  QgsField field1;
+  field1.setName( "name" );
+  QgsField field2;
+  field2.setName( "name" );
+  QCOMPARE( field1, field2 );
+  fields1.append( field1 );
+  fields2.append( field2 );
+  QVERIFY( fields1 == fields2 );
+  QVERIFY( !( fields1 != fields2 ) );
+
+  //make a change and retest
+  QgsField field3;
+  fields2.append( field3 );
+  QVERIFY( !( fields1 == fields2 ) );
+  QVERIFY( fields1 != fields2 );
+}
+
+void TestQgsFields::asVariant()
+{
+  QgsField field1;
+  field1.setName( "name" );
+  QgsField field2;
+  field2.setName( "name" );
+  QgsFields original;
+  original.append( field1 );
+  original.append( field2 );
+
+  //convert to and from a QVariant
+  QVariant var = QVariant::fromValue( original );
+  QVERIFY( var.isValid() );
+
+  QgsFields fromVar = qvariant_cast<QgsFields>( var );
+  QCOMPARE( fromVar, original );
+}
+
+void TestQgsFields::clear()
+{
+  QgsFields original;
+  QgsField field( "testfield" );
+  original.append( field );
+  QCOMPARE( original.count(), 1 );
+  QgsFields copy( original );
+
+  copy.clear();
+  QCOMPARE( copy.count(), 0 );
+  QCOMPARE( original.count(), 1 );
+}
+
+void TestQgsFields::exists()
+{
+  QgsFields fields;
+  QgsField field( "testfield" );
+  fields.append( field );
+
+  QVERIFY( !fields.exists( -1 ) );
+  QVERIFY( !fields.exists( 1 ) );
+  QVERIFY( fields.exists( 0 ) );
+}
+
+void TestQgsFields::count()
+{
+  QgsFields fields;
+  QCOMPARE( fields.count(), 0 );
+  QCOMPARE( fields.size(), 0 );
+
+  QgsField field( "testfield" );
+  fields.append( field );
+  QCOMPARE( fields.count(), 1 );
+  QCOMPARE( fields.size(), 1 );
+
+  QgsField field2( "testfield2" );
+  fields.append( field2 );
+  QCOMPARE( fields.count(), 2 );
+  QCOMPARE( fields.size(), 2 );
+}
+
+void TestQgsFields::isEmpty()
+{
+  QgsFields fields;
+  QVERIFY( fields.isEmpty() );
+
+  QgsField field( "testfield" );
+  fields.append( field );
+  QVERIFY( !fields.isEmpty() );
+}
+
+void TestQgsFields::remove()
+{
+  QgsFields fields;
+
+  //test for no crash
+  fields.remove( 1 );
+
+  QgsField field( "testfield" );
+  fields.append( field );
+  QgsField field2( "testfield2" );
+  fields.append( field2 );
+
+  //test for no crash
+  fields.remove( -1 );
+  fields.remove( 5 );
+
+  //remove valid field
+  fields.remove( 0 );
+  QCOMPARE( fields.count(), 1 );
+  QCOMPARE( fields.at( 0 ).name(), QString( "testfield2" ) );
+  QCOMPARE( fields.indexFromName(QString( "testfield2" )), 0);
+}
+
+void TestQgsFields::extend()
+{
+  QgsFields destination;
+  QgsField field( "testfield" );
+  destination.append( field );
+  QgsField field2( "testfield2" );
+  destination.append( field2 );
+
+  QgsFields source;
+  QgsField field3( "testfield3" );
+  source.append( field3, QgsFields::OriginJoin, 5 );
+  QgsField field4( "testfield4" );
+  source.append( field4 );
+
+  QCOMPARE( destination.count(), 2 );
+  destination.extend( source );
+  QCOMPARE( destination.count(), 4 );
+  QCOMPARE( destination.at( 2 ), field3 );
+  QCOMPARE( destination.at( 3 ), field4 );
+}
+
+void TestQgsFields::byIndex()
+{
+  QgsFields fields;
+  QgsField field( "testfield" );
+  fields.append( field );
+  QgsField field2( "testfield2" );
+  fields.append( field2 );
+
+  QCOMPARE( fields[0], field );
+  QCOMPARE( fields[1], field2 );
+
+  const QgsFields& constFields = fields;
+  QCOMPARE( constFields[0], field );
+  QCOMPARE( constFields[1], field2 );
+  QCOMPARE( constFields.at( 0 ), field );
+  QCOMPARE( constFields.at( 1 ), field2 );
+  QCOMPARE( constFields.field( 0 ), field );
+  QCOMPARE( constFields.field( 1 ), field2 );
+}
+
+void TestQgsFields::byName()
+{
+  QgsFields fields;
+  QgsField field( "testfield" );
+  fields.append( field );
+  QgsField field2( "testfield2" );
+  fields.append( field2 );
+
+  QCOMPARE( fields.field( "testfield" ), field );
+  QCOMPARE( fields.field( "testfield2" ), field2 );
+}
+
+void TestQgsFields::fieldOrigin()
+{
+  QgsFields fields;
+  QgsField field( QString( "testfield" ) );
+  fields.append( field , QgsFields::OriginJoin );
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2, QgsFields::OriginExpression );
+
+  QCOMPARE( fields.fieldOrigin( 0 ), QgsFields::OriginJoin );
+  QCOMPARE( fields.fieldOrigin( 1 ), QgsFields::OriginExpression );
+  QCOMPARE( fields.fieldOrigin( 2 ), QgsFields::OriginUnknown );
+}
+
+void TestQgsFields::fieldOriginIndex()
+{
+  QgsFields fields;
+  QgsField field( QString( "testfield" ) );
+  fields.append( field , QgsFields::OriginProvider, 5 );
+  QCOMPARE( fields.fieldOriginIndex( 0 ), 5 );
+
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2, QgsFields::OriginProvider, 10 );
+  QCOMPARE( fields.fieldOriginIndex( 1 ), 10 );
+
+  QgsField field3( QString( "testfield3" ) );
+  //field origin index not specified with OriginProvider, should be automatic
+  fields.append( field3, QgsFields::OriginProvider );
+  QCOMPARE( fields.fieldOriginIndex( 2 ), 2 );
+
+  QgsField field4( QString( "testfield4" ) );
+  //field origin index not specified with other than OriginProvider, should remain -1
+  fields.append( field4, QgsFields::OriginEdit );
+  QCOMPARE( fields.fieldOriginIndex( 3 ), -1 );
+}
+
+void TestQgsFields::indexFromName()
+{
+  QgsFields fields;
+  QgsField field( QString( "testfield" ) );
+  fields.append( field );
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2 );
+  QgsField field3( QString( "testfield3" ) );
+  fields.append( field3 );
+
+  QCOMPARE( fields.indexFromName( QString( "bad" ) ), -1 );
+  QCOMPARE( fields.fieldNameIndex( QString( "bad" ) ), -1 );
+  QCOMPARE( fields.indexFromName( QString( "testfield" ) ), 0 );
+  QCOMPARE( fields.fieldNameIndex( QString( "testfield" ) ), 0 );
+  QCOMPARE( fields.indexFromName( QString( "testfield3" ) ), 2 );
+  QCOMPARE( fields.fieldNameIndex( QString( "testfield3" ) ), 2 );
+
+  //indexFromName is case sensitive, fieldNameIndex isn't
+  QCOMPARE( fields.indexFromName( QString( "teStFiEld2" ) ), -1 );
+  QCOMPARE( fields.fieldNameIndex( QString( "teStFiEld2" ) ), 1 );
+}
+
+void TestQgsFields::toList()
+{
+  QgsFields fields;
+  QList<QgsField> list = fields.toList();
+  QVERIFY( list.isEmpty() );
+
+  QgsField field( QString( "testfield" ) );
+  fields.append( field );
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2 );
+  QgsField field3( QString( "testfield3" ) );
+  fields.append( field3 );
+
+  list = fields.toList();
+  QCOMPARE( list.at( 0 ), field );
+  QCOMPARE( list.at( 1 ), field2 );
+  QCOMPARE( list.at( 2 ), field3 );
+}
+
+void TestQgsFields::allAttrsList()
+{
+  QgsFields fields;
+  QgsAttributeList attrList = fields.allAttributesList();
+  QVERIFY( attrList.isEmpty() );
+
+  QgsField field( QString( "testfield" ) );
+  fields.append( field );
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2 );
+  QgsField field3( QString( "testfield3" ) );
+  fields.append( field3 );
+
+  attrList = fields.allAttributesList();
+  QCOMPARE( attrList.at( 0 ), 0 );
+  QCOMPARE( attrList.at( 1 ), 1 );
+  QCOMPARE( attrList.at( 2 ), 2 );
+}
+
+void TestQgsFields::appendExpressionField()
+{
+  QgsFields fields;
+  QgsField field( QString( "testfield" ) );
+  fields.append( field );
+  QgsField field2( QString( "testfield2" ) );
+  fields.append( field2 );
+
+  QgsField dupeName( QString( "testfield" ) );
+  QVERIFY( !fields.appendExpressionField( dupeName, 1 ) );
+
+  //good name
+  QgsField exprField( QString( "expression" ) );
+  QVERIFY( fields.appendExpressionField( exprField, 5 ) );
+  QCOMPARE( fields.count(), 3 );
+  QCOMPARE( fields.fieldOrigin( 2 ), QgsFields::OriginExpression );
+  QCOMPARE( fields.fieldOriginIndex( 2 ), 5 );
+}
+
+QTEST_MAIN( TestQgsFields )
+#include "testqgsfields.moc"
diff --git a/tests/src/core/testqgspallabeling.cpp b/tests/src/core/testqgspallabeling.cpp
new file mode 100644
index 0000000..93b88ba
--- /dev/null
+++ b/tests/src/core/testqgspallabeling.cpp
@@ -0,0 +1,67 @@
+/***************************************************************************
+     testqgspallabeling.cpp
+     ----------------------
+    Date                 : May 2015
+    Copyright            : (C) 2015 Nyall Dawson
+    Email                : nyall dot dawson 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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+#include <QtTest/QtTest>
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QSharedPointer>
+
+#include "qgspallabeling.h"
+
+class TestQgsPalLabeling: 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 wrapChar();//test wrapping text lines
+
+  private:
+};
+
+void TestQgsPalLabeling::initTestCase()
+{
+}
+
+void TestQgsPalLabeling::cleanupTestCase()
+{
+
+}
+
+void TestQgsPalLabeling::init()
+{
+
+}
+
+void TestQgsPalLabeling::cleanup()
+{
+
+}
+
+void TestQgsPalLabeling::wrapChar()
+{
+  QCOMPARE( QgsPalLabeling::splitToLines( "nolines", QString() ) , QStringList() << "nolines" );
+  QCOMPARE( QgsPalLabeling::splitToLines( "new line\nonly", QString() ), QStringList() << "new line" << "only" );
+  QCOMPARE( QgsPalLabeling::splitToLines( "new line\nonly", QString( "\n" ) ), QStringList() << "new line" << "only" );
+  QCOMPARE( QgsPalLabeling::splitToLines( "mixed new line\nand char", QString( " " ) ), QStringList() << "mixed" << "new" << "line" << "and" << "char" );
+  QCOMPARE( QgsPalLabeling::splitToLines( "no matching chars", QString( "#" ) ), QStringList() << "no matching chars" );
+  QCOMPARE( QgsPalLabeling::splitToLines( "no\nmatching\nchars", QString( "#" ) ), QStringList() << "no" << "matching" << "chars" );
+}
+
+QTEST_MAIN( TestQgsPalLabeling )
+#include "testqgspallabeling.moc"
diff --git a/tests/src/core/testqgspoint.cpp b/tests/src/core/testqgspoint.cpp
index 0e57238..a6eb11a 100644
--- a/tests/src/core/testqgspoint.cpp
+++ b/tests/src/core/testqgspoint.cpp
@@ -218,6 +218,38 @@ void TestQgsPoint::toDegreesMinutesSeconds()
                     QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 );
   QCOMPARE( QgsPoint( -359, 0 ).toDegreesMinutesSeconds( 2 ), myControlString );
 
+  //check if latitudes > 90 or <-90 wrap around
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",10" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "N" );
+  QCOMPARE( QgsPoint( 0, 190 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",10" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "S" );
+  QCOMPARE( QgsPoint( 0, -190 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",89" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "S" );
+  QCOMPARE( QgsPoint( 0, 91 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",89" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "N" );
+  QCOMPARE( QgsPoint( 0, -91 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",1" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "S" );
+  QCOMPARE( QgsPoint( 0, 179 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  myControlString = QString( "0" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) +
+                    QString( ",1" ) + QChar( 176 ) +
+                    QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "N" );
+  QCOMPARE( QgsPoint( 0, -179 ).toDegreesMinutesSeconds( 2 ), myControlString );
+
   //should be no directional suffixes for 0 degree coordinates
   myControlString = QString( "0" ) + QChar( 176 ) +
                     QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) +
@@ -256,9 +288,9 @@ void TestQgsPoint::toDegreesMinutesSeconds()
   //test rounding does not create seconds >= 60
   myControlString = QString( "100" ) + QChar( 176 ) +
                     QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "E" ) +
-                    QString( ",100" ) + QChar( 176 ) +
+                    QString( ",90" ) + QChar( 176 ) +
                     QString( "0" ) + QChar( 0x2032 ) + QString( "0.00" ) + QChar( 0x2033 ) + QString( "N" );
-  QCOMPARE( QgsPoint( 99.999999, 99.999999 ).toDegreesMinutesSeconds( 2 ), myControlString );
+  QCOMPARE( QgsPoint( 99.999999, 89.999999 ).toDegreesMinutesSeconds( 2 ), myControlString );
 
   //should be no directional suffixes for 180 degree longitudes
   myControlString = QString( "180" ) + QChar( 176 ) +
diff --git a/tests/src/python/test_qgsfeature.py b/tests/src/python/test_qgsfeature.py
index cfb7d43..cda273b 100644
--- a/tests/src/python/test_qgsfeature.py
+++ b/tests/src/python/test_qgsfeature.py
@@ -15,12 +15,14 @@ __revision__ = '$Format:%H$'
 import qgis
 import os
 
-from qgis.core import QgsFeature, QgsGeometry, QgsPoint, QgsVectorLayer
+from qgis.core import QgsFeature, QgsGeometry, QgsPoint, QgsVectorLayer, NULL
 from utilities import (unitTestDataPath,
                        getQgisTestApp,
                        TestCase,
                        unittest
                        )
+from unittest import expectedFailure
+
 QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()
 
 
@@ -68,6 +70,13 @@ class TestQgsFeature(TestCase):
 
         assert myAttributes == myExpectedAttributes, myMessage
 
+    def test_SetAttribute(self):
+        feat = QgsFeature()
+        feat.initAttributes(1)
+        feat.setAttributes([0])
+        feat.setAttributes([NULL])
+        assert [NULL] == feat.attributes()
+
     def test_DeleteAttribute(self):
         feat = QgsFeature()
         feat.initAttributes(3)

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