[gdal] 03/10: Imported Upstream version 2.1.1~rc1+dfsg

Bas Couwenberg sebastic at debian.org
Sun Jul 3 17:14:50 UTC 2016


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

sebastic pushed a commit to branch experimental-2.1
in repository gdal.

commit 0cade9dffa91fb4ccd22a984b01d41925afe27c6
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sun Jul 3 16:51:46 2016 +0200

    Imported Upstream version 2.1.1~rc1+dfsg
---
 GDALmake.opt.in                                    |    2 +-
 GNUmakefile                                        |    2 +
 NEWS                                               |  126 +
 VERSION                                            |    2 +-
 alg/contour.cpp                                    |  287 +-
 alg/gdalgrid.cpp                                   |    7 +-
 apps/gdalwarp_lib.cpp                              |   14 +-
 apps/ogr2ogr_bin.cpp                               |    7 +-
 apps/ogr2ogr_lib.cpp                               |   14 +-
 apps/ogr_utilities.dox                             |    2 +-
 configure                                          |    2 +-
 configure.in                                       |    4 +-
 data/ogrvrt.xsd                                    |    7 +-
 frmts/adrg/srpdataset.cpp                          |   30 +-
 frmts/ecw/ecwdataset.cpp                           |   17 +-
 frmts/ecw/frmt_ecw.html                            |   12 +
 frmts/gtiff/geotiff.cpp                            |   24 +-
 frmts/gtiff/libtiff/tif_dirread.c                  |   14 +-
 frmts/jp2kak/jp2kak.lst                            |   11 +-
 frmts/jp2kak/jp2kakdataset.cpp                     |   27 +-
 frmts/mrf/GNUmakefile                              |    2 +-
 frmts/mrf/marfa.h                                  |    4 +-
 frmts/mrf/marfa_dataset.cpp                        |    6 +-
 frmts/mrf/mrf_band.cpp                             |    2 +-
 frmts/postgisraster/postgisrasterdataset.cpp       |   20 +-
 frmts/raw/iscedataset.cpp                          |   22 +-
 frmts/raw/roipacdataset.cpp                        |   24 +-
 frmts/safe/frmt_safe.html                          |  217 +-
 frmts/safe/safedataset.cpp                         |  172 +-
 frmts/vrt/vrtsources.cpp                           |   79 +-
 gcore/gdal_version.h                               |    6 +-
 gcore/mdreader/reader_pleiades.cpp                 |   64 +-
 gcore/mdreader/reader_pleiades.h                   |    3 +-
 man/man1/_home_rouault_dist_wrk_gdal_apps_.1       |  129 -
 man/man1/gdal-config.1                             |    2 +-
 man/man1/gdal2tiles.1                              |    2 +-
 man/man1/gdal_calc.1                               |    2 +-
 man/man1/gdal_contour.1                            |    2 +-
 man/man1/gdal_edit.1                               |    2 +-
 man/man1/gdal_fillnodata.1                         |    2 +-
 man/man1/gdal_grid.1                               |    2 +-
 man/man1/gdal_merge.1                              |    2 +-
 man/man1/gdal_pansharpen.1                         |    2 +-
 man/man1/gdal_polygonize.1                         |    2 +-
 man/man1/gdal_proximity.1                          |    2 +-
 man/man1/gdal_rasterize.1                          |    2 +-
 man/man1/gdal_retile.1                             |    2 +-
 man/man1/gdal_sieve.1                              |    2 +-
 man/man1/gdal_translate.1                          |    2 +-
 man/man1/gdal_utilities.1                          |    2 +-
 man/man1/gdaladdo.1                                |    2 +-
 man/man1/gdalbuildvrt.1                            |    2 +-
 man/man1/gdalcompare.1                             |    2 +-
 man/man1/gdaldem.1                                 |    2 +-
 man/man1/gdalinfo.1                                |    2 +-
 man/man1/gdallocationinfo.1                        |    2 +-
 man/man1/gdalmanage.1                              |    2 +-
 man/man1/gdalmove.1                                |    2 +-
 man/man1/gdalsrsinfo.1                             |    2 +-
 man/man1/gdaltindex.1                              |    2 +-
 man/man1/gdaltransform.1                           |    2 +-
 man/man1/gdalwarp.1                                |    2 +-
 man/man1/gnm_utilities.1                           |    2 +-
 man/man1/gnmanalyse.1                              |    2 +-
 man/man1/gnmmanage.1                               |    2 +-
 man/man1/nearblack.1                               |    2 +-
 man/man1/ogr2ogr.1                                 |    4 +-
 man/man1/ogr_utilities.1                           |    2 +-
 man/man1/ogrinfo.1                                 |    2 +-
 man/man1/ogrlineref.1                              |    2 +-
 man/man1/ogrtindex.1                               |    2 +-
 man/man1/pct2rgb.1                                 |    2 +-
 man/man1/rgb2pct.1                                 |    2 +-
 ogr/ogr_srs_esri.cpp                               |   14 +-
 ogr/ogrgeometryfactory.cpp                         |   29 +-
 ogr/ogrlinearring.cpp                              |    6 +-
 ogr/ogrsf_frmts/cartodb/ogrcartodbtablelayer.cpp   |   14 +-
 ogr/ogrsf_frmts/geojson/ogr_geojson.h              |    4 +-
 ogr/ogrsf_frmts/geojson/ogresrijsonreader.cpp      |    8 +-
 ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp        |   50 +-
 ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp       |  167 +-
 ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h         |    8 +-
 ogr/ogrsf_frmts/geojson/ogrtopojsonreader.cpp      |   28 +-
 ogr/ogrsf_frmts/libkml/ogrlibkmlfield.cpp          |   12 +-
 ogr/ogrsf_frmts/mitab/mitab.h                      |    2 +-
 ogr/ogrsf_frmts/mitab/mitab_datfile.cpp            |    9 +-
 ogr/ogrsf_frmts/mitab/mitab_imapinfofile.cpp       |   25 +-
 .../mssqlspatial/ogrmssqlspatialtablelayer.cpp     |    6 +-
 ogr/ogrsf_frmts/nas/nashandler.cpp                 |   26 +-
 ogr/ogrsf_frmts/nas/nasreaderp.h                   |    6 +-
 ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp       |   89 +-
 .../openfilegdb/ogropenfilegdblayer.cpp            |    6 +-
 ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp          |    6 +-
 ogr/ogrsf_frmts/s57/ogrs57datasource.cpp           |   25 +-
 ogr/ogrsf_frmts/sosi/GNUmakefile                   |    3 +-
 ogr/ogrsf_frmts/sosi/makefile.vc                   |    2 +-
 ogr/ogrsf_frmts/sosi/ogr_sosi.h                    |   65 +-
 ogr/ogrsf_frmts/sosi/ogrsosidatasource.cpp         |  141 +-
 ogr/ogrsf_frmts/sosi/ogrsosidatatypes.cpp          |  105 +
 ogr/ogrsf_frmts/sosi/ogrsosidatatypes.h            | 3560 ++++++++++++++++++++
 ogr/ogrsf_frmts/sosi/ogrsosidriver.cpp             |    8 +-
 ogr/ogrsf_frmts/sosi/ogrsosilayer.cpp              |  153 +-
 ogr/ogrsf_frmts/sosi/tools/README                  |    7 +
 ogr/ogrsf_frmts/sosi/tools/basicelements.xslt      |   25 +
 ogr/ogrsf_frmts/sosi/tools/convert.sh              |   11 +
 ogr/ogrsf_frmts/sosi/tools/groupelements.xslt      |   62 +
 ogr/ogrsf_frmts/sosi/tools/unnorsk.xslt            |   74 +
 ogr/ogrsf_frmts/vfk/vfkreadersqlite.cpp            |   54 +-
 ogr/ogrsf_frmts/vrt/drv_vrt.html                   |   11 +-
 ogr/ogrsf_frmts/vrt/ogr_vrt.h                      |    4 +-
 ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp                |   49 +-
 ogr/ogrsf_frmts/wfs/ogr_wfs.h                      |    4 +-
 ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp                |   16 +-
 port/cpl_port.h                                    |    8 +-
 port/cpl_vsi_error.cpp                             |    6 +-
 port/cpl_vsi_virtual.h                             |    4 +-
 port/cpl_vsil_unix_stdio_64.cpp                    |    6 +-
 swig/include/ogr.i                                 |    5 +-
 swig/include/perl/gdal_perl.i                      |    9 +-
 swig/include/perl/ogr_perl.i                       |    2 +-
 swig/perl/lib/Geo/GDAL.pm                          |    9 +-
 swig/perl/lib/Geo/OGR.pm                           |    2 +-
 swig/perl/ogr_wrap.cpp                             |    3 +-
 swig/perl/t/alg.t                                  |   24 +-
 swig/python/scripts/gdal_polygonize.py             |    4 +-
 swig/python/setup.py                               |    2 +-
 126 files changed, 5732 insertions(+), 687 deletions(-)

diff --git a/GDALmake.opt.in b/GDALmake.opt.in
index 81a2105..e3ebef4 100644
--- a/GDALmake.opt.in
+++ b/GDALmake.opt.in
@@ -121,7 +121,7 @@ GDAL_INCLUDE	=	-I$(GDAL_ROOT)/port -I$(GDAL_ROOT)/gcore \
 # libtool targets and help variables
 LIBGDAL	:=		libgdal.la
 LIBGDAL_CURRENT	:=	21
-LIBGDAL_REVISION	:=	0
+LIBGDAL_REVISION	:=	1
 LIBGDAL_AGE	:=	1
 
 # native build targets and variables
diff --git a/GNUmakefile b/GNUmakefile
index ba9f2b9..ec7d232 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -167,6 +167,8 @@ docs:
 man:
 # Generate man pages
 	(cat Doxyfile ; echo "ENABLED_SECTIONS=man"; echo "INPUT=apps swig/python/scripts"; echo "FILE_PATTERNS=*.cpp *.dox"; echo "GENERATE_HTML=NO"; echo "GENERATE_MAN=YES") | doxygen -
+# Remove "Directory reference" file. Not sure if there's a better way of doing it.
+	 @find man -name '_home_*_gdal_apps_.1' -exec rm {} \;
 
 all:	default ogr-all
 
diff --git a/NEWS b/NEWS
index b07ca8e..51a723f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,129 @@
+= GDAL/OGR 2.1.1 Release Notes = 
+
+The 2.1.1 release is a bug fix release.
+
+== Build ==
+ * Unix: Fix compilation in std=c++11 mode with Ubuntu 16.04 (#6490)
+ * Unix: fix libqhull include path when it is /usr/local/include/libqhull (#6522)
+ * Fix build failure on Solaris 11 on MRF driver (#6559)
+
+== Port ==
+ * Export VSICreateCachedFile() as CPL_DLL so as to enable building JP2KAK as a plugin (https://github.com/OSGeo/gdal/pull/126)
+ * Unix filesystem: make error message about failed open to report the filename (#6545)
+ * Fix VSIErrorV() buffer reallocation (#6545)
+
+== GDAL algorithms ==
+ * Fix GDAL_CG_Create() to call GDALContourGenerator::Init() (#6491)
+ * GDALContourGenerate(): handle the case where the nodata value is NaN (#6519)
+ * GDALGridCreate(): fix hang in multi-threaded case when pfnProgress is NULL or GDALDummyProgress (#6552)
+ * GDAL contour: fix incorrect oriented contour lines in some rare cases (#6563)
+
+== GDAL Core ==
+ * DIMAP/Pleiades metadata reader: take into tiling to properly shift RPC (#6293)
+
+== Utilities ==
+ * gdal_polygonize.py: explicitly set output layer geometry type to be polygon (#6530)
+ * gdalwarp: do not densify cutlines by default when CUTLINE_BLEND_DIST is used (#6507)
+
+== GDAL drivers ==
+
+ASRP driver:
+ * fix georeferencing of polar arc zone images (#6560)
+
+ECW driver:
+ * Add configuration option ECW_ALWAYS_UPWARD=TRUE/FALSE  to work around issues with "Downward" oriented images (#6516)
+
+GTiff driver:
+ * fix RasterIO() reported when downsampling a RGBA JPEG compressed TIFF file (#6943)
+ * Internal libtiff: fix 1.11 regression that prevents from reading one-strip files that have no StripByteCounts tag (#6490)
+
+ISCE driver:
+ * fix computation of line offset for multi-band BIP files, and warn if detecting a wrong file produced by GDAL 2.1.0 (#6556)
+
+JP2KAK driver:
+ * add support for Kakadu v7.8 (https://github.com/OSGeo/gdal/pull/138)
+
+MRF driver:
+ * Fix plugin building (#6498)
+ * Fix crashes on MRF using JPEG or PNG crashes due to dandling pointer (#6554)
+ * Fix crashes when NoData is set after create (#6555)
+
+PostgisRaster driver:
+ * fix potential crash when one tile has a lower number of bands than the max of the table (fixes #6267)
+
+SAFE driver:
+ * fix handling of SLC Products by providing access to measurements as subdatasets (#6514)
+
+VRT driver:
+  * avoid useless floating point values in SrcRect / DstRect (#6568)
+
+== OGR core ==
+ * Fix assertion in OGRGeometryFactory::GetCurveParmeters() on degnerated CIRCULARSTRING (#6553)
+ * Fix crash/corrupted values when running importFromWkb() on POLYGON M/POLYGON ZM geometries (#6562)
+
+== OGRSpatialReference == 
+ * importFromESRI(): fix import of multi line MERCATOR SRS (#6523)
+ * morphToESRI(): correctly compute standard_parallel_1 of Mercator(2SP) projection from scale factor of Mercator(1SP) (#6456, #4861)
+
+== OGR utilities ==
+ * ogr2ogr: keep -append and -overwrite when -update follows (backport trunk r34341)
+ * ogr2ogr: do not return error on ogr2ogr --utility_version (backport of trunk r34340)
+ * ogr2ogr: fix heuristics to detect likely absence of '-f' (#6561)
+
+== OGR drivers == 
+
+CartoDB driver:
+ * fix CartoDB'fication() by removing manual creation of the_geom_webmercator mercator, and also attach created sequence to table.cartodb_id (#6565)
+
+GeoJSON driver:
+ * fix field type detection when first value of a field is null (#6517)
+ * ESRI Json reader: do not set field width of 2147483647 (#6529)
+ * fix wrong behaviour when there's a 'id' at Feature level and 'id' or 'ID' field in properties (#6538)
+ * in case top level id is a negative integer, put the value in a 'id' attribute (#6538)
+
+LIBKML driver:
+ * fix crash when reading <gx:TimeStamp> or <gx:TimeSpan> elements (#6518)
+
+MITAB driver:
+ * limit (width, precision) of numeric fields on creation to (20,16) for compatibility with MapInfo (#6392)
+
+MSSQLSpatial driver:
+ * Fix MSSQL bulk insert with table names containing spaces (#6527)
+
+NAS driver:
+ * support multiple 'anlass' in updates (cherry picked from r34461)
+
+OpenFileGDB driver:
+ * transcode UTF-16 strings found in column names, alias, etc... to UTF-8 (instead of using only their ASCII byte) (#6544)
+ * do not error out on geometries that have a declared M array but that is missing (#6528)
+ * do not emit an error on a empty table whose declaration has M settings (#6564)
+
+PG driver:
+ * fix insertion of binary/bytea content in non-copy mode (#6566)
+
+ROI_PAC driver:
+ * add support for reading/writing .flg files (#6504)
+
+S57 driver:
+ * Fix ogr2ogr -S57 (#6549)
+
+VFK driver:
+ * recreate DB automatically when it's outdated (#6511)
+
+VRT driver:
+ * add support for 'm' attribute in PointFromColumns mode (#6505)
+
+SOSI driver:
+ * make registration of driver work again (2.1 regression) (#6500)
+ * Update to latest version of ​https://github.com/kartverket/gdal. Make SOSI driver support more geometry types (including curved geometries) plus provides some improvements on attribute-type mapping. Fix some memory errors/leaks. Disable by default non working creation code (#6503)
+
+WFS driver:
+ * invalidate underlying layer when SetIgnoredFields() is called (QGIS #15112)
+
+== Perl bindings ==
+ * Fix GetGeomFieldIndex()
+ * Fix Dataset.Warp (#6521)
+
 = GDAL/OGR 2.1.0 Release Notes =
 
 == In a nutshell... ==
diff --git a/VERSION b/VERSION
index 7ec1d6d..3e3c2f1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.0
+2.1.1
diff --git a/alg/contour.cpp b/alg/contour.cpp
index 4242e55..be777d3 100644
--- a/alg/contour.cpp
+++ b/alg/contour.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: contour.cpp 33757 2016-03-20 20:22:33Z goatbar $
+ * $Id: contour.cpp 34472 2016-06-30 10:51:45Z rouault $
  *
  * Project:  Contour Generation
  * Purpose:  Core algorithm implementation for contour line generation.
@@ -33,7 +33,7 @@
 #include "gdal_alg.h"
 #include "ogr_api.h"
 
-CPL_CVSID("$Id: contour.cpp 33757 2016-03-20 20:22:33Z goatbar $");
+CPL_CVSID("$Id: contour.cpp 34472 2016-06-30 10:51:45Z rouault $");
 
 // The amount of a contour interval that pixels should be fudged by if they
 // match a contour level exactly.
@@ -70,6 +70,9 @@ public:
                        double dfXEnd, double dfYEnd, int bLeftHigh );
     void   MakeRoomFor( int );
     int    Merge( GDALContourItem * );
+    double DistanceSqr(double x0, double y0, double x1, double y1);
+    int    MergeCase( double ax0, double ay0, double ax1, double ay1,
+                      double bx0, double by0, double bx1, double by1);
     void   PrepareEjection();
 };
 
@@ -120,11 +123,14 @@ class GDALContourGenerator
     double  dfContourInterval;
     double  dfContourOffset;
 
+
     CPLErr AddSegment( double dfLevel,
                        double dfXStart, double dfYStart,
                        double dfXEnd, double dfYEnd, int bLeftHigh );
 
-    CPLErr ProcessPixel( int iPixel );
+    template<EMULATED_BOOL bNoDataIsNan> inline bool IsNoData(double dfVal) const;
+
+    template<EMULATED_BOOL bNoDataIsNan> CPLErr ProcessPixel( int iPixel );
     CPLErr ProcessRect( double, double, double,
                         double, double, double,
                         double, double, double,
@@ -158,6 +164,17 @@ public:
 
 };
 
+template<> inline bool GDALContourGenerator::IsNoData<true>(double dfVal) const
+{
+    return CPL_TO_BOOL(CPLIsNan(dfVal));
+}
+
+template<> inline bool GDALContourGenerator::IsNoData<false>(double dfVal) const
+{
+    return dfVal == dfNoDataValue;
+}
+
+
 /************************************************************************/
 /*                           GDAL_CG_Create()                           */
 /************************************************************************/
@@ -170,7 +187,11 @@ GDAL_CG_Create( int nWidth, int nHeight, int bNoDataSet, double dfNoDataValue,
 {
     GDALContourGenerator *poCG = new GDALContourGenerator( nWidth, nHeight,
                                                            pfnWriter, pCBData );
-
+    if( !poCG->Init() )
+    {
+        delete poCG;
+        return NULL;
+    }
     if( bNoDataSet )
         poCG->SetNoData( dfNoDataValue );
 
@@ -292,7 +313,7 @@ void GDALContourGenerator::SetNoData( double dfNewValue )
 /*                            ProcessPixel()                            */
 /************************************************************************/
 
-CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
+template<EMULATED_BOOL bNoDataIsNan> CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
 
 {
     double  dfUpLeft, dfUpRight, dfLoLeft, dfLoRight;
@@ -313,11 +334,13 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
 /*      Check if we have any nodata values.                             */
 /* -------------------------------------------------------------------- */
     if( bNoDataActive
-        && ( dfUpLeft == dfNoDataValue
-             || dfLoLeft == dfNoDataValue
-             || dfLoRight == dfNoDataValue
-             || dfUpRight == dfNoDataValue ) )
+        && ( IsNoData<bNoDataIsNan>(dfUpLeft)
+            || IsNoData<bNoDataIsNan>(dfLoLeft)
+            || IsNoData<bNoDataIsNan>(dfLoRight)
+            || IsNoData<bNoDataIsNan>(dfUpRight) ) )
+    {
         bSubdivide = TRUE;
+    }
 
 /* -------------------------------------------------------------------- */
 /*      Check if we have any nodata, if so, go to a special case of     */
@@ -339,25 +362,25 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
     double dfASum = 0.0;
     double dfTop=0.0, dfRight=0.0, dfLeft=0.0, dfBottom=0.0;
 
-    if( dfUpLeft != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfUpLeft) )
     {
         dfASum += dfUpLeft;
         nGoodCount++;
     }
 
-    if( dfLoLeft != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfLoLeft) )
     {
         dfASum += dfLoLeft;
         nGoodCount++;
     }
 
-    if( dfLoRight != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfLoRight) )
     {
         dfASum += dfLoRight;
         nGoodCount++;
     }
 
-    if( dfUpRight != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfUpRight) )
     {
         dfASum += dfUpRight;
         nGoodCount++;
@@ -368,14 +391,14 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
 
     double dfCenter = dfASum / nGoodCount;
 
-    if( dfUpLeft != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfUpLeft) )
     {
-        if( dfUpRight != dfNoDataValue )
+        if( !IsNoData<bNoDataIsNan>(dfUpRight) )
             dfTop = (dfUpLeft + dfUpRight) / 2.0;
         else
             dfTop = dfUpLeft;
 
-        if( dfLoLeft != dfNoDataValue )
+        if( !IsNoData<bNoDataIsNan>(dfLoLeft) )
             dfLeft = (dfUpLeft + dfLoLeft) / 2.0;
         else
             dfLeft = dfUpLeft;
@@ -386,14 +409,14 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
         dfLeft = dfLoLeft;
     }
 
-    if( dfLoRight != dfNoDataValue )
+    if( !IsNoData<bNoDataIsNan>(dfLoRight) )
     {
-        if( dfUpRight != dfNoDataValue )
+        if( !IsNoData<bNoDataIsNan>(dfUpRight) )
             dfRight = (dfLoRight + dfUpRight) / 2.0;
         else
             dfRight = dfLoRight;
 
-        if( dfLoLeft != dfNoDataValue )
+        if( !IsNoData<bNoDataIsNan>(dfLoLeft) )
             dfBottom = (dfLoRight + dfLoLeft) / 2.0;
         else
             dfBottom = dfLoRight;
@@ -409,7 +432,7 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
 /* -------------------------------------------------------------------- */
     CPLErr eErr = CE_None;
 
-    if( dfUpLeft != dfNoDataValue && iPixel > 0 && iLine > 0 )
+    if( !IsNoData<bNoDataIsNan>(dfUpLeft) && iPixel > 0 && iLine > 0 )
     {
         eErr = ProcessRect( dfUpLeft, iPixel - 0.5, iLine - 0.5,
                             dfLeft, iPixel - 0.5, iLine,
@@ -417,7 +440,7 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
                             dfTop, iPixel, iLine - 0.5 );
     }
 
-    if( dfLoLeft != dfNoDataValue && eErr == CE_None
+    if( !IsNoData<bNoDataIsNan>(dfLoLeft) && eErr == CE_None
         && iPixel > 0 && iLine < nHeight )
     {
         eErr = ProcessRect( dfLeft, iPixel - 0.5, iLine,
@@ -426,7 +449,7 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
                             dfCenter, iPixel, iLine );
     }
 
-    if( dfLoRight != dfNoDataValue && iPixel < nWidth && iLine < nHeight )
+    if( !IsNoData<bNoDataIsNan>(dfLoRight) && iPixel < nWidth && iLine < nHeight )
     {
         eErr = ProcessRect( dfCenter, iPixel, iLine,
                             dfBottom, iPixel, iLine + 0.5,
@@ -434,7 +457,7 @@ CPLErr GDALContourGenerator::ProcessPixel( int iPixel )
                             dfRight, iPixel + 0.5, iLine );
     }
 
-    if( dfUpRight != dfNoDataValue && iPixel < nWidth && iLine > 0 )
+    if( !IsNoData<bNoDataIsNan>(dfUpRight) && iPixel < nWidth && iLine > 0 )
     {
         eErr = ProcessRect( dfTop, iPixel, iLine - 0.5,
                             dfCenter, iPixel, iLine,
@@ -798,9 +821,11 @@ CPLErr GDALContourGenerator::FeedLine( double *padfScanline )
 /* -------------------------------------------------------------------- */
 /*      Process each pixel.                                             */
 /* -------------------------------------------------------------------- */
+    const bool bNoDataIsNan = CPL_TO_BOOL(CPLIsNan(dfNoDataValue));
     for( iPixel = 0; iPixel < nWidth+1; iPixel++ )
     {
-        CPLErr eErr = ProcessPixel( iPixel );
+        CPLErr eErr = bNoDataIsNan ? ProcessPixel<true>( iPixel ) :
+                                     ProcessPixel<false>( iPixel );
         if( eErr != CE_None )
             return eErr;
     }
@@ -1205,105 +1230,189 @@ int GDALContourItem::AddSegment( double dfXStart, double dfYStart,
 }
 
 /************************************************************************/
+/*                               DistanceSqr()                          */
+/************************************************************************/
+
+double GDALContourItem::DistanceSqr( 
+   double x0, double y0, double x1, double y1
+)
+{
+// --------------------------------------------------------------------
+// Coumpute the square of the euclidian distance between
+// (x0;y0)-(x1;y1)
+// --------------------------------------------------------------------
+   double dx = x0 - x1;
+   double dy = y0 - y1;
+
+   return (dx*dx + dy*dy);
+}
+
+/************************************************************************/
+/*                               MergeCase()                            */
+/************************************************************************/
+
+int GDALContourItem::MergeCase( 
+   double ax0, double ay0, double ax1, double ay1,
+   double bx0, double by0, double bx1, double by1
+)
+{
+    double dd;
+
+// --------------------------------------------------------------------
+// Try to find a match case between line ends
+// Calculate all possible distances and choose the closest
+// if less than JOIN_DIST
+// --------------------------------------------------------------------
+
+    // avoid sqrt()
+    const double jds = JOIN_DIST * JOIN_DIST;   
+
+    // case 1 e-b
+    int cs = 1;
+    double dmin = DistanceSqr (ax1, ay1, bx0, by0);
+
+    // case 2 b-e
+    dd = DistanceSqr (ax0, ay0, bx1, by1);
+    if (dd < dmin)
+    {
+        dmin = dd;
+        cs   = 2;
+    }
+
+    // case 3 e-e
+    dd = DistanceSqr (ax1, ay1, bx1, by1);
+    if (dd < dmin)
+    {
+        dmin = dd;
+        cs   = 3;
+    }
+
+    // case 4 b-b
+    dd = DistanceSqr (ax0, ay0, bx0, by0);
+    if (dd < dmin)
+    {
+        dmin = dd;
+        cs   = 4;
+    }
+
+    if (dmin > jds)
+        cs = 0;
+
+    return cs;
+}
+
+/************************************************************************/
 /*                               Merge()                                */
 /************************************************************************/
 
 int GDALContourItem::Merge( GDALContourItem *poOther )
 
 {
+    int rc = FALSE;
+    int i;
+
     if( poOther->dfLevel != dfLevel )
         return FALSE;
 
 /* -------------------------------------------------------------------- */
 /*      Try to matching up with one of the ends, and insert.            */
 /* -------------------------------------------------------------------- */
-    if( fabs(padfX[nPoints-1]-poOther->padfX[0]) < JOIN_DIST
-        && fabs(padfY[nPoints-1]-poOther->padfY[0]) < JOIN_DIST )
+
+    int mc = MergeCase (
+        padfX[0],                           padfY[0], 
+        padfX[nPoints-1],                   padfY[nPoints-1],
+        poOther->padfX[0],                  poOther->padfY[0], 
+        poOther->padfX[poOther->nPoints-1], poOther->padfY[poOther->nPoints-1]
+    );
+
+    switch (mc)
     {
-        MakeRoomFor( nPoints + poOther->nPoints - 1 );
+        case 0:
+            break;
 
-        memcpy( padfX + nPoints, poOther->padfX + 1,
-                sizeof(double) * (poOther->nPoints-1) );
-        memcpy( padfY + nPoints, poOther->padfY + 1,
-                sizeof(double) * (poOther->nPoints-1) );
-        nPoints += poOther->nPoints - 1;
+        case 1:   // case 1 e-b
+            MakeRoomFor( nPoints + poOther->nPoints - 1 );
 
-        bRecentlyAccessed = TRUE;
+            memcpy( padfX + nPoints, poOther->padfX + 1,
+                    sizeof(double) * (poOther->nPoints-1) );
+            memcpy( padfY + nPoints, poOther->padfY + 1,
+                    sizeof(double) * (poOther->nPoints-1) );
+            nPoints += poOther->nPoints - 1;
 
-        dfTailX = padfX[nPoints-1];
+            bRecentlyAccessed = TRUE;
 
-        return TRUE;
-    }
-    else if( fabs(padfX[0]-poOther->padfX[poOther->nPoints-1]) < JOIN_DIST
-             && fabs(padfY[0]-poOther->padfY[poOther->nPoints-1]) < JOIN_DIST )
-    {
-        MakeRoomFor( nPoints + poOther->nPoints - 1 );
-
-        memmove( padfX + poOther->nPoints - 1, padfX,
-                sizeof(double) * nPoints );
-        memmove( padfY + poOther->nPoints - 1, padfY,
-                sizeof(double) * nPoints );
-        memcpy( padfX, poOther->padfX,
-                sizeof(double) * (poOther->nPoints-1) );
-        memcpy( padfY, poOther->padfY,
-                sizeof(double) * (poOther->nPoints-1) );
-        nPoints += poOther->nPoints - 1;
+            dfTailX = padfX[nPoints-1];
 
-        bRecentlyAccessed = TRUE;
+            rc = TRUE;
+            break;
 
-        dfTailX = padfX[nPoints-1];
+        case 2:   // case 2 b-e
+            MakeRoomFor( nPoints + poOther->nPoints - 1 );
 
-        return TRUE;
-    }
-    else if( fabs(padfX[nPoints-1]-poOther->padfX[poOther->nPoints-1]) < JOIN_DIST
-        && fabs(padfY[nPoints-1]-poOther->padfY[poOther->nPoints-1]) < JOIN_DIST )
-    {
-        int i;
+            memmove( padfX + poOther->nPoints - 1, padfX,
+                    sizeof(double) * nPoints );
+            memmove( padfY + poOther->nPoints - 1, padfY,
+                    sizeof(double) * nPoints );
+            memcpy( padfX, poOther->padfX,
+                    sizeof(double) * (poOther->nPoints-1) );
+            memcpy( padfY, poOther->padfY,
+                    sizeof(double) * (poOther->nPoints-1) );
+            nPoints += poOther->nPoints - 1;
 
-        MakeRoomFor( nPoints + poOther->nPoints - 1 );
+            bRecentlyAccessed = TRUE;
 
-        for( i = 0; i < poOther->nPoints-1; i++ )
-        {
-            padfX[i+nPoints] = poOther->padfX[poOther->nPoints-i-2];
-            padfY[i+nPoints] = poOther->padfY[poOther->nPoints-i-2];
-        }
+            dfTailX = padfX[nPoints-1];
 
-        nPoints += poOther->nPoints - 1;
+            rc = TRUE;
+            break;
 
-        bRecentlyAccessed = TRUE;
+        case 3:   // case 3 e-e
+            MakeRoomFor( nPoints + poOther->nPoints - 1 );
+
+            for( i = 0; i < poOther->nPoints-1; i++ )
+            {
+                padfX[i+nPoints] = poOther->padfX[poOther->nPoints-i-2];
+                padfY[i+nPoints] = poOther->padfY[poOther->nPoints-i-2];
+            }
 
-        dfTailX = padfX[nPoints-1];
+            nPoints += poOther->nPoints - 1;
 
-        return TRUE;
-    }
-    else if( fabs(padfX[0]-poOther->padfX[0]) < JOIN_DIST
-        && fabs(padfY[0]-poOther->padfY[0]) < JOIN_DIST )
-    {
-        int i;
+            bRecentlyAccessed = TRUE;
 
-        MakeRoomFor( nPoints + poOther->nPoints - 1 );
+            dfTailX = padfX[nPoints-1];
 
-        memmove( padfX + poOther->nPoints - 1, padfX,
-                sizeof(double) * nPoints );
-        memmove( padfY + poOther->nPoints - 1, padfY,
-                sizeof(double) * nPoints );
+            rc = TRUE;
+            break;
 
-        for( i = 0; i < poOther->nPoints-1; i++ )
-        {
-            padfX[i] = poOther->padfX[poOther->nPoints - i - 1];
-            padfY[i] = poOther->padfY[poOther->nPoints - i - 1];
-        }
+        case 4:   // case 3 b-b
+            MakeRoomFor( nPoints + poOther->nPoints - 1 );
 
-        nPoints += poOther->nPoints - 1;
+            memmove( padfX + poOther->nPoints - 1, padfX,
+                    sizeof(double) * nPoints );
+            memmove( padfY + poOther->nPoints - 1, padfY,
+                    sizeof(double) * nPoints );
 
-        bRecentlyAccessed = TRUE;
+            for( i = 0; i < poOther->nPoints-1; i++ )
+            {
+                padfX[i] = poOther->padfX[poOther->nPoints - i - 1];
+                padfY[i] = poOther->padfY[poOther->nPoints - i - 1];
+            }
 
-        dfTailX = padfX[nPoints-1];
+            nPoints += poOther->nPoints - 1;
 
-        return TRUE;
+            bRecentlyAccessed = TRUE;
+
+            dfTailX = padfX[nPoints-1];
+
+            rc = TRUE;
+            break;
+
+        default:
+            CPLAssert(FALSE);
+            break;
     }
-    else
-        return FALSE;
+
+    return rc;
 }
 
 /************************************************************************/
diff --git a/alg/gdalgrid.cpp b/alg/gdalgrid.cpp
index 76f1716..920ffbf 100644
--- a/alg/gdalgrid.cpp
+++ b/alg/gdalgrid.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: gdalgrid.cpp 33808 2016-03-29 21:15:28Z goatbar $
+ * $Id: gdalgrid.cpp 34393 2016-06-22 21:21:29Z rouault $
  *
  * Project:  GDAL Gridding API.
  * Purpose:  Implementation of GDAL scattered data gridder.
@@ -38,7 +38,7 @@
 #include "gdalgrid_priv.h"
 #include <cstdlib>
 
-CPL_CVSID("$Id: gdalgrid.cpp 33808 2016-03-29 21:15:28Z goatbar $");
+CPL_CVSID("$Id: gdalgrid.cpp 34393 2016-06-22 21:21:29Z rouault $");
 
 #define TO_RADIANS (M_PI / 180.0)
 
@@ -2310,8 +2310,7 @@ CPLErr GDALGridContextProcess(GDALGridContext* psContext,
         sJob.nYStep = nThreads;
         sJob.hCondMutex = CPLCreateMutex(); /* and  implicitly take the mutex */
         sJob.hCond = CPLCreateCond();
-        if( sJob.pfnRealProgress != NULL && sJob.pfnRealProgress != GDALDummyProgress )
-            sJob.pfnProgress = GDALGridProgressMultiThread;
+        sJob.pfnProgress = GDALGridProgressMultiThread;
 
 /* -------------------------------------------------------------------- */
 /*      Start threads.                                                  */
diff --git a/apps/gdalwarp_lib.cpp b/apps/gdalwarp_lib.cpp
index b5aa5ef..95e8f46 100644
--- a/apps/gdalwarp_lib.cpp
+++ b/apps/gdalwarp_lib.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: gdalwarp_lib.cpp 33757 2016-03-20 20:22:33Z goatbar $
+ * $Id: gdalwarp_lib.cpp 34210 2016-05-10 21:08:22Z rouault $
  *
  * Project:  High Performance Image Reprojector
  * Purpose:  Test program for high performance warper API.
@@ -42,7 +42,7 @@
 #include <algorithm>
 #include "gdal_utils_priv.h"
 
-CPL_CVSID("$Id: gdalwarp_lib.cpp 33757 2016-03-20 20:22:33Z goatbar $");
+CPL_CVSID("$Id: gdalwarp_lib.cpp 34210 2016-05-10 21:08:22Z rouault $");
 
 /************************************************************************/
 /*                        GDALWarpAppOptions                            */
@@ -2271,8 +2271,18 @@ TransformCutlineToSource( GDALDatasetH hSrcDS, void *hCutline,
         {
             bDensify = ( OGRGeometryFactory::haveGEOS() && !bWasValidInitialy );
         }
+        else if( CSLFetchNameValue( *ppapszWarpOptions, "CUTLINE_BLEND_DIST" ) != NULL &&
+                 CPLGetConfigOption("GDALWARP_DENSIFY_CUTLINE", NULL) == NULL )
+        {
+            // TODO: we should only emit this message if a transform/reprojection will be actually done
+            CPLDebug("WARP", "Densification of cutline could perhaps be useful but as "
+                     "CUTLINE_BLEND_DIST is used, this could be very slow. So disabled "
+                     "unless GDALWARP_DENSIFY_CUTLINE=YES is explicitly specified as configuration option");
+        }
         else
+        {
             bDensify = CPLTestBool(pszDensifyCutline);
+        }
     }
     if( bDensify )
     {
diff --git a/apps/ogr2ogr_bin.cpp b/apps/ogr2ogr_bin.cpp
index 44fb413..657cba3 100644
--- a/apps/ogr2ogr_bin.cpp
+++ b/apps/ogr2ogr_bin.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr2ogr_bin.cpp 33615 2016-03-02 20:19:22Z goatbar $
+ * $Id: ogr2ogr_bin.cpp 34466 2016-06-29 18:18:18Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Simple client for translating between formats.
@@ -33,7 +33,7 @@
 #include "gdal_utils_priv.h"
 #include "commonutils.h"
 
-CPL_CVSID("$Id: ogr2ogr_bin.cpp 33615 2016-03-02 20:19:22Z goatbar $");
+CPL_CVSID("$Id: ogr2ogr_bin.cpp 34466 2016-06-29 18:18:18Z rouault $");
 
 static void Usage(int bShort = TRUE);
 static void Usage(const char* pszAdditionalMsg, int bShort = TRUE);
@@ -151,6 +151,7 @@ int main( int nArgc, char ** papszArgv )
         {
             printf("%s was compiled against GDAL %s and is running against GDAL %s\n",
                    papszArgv[0], GDAL_RELEASE_NAME, GDALVersionInfo("RELEASE_NAME"));
+            nRetCode = 0;
             goto exit;
         }
         else if( EQUAL(papszArgv[iArg],"--help") )
@@ -190,7 +191,7 @@ int main( int nArgc, char ** papszArgv )
     if( strcmp(psOptionsForBinary->pszDestDataSource, "/vsistdout/") == 0 )
         psOptionsForBinary->bQuiet = TRUE;
 
-    if (!psOptionsForBinary->bQuiet && psOptionsForBinary->bFormatExplicitlySet)
+    if (!psOptionsForBinary->bQuiet && !psOptionsForBinary->bFormatExplicitlySet)
     {
         CheckDestDataSourceNameConsistency(psOptionsForBinary->pszDestDataSource,
                                            psOptionsForBinary->pszFormat);
diff --git a/apps/ogr2ogr_lib.cpp b/apps/ogr2ogr_lib.cpp
index f1c506e..e6ecaa1 100644
--- a/apps/ogr2ogr_lib.cpp
+++ b/apps/ogr2ogr_lib.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr2ogr_lib.cpp 33615 2016-03-02 20:19:22Z goatbar $
+ * $Id: ogr2ogr_lib.cpp 34384 2016-06-20 17:09:24Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Simple client for translating between formats.
@@ -42,7 +42,7 @@
 #include <map>
 #include <vector>
 
-CPL_CVSID("$Id: ogr2ogr_lib.cpp 33615 2016-03-02 20:19:22Z goatbar $");
+CPL_CVSID("$Id: ogr2ogr_lib.cpp 34384 2016-06-20 17:09:24Z rouault $");
 
 typedef enum
 {
@@ -369,6 +369,7 @@ public:
     bool                  m_bPreserveFID;
     bool                  m_bCopyMD;
     bool                  m_bNativeData;
+    bool                  m_bNewDataSource;
 
     TargetLayerInfo*            Setup(OGRLayer * poSrcLayer,
                                       const char *pszNewLayerName,
@@ -1437,6 +1438,7 @@ GDALDatasetH GDALVectorTranslate( const char *pszDest, GDALDatasetH hDstDS, int
 /* -------------------------------------------------------------------- */
 /*      Find the output driver.                                         */
 /* -------------------------------------------------------------------- */
+    bool bNewDataSource = false;
     if( !bUpdate )
     {
         OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar();
@@ -1507,6 +1509,7 @@ GDALDatasetH GDALVectorTranslate( const char *pszDest, GDALDatasetH hDstDS, int
             GDALVectorTranslateOptionsFree(psOptions);
             return NULL;
         }
+        bNewDataSource = true;
 
         if( psOptions->bCopyMD )
         {
@@ -1650,6 +1653,7 @@ GDALDatasetH GDALVectorTranslate( const char *pszDest, GDALDatasetH hDstDS, int
     oSetup.m_bPreserveFID = psOptions->bPreserveFID;
     oSetup.m_bCopyMD = psOptions->bCopyMD;
     oSetup.m_bNativeData = psOptions->bNativeData;
+    oSetup.m_bNewDataSource = bNewDataSource;
 
     LayerTranslator oTranslator;
     oTranslator.m_poSrcDS = poDS;
@@ -2840,7 +2844,7 @@ TargetLayerInfo* SetupTargetLayer::Setup(OGRLayer* poSrcLayer,
 /* -------------------------------------------------------------------- */
 /*      Otherwise we will append to it, if append was requested.        */
 /* -------------------------------------------------------------------- */
-    else if( !bAppend )
+    else if( !bAppend && !m_bNewDataSource )
     {
         CPLError( CE_Failure, CPLE_AppDefined, "Layer %s already exists, and -append not specified.\n"
                          "        Consider using -append, or -overwrite.",
@@ -3961,7 +3965,9 @@ GDALVectorTranslateOptions *GDALVectorTranslateOptionsNew(char** papszArgv,
         }
         else if( EQUAL(papszArgv[i],"-update") )
         {
-            psOptions->eAccessMode = ACCESS_UPDATE;
+            /* Don't reset -append or -overwrite */
+            if( psOptions->eAccessMode != ACCESS_APPEND && psOptions->eAccessMode != ACCESS_OVERWRITE )
+                psOptions->eAccessMode = ACCESS_UPDATE;
         }
         else if( EQUAL(papszArgv[i],"-relaxedFieldNameMatch") )
         {
diff --git a/apps/ogr_utilities.dox b/apps/ogr_utilities.dox
index 8e8cc4b..6d7a5c2 100644
--- a/apps/ogr_utilities.dox
+++ b/apps/ogr_utilities.dox
@@ -269,7 +269,7 @@ Advanced options :
                [-splitlistfields] [-maxsubfields val]
                [-explodecollections] [-zfield field_name]
                [-gcp pixel line easting northing [elevation]]* [-order n | -tps]
-               [-nomd] [-mo \"META-TAG=VALUE\"]* [-noNativeData]
+               [-nomd] [-mo "META-TAG=VALUE"]* [-noNativeData]
 
 \endverbatim
 
diff --git a/configure b/configure
index c41febc..1ae229b 100755
--- a/configure
+++ b/configure
@@ -29227,7 +29227,7 @@ fi
         if test -f /usr/include/libqhull/libqhull.h; then
             EXTRA_INCLUDES="-I/usr/include/libqhull $EXTRA_INCLUDES"
         else
-            EXTRA_INCLUDES="-I/usr/local/include/qhull $EXTRA_INCLUDES"
+            EXTRA_INCLUDES="-I/usr/local/include/libqhull $EXTRA_INCLUDES"
         fi
         LIBS="-lqhull $LIBS"
     fi
diff --git a/configure.in b/configure.in
index 2f32fd2..cd705fe 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
 dnl ***************************************************************************
-dnl $Id: configure.in 34060 2016-04-22 11:15:16Z rouault $
+dnl $Id: configure.in 34263 2016-05-23 15:45:52Z rouault $
 dnl
 dnl Project:  GDAL
 dnl Purpose:  Configure source file.
@@ -3649,7 +3649,7 @@ elif test "$with_qhull" = "yes" -o "$with_qhull" = "" ; then
         if test -f /usr/include/libqhull/libqhull.h; then
             EXTRA_INCLUDES="-I/usr/include/libqhull $EXTRA_INCLUDES"
         else
-            EXTRA_INCLUDES="-I/usr/local/include/qhull $EXTRA_INCLUDES"
+            EXTRA_INCLUDES="-I/usr/local/include/libqhull $EXTRA_INCLUDES"
         fi
         LIBS="-lqhull $LIBS"
     fi
diff --git a/data/ogrvrt.xsd b/data/ogrvrt.xsd
index 8e535bc..d957a49 100644
--- a/data/ogrvrt.xsd
+++ b/data/ogrvrt.xsd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 /******************************************************************************
- * $Id: ogrvrt.xsd 33680 2016-03-08 09:59:03Z rouault $
+ * $Id: ogrvrt.xsd 34203 2016-05-10 14:06:35Z rouault $
  *
  * Project:  GDAL/OGR
  * Purpose:  XML Schema for OGR VRT files.
@@ -350,6 +350,11 @@
                 <xs:documentation>Only used if encoding = "PointFromColumns"</xs:documentation>
             </xs:annotation>
         </xs:attribute>
+        <xs:attribute name="m" type="nonEmptyStringType">
+            <xs:annotation>
+                <xs:documentation>Only used if encoding = "PointFromColumns"</xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
         <xs:attribute name="useSpatialSubquery" type="OGRBooleanType">
             <xs:annotation>
                 <xs:documentation>Only used if encoding = "PointFromColumns". Defaults to TRUE.</xs:documentation>
diff --git a/frmts/adrg/srpdataset.cpp b/frmts/adrg/srpdataset.cpp
index e56bdf3..3803676 100644
--- a/frmts/adrg/srpdataset.cpp
+++ b/frmts/adrg/srpdataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: srpdataset.cpp 33901 2016-04-06 16:31:31Z goatbar $
+ * $Id: srpdataset.cpp 34458 2016-06-28 08:37:28Z rouault $
  * Purpose:  ASRP/USRP Reader
  * Author:   Frank Warmerdam (warmerdam at pobox.com)
  *
@@ -38,7 +38,7 @@
 // Uncomment to recognize also .gen files in addition to .img files
 // #define OPEN_GEN
 
-CPL_CVSID("$Id: srpdataset.cpp 33901 2016-04-06 16:31:31Z goatbar $");
+CPL_CVSID("$Id: srpdataset.cpp 34458 2016-06-28 08:37:28Z rouault $");
 
 class SRPDataset : public GDALPamDataset
 {
@@ -391,15 +391,25 @@ CPLErr SRPDataset::GetGeoTransform( double * padfGeoTransform)
 {
     if( EQUAL(osProduct,"ASRP") )
     {
-        if( ZNA == 9 || ZNA == 18 )
+        if( ZNA == 9)
         {
-            padfGeoTransform[0] = -1152000.0;
-            padfGeoTransform[1] = 500.0;
+            // North Polar Case
+            padfGeoTransform[0] = 111319.4907933 * (90.0 - PSO/3600.0) * sin(LSO * M_PI / 648000.0);
+            padfGeoTransform[1] = 40075016.68558 / ARV;
             padfGeoTransform[2] = 0.0;
-            padfGeoTransform[3] = 1152000.0;
+            padfGeoTransform[3] = -111319.4907933 * (90.0 - PSO/3600.0) * cos(LSO * M_PI / 648000.0);
             padfGeoTransform[4] = 0.0;
-            padfGeoTransform[5] = -500.0;
-
+            padfGeoTransform[5] = -40075016.68558 / ARV;
+        }
+        else if (ZNA == 18)
+        {
+            // South Polar Case
+            padfGeoTransform[0] = 111319.4907933 * (90.0 + PSO/3600.0) * sin(LSO * M_PI / 648000.0);
+            padfGeoTransform[1] = 40075016.68558 / ARV;
+            padfGeoTransform[2] = 0.0;
+            padfGeoTransform[3] = 111319.4907933 * (90.0 + PSO/3600.0) * cos(LSO * M_PI / 648000.0);
+            padfGeoTransform[4] = 0.0;
+            padfGeoTransform[5] = -40075016.68558 / ARV;
         }
         else
         {
@@ -770,12 +780,12 @@ int SRPDataset::GetFromRecord(const char* pszFileName, DDFRecord * record)
 
         if( ZNA == 9 )
         {
-            osSRS = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Azimuthal_Equidistant\"],PARAMETER[\"latitude_of_center\",90],PARAMETER[\"longitude_of_center\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0]]";
+            osSRS = "PROJCS[\"ARC_System_Zone_09\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6378137.0,0.0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Azimuthal_Equidistant\"],PARAMETER[\"latitude_of_center\",90],PARAMETER[\"longitude_of_center\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0]]";
         }
 
         if (ZNA == 18)
         {
-            osSRS = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Azimuthal_Equidistant\"],PARAMETER[\"latitude_of_center\",-90],PARAMETER[\"longitude_of_center\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0]]";
+            osSRS = "PROJCS[\"ARC_System_Zone_18\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6378137.0,0.0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Azimuthal_Equidistant\"],PARAMETER[\"latitude_of_center\",-90],PARAMETER[\"longitude_of_center\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0]]";
         }
     }
     else
diff --git a/frmts/ecw/ecwdataset.cpp b/frmts/ecw/ecwdataset.cpp
index 6d9383a..1936de7 100644
--- a/frmts/ecw/ecwdataset.cpp
+++ b/frmts/ecw/ecwdataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ecwdataset.cpp 33717 2016-03-14 06:29:14Z goatbar $
+ * $Id: ecwdataset.cpp 34287 2016-05-24 15:49:52Z mloskot $
  *
  * Project:  GDAL
  * Purpose:  ECW (ERDAS Wavelet Compression Format) Driver
@@ -37,7 +37,7 @@
 
 #include "../mem/memdataset.h"
 
-CPL_CVSID("$Id: ecwdataset.cpp 33717 2016-03-14 06:29:14Z goatbar $");
+CPL_CVSID("$Id: ecwdataset.cpp 34287 2016-05-24 15:49:52Z mloskot $");
 
 #undef NOISY_DEBUG
 
@@ -3013,7 +3013,18 @@ void ECWDataset::ECW2WKTProjection()
 
         adfGeoTransform[3] = psFileInfo->fOriginY;
         adfGeoTransform[4] = 0.0;
-        adfGeoTransform[5] = -fabs(psFileInfo->fCellIncrementY);
+
+        /* By default, set Y-resolution negative assuming images always */
+        /* have "Upward" orientation (Y coordinates increase "Upward"). */
+        /* Setting ECW_ALWAYS_UPWARD=FALSE option relexes that policy   */
+        /* and makes the driver rely on the actual Y-resolution         */
+        /* value (sign) of an image. This allows to correctly process   */
+        /* rare images with "Downward" orientation, where Y coordinates */
+        /* increase "Downward" and Y-resolution is positive.            */
+        if( CPLTestBool( CPLGetConfigOption("ECW_ALWAYS_UPWARD","TRUE") ) )
+            adfGeoTransform[5] = -fabs(psFileInfo->fCellIncrementY);
+        else
+            adfGeoTransform[5] = psFileInfo->fCellIncrementY;
     }
 
 /* -------------------------------------------------------------------- */
diff --git a/frmts/ecw/frmt_ecw.html b/frmts/ecw/frmt_ecw.html
index a330738..0f3c5bb 100644
--- a/frmts/ecw/frmt_ecw.html
+++ b/frmts/ecw/frmt_ecw.html
@@ -126,6 +126,18 @@ in an error.<p>
 
 </ul>
 
+The GDAL-specific options:
+
+<ul>
+<li> <b>ECW_ALWAYS_UPWARD=TRUE/FALSE</b>: If TRUE, the driver sets negative
+Y-resolution and assumes an image always has the "Upward" orientation
+(Y coordinates increase upward). This may be set to FALSE to let the driver
+rely on the actual image orientation, using Y-resolution value (sign) of an image,
+to allow correct processing of rare images with "Downward" orientation (Y coordinates
+increase "Downward" and Y-resolution is positive). Defaults to TRUE.</p>
+
+</ul>
+
 <h3>ECW Version 3 Files</h3>
 (Starting with GDAL 1.10.0)<p>
 
diff --git a/frmts/gtiff/geotiff.cpp b/frmts/gtiff/geotiff.cpp
index 92508f9..ff9bb8d 100644
--- a/frmts/gtiff/geotiff.cpp
+++ b/frmts/gtiff/geotiff.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: geotiff.cpp 33843 2016-04-01 08:37:57Z rouault $
+ * $Id: geotiff.cpp 34141 2016-04-30 16:44:23Z rouault $
  *
  * Project:  GeoTIFF Driver
  * Purpose:  GDAL GeoTIFF support.
@@ -65,7 +65,7 @@
 #include "tifvsi.h"
 #include "xtiffio.h"
 
-CPL_CVSID("$Id: geotiff.cpp 33843 2016-04-01 08:37:57Z rouault $");
+CPL_CVSID("$Id: geotiff.cpp 34141 2016-04-30 16:44:23Z rouault $");
 
 #if SIZEOF_VOIDP == 4
 static int bGlobalStripIntegerOverflow = FALSE;
@@ -818,6 +818,14 @@ CPLErr GTiffJPEGOverviewBand::IReadBlock( int nBlockXOff, int nBlockYOff, void *
         if( poGDS->poJPEGDS == NULL )
         {
             const char* apszDrivers[] = { "JPEG", NULL };
+            
+            CPLString osOldVal;
+            if( poGDS->poParentDS->nPlanarConfig == PLANARCONFIG_CONTIG && poGDS->nBands == 4 )
+            {
+                osOldVal = CPLGetThreadLocalConfigOption("GDAL_JPEG_TO_RGB", "");
+                CPLSetThreadLocalConfigOption("GDAL_JPEG_TO_RGB", "NO");
+            }
+
             poGDS->poJPEGDS = (GDALDataset*) GDALOpenEx(osFileToOpen,
                                                         GDAL_OF_RASTER | GDAL_OF_INTERNAL,
                                                                 apszDrivers,
@@ -831,6 +839,11 @@ CPLErr GTiffJPEGOverviewBand::IReadBlock( int nBlockXOff, int nBlockYOff, void *
 
                 poGDS->nBlockId = nBlockId;
             }
+            
+            if( poGDS->poParentDS->nPlanarConfig == PLANARCONFIG_CONTIG && poGDS->nBands == 4 )
+            {
+                CPLSetThreadLocalConfigOption("GDAL_JPEG_TO_RGB", osOldVal.size() ? osOldVal.c_str() : NULL);
+            }
         }
         else
         {
@@ -6359,6 +6372,13 @@ int GTiffDataset::GetJPEGOverviewCount()
     {
         return 0;
     }
+    const char* pszSourceColorSpace = oGTiffMDMD.GetMetadataItem( "SOURCE_COLOR_SPACE", "IMAGE_STRUCTURE");
+    if( pszSourceColorSpace != NULL && EQUAL(pszSourceColorSpace, "CMYK") )
+    {
+        // We cannot handle implicit overviews on JPEG CMYK datasets converted to RGBA
+        // This would imply doing the conversion in GTiffJPEGOverviewBand
+       return 0;
+    }
 
     /* libjpeg-6b only supports 2, 4 and 8 scale denominators */
     /* TODO: Later versions support more */
diff --git a/frmts/gtiff/libtiff/tif_dirread.c b/frmts/gtiff/libtiff/tif_dirread.c
index 80d059b..a8597db 100644
--- a/frmts/gtiff/libtiff/tif_dirread.c
+++ b/frmts/gtiff/libtiff/tif_dirread.c
@@ -166,6 +166,8 @@ static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
 static void ChopUpSingleUncompressedStrip(TIFF*);
 static uint64 TIFFReadUInt64(const uint8 *value);
 
+static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount );
+
 typedef union _UInt64Aligned_t
 {
         double d;
@@ -4281,7 +4283,8 @@ EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
 	TIFFDirectory *td = &tif->tif_dir;
 	uint32 strip;
 
-        if( !_TIFFFillStriles( tif ) )
+    /* Do not try to load stripbytecount as we will compute it */
+        if( !_TIFFFillStrilesInternal( tif, 0 ) )
             return -1;
 
 	if (td->td_stripbytecount)
@@ -5569,6 +5572,11 @@ ChopUpSingleUncompressedStrip(TIFF* tif)
 
 int _TIFFFillStriles( TIFF *tif )
 {
+    return _TIFFFillStrilesInternal( tif, 1 );
+}
+
+static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount )
+{
 #if defined(DEFER_STRILE_LOAD)
         register TIFFDirectory *td = &tif->tif_dir;
         int return_value = 1;
@@ -5585,7 +5593,8 @@ int _TIFFFillStriles( TIFF *tif )
                 return_value = 0;
         }
 
-        if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
+        if (loadStripByteCount &&
+            !TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
                                  td->td_nstrips,&td->td_stripbytecount))
         {
                 return_value = 0;
@@ -5610,6 +5619,7 @@ int _TIFFFillStriles( TIFF *tif )
         return return_value;
 #else /* !defined(DEFER_STRILE_LOAD) */
         (void) tif;
+        (void) loadStripByteCount;
         return 1;
 #endif 
 }
diff --git a/frmts/jp2kak/jp2kak.lst b/frmts/jp2kak/jp2kak.lst
index 8d1f784..440ea79 100644
--- a/frmts/jp2kak/jp2kak.lst
+++ b/frmts/jp2kak/jp2kak.lst
@@ -24,7 +24,8 @@ endif
 ifneq ($(wildcard $(KAKDIR)/apps/make/ssse3_region_decompressor.o),)
 KAK_OBJ +=	\
     $(KAKDIR)/apps/make/ssse3_region_decompressor.o \
-    $(KAKDIR)/apps/make/avx2_stripe_transfer.o
+    $(KAKDIR)/apps/make/avx2_stripe_transfer.o \
+    $(KAKDIR)/apps/make/avx2_region_decompressor.o
 endif
 
 # The following are for Kakadu 7.7 and later
@@ -33,3 +34,11 @@ ifneq ($(wildcard $(KAKDIR)/apps/make/kdu_client_windo?.o),)
 KAK_OBJ +=      \
     $(KAKDIR)/apps/make/kdu_client_window.o
 endif
+
+# The following are for Kakadu 7.8 and later.
+ifneq ($(wildcard $(KAKDIR)/apps/make/sse4_region_decompressor.o),)
+KAK_OBJ +=      \
+    $(KAKDIR)/apps/make/sse4_region_decompressor.o \
+    $(KAKDIR)/apps/make/avx2_region_compositor.o \
+    $(KAKDIR)/apps/make/avx2_vex_transfer.o
+endif
diff --git a/frmts/jp2kak/jp2kakdataset.cpp b/frmts/jp2kak/jp2kakdataset.cpp
index 6e570fc..6615ff5 100644
--- a/frmts/jp2kak/jp2kakdataset.cpp
+++ b/frmts/jp2kak/jp2kakdataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: jp2kakdataset.cpp 33812 2016-03-29 23:14:24Z goatbar $
+ * $Id: jp2kakdataset.cpp 34399 2016-06-24 08:27:25Z rouault $
  *
  * Project:  JPEG-2000
  * Purpose:  Implementation of the ISO/IEC 15444-1 standard based on Kakadu.
@@ -45,7 +45,7 @@
 #include "subfile_source.h"
 #include "vsil_target.h"
 
-CPL_CVSID("$Id: jp2kakdataset.cpp 33812 2016-03-29 23:14:24Z goatbar $");
+CPL_CVSID("$Id: jp2kakdataset.cpp 34399 2016-06-24 08:27:25Z rouault $");
 
 // Before v7.5 Kakadu does not advertise its version well
 // After v7.5 Kakadu has KDU_{MAJOR,MINOR,PATCH}_VERSION defines so it's easier
@@ -324,16 +324,29 @@ JP2KAKRasterBand::JP2KAKRasterBand( int nBandIn, int nDiscardLevelsIn,
         int nBlueIndex = -1;
         int nLutIndex = 0;
         int nCSI = 0;
+#if KDU_MAJOR_VERSION > 7 || (KDU_MAJOR_VERSION == 7 && KDU_MINOR_VERSION >= 8)
+        int nFMT = 0;
+#endif
 
         if( oJP2Channels.get_num_colours() == 3 )
         {
+#if KDU_MAJOR_VERSION > 7 || (KDU_MAJOR_VERSION == 7 && KDU_MINOR_VERSION >= 8)
+            oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI, nFMT );
+            oJP2Channels.get_colour_mapping( 1, nGreenIndex, nLutIndex, nCSI, nFMT );
+            oJP2Channels.get_colour_mapping( 2, nBlueIndex, nLutIndex, nCSI, nFMT );
+#else
             oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI );
             oJP2Channels.get_colour_mapping( 1, nGreenIndex, nLutIndex, nCSI );
             oJP2Channels.get_colour_mapping( 2, nBlueIndex, nLutIndex, nCSI );
+#endif
         }
         else
         {
+#if KDU_MAJOR_VERSION > 7 || (KDU_MAJOR_VERSION == 7 && KDU_MINOR_VERSION >= 8)
+            oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI, nFMT );
+#else
             oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI );
+#endif
             if( nBand == 1 )
                 eInterp = GCI_GrayIndex;
         }
@@ -365,14 +378,24 @@ JP2KAKRasterBand::JP2KAKRasterBand( int nBandIn, int nDiscardLevelsIn,
                 int lut_idx = 0;
 
                 // get_opacity_mapping sets that last 3 args by non-const refs.
+#if KDU_MAJOR_VERSION > 7 || (KDU_MAJOR_VERSION == 7 && KDU_MINOR_VERSION >= 8)
+                if( oJP2Channels.get_opacity_mapping( color_idx, opacity_idx,
+                                                      lut_idx, nCSI, nFMT ) )
+#else
                 if( oJP2Channels.get_opacity_mapping( color_idx, opacity_idx,
                                                       lut_idx, nCSI ) )
+#endif
                 {
                     if( opacity_idx == nBand - 1 )
                         eInterp = GCI_AlphaBand;
                 }
+#if KDU_MAJOR_VERSION > 7 || (KDU_MAJOR_VERSION == 7 && KDU_MINOR_VERSION >= 8)
+                if( oJP2Channels.get_premult_mapping( color_idx, opacity_idx,
+                                                      lut_idx, nCSI, nFMT ) )
+#else
                 if( oJP2Channels.get_premult_mapping( color_idx, opacity_idx,
                                                       lut_idx, nCSI ) )
+#endif
                 {
                     if( opacity_idx == nBand - 1 )
                         eInterp = GCI_AlphaBand;
diff --git a/frmts/mrf/GNUmakefile b/frmts/mrf/GNUmakefile
index 624be4a..618e853 100644
--- a/frmts/mrf/GNUmakefile
+++ b/frmts/mrf/GNUmakefile
@@ -60,7 +60,7 @@ install-obj:	$(O_OBJ:.o=.$(OBJ_EXT))
 $(OBJ) $(O_OBJ):    $(DEPENDS)
 
 plugin: $(OBJ)
-	g++ -shared -W1,-soname,gdal_mrf.so.1 $(OBJ) -o gdal_mrf.so.1
+	g++ -shared -Wl,-soname,gdal_mrf.so.1 $(OBJ) -o gdal_mrf.so.1
 
 iplugin: gdal_mrf.so.1 plugin
 	mkdir -p $(PLUGIN_PATH)
diff --git a/frmts/mrf/marfa.h b/frmts/mrf/marfa.h
index 0b34068..c194524 100644
--- a/frmts/mrf/marfa.h
+++ b/frmts/mrf/marfa.h
@@ -602,7 +602,7 @@ public:
     CPLErr CompressPNG(buf_mgr &dst, buf_mgr &src);
     CPLErr DecompressPNG(buf_mgr &dst, buf_mgr &src);
 
-    const ILImage &img;
+    const ILImage img;
 
     void *PNGColors;
     void *PNGAlpha;
@@ -642,7 +642,7 @@ public:
     CPLErr DecompressJPEG12(buf_mgr &dst, buf_mgr &src);
 #endif
 
-    const ILImage &img;
+    const ILImage img;
 
     // JPEG specific flags
     bool sameres;
diff --git a/frmts/mrf/marfa_dataset.cpp b/frmts/mrf/marfa_dataset.cpp
index 78fe45d..15b52cb 100644
--- a/frmts/mrf/marfa_dataset.cpp
+++ b/frmts/mrf/marfa_dataset.cpp
@@ -1069,11 +1069,11 @@ CPLXMLNode * GDALMRFDataset::BuildConfig()
     CPLXMLNode *config = CPLCreateXMLNode(NULL, CXT_Element, "MRF_META");
 
     if (!source.empty()) {
-	CPLXMLNode *CS = CPLCreateXMLNode(config, CXT_Element, "CachedSource");
+	CPLXMLNode *psCachedSource = CPLCreateXMLNode(config, CXT_Element, "CachedSource");
 	// Should wrap the string in CDATA, in case it is XML
-	CPLXMLNode *S = CPLCreateXMLElementAndValue(CS, "Source", source);
+	CPLXMLNode *psSource = CPLCreateXMLElementAndValue(psCachedSource, "Source", source);
 	if (clonedSource)
-	    CPLSetXMLValue(S, "#clone", "true");
+	    CPLSetXMLValue(psSource, "#clone", "true");
     }
 
     // Use the full size
diff --git a/frmts/mrf/mrf_band.cpp b/frmts/mrf/mrf_band.cpp
index 6232d4b..af28cf1 100644
--- a/frmts/mrf/mrf_band.cpp
+++ b/frmts/mrf/mrf_band.cpp
@@ -283,7 +283,7 @@ CPLErr  GDALMRFRasterBand::SetNoDataValue(double val)
 	CPLError(CE_Failure, CPLE_AssertionFailed, "MRF: NoData can be set only during file create");
 	return CE_Failure;
     }
-    if (GInt32(poDS->vNoData.size()) < m_band)
+    if (GInt32(poDS->vNoData.size()) < nBand)
 	poDS->vNoData.resize(nBand);
     poDS->vNoData[m_band] = val;
     // We also need to set it for this band
diff --git a/frmts/postgisraster/postgisrasterdataset.cpp b/frmts/postgisraster/postgisrasterdataset.cpp
index d709fd2..50528ad 100644
--- a/frmts/postgisraster/postgisrasterdataset.cpp
+++ b/frmts/postgisraster/postgisrasterdataset.cpp
@@ -1210,19 +1210,11 @@ BandMetadata * PostGISRasterDataset::GetBandsMetadata(int * pnBands)
     char * pszFilteredRes = NULL;
     char ** papszParams = NULL;
 
-    if (pszWhere == NULL) {
-        osCommand.Printf("select st_bandmetadata(%s, band) from "
-        "(select %s, generate_series(1, st_numbands(%s)) band from "
-        "(select %s from %s.%s limit 1) bar) foo", pszColumn, pszColumn,
-        pszColumn, pszColumn, pszSchema, pszTable);
-    }
-
-    else {
-        osCommand.Printf("select st_bandmetadata(%s, band) from "
-        "(select %s, generate_series(1, st_numbands(%s)) band from "
-        "(select %s from %s.%s where %s limit 1) bar) foo", pszColumn,
-        pszColumn, pszColumn, pszColumn, pszSchema, pszTable, pszWhere);
-    }
+    osCommand.Printf("select st_bandmetadata(%s, band) from "
+      "(select %s, generate_series(1, %d) band from "
+      "(select %s from %s.%s where (%s) AND st_numbands(%s)=%d limit 1) bar) foo", pszColumn,
+      pszColumn, nBandsToCreate, pszColumn, pszSchema, pszTable, pszWhere ? pszWhere : "true",
+      pszColumn, nBandsToCreate);
 
 #ifdef DEBUG_QUERY
     CPLDebug("PostGIS_Raster",
@@ -1702,7 +1694,7 @@ GBool PostGISRasterDataset::ConstructOneDatasetFromTiles(
 #endif
 
         papoSourcesHolders = (PostGISRasterTileDataset **)
-            VSI_MALLOC2_VERBOSE(l_nTiles, sizeof(PostGISRasterTileDataset *));
+            VSI_CALLOC_VERBOSE(l_nTiles, sizeof(PostGISRasterTileDataset *));
 
         if (papoSourcesHolders == NULL) {
             VSIFree(poBandMetaData);
diff --git a/frmts/raw/iscedataset.cpp b/frmts/raw/iscedataset.cpp
index 99193d7..fdb8647 100644
--- a/frmts/raw/iscedataset.cpp
+++ b/frmts/raw/iscedataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: iscedataset.cpp 33864 2016-04-02 11:50:14Z goatbar $
+ * $Id: iscedataset.cpp 34431 2016-06-25 15:07:10Z rouault $
  *
  * Project:  ISCE Raster Reader
  * Purpose:  Implementation of the ISCE raster reader
@@ -30,7 +30,7 @@
 #include "gdal_frmts.h"
 #include "rawdataset.h"
 
-CPL_CVSID("$Id: iscedataset.cpp 33864 2016-04-02 11:50:14Z goatbar $");
+CPL_CVSID("$Id: iscedataset.cpp 34431 2016-06-25 15:07:10Z rouault $");
 
 static const char * const apszISCE2GDALDatatypes[] = {
     "BYTE:Byte",
@@ -458,7 +458,23 @@ GDALDataset *ISCEDataset::Open( GDALOpenInfo *poOpenInfo )
     {
         poDS->eScheme = BIP;
         nPixelOffset = GDALGetDataTypeSize(eDataType)/8 * nBands;
-        nLineOffset = nPixelOffset * nWidth * nBands;
+        nLineOffset = nPixelOffset * nWidth;
+        if( nBands > 1 )
+        {
+            // GDAL 2.1.0 had a value of nLineOffset that was equal to the theoretical
+            // nLineOffset multiplied by nBands...
+            VSIFSeekL( poDS->fpImage, 0, SEEK_END );
+            const GUIntBig nWrongFileSize = GDALGetDataTypeSizeBytes(eDataType) *
+              nWidth * (static_cast<GUIntBig>(nFileLength - 1) * nBands * nBands + nBands);
+            if( VSIFTellL( poDS->fpImage ) == nWrongFileSize )
+            {
+                CPLError(CE_Warning, CPLE_AppDefined,
+                         "This file has been incorrectly generated by an older "
+                         "GDAL version whose line offset computation was erroneous. "
+                         "Taking that into account, but the file should be re-encoded ideally");
+                nLineOffset = nLineOffset * nBands;
+            }
+        }
         nBandOffset = GDALGetDataTypeSize(eDataType)/8;
     }
     else if ( EQUAL( sScheme, "BSQ" ) )
diff --git a/frmts/raw/roipacdataset.cpp b/frmts/raw/roipacdataset.cpp
index 0e5c876..d3496b8 100644
--- a/frmts/raw/roipacdataset.cpp
+++ b/frmts/raw/roipacdataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: roipacdataset.cpp 33864 2016-04-02 11:50:14Z goatbar $
+ * $Id: roipacdataset.cpp 34205 2016-05-10 14:14:49Z rouault $
  *
  * Project:  ROI_PAC Raster Reader
  * Purpose:  Implementation of the ROI_PAC raster reader
@@ -31,7 +31,7 @@
 #include "ogr_spatialref.h"
 #include "rawdataset.h"
 
-CPL_CVSID("$Id: roipacdataset.cpp 33864 2016-04-02 11:50:14Z goatbar $");
+CPL_CVSID("$Id: roipacdataset.cpp 34205 2016-05-10 14:14:49Z rouault $");
 
 /************************************************************************/
 /* ==================================================================== */
@@ -338,6 +338,12 @@ GDALDataset *ROIPACDataset::Open( GDALOpenInfo *poOpenInfo )
         nBands = 1;
         eInterleave = PIXEL;
     }
+    else if ( strcmp( pszExtension, "flg" ) == 0 )
+    {
+        eDataType = GDT_Byte;
+        nBands = 1;
+        eInterleave = PIXEL;
+    }
     else { /* Eeek */
         delete poDS;
         CSLDestroy( papszRsc );
@@ -519,7 +525,8 @@ int ROIPACDataset::Identify( GDALOpenInfo *poOpenInfo )
                                || strcmp( pszExtension, "unw" ) == 0
                                || strcmp( pszExtension, "msk" ) == 0
                                || strcmp( pszExtension, "trans" ) == 0
-                               || strcmp( pszExtension, "dem" ) == 0;
+                               || strcmp( pszExtension, "dem" ) == 0
+                               || strcmp( pszExtension, "flg" ) == 0;
     if ( !bExtensionIsValid )
     {
         return false;
@@ -599,6 +606,17 @@ GDALDataset *ROIPACDataset::Create( const char *pszFilename,
             return NULL;
         }
     }
+    else if ( strcmp( pszExtension, "flg" ) == 0 )
+    {
+        if ( nBands != 1 || eType != GDT_Byte )
+        {
+            CPLError( CE_Failure, CPLE_AppDefined,
+                      "Attempt to create ROI_PAC %s dataset with an illegal "
+                      "number of bands (%d) and/or data type (%s).",
+                      pszExtension, nBands, GDALGetDataTypeName(eType) );
+            return NULL;
+        }
+    }
     else { /* Eeek */
         CPLError( CE_Failure, CPLE_AppDefined,
                   "Attempt to create ROI_PAC dataset with an unknown type (%s)\n",
diff --git a/frmts/safe/frmt_safe.html b/frmts/safe/frmt_safe.html
index f9b1dc0..8527408 100644
--- a/frmts/safe/frmt_safe.html
+++ b/frmts/safe/frmt_safe.html
@@ -28,8 +28,223 @@ All other will be ignored, or result in various runtime errors.</p>
 
 <h2>Multiple measurements</h2>
 <p>If the product contains multiple measurements (for example multiple
-polarizations), each one is available as a raster band</p>
+polarizations), each one is available as a raster band - if the swath is the same. When the swath is the same, the geographic area is the same.</p>
+<p>If the product contains multiple swaths and multiple polatizations, the driver shows the first swath by default. To access other swaths, the user must select a specific subdataset.</p>
 
+<h2>Examples</h2>
+
+<ul>
+
+<li>Opening the Sentinel-1 product:
+
+<pre>
+$ gdalinfo S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/manifest.safe 
+</pre>
+
+<pre>
+Driver: SAFE/Sentinel-1 SAR SAFE Product
+Files: S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/manifest.safe
+       S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/measurement/s1a-iw-grd-vh-20150705t064241-20150705t064306-006672-008ea0-002.tiff
+       S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/measurement/s1a-iw-grd-vv-20150705t064241-20150705t064306-006672-008ea0-001.tiff
+Size is 256, 167
+Coordinate System is `'
+GCP Projection = 
+GEOGCS["WGS 84",
+    DATUM["WGS_1984",
+        SPHEROID["WGS 84",6378137,298.257223563,
+            AUTHORITY["EPSG","7030"]],
+        AUTHORITY["EPSG","6326"]],
+    PRIMEM["Greenwich",0,
+        AUTHORITY["EPSG","8901"]],
+    UNIT["degree",0.0174532925199433,
+        AUTHORITY["EPSG","9122"]],
+    AUTHORITY["EPSG","4326"]]
+GCP[  0]: Id=1, Info=
+          (0,0) -> (-8.03500070209827,39.6332161725022,141.853266630322)
+Metadata:
+  ACQUISITION_START_TIME=2015-07-05T06:42:41.504840
+  ACQUISITION_STOP_TIME=2015-07-05T06:43:06.503530
+  BEAM_MODE=IW
+  BEAM_SWATH=IW
+  FACILITY_IDENTIFIER=UPA_
+  LINE_SPACING=1.000655e+01
+  MISSION_ID=S1A
+  MODE=IW
+  ORBIT_DIRECTION=DESCENDING
+  ORBIT_NUMBER=6672
+  PIXEL_SPACING=1.000000e+01
+  PRODUCT_TYPE=GRD
+  SATELLITE_IDENTIFIER=SENTINEL-1
+  SENSOR_IDENTIFIER=SAR
+  SWATH=IW
+Subdatasets:
+  SUBDATASET_1_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW_VH
+  SUBDATASET_1_DESC=Single band with IW swath and VH polarization
+  SUBDATASET_2_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW_VV
+  SUBDATASET_2_DESC=Single band with IW swath and VV polarization
+  SUBDATASET_3_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW
+  SUBDATASET_3_DESC=IW swath with all polarizations as bands
+Corner Coordinates:
+Upper Left  (    0.0,    0.0)
+Lower Left  (    0.0,  167.0)
+Upper Right (  256.0,    0.0)
+Lower Right (  256.0,  167.0)
+Center      (  128.0,   83.5)
+Band 1 Block=256x16 Type=UInt16, ColorInterp=Undefined
+  Metadata:
+    POLARISATION=VH
+    SWATH=IW
+Band 2 Block=256x16 Type=UInt16, ColorInterp=Undefined
+  Metadata:
+    POLARISATION=VV
+    SWATH=IW
+</pre>
+
+</li>
+
+<li>It's not mandatory to open manifest.safe, just pass the folder name:
+
+<pre>
+$ gdalinfo S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE
+</pre>
+</li>
+
+<li>Opening a single measurement (for example IW/VH):
+
+<pre>
+$ gdalinfo SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW_VV
+</pre>
+
+<pre>
+Driver: SAFE/Sentinel-1 SAR SAFE Product
+Files: S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/manifest.safe
+       S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE/measurement/s1a-iw-grd-vh-20150705t064241-20150705t064306-006672-008ea0-002.tiff
+Size is 256, 167
+Coordinate System is `'
+GCP Projection = 
+GEOGCS["WGS 84",
+    DATUM["WGS_1984",
+        SPHEROID["WGS 84",6378137,298.257223563,
+            AUTHORITY["EPSG","7030"]],
+        AUTHORITY["EPSG","6326"]],
+    PRIMEM["Greenwich",0,
+        AUTHORITY["EPSG","8901"]],
+    UNIT["degree",0.0174532925199433,
+        AUTHORITY["EPSG","9122"]],
+    AUTHORITY["EPSG","4326"]]
+GCP[  0]: Id=1, Info=
+          (0,0) -> (-8.03500070209827,39.6332161725022,141.853266630322)
+Metadata:
+  ACQUISITION_START_TIME=2015-07-05T06:42:41.504840
+  ACQUISITION_STOP_TIME=2015-07-05T06:43:06.503530
+  BEAM_MODE=IW
+  BEAM_SWATH=IW
+  FACILITY_IDENTIFIER=UPA_
+  LINE_SPACING=1.000655e+01
+  MISSION_ID=S1A
+  MODE=IW
+  ORBIT_DIRECTION=DESCENDING
+  ORBIT_NUMBER=6672
+  PIXEL_SPACING=1.000000e+01
+  PRODUCT_TYPE=GRD
+  SATELLITE_IDENTIFIER=SENTINEL-1
+  SENSOR_IDENTIFIER=SAR
+  SWATH=IW
+Subdatasets:
+  SUBDATASET_1_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW_VH
+  SUBDATASET_1_DESC=Single band with IW swath and VH polarization
+  SUBDATASET_2_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW_VV
+  SUBDATASET_2_DESC=Single band with IW swath and VV polarization
+  SUBDATASET_3_NAME=SENTINEL1_DS:S1A_IW_GRDH_1SDV_20150705T064241_20150705T064306_006672_008EA0_24EE.SAFE:IW
+  SUBDATASET_3_DESC=IW swath with all polarizations as bands
+Corner Coordinates:
+Upper Left  (    0.0,    0.0)
+Lower Left  (    0.0,  167.0)
+Upper Right (  256.0,    0.0)
+Lower Right (  256.0,  167.0)
+Center      (  128.0,   83.5)
+Band 1 Block=256x16 Type=UInt16, ColorInterp=Undefined
+  Metadata:
+    POLARISATION=VH
+    SWATH=IW
+</pre>
+
+</li>
+
+<li>A SLC product with 5 swaths in single pol (the first EW1/HH is selected by default):
+
+<pre>
+$ gdalinfo S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE 
+</pre>
+
+<pre>
+
+Driver: SAFE/Sentinel-1 SAR SAFE Product
+Files: S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE/manifest.safe
+       S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE/measurement/s1a-ew1-slc-hh-20150226t010823-20150226t010859-004787-005f2b-001.tiff
+Size is 6871, 14016
+Coordinate System is `'
+GCP Projection = 
+GEOGCS["WGS 84",
+    DATUM["WGS_1984",
+        SPHEROID["WGS 84",6378137,298.257223563,
+            AUTHORITY["EPSG","7030"]],
+        AUTHORITY["EPSG","6326"]],
+    PRIMEM["Greenwich",0,
+        AUTHORITY["EPSG","8901"]],
+    UNIT["degree",0.0174532925199433,
+        AUTHORITY["EPSG","9122"]],
+    AUTHORITY["EPSG","4326"]]
+GCP[  0]: Id=1, Info=
+          (0,0) -> (-26.9158879633399,-76.5938687850829,250.211451298701)
+GCP[  1]: Id=2, Info=
+
+...supressed output...
+
+GCP[272]: Id=273, Info=
+          (6870,14015) -> (-35.4972634588715,-75.5331533717809,0)
+Metadata:
+  ACQUISITION_START_TIME=2015-02-26T01:08:23.095253
+  ACQUISITION_STOP_TIME=2015-02-26T01:09:02.335069
+  BEAM_MODE=EW
+  BEAM_SWATH=EW1
+  FACILITY_IDENTIFIER=ESRIN headquarters
+  LINE_SPACING=1.992087e+01
+  MISSION_ID=S1A
+  MODE=EW
+  ORBIT_DIRECTION=ASCENDING
+  ORBIT_NUMBER=4787
+  PIXEL_SPACING=5.990303e+00
+  PRODUCT_TYPE=SLC
+  SATELLITE_IDENTIFIER=SENTINEL-1
+  SENSOR_IDENTIFIER=SAR
+  SWATH=EW1
+Subdatasets:
+  SUBDATASET_1_NAME=SENTINEL1_DS:S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE:EW1_HH
+  SUBDATASET_1_DESC=Single band with EW1 swath and HH polarization
+  SUBDATASET_2_NAME=SENTINEL1_DS:S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE:EW2_HH
+  SUBDATASET_2_DESC=Single band with EW2 swath and HH polarization
+  SUBDATASET_3_NAME=SENTINEL1_DS:S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE:EW3_HH
+  SUBDATASET_3_DESC=Single band with EW3 swath and HH polarization
+  SUBDATASET_4_NAME=SENTINEL1_DS:S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE:EW4_HH
+  SUBDATASET_4_DESC=Single band with EW4 swath and HH polarization
+  SUBDATASET_5_NAME=SENTINEL1_DS:S1A_EW_SLC__1SSH_20150226T010823_20150226T010902_004787_005F2B_E43E.SAFE:EW5_HH
+  SUBDATASET_5_DESC=Single band with EW5 swath and HH polarization
+Corner Coordinates:
+Upper Left  (    0.0,    0.0)
+Lower Left  (    0.0,14016.0)
+Upper Right ( 6871.0,    0.0)
+Lower Right ( 6871.0,14016.0)
+Center      ( 3435.5, 7008.0)
+Band 1 Block=7852x1 Type=CInt16, ColorInterp=Undefined
+  Metadata:
+    POLARISATION=HH
+    SWATH=EW1
+</pre>
+
+</li>
+
+</ul>
 
 <h2>Data Calibration</h2>
 <p>Currently the driver does not apply calibration information.</p>
diff --git a/frmts/safe/safedataset.cpp b/frmts/safe/safedataset.cpp
index bea1cc5..6b2f906 100644
--- a/frmts/safe/safedataset.cpp
+++ b/frmts/safe/safedataset.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: safedataset.cpp 33717 2016-03-14 06:29:14Z goatbar $
+ * $Id: safedataset.cpp 34273 2016-05-23 20:00:39Z rouault $
  *
  * Project:  Sentinel SAFE products
  * Purpose:  Sentinel Products (manifest.safe) driver
@@ -32,8 +32,10 @@
 #include "gdal_frmts.h"
 #include "gdal_pam.h"
 #include "ogr_spatialref.h"
+#include <set>
+#include <map>
 
-CPL_CVSID("$Id: safedataset.cpp 33717 2016-03-14 06:29:14Z goatbar $");
+CPL_CVSID("$Id: safedataset.cpp 34273 2016-05-23 20:00:39Z rouault $");
 
 /************************************************************************/
 /* ==================================================================== */
@@ -62,6 +64,8 @@ class SAFEDataset : public GDALPamDataset
 
     static CPLXMLNode * GetDataObject(CPLXMLNode *, const char *);
     static CPLXMLNode * GetDataObject(CPLXMLNode *, CPLXMLNode *, const char *);
+    
+    static void AddSubDataset(SAFEDataset *poDS, int iDSNum, CPLString osName, CPLString osDesc);
 
   public:
             SAFEDataset();
@@ -99,7 +103,8 @@ class SAFERasterBand : public GDALPamRasterBand
   public:
             SAFERasterBand( SAFEDataset *poDSIn,
                                GDALDataType eDataTypeIn,
-                               const char *pszPole,
+                               const char *pszSwath,
+                               const char *pszPol,
                                GDALDataset *poBandFile );
     virtual     ~SAFERasterBand();
 
@@ -114,6 +119,7 @@ class SAFERasterBand : public GDALPamRasterBand
 
 SAFERasterBand::SAFERasterBand( SAFEDataset *poDSIn,
                               GDALDataType eDataTypeIn,
+                              const char *pszSwath,
                               const char *pszPolarisation,
                               GDALDataset *poBandFileIn )
 
@@ -127,6 +133,9 @@ SAFERasterBand::SAFERasterBand( SAFEDataset *poDSIn,
 
     eDataType = eDataTypeIn;
 
+    if( *pszSwath != '\0' ) {
+        SetMetadataItem( "SWATH", pszSwath );
+    }
     if( *pszPolarisation != '\0' ) {
         SetMetadataItem( "POLARISATION", pszPolarisation );
     }
@@ -430,7 +439,12 @@ char **SAFEDataset::GetFileList()
 int SAFEDataset::Identify( GDALOpenInfo *poOpenInfo )
 {
     /* Check for the case where we're trying to read the calibrated data: */
-    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "SENTINEL_1_CALIB:")) {
+    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "SENTINEL1_CALIB:")) {
+        return TRUE;
+    }
+
+    /* Check for the case where we're trying to read the subdatasets: */
+    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "SENTINEL1_DS:")) {
         return TRUE;
     }
 
@@ -488,15 +502,47 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
 /*        Get subdataset information, if relevant                       */
 /* -------------------------------------------------------------------- */
     CPLString osMDFilename;
-    const char *pszFilename = poOpenInfo->pszFilename;
+    
+    //Subdataset 1st level selection (ex: for swath selection)
+    CPLString osSelectedSubDS1;
+    //Subdataset 2nd level selection (ex: for polarisation selection)
+    CPLString osSelectedSubDS2;
 
+    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "SENTINEL1_DS:")) 
+    {
+      
+      osMDFilename = poOpenInfo->pszFilename + strlen("SENTINEL1_DS:");
+      const char* pszSelection1 = strrchr(osMDFilename.c_str(), ':');
+      if (pszSelection1 == NULL || pszSelection1 == osMDFilename.c_str() )
+      {
+          CPLError(CE_Failure, CPLE_AppDefined, "Invalid syntax for SENTINEL1_DS:");
+          return NULL;
+      }
+      osMDFilename.resize( pszSelection1 - osMDFilename.c_str() );
+      osSelectedSubDS1 = pszSelection1 + strlen(":");
+      
+      const char* pszSelection2 = strchr(osSelectedSubDS1.c_str(), '_');
+      if (pszSelection2 != NULL && pszSelection2 != pszSelection1 )
+      {
+          osSelectedSubDS1.resize( pszSelection2 - osSelectedSubDS1.c_str() );
+          osSelectedSubDS2 = pszSelection2 + strlen("_");
+      }
+
+      //update directory check:
+      VSIStatBufL  sStat;
+      if( VSIStatL( osMDFilename.c_str(), &sStat ) == 0 )
+          poOpenInfo->bIsDirectory = VSI_ISDIR( sStat.st_mode );
+      
+    } 
+    else {
+      osMDFilename = poOpenInfo->pszFilename;
+    }
+    
     if( poOpenInfo->bIsDirectory )
     {
         osMDFilename =
-            CPLFormCIFilename( pszFilename, "manifest.safe", NULL );
+            CPLFormCIFilename( osMDFilename.c_str(), "manifest.safe", NULL );
     }
-    else
-        osMDFilename = pszFilename;
 
 /* -------------------------------------------------------------------- */
 /*      Ingest the manifest.safe file.                                  */
@@ -573,6 +619,8 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
 /*      Look for "Measurement Data Unit" contentUnit elements.          */
 /* -------------------------------------------------------------------- */
     CPLXMLNode *psAnnotation = NULL;
+    //Map with all measures aggregated by swath
+    std::map<CPLString, std::set<CPLString> > oMapSwaths2Pols;
 
     for( CPLXMLNode *psContentUnit = psContentUnits->psChild;
          psContentUnit != NULL;
@@ -691,21 +739,40 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
                 return NULL;
             }
 
-            const char *pszProductType = CPLGetXMLValue(
+            CPLString osProductType = CPLGetXMLValue(
                 psAnnotation, "=product.adsHeader.productType", "UNK" );
-            const char *pszMissionId = CPLGetXMLValue(
+            CPLString osMissionId = CPLGetXMLValue(
                 psAnnotation, "=product.adsHeader.missionId", "UNK" );
-            const char *pszPolarisation = CPLGetXMLValue(
+            CPLString osPolarisation = CPLGetXMLValue(
                 psAnnotation, "=product.adsHeader.polarisation", "UNK" );
-            const char *pszMode = CPLGetXMLValue(
+            CPLString osMode = CPLGetXMLValue(
                 psAnnotation, "=product.adsHeader.mode", "UNK" );
-            const char *pszSwath = CPLGetXMLValue(
+            CPLString osSwath = CPLGetXMLValue(
                 psAnnotation, "=product.adsHeader.swath", "UNK" );
-
-            poDS->SetMetadataItem("PRODUCT_TYPE", pszProductType);
-            poDS->SetMetadataItem("MISSION_ID", pszMissionId);
-            poDS->SetMetadataItem("MODE", pszMode);
-            poDS->SetMetadataItem("SWATH", pszSwath);
+            
+            oMapSwaths2Pols[osSwath].insert(osPolarisation);
+            
+            if (osSelectedSubDS1.empty()) {
+              //if not subdataset was selected, 
+              //we open the first one we can find
+              osSelectedSubDS1 = osSwath;
+            }
+            
+            if (!EQUAL(osSelectedSubDS1.c_str(), osSwath.c_str())) {
+              //do not mix swath, otherwise it does not work for SLC products
+              continue;
+            }
+            
+            if (!osSelectedSubDS2.empty() 
+              && (osSelectedSubDS2.find(osPolarisation)== std::string::npos)) {
+              //add only selected polarisations
+              continue;
+            }
+            
+            poDS->SetMetadataItem("PRODUCT_TYPE", osProductType.c_str());
+            poDS->SetMetadataItem("MISSION_ID", osMissionId.c_str());
+            poDS->SetMetadataItem("MODE", osMode.c_str());
+            poDS->SetMetadataItem("SWATH", osSwath.c_str());
 
 /* -------------------------------------------------------------------- */
 /*      Get dataType (so we can recognize complex data), and the        */
@@ -744,7 +811,7 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
                 "=product.imageAnnotation.imageInformation.azimuthPixelSpacing",
                 "UNK" );
             poDS->SetMetadataItem( "LINE_SPACING", pszLineSpacing );
-
+            
 /* -------------------------------------------------------------------- */
 /*      Form full filename (path of manifest.safe + measurement file).  */
 /* -------------------------------------------------------------------- */
@@ -775,7 +842,8 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
 /* -------------------------------------------------------------------- */
                 SAFERasterBand *poBand
                     = new SAFERasterBand( poDS, eDataType,
-                                          pszPolarisation,
+                                          osSwath.c_str(),
+                                          osPolarisation.c_str(),
                                           poBandFile );
 
                 poDS->SetBand( poDS->GetRasterCount() + 1, poBand );
@@ -784,7 +852,53 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
             CPLFree( pszFullname );
         }
     }
+    
+    //loop through all Swath/pols to add subdatasets
+    int iSubDS = 1;
+    for (std::map<CPLString, std::set<CPLString> >::iterator iterSwath=oMapSwaths2Pols.begin(); 
+         iterSwath!=oMapSwaths2Pols.end(); ++iterSwath) 
+    {
+        CPLString osSubDS1 = iterSwath->first;
+        CPLString osSubDS2;
+        
+        for (std::set<CPLString>::iterator iterPol=iterSwath->second.begin(); 
+            iterPol!=iterSwath->second.end(); ++iterPol)
+        {
+            if (!osSubDS2.empty()) {
+                osSubDS2 += "+";
+            }
+            osSubDS2 += *iterPol;
+            
+            //Create single band SubDataset
+            SAFEDataset::AddSubDataset(poDS, iSubDS,
+                CPLSPrintf("SENTINEL1_DS:%s:%s_%s", 
+                    osPath.c_str(), 
+                    osSubDS1.c_str(), 
+                    (*iterPol).c_str()),
+                CPLSPrintf("Single band with %s swath and %s polarisation",
+                    osSubDS1.c_str(),
+                    (*iterPol).c_str())
+            );
+            iSubDS++;
+            
+        }
+        
+        if (iterSwath->second.size()>1) {
+            //Create single band SubDataset with all polarisations
+            SAFEDataset::AddSubDataset(poDS, iSubDS,
+                CPLSPrintf("SENTINEL1_DS:%s:%s", 
+                    osPath.c_str(), 
+                    osSubDS1.c_str()),
+                CPLSPrintf("%s swath with all polarisations as bands",
+                    osSubDS1.c_str())
+            );
+            iSubDS++;
+        }
+        
+    }
+
 
+    
     if (poDS->GetRasterCount() == 0) {
         CPLError( CE_Failure, CPLE_OpenFailed, "Measurement bands not found." );
         delete poDS;
@@ -992,6 +1106,24 @@ GDALDataset *SAFEDataset::Open( GDALOpenInfo * poOpenInfo )
     return( poDS );
 }
 
+
+/************************************************************************/
+/*                            AddSubDataset()                           */
+/************************************************************************/
+void SAFEDataset::AddSubDataset(SAFEDataset *poDS, int iDSNum, CPLString osName, CPLString osDesc)
+{
+    //Create SubDataset
+    poDS->GDALDataset::SetMetadataItem(
+        CPLSPrintf("SUBDATASET_%d_NAME", iDSNum),
+        osName.c_str(),
+        "SUBDATASETS");
+    
+    poDS->GDALDataset::SetMetadataItem(
+        CPLSPrintf("SUBDATASET_%d_DESC", iDSNum),
+        osDesc.c_str(),
+        "SUBDATASETS");
+}
+
 /************************************************************************/
 /*                            GetGCPCount()                             */
 /************************************************************************/
diff --git a/frmts/vrt/vrtsources.cpp b/frmts/vrt/vrtsources.cpp
index 76e6874..032a10f 100644
--- a/frmts/vrt/vrtsources.cpp
+++ b/frmts/vrt/vrtsources.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: vrtsources.cpp 33826 2016-03-31 14:37:01Z rouault $
+ * $Id: vrtsources.cpp 34511 2016-07-01 21:50:45Z rouault $
  *
  * Project:  Virtual GDAL Datasets
  * Purpose:  Implementation of VRTSimpleSource, VRTFuncSource and
@@ -43,7 +43,7 @@
 #define isnan std::isnan
 #endif
 
-CPL_CVSID("$Id: vrtsources.cpp 33826 2016-03-31 14:37:01Z rouault $");
+CPL_CVSID("$Id: vrtsources.cpp 34511 2016-07-01 21:50:45Z rouault $");
 
 /************************************************************************/
 /* ==================================================================== */
@@ -180,6 +180,16 @@ void VRTSimpleSource::SetSrcMaskBand( GDALRasterBand *poNewSrcBand )
 }
 
 /************************************************************************/
+/*                         RoundIfCloseToInt()                          */
+/************************************************************************/
+
+static double RoundIfCloseToInt(double dfValue)
+{
+    double dfClosestInt = floor(dfValue + 0.5);
+    return (fabs( dfValue - dfClosestInt ) < 1e-5) ? dfClosestInt : dfValue;
+}
+
+/************************************************************************/
 /*                            SetSrcWindow()                            */
 /************************************************************************/
 
@@ -187,10 +197,10 @@ void VRTSimpleSource::SetSrcWindow( double dfNewXOff, double dfNewYOff,
                                     double dfNewXSize, double dfNewYSize )
 
 {
-    m_dfSrcXOff = dfNewXOff;
-    m_dfSrcYOff = dfNewYOff;
-    m_dfSrcXSize = dfNewXSize;
-    m_dfSrcYSize = dfNewYSize;
+    m_dfSrcXOff = RoundIfCloseToInt(dfNewXOff);
+    m_dfSrcYOff = RoundIfCloseToInt(dfNewYOff);
+    m_dfSrcXSize = RoundIfCloseToInt(dfNewXSize);
+    m_dfSrcYSize = RoundIfCloseToInt(dfNewYSize);
 }
 
 /************************************************************************/
@@ -201,10 +211,10 @@ void VRTSimpleSource::SetDstWindow( double dfNewXOff, double dfNewYOff,
                                     double dfNewXSize, double dfNewYSize )
 
 {
-    m_dfDstXOff = dfNewXOff;
-    m_dfDstYOff = dfNewYOff;
-    m_dfDstXSize = dfNewXSize;
-    m_dfDstYSize = dfNewYSize;
+    m_dfDstXOff = RoundIfCloseToInt(dfNewXOff);
+    m_dfDstYOff = RoundIfCloseToInt(dfNewYOff);
+    m_dfDstXSize = RoundIfCloseToInt(dfNewXSize);
+    m_dfDstYSize = RoundIfCloseToInt(dfNewYSize);
 }
 
 /************************************************************************/
@@ -637,10 +647,10 @@ CPLErr VRTSimpleSource::XMLInit( CPLXMLNode *psSrc, const char *pszVRTPath )
     CPLXMLNode* psSrcRect = CPLGetXMLNode(psSrc,"SrcRect");
     if (psSrcRect)
     {
-        m_dfSrcXOff = CPLAtof(CPLGetXMLValue(psSrcRect,"xOff","-1"));
-        m_dfSrcYOff = CPLAtof(CPLGetXMLValue(psSrcRect,"yOff","-1"));
-        m_dfSrcXSize = CPLAtof(CPLGetXMLValue(psSrcRect,"xSize","-1"));
-        m_dfSrcYSize = CPLAtof(CPLGetXMLValue(psSrcRect,"ySize","-1"));
+        SetSrcWindow( CPLAtof(CPLGetXMLValue(psSrcRect,"xOff","-1")),
+                      CPLAtof(CPLGetXMLValue(psSrcRect,"yOff","-1")),
+                      CPLAtof(CPLGetXMLValue(psSrcRect,"xSize","-1")),
+                      CPLAtof(CPLGetXMLValue(psSrcRect,"ySize","-1")) );
     }
     else
     {
@@ -650,10 +660,10 @@ CPLErr VRTSimpleSource::XMLInit( CPLXMLNode *psSrc, const char *pszVRTPath )
     CPLXMLNode* psDstRect = CPLGetXMLNode(psSrc,"DstRect");
     if (psDstRect)
     {
-        m_dfDstXOff = CPLAtof(CPLGetXMLValue(psDstRect,"xOff","-1"));
-        m_dfDstYOff = CPLAtof(CPLGetXMLValue(psDstRect,"yOff","-1"));
-        m_dfDstXSize = CPLAtof(CPLGetXMLValue(psDstRect,"xSize","-1"));
-        m_dfDstYSize = CPLAtof(CPLGetXMLValue(psDstRect,"ySize","-1"));
+        SetDstWindow( CPLAtof(CPLGetXMLValue(psDstRect,"xOff","-1")),
+                      CPLAtof(CPLGetXMLValue(psDstRect,"yOff","-1")),
+                      CPLAtof(CPLGetXMLValue(psDstRect,"xSize","-1")),
+                      CPLAtof(CPLGetXMLValue(psDstRect,"ySize","-1")) );
     }
     else
     {
@@ -1098,13 +1108,19 @@ VRTSimpleSource::RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
     {
         return CE_None;
     }
-    /*CPLDebug("VRT", "nXOff=%d, nYOff=%d, nXSize=%d, nYSize=%d, nBufXSize=%d, nBufYSize=%d, "
-                    "dfReqXOff=%g, dfReqYOff=%g, dfReqXSize=%g, dfReqYSize=%g, "
-                    "nOutXOff=%d, nOutYOff=%d, nOutXSize=%d, nOutYSize=%d",
-                    nXOff, nYOff, nXSize, nYSize,
-                    nBufXSize, nBufYSize,
-                    dfReqXOff, dfReqYOff, dfReqXSize, dfReqYSize,
-                    nOutXOff, nOutYOff, nOutXSize, nOutYSize);*/
+#if DEBUG_VERBOSE
+    CPLDebug(
+        "VRT",
+        "nXOff=%d, nYOff=%d, nXSize=%d, nYSize=%d, nBufXSize=%d, nBufYSize=%d,\n"
+        "dfReqXOff=%g, dfReqYOff=%g, dfReqXSize=%g, dfReqYSize=%g,\n"
+        "nReqXOff=%d, nReqYOff=%d, nReqXSize=%d, nReqYSize=%d,\n"
+        "nOutXOff=%d, nOutYOff=%d, nOutXSize=%d, nOutYSize=%d",
+        nXOff, nYOff, nXSize, nYSize,
+        nBufXSize, nBufYSize,
+        dfReqXOff, dfReqYOff, dfReqXSize, dfReqYSize,
+        nReqXOff, nReqYOff, nReqXSize, nReqYSize,
+        nOutXOff, nOutYOff, nOutXSize, nOutYSize );
+#endif
 
 /* -------------------------------------------------------------------- */
 /*      Actually perform the IO request.                                */
@@ -2088,6 +2104,19 @@ VRTComplexSource::RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
                           &nReqXOff, &nReqYOff, &nReqXSize, &nReqYSize,
                           &nOutXOff, &nOutYOff, &nOutXSize, &nOutYSize ) )
         return CE_None;
+#if DEBUG_VERBOSE
+    CPLDebug(
+        "VRT",
+        "nXOff=%d, nYOff=%d, nXSize=%d, nYSize=%d, nBufXSize=%d, nBufYSize=%d,\n"
+        "dfReqXOff=%g, dfReqYOff=%g, dfReqXSize=%g, dfReqYSize=%g,\n"
+        "nReqXOff=%d, nReqYOff=%d, nReqXSize=%d, nReqYSize=%d,\n"
+        "nOutXOff=%d, nOutYOff=%d, nOutXSize=%d, nOutYSize=%d",
+        nXOff, nYOff, nXSize, nYSize,
+        nBufXSize, nBufYSize,
+        dfReqXOff, dfReqYOff, dfReqXSize, dfReqYSize,
+        nReqXOff, nReqYOff, nReqXSize, nReqYSize,
+        nOutXOff, nOutYOff, nOutXSize, nOutYSize );
+#endif
 
     if( m_osResampling.size() )
     {
diff --git a/gcore/gdal_version.h b/gcore/gdal_version.h
index 83a38e7..8e8191e 100644
--- a/gcore/gdal_version.h
+++ b/gcore/gdal_version.h
@@ -6,7 +6,7 @@
 #ifndef GDAL_VERSION_MAJOR
 #  define GDAL_VERSION_MAJOR    2
 #  define GDAL_VERSION_MINOR    1
-#  define GDAL_VERSION_REV      0
+#  define GDAL_VERSION_REV      1
 #  define GDAL_VERSION_BUILD    0
 #endif
 
@@ -22,8 +22,8 @@
 #endif
 
 #ifndef GDAL_RELEASE_DATE
-#  define GDAL_RELEASE_DATE     20160425
+#  define GDAL_RELEASE_DATE     20160703
 #endif
 #ifndef GDAL_RELEASE_NAME
-#  define GDAL_RELEASE_NAME     "2.1.0"
+#  define GDAL_RELEASE_NAME     "2.1.1"
 #endif
diff --git a/gcore/mdreader/reader_pleiades.cpp b/gcore/mdreader/reader_pleiades.cpp
index e7551c9..4a9c48d 100644
--- a/gcore/mdreader/reader_pleiades.cpp
+++ b/gcore/mdreader/reader_pleiades.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: reader_pleiades.cpp 33720 2016-03-15 00:39:53Z goatbar $
+ * $Id: reader_pleiades.cpp 34367 2016-06-17 13:58:32Z rouault $
  *
  * Project:  GDAL Core
  * Purpose:  Read metadata from Pleiades imagery.
@@ -30,7 +30,7 @@
 
 #include "reader_pleiades.h"
 
-CPL_CVSID("$Id: reader_pleiades.cpp 33720 2016-03-15 00:39:53Z goatbar $");
+CPL_CVSID("$Id: reader_pleiades.cpp 34367 2016-06-17 13:58:32Z rouault $");
 
 /**
  * GDALMDReaderPleiades()
@@ -38,6 +38,7 @@ CPL_CVSID("$Id: reader_pleiades.cpp 33720 2016-03-15 00:39:53Z goatbar $");
 GDALMDReaderPleiades::GDALMDReaderPleiades(const char *pszPath,
         char **papszSiblingFiles) : GDALMDReaderBase(pszPath, papszSiblingFiles)
 {
+    m_osBaseFilename = pszPath;
     const char* pszBaseName = CPLGetBasename(pszPath);
     size_t nBaseNameLen = strlen(pszBaseName);
     if( nBaseNameLen < 4 || nBaseNameLen > 511 )
@@ -257,8 +258,8 @@ void GDALMDReaderPleiades::LoadMetadata()
  */
 
 static const char * const apszRPBMap[] = {
-    RPC_LINE_OFF,   "RFM_Validity.LINE_OFF",
-    RPC_SAMP_OFF,   "RFM_Validity.SAMP_OFF",
+    RPC_LINE_OFF,   "RFM_Validity.LINE_OFF", // do not change order !
+    RPC_SAMP_OFF,   "RFM_Validity.SAMP_OFF", // do not change order !
     RPC_LAT_OFF,    "RFM_Validity.LAT_OFF",
     RPC_LONG_OFF,   "RFM_Validity.LONG_OFF",
     RPC_HEIGHT_OFF, "RFM_Validity.HEIGHT_OFF",
@@ -300,10 +301,44 @@ char** GDALMDReaderPleiades::LoadRPCXmlFile()
         return NULL;
     }
 
+    // If we are not the top-left tile, then we must shift LINE_OFF and SAMP_OFF
+    int nLineOffShift = 0;
+    int nPixelOffShift = 0;
+    for(int i=1; TRUE; i++ )
+    {
+        CPLString osKey;
+        osKey.Printf("Raster_Data.Data_Access.Data_Files.Data_File_%d.DATA_FILE_PATH.href", i);
+        const char* pszHref = CSLFetchNameValue(m_papszIMDMD, osKey);
+        if( pszHref == NULL )
+            break;
+        if( strcmp( CPLGetFilename(pszHref), CPLGetFilename(m_osBaseFilename) ) == 0 )
+        {
+            osKey.Printf("Raster_Data.Data_Access.Data_Files.Data_File_%d.tile_C", i);
+            const char* pszC = CSLFetchNameValue(m_papszIMDMD, osKey);
+            osKey.Printf("Raster_Data.Data_Access.Data_Files.Data_File_%d.tile_R", i);
+            const char* pszR = CSLFetchNameValue(m_papszIMDMD, osKey);
+            const char* pszTileWidth = CSLFetchNameValue(m_papszIMDMD,
+                "Raster_Data.Raster_Dimensions.Tile_Set.Regular_Tiling.NTILES_SIZE.ncols");
+            const char* pszTileHeight = CSLFetchNameValue(m_papszIMDMD,
+                "Raster_Data.Raster_Dimensions.Tile_Set.Regular_Tiling.NTILES_SIZE.nrows");
+            const char* pszOVERLAP_COL = CSLFetchNameValueDef(m_papszIMDMD,
+                "Raster_Data.Raster_Dimensions.Tile_Set.Regular_Tiling.OVERLAP_COL", "0");
+            const char* pszOVERLAP_ROW = CSLFetchNameValueDef(m_papszIMDMD,
+                "Raster_Data.Raster_Dimensions.Tile_Set.Regular_Tiling.OVERLAP_ROW", "0");
+
+            if( pszC && pszR && pszTileWidth && pszTileHeight &&
+                atoi(pszOVERLAP_COL) == 0 && atoi(pszOVERLAP_ROW) == 0 )
+            {
+                nLineOffShift = - (atoi(pszR) - 1) * atoi(pszTileHeight);
+                nPixelOffShift = - (atoi(pszC) - 1) * atoi(pszTileWidth);
+            }
+            break;
+        }
+    }
+
     // format list
     char** papszRPB = NULL;
-    int i, j;
-    for( i = 0; apszRPBMap[i] != NULL; i += 2 )
+    for( int i = 0; apszRPBMap[i] != NULL; i += 2 )
     {
         // Pleiades RPCs use "center of upper left pixel is 1,1" convention, convert to
         // Digital globe convention of "center of upper left pixel is 0,0".
@@ -312,7 +347,12 @@ char** GDALMDReaderPleiades::LoadRPCXmlFile()
             CPLString osField;
             const char *pszOffset = CSLFetchNameValue(papszRawRPCList,
                                                     apszRPBMap[i + 1]);
-            osField.Printf( "%.15g", CPLAtofM( pszOffset ) -1.0 );
+            double dfVal = CPLAtofM( pszOffset ) -1.0 ;
+            if( i == 0 )
+                dfVal += nLineOffShift;
+            else
+                dfVal += nPixelOffShift;
+            osField.Printf( "%.15g", dfVal );
             papszRPB = CSLAddNameValue( papszRPB, apszRPBMap[i], osField );
         }
         else
@@ -324,13 +364,17 @@ char** GDALMDReaderPleiades::LoadRPCXmlFile()
     }
 
     // merge coefficients
-    for( i = 0; apszRPCTXT20ValItems[i] != NULL; i++ )
+    for( int i = 0; apszRPCTXT20ValItems[i] != NULL; i++ )
     {
         CPLString value;
-        for( j = 1; j < 21; j++ )
+        for( int j = 1; j < 21; j++ )
         {
+            // We want to use the Inverse_Model
+            // Quoting PleiadesUserGuideV2-1012.pdf:
+            // """When using the inverse model (ground --> image), the user
+            // supplies geographic coordinates (lon, lat) and an altitude (alt)"""
             const char* pszValue = CSLFetchNameValue(papszRawRPCList,
-                 CPLSPrintf("Inverse_Model.%s_%d", apszRPCTXT20ValItems[i], j)); // Direct_Model
+                 CPLSPrintf("Inverse_Model.%s_%d", apszRPCTXT20ValItems[i], j));
             if(NULL != pszValue)
                 value = value + " " + CPLString(pszValue);
         }
diff --git a/gcore/mdreader/reader_pleiades.h b/gcore/mdreader/reader_pleiades.h
index d9b5dcf..45b2735 100644
--- a/gcore/mdreader/reader_pleiades.h
+++ b/gcore/mdreader/reader_pleiades.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: reader_pleiades.h 29915 2015-08-29 21:29:57Z rouault $
+ * $Id: reader_pleiades.h 34367 2016-06-17 13:58:32Z rouault $
  *
  * Project:  GDAL Core
  * Purpose:  Read metadata from Pleiades imagery.
@@ -57,6 +57,7 @@ protected:
     virtual void LoadMetadata();
     char** LoadRPCXmlFile();
 protected:
+    CPLString m_osBaseFilename;
     CPLString m_osIMDSourceFilename;
     CPLString m_osRPBSourceFilename;
 };
diff --git a/man/man1/_home_rouault_dist_wrk_gdal_apps_.1 b/man/man1/_home_rouault_dist_wrk_gdal_apps_.1
deleted file mode 100644
index d0b7f83..0000000
--- a/man/man1/_home_rouault_dist_wrk_gdal_apps_.1
+++ /dev/null
@@ -1,129 +0,0 @@
-.TH "apps Directory Reference" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-apps Directory Reference \- 
-.SH SYNOPSIS
-.br
-.PP
-.SS "Files"
-
-.in +1c
-.ti -1c
-.RI "file \fBcommonutils\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBdumpoverviews\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_contour\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_grid_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_grid_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_rasterize_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_rasterize_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_translate_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdal_translate_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdaladdo\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalasyncread\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalbuildvrt_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalbuildvrt_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdaldem_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdaldem_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalenhance\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalinfo_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalinfo_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdallocationinfo\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalmanage\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalsrsinfo\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdaltorture\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdaltransform\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalwarp_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgdalwarp_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgnmanalyse\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBgnmmanage\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBmultireadtest\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBnearblack_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBnearblack_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogr2ogr_bin\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogr2ogr_lib\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogrdissolve\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogrinfo\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogrlineref\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBogrtindex\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBtest_ogrsf\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBtestepsg\&.cpp\fP"
-.br
-.ti -1c
-.RI "file \fBtestreprojmulti\&.cpp\fP"
-.br
-.in -1c
diff --git a/man/man1/gdal-config.1 b/man/man1/gdal-config.1
index e3df1f4..004c4d7 100644
--- a/man/man1/gdal-config.1
+++ b/man/man1/gdal-config.1
@@ -1,4 +1,4 @@
-.TH "gdal-config" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal-config" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal2tiles.1 b/man/man1/gdal2tiles.1
index 02b306a..378e2f6 100644
--- a/man/man1/gdal2tiles.1
+++ b/man/man1/gdal2tiles.1
@@ -1,4 +1,4 @@
-.TH "gdal2tiles" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal2tiles" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_calc.1 b/man/man1/gdal_calc.1
index 8038dc9..1ed46eb 100644
--- a/man/man1/gdal_calc.1
+++ b/man/man1/gdal_calc.1
@@ -1,4 +1,4 @@
-.TH "gdal_calc" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_calc" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_contour.1 b/man/man1/gdal_contour.1
index 3a30877..0de7a4c 100644
--- a/man/man1/gdal_contour.1
+++ b/man/man1/gdal_contour.1
@@ -1,4 +1,4 @@
-.TH "gdal_contour" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_contour" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_edit.1 b/man/man1/gdal_edit.1
index f3e6acb..c839f8f 100644
--- a/man/man1/gdal_edit.1
+++ b/man/man1/gdal_edit.1
@@ -1,4 +1,4 @@
-.TH "gdal_edit" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_edit" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_fillnodata.1 b/man/man1/gdal_fillnodata.1
index 0f637e7..de9c9f2 100644
--- a/man/man1/gdal_fillnodata.1
+++ b/man/man1/gdal_fillnodata.1
@@ -1,4 +1,4 @@
-.TH "gdal_fillnodata" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_fillnodata" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_grid.1 b/man/man1/gdal_grid.1
index 4d850cc..af7c709 100644
--- a/man/man1/gdal_grid.1
+++ b/man/man1/gdal_grid.1
@@ -1,4 +1,4 @@
-.TH "gdal_grid" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_grid" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_merge.1 b/man/man1/gdal_merge.1
index a7725eb..5f38799 100644
--- a/man/man1/gdal_merge.1
+++ b/man/man1/gdal_merge.1
@@ -1,4 +1,4 @@
-.TH "gdal_merge" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_merge" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_pansharpen.1 b/man/man1/gdal_pansharpen.1
index 652c234..6d920e8 100644
--- a/man/man1/gdal_pansharpen.1
+++ b/man/man1/gdal_pansharpen.1
@@ -1,4 +1,4 @@
-.TH "gdal_pansharpen" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_pansharpen" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_polygonize.1 b/man/man1/gdal_polygonize.1
index 4646b5d..2530f0e 100644
--- a/man/man1/gdal_polygonize.1
+++ b/man/man1/gdal_polygonize.1
@@ -1,4 +1,4 @@
-.TH "gdal_polygonize" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_polygonize" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_proximity.1 b/man/man1/gdal_proximity.1
index f368833..ee943b7 100644
--- a/man/man1/gdal_proximity.1
+++ b/man/man1/gdal_proximity.1
@@ -1,4 +1,4 @@
-.TH "gdal_proximity" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_proximity" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_rasterize.1 b/man/man1/gdal_rasterize.1
index 86a47a0..60508cc 100644
--- a/man/man1/gdal_rasterize.1
+++ b/man/man1/gdal_rasterize.1
@@ -1,4 +1,4 @@
-.TH "gdal_rasterize" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_rasterize" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_retile.1 b/man/man1/gdal_retile.1
index 3551991..ac63041 100644
--- a/man/man1/gdal_retile.1
+++ b/man/man1/gdal_retile.1
@@ -1,4 +1,4 @@
-.TH "gdal_retile" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_retile" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_sieve.1 b/man/man1/gdal_sieve.1
index ebc4b9c..0b90f40 100644
--- a/man/man1/gdal_sieve.1
+++ b/man/man1/gdal_sieve.1
@@ -1,4 +1,4 @@
-.TH "gdal_sieve" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_sieve" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_translate.1 b/man/man1/gdal_translate.1
index e89caef..b1cef92 100644
--- a/man/man1/gdal_translate.1
+++ b/man/man1/gdal_translate.1
@@ -1,4 +1,4 @@
-.TH "gdal_translate" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_translate" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdal_utilities.1 b/man/man1/gdal_utilities.1
index d7242c3..4eeeb2e 100644
--- a/man/man1/gdal_utilities.1
+++ b/man/man1/gdal_utilities.1
@@ -1,4 +1,4 @@
-.TH "gdal_utilities" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdal_utilities" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdaladdo.1 b/man/man1/gdaladdo.1
index 9f504ab..6b00bb7 100644
--- a/man/man1/gdaladdo.1
+++ b/man/man1/gdaladdo.1
@@ -1,4 +1,4 @@
-.TH "gdaladdo" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdaladdo" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalbuildvrt.1 b/man/man1/gdalbuildvrt.1
index d215644..6d5d2e5 100644
--- a/man/man1/gdalbuildvrt.1
+++ b/man/man1/gdalbuildvrt.1
@@ -1,4 +1,4 @@
-.TH "gdalbuildvrt" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalbuildvrt" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalcompare.1 b/man/man1/gdalcompare.1
index 61b5fb4..77c7dee 100644
--- a/man/man1/gdalcompare.1
+++ b/man/man1/gdalcompare.1
@@ -1,4 +1,4 @@
-.TH "gdalcompare" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalcompare" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdaldem.1 b/man/man1/gdaldem.1
index ab9c927..5d9de11 100644
--- a/man/man1/gdaldem.1
+++ b/man/man1/gdaldem.1
@@ -1,4 +1,4 @@
-.TH "gdaldem" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdaldem" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalinfo.1 b/man/man1/gdalinfo.1
index a6c0979..abbf9e7 100644
--- a/man/man1/gdalinfo.1
+++ b/man/man1/gdalinfo.1
@@ -1,4 +1,4 @@
-.TH "gdalinfo" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalinfo" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdallocationinfo.1 b/man/man1/gdallocationinfo.1
index 48a5a8c..3322888 100644
--- a/man/man1/gdallocationinfo.1
+++ b/man/man1/gdallocationinfo.1
@@ -1,4 +1,4 @@
-.TH "gdallocationinfo" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdallocationinfo" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalmanage.1 b/man/man1/gdalmanage.1
index 0d794d8..d350fe3 100644
--- a/man/man1/gdalmanage.1
+++ b/man/man1/gdalmanage.1
@@ -1,4 +1,4 @@
-.TH "gdalmanage" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalmanage" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalmove.1 b/man/man1/gdalmove.1
index a92c305..2da9066 100644
--- a/man/man1/gdalmove.1
+++ b/man/man1/gdalmove.1
@@ -1,4 +1,4 @@
-.TH "gdalmove" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalmove" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalsrsinfo.1 b/man/man1/gdalsrsinfo.1
index 6dbc36c..c6a86c8 100644
--- a/man/man1/gdalsrsinfo.1
+++ b/man/man1/gdalsrsinfo.1
@@ -1,4 +1,4 @@
-.TH "gdalsrsinfo" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalsrsinfo" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdaltindex.1 b/man/man1/gdaltindex.1
index fa1ed91..164db7c 100644
--- a/man/man1/gdaltindex.1
+++ b/man/man1/gdaltindex.1
@@ -1,4 +1,4 @@
-.TH "gdaltindex" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdaltindex" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdaltransform.1 b/man/man1/gdaltransform.1
index 0d1f207..90d465f 100644
--- a/man/man1/gdaltransform.1
+++ b/man/man1/gdaltransform.1
@@ -1,4 +1,4 @@
-.TH "gdaltransform" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdaltransform" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gdalwarp.1 b/man/man1/gdalwarp.1
index 6a3cf91..e58d70a 100644
--- a/man/man1/gdalwarp.1
+++ b/man/man1/gdalwarp.1
@@ -1,4 +1,4 @@
-.TH "gdalwarp" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gdalwarp" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gnm_utilities.1 b/man/man1/gnm_utilities.1
index e4e0dbd..f0c8f34 100644
--- a/man/man1/gnm_utilities.1
+++ b/man/man1/gnm_utilities.1
@@ -1,4 +1,4 @@
-.TH "gnm_utilities" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gnm_utilities" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gnmanalyse.1 b/man/man1/gnmanalyse.1
index 57c58ae..0ba7994 100644
--- a/man/man1/gnmanalyse.1
+++ b/man/man1/gnmanalyse.1
@@ -1,4 +1,4 @@
-.TH "gnmanalyse" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gnmanalyse" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/gnmmanage.1 b/man/man1/gnmmanage.1
index 6907dee..bd799b7 100644
--- a/man/man1/gnmmanage.1
+++ b/man/man1/gnmmanage.1
@@ -1,4 +1,4 @@
-.TH "gnmmanage" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "gnmmanage" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/nearblack.1 b/man/man1/nearblack.1
index 5f9d31a..78aedb5 100644
--- a/man/man1/nearblack.1
+++ b/man/man1/nearblack.1
@@ -1,4 +1,4 @@
-.TH "nearblack" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "nearblack" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/ogr2ogr.1 b/man/man1/ogr2ogr.1
index aa9d08f..7a2ed15 100644
--- a/man/man1/ogr2ogr.1
+++ b/man/man1/ogr2ogr.1
@@ -1,4 +1,4 @@
-.TH "ogr2ogr" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "ogr2ogr" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
@@ -40,7 +40,7 @@ Advanced options :
                [-splitlistfields] [-maxsubfields val]
                [-explodecollections] [-zfield field_name]
                [-gcp pixel line easting northing [elevation]]* [-order n | -tps]
-               [-nomd] [-mo \"META-TAG=VALUE\"]* [-noNativeData].fi
+               [-nomd] [-mo "META-TAG=VALUE"]* [-noNativeData].fi
 .PP
 .SH "DESCRIPTION"
 .PP
diff --git a/man/man1/ogr_utilities.1 b/man/man1/ogr_utilities.1
index 006b050..d7f2bb5 100644
--- a/man/man1/ogr_utilities.1
+++ b/man/man1/ogr_utilities.1
@@ -1,4 +1,4 @@
-.TH "ogr_utilities" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "ogr_utilities" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/ogrinfo.1 b/man/man1/ogrinfo.1
index 0db692d..13927b2 100644
--- a/man/man1/ogrinfo.1
+++ b/man/man1/ogrinfo.1
@@ -1,4 +1,4 @@
-.TH "ogrinfo" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "ogrinfo" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/ogrlineref.1 b/man/man1/ogrlineref.1
index 4aeefd3..7505ed7 100644
--- a/man/man1/ogrlineref.1
+++ b/man/man1/ogrlineref.1
@@ -1,4 +1,4 @@
-.TH "ogrlineref" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "ogrlineref" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/ogrtindex.1 b/man/man1/ogrtindex.1
index 67ea0e1..6ffdeea 100644
--- a/man/man1/ogrtindex.1
+++ b/man/man1/ogrtindex.1
@@ -1,4 +1,4 @@
-.TH "ogrtindex" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "ogrtindex" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/pct2rgb.1 b/man/man1/pct2rgb.1
index 07eb042..c608c78 100644
--- a/man/man1/pct2rgb.1
+++ b/man/man1/pct2rgb.1
@@ -1,4 +1,4 @@
-.TH "pct2rgb" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "pct2rgb" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/man/man1/rgb2pct.1 b/man/man1/rgb2pct.1
index ea15c35..eadeed7 100644
--- a/man/man1/rgb2pct.1
+++ b/man/man1/rgb2pct.1
@@ -1,4 +1,4 @@
-.TH "rgb2pct" 1 "Mon Apr 25 2016" "GDAL" \" -*- nroff -*-
+.TH "rgb2pct" 1 "Sun Jul 3 2016" "GDAL" \" -*- nroff -*-
 .ad l
 .nh
 .SH NAME
diff --git a/ogr/ogr_srs_esri.cpp b/ogr/ogr_srs_esri.cpp
index 189702f..f988cbc 100644
--- a/ogr/ogr_srs_esri.cpp
+++ b/ogr/ogr_srs_esri.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr_srs_esri.cpp 33534 2016-02-23 16:57:43Z goatbar $
+ * $Id: ogr_srs_esri.cpp 34495 2016-07-01 10:16:03Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  OGRSpatialReference translation to/from ESRI .prj definitions.
@@ -37,7 +37,7 @@
 
 #include "ogr_srs_esri_names.h"
 
-CPL_CVSID("$Id: ogr_srs_esri.cpp 33534 2016-02-23 16:57:43Z goatbar $");
+CPL_CVSID("$Id: ogr_srs_esri.cpp 34495 2016-07-01 10:16:03Z rouault $");
 
 void  SetNewName( OGRSpatialReference* pOgr, const char* keyName, const char* newName );
 int   RemapImgWGSProjcsName(OGRSpatialReference* pOgr, const char* pszProjCSName,
@@ -817,11 +817,11 @@ OGRErr OGRSpatialReference::importFromESRI( char **papszPrj )
 
     else if( EQUAL(osProj,"MERCATOR") )
     {
-        SetMercator( OSR_GDV( papszPrj, "PARAM_1", 0.0 ),
-                     OSR_GDV( papszPrj, "PARAM_0", 0.0 ),
+        SetMercator( OSR_GDV( papszPrj, "PARAM_2", 0.0 ),
+                     OSR_GDV( papszPrj, "PARAM_1", 0.0 ),
                      1.0,
-                     OSR_GDV( papszPrj, "PARAM_2", 0.0 ),
-                     OSR_GDV( papszPrj, "PARAM_3", 0.0 ) );
+                     OSR_GDV( papszPrj, "PARAM_3", 0.0 ),
+                     OSR_GDV( papszPrj, "PARAM_4", 0.0 ) );
     }
 
     else if( EQUAL(osProj, SRS_PT_MERCATOR_AUXILIARY_SPHERE) )
@@ -1370,7 +1370,7 @@ OGRErr OGRSpatialReference::morphToESRI()
             e2 = 2 *f - f*f;
         }
         const double dfStdP1Lat =
-            acos( sqrt( (1 - e2) / (1 / (dfK0 * dfK0)) - e2) ) / M_PI * 180.0;
+            acos( sqrt( (1 - e2) / ((1 / (dfK0 * dfK0)) - e2)) ) / M_PI * 180.0;
         if( poProjCS )
         {
             const int iScaleFactorChild =
diff --git a/ogr/ogrgeometryfactory.cpp b/ogr/ogrgeometryfactory.cpp
index caeb4b0..e6a62ed 100644
--- a/ogr/ogrgeometryfactory.cpp
+++ b/ogr/ogrgeometryfactory.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrgeometryfactory.cpp 33652 2016-03-05 23:39:47Z rouault $
+ * $Id: ogrgeometryfactory.cpp 34396 2016-06-23 17:12:10Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Factory for converting geometry to and from well known binary
@@ -41,7 +41,7 @@
 #define UNUSED_IF_NO_GEOS
 #endif
 
-CPL_CVSID("$Id: ogrgeometryfactory.cpp 33652 2016-03-05 23:39:47Z rouault $");
+CPL_CVSID("$Id: ogrgeometryfactory.cpp 34396 2016-06-23 17:12:10Z rouault $");
 
 /************************************************************************/
 /*                           createFromWkb()                            */
@@ -3243,16 +3243,23 @@ int OGRGeometryFactory::GetCurveParmeters(
     double& R, double& cx, double& cy, double& alpha0, double& alpha1, double& alpha2 )
 {
     /* Circle */
-    if( x0 == x2 && y0 == y2 && (x0 != x1 || y0 != y1) )
+    if( x0 == x2 && y0 == y2 )
     {
-        cx = (x0 + x1) / 2;
-        cy = (y0 + y1) / 2;
-        R = DISTANCE(cx,cy,x0,y0);
-        /* Arbitrarily pick counter-clock-wise order (like PostGIS does) */
-        alpha0 = atan2(y0 - cy, x0 - cx);
-        alpha1 = alpha0 + M_PI;
-        alpha2 = alpha0 + 2 * M_PI;
-        return TRUE;
+        if (x0 != x1 || y0 != y1)
+        {
+            cx = (x0 + x1) / 2;
+            cy = (y0 + y1) / 2;
+            R = DISTANCE(cx,cy,x0,y0);
+            /* Arbitrarily pick counter-clock-wise order (like PostGIS does) */
+            alpha0 = atan2(y0 - cy, x0 - cx);
+            alpha1 = alpha0 + M_PI;
+            alpha2 = alpha0 + 2 * M_PI;
+            return TRUE;
+        }
+        else
+        {
+            return FALSE;
+        }
     }
 
     double dx01 = x1 - x0;
diff --git a/ogr/ogrlinearring.cpp b/ogr/ogrlinearring.cpp
index 05ffebd..6d45078 100644
--- a/ogr/ogrlinearring.cpp
+++ b/ogr/ogrlinearring.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrlinearring.cpp 33631 2016-03-04 06:28:09Z goatbar $
+ * $Id: ogrlinearring.cpp 34469 2016-06-30 08:52:13Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  The OGRLinearRing geometry class.
@@ -31,7 +31,7 @@
 #include "ogr_geometry.h"
 #include "ogr_p.h"
 
-CPL_CVSID("$Id: ogrlinearring.cpp 33631 2016-03-04 06:28:09Z goatbar $");
+CPL_CVSID("$Id: ogrlinearring.cpp 34469 2016-06-30 08:52:13Z rouault $");
 
 /************************************************************************/
 /*                           OGRLinearRing()                            */
@@ -278,7 +278,7 @@ OGRErr OGRLinearRing::_importFromWkb( OGRwkbByteOrder eByteOrder, int _flags,
             }
             if( flags & OGR_G_MEASURED )
             {
-                CPL_SWAPDOUBLE( padfZ + i );
+                CPL_SWAPDOUBLE( padfM + i );
             }
         }
     }
diff --git a/ogr/ogrsf_frmts/cartodb/ogrcartodbtablelayer.cpp b/ogr/ogrsf_frmts/cartodb/ogrcartodbtablelayer.cpp
index ed44984..11f7e49 100644
--- a/ogr/ogrsf_frmts/cartodb/ogrcartodbtablelayer.cpp
+++ b/ogr/ogrsf_frmts/cartodb/ogrcartodbtablelayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrcartodbtablelayer.cpp 33647 2016-03-05 16:43:00Z rouault $
+ * $Id: ogrcartodbtablelayer.cpp 34476 2016-06-30 15:43:07Z rouault $
  *
  * Project:  CartoDB Translator
  * Purpose:  Implements OGRCARTODBTableLayer class.
@@ -31,7 +31,7 @@
 #include "ogr_p.h"
 #include "ogr_pgdump.h"
 
-CPL_CVSID("$Id: ogrcartodbtablelayer.cpp 33647 2016-03-05 16:43:00Z rouault $");
+CPL_CVSID("$Id: ogrcartodbtablelayer.cpp 34476 2016-06-30 15:43:07Z rouault $");
 
 /************************************************************************/
 /*                    OGRCARTODBEscapeIdentifier( )                     */
@@ -1433,14 +1433,11 @@ OGRErr OGRCARTODBTableLayer::RunDeferredCreationIfNecessary()
             (OGRCartoDBGeomFieldDefn *)poFeatureDefn->GetGeomFieldDefn(0);
         nSRID = poFieldDefn->nSRID;
 
-        osSQL += CPLSPrintf("%s GEOMETRY(%s, %d)%s, %s GEOMETRY(%s, %d),",
+        osSQL += CPLSPrintf("%s GEOMETRY(%s, %d)%s,",
                  "the_geom",
                  osGeomType.c_str(),
                  nSRID,
-                 (!poFieldDefn->IsNullable()) ? " NOT NULL" : "",
-                 "the_geom_webmercator",
-                 osGeomType.c_str(),
-                 3857);
+                 (!poFieldDefn->IsNullable()) ? " NOT NULL" : "");
     }
 
     for( int i = 0; i < poFeatureDefn->GetFieldCount(); i++ )
@@ -1472,6 +1469,9 @@ OGRErr OGRCARTODBTableLayer::RunDeferredCreationIfNecessary()
     osSQL += ";";
     osSQL += CPLSPrintf("CREATE SEQUENCE %s START 1", osSeqName.c_str());
     osSQL += ";";
+    osSQL += CPLSPrintf("ALTER SEQUENCE %s OWNED BY %s.%s", osSeqName.c_str(),
+                        OGRCARTODBEscapeIdentifier(osName).c_str(), osFIDColName.c_str());
+    osSQL += ";";
     osSQL += CPLSPrintf("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT nextval('%s')",
                         OGRCARTODBEscapeIdentifier(osName).c_str(),
                         osFIDColName.c_str(), osSeqName.c_str());
diff --git a/ogr/ogrsf_frmts/geojson/ogr_geojson.h b/ogr/ogrsf_frmts/geojson/ogr_geojson.h
index a29153a..5d5c31f 100644
--- a/ogr/ogrsf_frmts/geojson/ogr_geojson.h
+++ b/ogr/ogrsf_frmts/geojson/ogr_geojson.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr_geojson.h 33138 2016-01-24 11:18:11Z rouault $
+ * $Id: ogr_geojson.h 34331 2016-06-09 20:03:05Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Definitions of OGR OGRGeoJSON driver types.
@@ -52,7 +52,6 @@ class OGRGeoJSONLayer : public OGRMemLayer
 public:
 
     static const char* const DefaultName;
-    static const char* const DefaultFIDColumn;
     static const OGRwkbGeometryType DefaultGeometryType;
 
     OGRGeoJSONLayer( const char* pszName,
@@ -80,6 +79,7 @@ private:
     OGRGeoJSONDataSource* poDS_;
     CPLString sFIDColumn_;
     bool bUpdated_;
+    bool bOriginalIdModified_;
 };
 
 /************************************************************************/
diff --git a/ogr/ogrsf_frmts/geojson/ogresrijsonreader.cpp b/ogr/ogrsf_frmts/geojson/ogresrijsonreader.cpp
index 16207a2..4aa7ab7 100644
--- a/ogr/ogrsf_frmts/geojson/ogresrijsonreader.cpp
+++ b/ogr/ogrsf_frmts/geojson/ogresrijsonreader.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogresrijsonreader.cpp 33880 2016-04-03 17:02:41Z rouault $
+ * $Id: ogresrijsonreader.cpp 34298 2016-05-26 17:14:18Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implementation of OGRESRIJSONReader class (OGR ESRIJSON Driver)
@@ -235,7 +235,11 @@ bool OGRESRIJSONReader::GenerateFeatureDefn( json_object* poObj )
         json_object* poObjLength = OGRGeoJSONFindMemberByName( poObj, "length" );
         if (poObjLength != NULL && json_object_get_type(poObjLength) == json_type_int )
         {
-            fldDefn.SetWidth(json_object_get_int(poObjLength));
+            int nWidth = json_object_get_int(poObjLength);
+            // A dummy with of 2147483647 seems to indicate no known field with
+            // which in the OGR world is better modelled as 0 field width. (#6529)
+            if( nWidth != INT_MAX )
+                fldDefn.SetWidth(nWidth);
         }
 
         poDefn->AddFieldDefn( &fldDefn );
diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp b/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp
index b0ed7e2..9f815de 100644
--- a/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp
+++ b/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrgeojsonlayer.cpp 33714 2016-03-13 05:42:13Z goatbar $
+ * $Id: ogrgeojsonlayer.cpp 34334 2016-06-10 07:37:16Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implementation of OGRGeoJSONLayer class (OGR GeoJSON Driver).
@@ -41,7 +41,6 @@
 /************************************************************************/
 
 const char* const OGRGeoJSONLayer::DefaultName = "OGRGeoJSON";
-const char* const OGRGeoJSONLayer::DefaultFIDColumn = "id";
 const OGRwkbGeometryType OGRGeoJSONLayer::DefaultGeometryType = wkbUnknown;
 
 /************************************************************************/
@@ -52,7 +51,8 @@ OGRGeoJSONLayer::OGRGeoJSONLayer( const char* pszName,
                                   OGRSpatialReference* poSRSIn,
                                   OGRwkbGeometryType eGType,
                                   OGRGeoJSONDataSource* poDS )
-  : OGRMemLayer( pszName, poSRSIn, eGType), poDS_(poDS), bUpdated_(false)
+  : OGRMemLayer( pszName, poSRSIn, eGType), poDS_(poDS), bUpdated_(false),
+    bOriginalIdModified_(false)
 {
     SetAdvertizeUTF8(true);
     SetUpdatable( poDS->IsUpdatable() );
@@ -112,22 +112,44 @@ OGRErr OGRGeoJSONLayer::SyncToDisk()
 
 void OGRGeoJSONLayer::AddFeature( OGRFeature* poFeature )
 {
-    if( -1 == poFeature->GetFID() )
+    GIntBig nFID = poFeature->GetFID();
+    
+    // Detect potential FID duplicates and make sure they are eventually
+    // unique
+    if( -1 == nFID )
+    {
+        nFID = GetFeatureCount(FALSE);
+        OGRFeature* poTryFeature;
+        while( (poTryFeature = GetFeature(nFID) ) != NULL )
+        {
+            nFID ++;
+            delete poTryFeature;
+        }
+    }
+    else
     {
-        GIntBig nFID = GetFeatureCount(FALSE);
-        poFeature->SetFID( nFID );
-
-        // TODO - mloskot: We need to redesign creation of FID column
-        int nField = poFeature->GetFieldIndex( DefaultFIDColumn );
-        if( -1 != nField &&
-            (GetLayerDefn()->GetFieldDefn(nField)->GetType() == OFTInteger ||
-             GetLayerDefn()->GetFieldDefn(nField)->GetType() == OFTInteger64 ))
+        OGRFeature* poTryFeature;
+        if( (poTryFeature = GetFeature(nFID) ) != NULL )
         {
-            poFeature->SetField( nField, nFID );
+            if( !bOriginalIdModified_ )
+            {
+                CPLError(CE_Warning, CPLE_AppDefined,
+                         "Several features with id = " CPL_FRMT_GIB " have been found. "
+                         "Altering it to be unique. This warning will not be emitted for this layer",
+                         nFID);
+                bOriginalIdModified_ = true;
+            }
+            delete poTryFeature;
+            nFID = GetFeatureCount(FALSE);
+            while( (poTryFeature = GetFeature(nFID) ) != NULL )
+            {
+                nFID ++;
+                delete poTryFeature;
+            }
         }
     }
+    poFeature->SetFID( nFID );
 
-    GIntBig nFID = poFeature->GetFID();
     if( !CPL_INT64_FITS_ON_INT32(nFID) )
         SetMetadataItem(OLMD_FID64, "YES");
 
diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp b/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp
index d5c17be..2aa1f62 100644
--- a/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp
+++ b/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrgeojsonreader.cpp 33914 2016-04-07 19:38:01Z rouault $
+ * $Id: ogrgeojsonreader.cpp 34362 2016-06-17 11:45:09Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implementation of OGRGeoJSONReader class (OGR GeoJSON Driver).
@@ -49,7 +49,8 @@ OGRGeoJSONReader::OGRGeoJSONReader() :
     bFoundId(false),
     bFoundRev(false),
     bFoundTypeFeature(false),
-    bIsGeocouchSpatiallistFormat(false)
+    bIsGeocouchSpatiallistFormat(false),
+    bFoundFeatureId(false)
 { }
 
 /************************************************************************/
@@ -154,6 +155,8 @@ void OGRGeoJSONReader::ReadLayer( OGRGeoJSONDataSource* poDS,
         }
     }
 
+    CPLErrorReset();
+
     OGRGeoJSONLayer* poLayer = new OGRGeoJSONLayer( pszName, poSRS,
                                     OGRGeoJSONLayer::DefaultGeometryType,
                                     poDS );
@@ -213,7 +216,8 @@ void OGRGeoJSONReader::ReadLayer( OGRGeoJSONDataSource* poDS,
         ReadFeatureCollection( poLayer, poObj );
     }
 
-    CPLErrorReset();
+    if( CPLGetLastErrorType() != CE_Warning )
+        CPLErrorReset();
 
     poDS->AddLayer(poLayer);
 }
@@ -438,32 +442,19 @@ bool OGRGeoJSONReader::GenerateLayerDefn( OGRGeoJSONLayer* poLayer, json_object*
     OGRFeatureDefn* poLayerDefn = poLayer->GetLayerDefn();
     CPLAssert( NULL != poLayerDefn );
 
-    /* bool bHasFID = false; */
-
-    for( int i = 0; i < poLayerDefn->GetFieldCount(); ++i )
+    if( !bFoundFeatureId )
     {
-        OGRFieldDefn* poDefn = poLayerDefn->GetFieldDefn(i);
-        if( EQUAL( poDefn->GetNameRef(), OGRGeoJSONLayer::DefaultFIDColumn )
-            && (OFTInteger == poDefn->GetType() || OFTInteger64 == poDefn->GetType()) )
+        int idx = poLayerDefn->GetFieldIndex( "id" );
+        if( idx >= 0 )
         {
-            poLayer->SetFIDColumn( poDefn->GetNameRef() );
-            /* bHasFID = true; */
-            break;
+            OGRFieldDefn* poFDefn = poLayerDefn->GetFieldDefn(idx);
+            if( poFDefn->GetType() == OFTInteger || poFDefn->GetType() == OFTInteger64 )
+            {
+                poLayer->SetFIDColumn( poLayerDefn->GetFieldDefn(idx)->GetNameRef() );
+            }
         }
     }
 
-    // TODO - mloskot: This is wrong! We want to add only FID field if
-    // found in source layer (by default name or by FID_PROPERTY= specifier,
-    // the latter has to be implemented).
-    /*
-      if( !bHasFID )
-      {
-      OGRFieldDefn fldDefn( OGRGeoJSONLayer::DefaultFIDColumn, OFTInteger );
-      poLayerDefn->AddFieldDefn( &fldDefn );
-      poLayer_->SetFIDColumn( fldDefn.GetNameRef() );
-      }
-    */
-
     return bSuccess;
 }
 
@@ -476,7 +467,8 @@ void OGRGeoJSONReaderAddOrUpdateField(OGRFeatureDefn* poDefn,
                                       json_object* poVal,
                                       bool bFlattenNestedAttributes,
                                       char chNestedAttributeSeparator,
-                                      bool bArrayAsString)
+                                      bool bArrayAsString,
+                                      std::set<int>& aoSetUndeterminedTypeFields)
 {
     if( bFlattenNestedAttributes &&
         poVal != NULL && json_object_get_type(poVal) == json_type_object )
@@ -496,12 +488,12 @@ void OGRGeoJSONReaderAddOrUpdateField(OGRFeatureDefn* poDefn,
             {
                 OGRGeoJSONReaderAddOrUpdateField(poDefn, osAttrName, it.val,
                                                  true, chNestedAttributeSeparator,
-                                                 bArrayAsString);
+                                                 bArrayAsString, aoSetUndeterminedTypeFields);
             }
             else
             {
                 OGRGeoJSONReaderAddOrUpdateField(poDefn, osAttrName, it.val, false, 0,
-                                                 bArrayAsString);
+                                                 bArrayAsString, aoSetUndeterminedTypeFields);
             }
         }
         return;
@@ -521,12 +513,29 @@ void OGRGeoJSONReaderAddOrUpdateField(OGRFeatureDefn* poDefn,
             fldDefn.SetType(GeoJSONStringPropertyToFieldType( poVal ));
         }
         poDefn->AddFieldDefn( &fldDefn );
+        if( poVal == NULL )
+            aoSetUndeterminedTypeFields.insert( poDefn->GetFieldCount() - 1 );
     }
     else if ( poVal ) // If there is a null value: do not update field definition
     {
         OGRFieldDefn* poFDefn = poDefn->GetFieldDefn(nIndex);
         OGRFieldType eType = poFDefn->GetType();
-        if( eType == OFTInteger )
+        if( aoSetUndeterminedTypeFields.find(nIndex) != aoSetUndeterminedTypeFields.end() )
+        {
+            OGRFieldSubType eSubType;
+            OGRFieldType eNewType = GeoJSONPropertyToFieldType( poVal, eSubType, bArrayAsString );
+            poFDefn->SetSubType(OFSTNone);
+            poFDefn->SetType(eNewType);
+            if( eSubType == OFSTBoolean )
+                poFDefn->SetWidth(1);
+            if( poFDefn->GetType() == OFTString )
+            {
+                poFDefn->SetType(GeoJSONStringPropertyToFieldType( poVal ));
+            }
+            poFDefn->SetSubType(eSubType);
+            aoSetUndeterminedTypeFields.erase(nIndex);
+        }
+        else if( eType == OFTInteger )
         {
             OGRFieldSubType eSubType;
             OGRFieldType eNewType = GeoJSONPropertyToFieldType( poVal, eSubType, bArrayAsString );
@@ -599,25 +608,65 @@ bool OGRGeoJSONReader::GenerateFeatureDefn( OGRGeoJSONLayer* poLayer, json_objec
 /* -------------------------------------------------------------------- */
     json_object* poObjProps = OGRGeoJSONFindMemberByName( poObj, "properties" );
 
-    // If there's a top-level id of type string, and no properties.id, then
-    // declare a id field
-    if( poDefn->GetFieldIndex( "id" ) < 0 )
+    json_object* poObjId = OGRGeoJSONFindMemberByName( poObj, "id" );
+    if( poObjId )
     {
-        json_object* poObjId = OGRGeoJSONFindMemberByName( poObj, "id" );
-        if( poObjId && json_object_get_type(poObjId) == json_type_string )
+        int nIdx = poDefn->GetFieldIndex( "id" );
+        if( nIdx < 0 )
         {
-            bool bHasRegularIdProp = false;
-            if( NULL != poObjProps &&
-                json_object_get_type(poObjProps) == json_type_object )
+            if( json_object_get_type(poObjId) == json_type_int )
             {
-                bHasRegularIdProp = (json_object_object_get(poObjProps, "id") != NULL);
+                // If the value is negative, we cannot use it as the FID
+                // as OGRMemLayer doesn't support negative FID. And we would
+                // have an ambiguity with -1 that can mean OGRNullFID
+                // so in that case create a regular attribute and let OGR
+                // attribute sequential OGR FIDs
+                if( json_object_get_int64(poObjId) < 0 )
+                {
+                    bFoundFeatureId = false;
+                }
+                else
+                {
+                    bFoundFeatureId = true;
+                }
             }
-            if( !bHasRegularIdProp )
+            if( !bFoundFeatureId )
             {
-                OGRFieldDefn fldDefn( "id", OFTString );
-                poDefn->AddFieldDefn(&fldDefn);
+                // If there's a top-level id of type string or negative int,
+                // and no properties.id, then declare a id field
+                bool bHasRegularIdProp = false;
+                if( NULL != poObjProps &&
+                    json_object_get_type(poObjProps) == json_type_object )
+                {
+                    bHasRegularIdProp = (json_object_object_get(poObjProps, "id") != NULL);
+                }
+                if( !bHasRegularIdProp )
+                {
+                    OGRFieldType eType = OFTString;
+                    if( json_object_get_type(poObjId) == json_type_int )
+                    {
+                        if( CPL_INT64_FITS_ON_INT32( json_object_get_int64(poObjId) ) )
+                            eType = OFTInteger;
+                        else
+                            eType = OFTInteger64;
+                    }
+                    OGRFieldDefn fldDefn( "id", eType );
+                    poDefn->AddFieldDefn(&fldDefn);
+                }
             }
         }
+        else if( json_object_get_type(poObjId) == json_type_int )
+        {
+            if( poDefn->GetFieldDefn(nIdx)->GetType() == OFTInteger )
+            {
+                if( !CPL_INT64_FITS_ON_INT32( json_object_get_int64(poObjId) ) )
+                    poDefn->GetFieldDefn(nIdx)->SetType(OFTInteger64);
+            }
+        }
+        else
+        {
+            poDefn->GetFieldDefn(nIdx)->SetType(OFTString);
+        }
     }
 
     bool bSuccess = false;
@@ -673,7 +722,8 @@ bool OGRGeoJSONReader::GenerateFeatureDefn( OGRGeoJSONLayer* poLayer, json_objec
             OGRGeoJSONReaderAddOrUpdateField(poDefn, it.key, it.val,
                                              bFlattenNestedAttributes_,
                                              chNestedAttributeSeparator_,
-                                             bArrayAsString_);
+                                             bArrayAsString_,
+                                             aoSetUndeterminedTypeFields_);
         }
 
         bSuccess = true; // SUCCESS
@@ -1013,35 +1063,26 @@ OGRFeature* OGRGeoJSONReader::ReadFeature( OGRGeoJSONLayer* poLayer, json_object
     }
 
 /* -------------------------------------------------------------------- */
-/*      If FID not set, try to use feature-level ID if available        */
+/*      Try to use feature-level ID if available                        */
 /*      and of integral type. Otherwise, leave unset (-1) then index    */
 /*      in features sequence will be used as FID.                       */
 /* -------------------------------------------------------------------- */
-    if( -1 == poFeature->GetFID() )
+    json_object* poObjId = OGRGeoJSONFindMemberByName( poObj, "id" );
+    if( NULL != poObjId && bFoundFeatureId )
     {
-        json_object* poObjId = NULL;
-        OGRFieldSubType eSubType;
-        poObjId = OGRGeoJSONFindMemberByName( poObj, OGRGeoJSONLayer::DefaultFIDColumn );
-        if( NULL != poObjId
-            && EQUAL( OGRGeoJSONLayer::DefaultFIDColumn, poLayer->GetFIDColumn() )
-            && (OFTInteger == GeoJSONPropertyToFieldType( poObjId, eSubType ) ||
-                OFTInteger64 == GeoJSONPropertyToFieldType( poObjId, eSubType )) )
-        {
-            poFeature->SetFID( (GIntBig)json_object_get_int64( poObjId ) );
-            int nField = poFeature->GetFieldIndex( poLayer->GetFIDColumn() );
-            if( -1 != nField )
-                poFeature->SetField( nField, poFeature->GetFID() );
-        }
+        poFeature->SetFID( (GIntBig)json_object_get_int64( poObjId ) );
     }
 
-    if( -1 == poFeature->GetFID() )
+/* -------------------------------------------------------------------- */
+/*      Handle the case where the special id is in a regular field.     */
+/* -------------------------------------------------------------------- */
+    else if( NULL != poObjId )
     {
-        json_object* poObjId = OGRGeoJSONFindMemberByName( poObj, "id" );
-        if (poObjId != NULL && json_object_get_type(poObjId) == json_type_int)
-            poFeature->SetFID( (GIntBig)json_object_get_int64( poObjId ) );
-        else if (poObjId != NULL && json_object_get_type(poObjId) == json_type_string &&
-                 !poFeature->IsFieldSet(poFeature->GetFieldIndex("id")))
-            poFeature->SetField( "id", json_object_get_string(poObjId) );
+        int nIdx = poLayer->GetLayerDefn()->GetFieldIndex( "id" );
+        if( nIdx >= 0 && !poFeature->IsFieldSet(nIdx) )
+        {
+            poFeature->SetField(nIdx, json_object_get_string(poObjId));
+        }
     }
 
 /* -------------------------------------------------------------------- */
diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h b/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h
index 2779a3e..e464afa 100644
--- a/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h
+++ b/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrgeojsonreader.h 32461 2015-12-26 03:46:04Z goatbar $
+ * $Id: ogrgeojsonreader.h 34331 2016-06-09 20:03:05Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Defines GeoJSON reader within OGR OGRGeoJSON Driver.
@@ -34,6 +34,7 @@
 #include "cpl_string.h"
 #include "ogrsf_frmts.h"
 #include <json.h> // JSON-C
+#include <set>
 
 /************************************************************************/
 /*                         FORWARD DECLARATIONS                         */
@@ -117,6 +118,7 @@ private:
     char chNestedAttributeSeparator_;
     bool bStoreNativeData_;
     bool bArrayAsString_;
+    std::set<int> aoSetUndeterminedTypeFields_;
 
     // bFlatten... is a tri-state boolean with -1 being unset.
     int bFlattenGeocouchSpatiallistFormat;
@@ -125,6 +127,7 @@ private:
     bool bFoundRev;
     bool bFoundTypeFeature;
     bool bIsGeocouchSpatiallistFormat;
+    bool bFoundFeatureId;
 
     //
     // Copy operations not supported.
@@ -157,7 +160,8 @@ void OGRGeoJSONReaderAddOrUpdateField(OGRFeatureDefn* poDefn,
                                       json_object* poVal,
                                       bool bFlattenNestedAttributes,
                                       char chNestedAttributeSeparator,
-                                      bool bArrayAsString = false);
+                                      bool bArrayAsString,
+                                      std::set<int>& aoSetUndeterminedTypeFields);
 
 /************************************************************************/
 /*                 GeoJSON Parsing Utilities                            */
diff --git a/ogr/ogrsf_frmts/geojson/ogrtopojsonreader.cpp b/ogr/ogrsf_frmts/geojson/ogrtopojsonreader.cpp
index 26e20ad..47494a6 100644
--- a/ogr/ogrsf_frmts/geojson/ogrtopojsonreader.cpp
+++ b/ogr/ogrsf_frmts/geojson/ogrtopojsonreader.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrtopojsonreader.cpp 33880 2016-04-03 17:02:41Z rouault $
+ * $Id: ogrtopojsonreader.cpp 34246 2016-05-18 13:25:44Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implementation of OGRTopoJSONReader class
@@ -385,7 +385,8 @@ static void ParseObject(const char* pszId,
 /************************************************************************/
 
 static void EstablishLayerDefn(OGRFeatureDefn* poDefn,
-                               json_object* poObj)
+                               json_object* poObj,
+                               std::set<int>& aoSetUndeterminedTypeFields)
 {
     json_object* poObjProps = OGRGeoJSONFindMemberByName( poObj, "properties" );
     if( NULL != poObjProps &&
@@ -395,9 +396,11 @@ static void EstablishLayerDefn(OGRFeatureDefn* poDefn,
         it.key = NULL;
         it.val = NULL;
         it.entry = NULL;
+        
         json_object_object_foreachC( poObjProps, it )
         {
-            OGRGeoJSONReaderAddOrUpdateField(poDefn, it.key, it.val, false, 0);
+            OGRGeoJSONReaderAddOrUpdateField(poDefn, it.key, it.val,
+                                             false, 0, false, aoSetUndeterminedTypeFields);
         }
     }
 }
@@ -411,7 +414,8 @@ static bool ParseObjectMain( const char* pszId, json_object* poObj,
                              OGRGeoJSONLayer **ppoMainLayer,
                              json_object* poArcs,
                              ScalingParams* psParams,
-                             int nPassNumber )
+                             int nPassNumber,
+                             std::set<int>& aoSetUndeterminedTypeFields)
 {
     bool bNeedSecondPass = false;
 
@@ -456,7 +460,7 @@ static bool ParseObjectMain( const char* pszId, json_object* poObj,
                         if( poGeom != NULL &&
                             json_type_object == json_object_get_type( poGeom ) )
                         {
-                            EstablishLayerDefn(poDefn, poGeom);
+                            EstablishLayerDefn(poDefn, poGeom, aoSetUndeterminedTypeFields);
                         }
                     }
 
@@ -494,7 +498,7 @@ static bool ParseObjectMain( const char* pszId, json_object* poObj,
                         }
                     }
                     OGRFeatureDefn* poDefn = (*ppoMainLayer)->GetLayerDefn();
-                    EstablishLayerDefn(poDefn, poObj);
+                    EstablishLayerDefn(poDefn, poObj, aoSetUndeterminedTypeFields);
                     bNeedSecondPass = true;
                 }
                 else
@@ -573,6 +577,7 @@ void OGRTopoJSONReader::ReadLayers( OGRGeoJSONDataSource* poDS )
     if( poObjects == NULL )
         return;
 
+    std::set<int> aoSetUndeterminedTypeFields;
     if( json_type_object == json_object_get_type( poObjects ) )
     {
         json_object_iter it;
@@ -585,7 +590,7 @@ void OGRTopoJSONReader::ReadLayers( OGRGeoJSONDataSource* poDS )
             json_object* poObj = it.val;
             bNeedSecondPass |= ParseObjectMain( it.key, poObj, poDS,
                                                 &poMainLayer, poArcs, &sParams,
-                                                1);
+                                                1, aoSetUndeterminedTypeFields);
         }
         if( bNeedSecondPass )
         {
@@ -595,7 +600,8 @@ void OGRTopoJSONReader::ReadLayers( OGRGeoJSONDataSource* poDS )
             json_object_object_foreachC( poObjects, it )
             {
                 json_object* poObj = it.val;
-                ParseObjectMain(it.key, poObj, poDS, &poMainLayer, poArcs, &sParams, 2);
+                ParseObjectMain(it.key, poObj, poDS, &poMainLayer, poArcs,
+                                &sParams, 2, aoSetUndeterminedTypeFields);
             }
         }
     }
@@ -606,14 +612,16 @@ void OGRTopoJSONReader::ReadLayers( OGRGeoJSONDataSource* poDS )
         for(int i=0; i<nObjects; i++)
         {
             json_object* poObj = json_object_array_get_idx(poObjects, i);
-            bNeedSecondPass |= ParseObjectMain(NULL, poObj, poDS, &poMainLayer, poArcs, &sParams, 1);
+            bNeedSecondPass |= ParseObjectMain(NULL, poObj, poDS, &poMainLayer,
+                                               poArcs, &sParams, 1, aoSetUndeterminedTypeFields);
         }
         if( bNeedSecondPass )
         {
             for(int i=0; i<nObjects; i++)
             {
                 json_object* poObj = json_object_array_get_idx(poObjects, i);
-                ParseObjectMain(NULL, poObj, poDS, &poMainLayer, poArcs, &sParams, 2);
+                ParseObjectMain(NULL, poObj, poDS, &poMainLayer, poArcs,
+                                &sParams, 2, aoSetUndeterminedTypeFields);
             }
         }
     }
diff --git a/ogr/ogrsf_frmts/libkml/ogrlibkmlfield.cpp b/ogr/ogrsf_frmts/libkml/ogrlibkmlfield.cpp
index 7d31fd2..f65757c 100644
--- a/ogr/ogrsf_frmts/libkml/ogrlibkmlfield.cpp
+++ b/ogr/ogrsf_frmts/libkml/ogrlibkmlfield.cpp
@@ -1204,9 +1204,12 @@ void kml2field (
         /***** timestamp *****/
 
         if ( poKmlTimePrimitive->IsA ( kmldom::Type_TimeStamp ) ) {
+            // probably a libkml bug: AsTimeStamp should really return not NULL on a gx:TimeStamp
             TimeStampPtr poKmlTimeStamp = AsTimeStamp ( poKmlTimePrimitive );
+            if( poKmlTimeStamp == NULL )
+                poKmlTimeStamp = AsGxTimeStamp ( poKmlTimePrimitive );
 
-            if ( poKmlTimeStamp->has_when (  ) ) {
+            if ( poKmlTimeStamp && poKmlTimeStamp->has_when (  ) ) {
                 const std::string oKmlWhen = poKmlTimeStamp->get_when (  );
                 kmldatetime2ogr(poOgrFeat, oFC.tsfield, oKmlWhen );
             }
@@ -1215,18 +1218,21 @@ void kml2field (
         /***** timespan *****/
 
         if ( poKmlTimePrimitive->IsA ( kmldom::Type_TimeSpan ) ) {
+            // probably a libkml bug: AsTimeSpan should really return not NULL on a gx:TimeSpan
             TimeSpanPtr poKmlTimeSpan = AsTimeSpan ( poKmlTimePrimitive );
+            if( poKmlTimeSpan == NULL )
+                poKmlTimeSpan = AsGxTimeSpan ( poKmlTimePrimitive );
 
             /***** begin *****/
 
-            if ( poKmlTimeSpan->has_begin (  ) ) {
+            if ( poKmlTimeSpan && poKmlTimeSpan->has_begin (  ) ) {
                 const std::string oKmlWhen = poKmlTimeSpan->get_begin (  );
                 kmldatetime2ogr(poOgrFeat, oFC.beginfield, oKmlWhen );
             }
 
             /***** end *****/
 
-            if ( poKmlTimeSpan->has_end (  ) ) {
+            if ( poKmlTimeSpan && poKmlTimeSpan->has_end (  ) ) {
                 const std::string oKmlWhen = poKmlTimeSpan->get_end (  );
                 kmldatetime2ogr(poOgrFeat, oFC.endfield, oKmlWhen );
             }
diff --git a/ogr/ogrsf_frmts/mitab/mitab.h b/ogr/ogrsf_frmts/mitab/mitab.h
index e071c4d..6b5dbfd 100644
--- a/ogr/ogrsf_frmts/mitab/mitab.h
+++ b/ogr/ogrsf_frmts/mitab/mitab.h
@@ -258,7 +258,7 @@ class IMapInfoFile : public OGRLayer
     virtual int  SetMIFCoordSys(const char *pszMIFCoordSys) = 0;
 
     static int GetTABType( OGRFieldDefn *poField, TABFieldType* peTABType,
-                           int *pnWidth);
+                           int *pnWidth, int *pnPrecision);
 
 #ifdef DEBUG
     virtual void Dump(FILE *fpOut = NULL) = 0;
diff --git a/ogr/ogrsf_frmts/mitab/mitab_datfile.cpp b/ogr/ogrsf_frmts/mitab/mitab_datfile.cpp
index f5be77f..4e1cf04 100644
--- a/ogr/ogrsf_frmts/mitab/mitab_datfile.cpp
+++ b/ogr/ogrsf_frmts/mitab/mitab_datfile.cpp
@@ -1309,16 +1309,18 @@ int TABDATFile::AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nF
 
     TABFieldType        eTABType = m_pasFieldDef[iField].eTABType;
     int                 nWidth = m_pasFieldDef[iField].byLength ;
+    int                 nPrecision = m_pasFieldDef[iField].byDecimals ;
     int                 nWidthDummy;
+    int                 nPrecisionDummy;
     if( (nFlags & ALTER_TYPE_FLAG) )
     {
-        if( IMapInfoFile::GetTABType( poNewFieldDefn, &eTABType, &nWidthDummy ) < 0 )
+        if( IMapInfoFile::GetTABType( poNewFieldDefn, &eTABType, &nWidthDummy, &nPrecisionDummy ) < 0 )
             return -1;
     }
     if( (nFlags & ALTER_WIDTH_PRECISION_FLAG) )
     {
         TABFieldType eTABTypeDummy;
-        if( IMapInfoFile::GetTABType( poNewFieldDefn, &eTABTypeDummy, &nWidth ) < 0 )
+        if( IMapInfoFile::GetTABType( poNewFieldDefn, &eTABTypeDummy, &nWidth, &nPrecision ) < 0 )
             return -1;
     }
 
@@ -1372,6 +1374,7 @@ int TABDATFile::AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nF
         if (nFlags & ALTER_WIDTH_PRECISION_FLAG)
         {
             m_pasFieldDef[iField].byLength = (GByte)nWidth;
+            m_pasFieldDef[iField].byDecimals = (GByte)nPrecision;
         }
         return 0;
     }
@@ -1393,7 +1396,7 @@ int TABDATFile::AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nF
                                  m_pasFieldDef[iField].szName,
                                  eTABType,
                                  nWidth,
-                                 m_pasFieldDef[iField].byDecimals);
+                                 nPrecision);
 
     for(i = 0; i < m_numFields; i++)
     {
diff --git a/ogr/ogrsf_frmts/mitab/mitab_imapinfofile.cpp b/ogr/ogrsf_frmts/mitab/mitab_imapinfofile.cpp
index 01ba4d3..b2ed38d 100644
--- a/ogr/ogrsf_frmts/mitab/mitab_imapinfofile.cpp
+++ b/ogr/ogrsf_frmts/mitab/mitab_imapinfofile.cpp
@@ -486,10 +486,12 @@ OGRFeature *IMapInfoFile::GetFeature(GIntBig nFeatureId)
 
 int IMapInfoFile::GetTABType( OGRFieldDefn *poField,
                               TABFieldType* peTABType,
-                              int *pnWidth)
+                              int *pnWidth,
+                              int *pnPrecision)
 {
     TABFieldType        eTABType;
     int                 nWidth = poField->GetWidth();
+    int                 nPrecision = poField->GetPrecision();
 
     if( poField->GetType() == OFTInteger )
     {
@@ -507,6 +509,21 @@ int IMapInfoFile::GetTABType( OGRFieldDefn *poField,
         else
         {
             eTABType = TABFDecimal;
+            // Enforce Mapinfo limits, otherwise MapInfo will crash (#6392)
+            if( nWidth > 20 || nWidth - nPrecision < 2 || nPrecision > 16 )
+            {
+                if( nWidth > 20 )
+                    nWidth = 20;
+                if( nWidth - nPrecision < 2 )
+                    nPrecision = nWidth - 2;
+                if( nPrecision > 16 )
+                    nPrecision = 16;
+                CPLDebug( "MITAB",
+                          "Adjusting initial width,precision of %s from %d,%d to %d,%d",
+                          poField->GetNameRef(),
+                          poField->GetWidth(), poField->GetPrecision(),
+                          nWidth, nPrecision );
+            }
         }
     }
     else if( poField->GetType() == OFTDate )
@@ -548,6 +565,7 @@ int IMapInfoFile::GetTABType( OGRFieldDefn *poField,
 
     *peTABType = eTABType;
     *pnWidth = nWidth;
+    *pnPrecision = nPrecision;
 
     return 0;
 }
@@ -563,12 +581,13 @@ OGRErr IMapInfoFile::CreateField( OGRFieldDefn *poField, int bApproxOK )
 {
     TABFieldType        eTABType;
     int                 nWidth;
+    int                 nPrecision;
 
-    if( GetTABType( poField, &eTABType, &nWidth ) < 0 )
+    if( GetTABType( poField, &eTABType, &nWidth, &nPrecision ) < 0 )
         return OGRERR_FAILURE;
 
     if( AddFieldNative( poField->GetNameRef(), eTABType,
-                        nWidth, poField->GetPrecision(), FALSE, FALSE, bApproxOK ) > -1 )
+                        nWidth, nPrecision, FALSE, FALSE, bApproxOK ) > -1 )
         return OGRERR_NONE;
     else
         return OGRERR_FAILURE;
diff --git a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp
index bfef681..3d72fcf 100644
--- a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp
+++ b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrmssqlspatialtablelayer.cpp 33891 2016-04-04 11:27:35Z tamas $
+ * $Id: ogrmssqlspatialtablelayer.cpp 34289 2016-05-24 19:43:40Z tamas $
  *
  * Project:  MSSQL Spatial driver
  * Purpose:  Implements OGRMSSQLSpatialTableLayer class, access to an existing table.
@@ -34,7 +34,7 @@
 #include <sqlncli.h>
 #endif
 
-CPL_CVSID("$Id: ogrmssqlspatialtablelayer.cpp 33891 2016-04-04 11:27:35Z tamas $");
+CPL_CVSID("$Id: ogrmssqlspatialtablelayer.cpp 34289 2016-05-24 19:43:40Z tamas $");
 
 /************************************************************************/
 /*                         OGRMSSQLAppendEscaped( )                     */
@@ -1385,7 +1385,7 @@ OGRErr OGRMSSQLSpatialTableLayer::CreateFeatureBCP( OGRFeature *poFeature )
             return OGRERR_FAILURE;
 
         /* Initialize the bulk copy */
-        if (Failed2( bcp_init(hDBCBCP, pszTableName, NULL, NULL, DB_IN) ))
+        if (Failed2( bcp_init(hDBCBCP, CPLSPrintf("[%s].[%s]", pszSchemaName, pszTableName), NULL, NULL, DB_IN) ))
         {
             CloseBCP();
             return OGRERR_FAILURE;
diff --git a/ogr/ogrsf_frmts/nas/nashandler.cpp b/ogr/ogrsf_frmts/nas/nashandler.cpp
index 8389984..142e29e 100644
--- a/ogr/ogrsf_frmts/nas/nashandler.cpp
+++ b/ogr/ogrsf_frmts/nas/nashandler.cpp
@@ -1,5 +1,5 @@
 /**********************************************************************
- * $Id: nashandler.cpp 32898 2016-01-10 14:44:10Z goatbar $
+ * $Id: nashandler.cpp 34462 2016-06-28 18:51:52Z jef $
  *
  * Project:  NAS Reader
  * Purpose:  Implementation of NASHandler class.
@@ -62,6 +62,10 @@ static const int MAX_TOKEN_SIZE = 1000;
                                         <wfs:Name>adv:anlass</wfs:Name>
                                         <wfs:Value>000000</wfs:Value>
                                 </wfs:Property>
+                                <wfs:Property>
+                                        <wfs:Name>adv:anlass</wfs:Name>
+                                        <wfs:Value>010102</wfs:Value>
+                                </wfs:Property>
                                 <ogc:Filter>
                                         <ogc:FeatureId fid="DENW11AL000062WD20111016T122010Z" />
                                 </ogc:Filter>
@@ -266,10 +270,10 @@ void NASHandler::startElement( const XMLCh* const /* uri */,
         }
 
         if( EQUAL( pszLast, "Update" )  &&
-            ( m_osLastEnded == "" || m_osLastOccasion == "" ) )
+            ( m_osLastEnded == "" || m_LastOccasions.empty() ) )
         {
             CPLError( CE_Failure, CPLE_AssertionFailed,
-                      "m_osLastEnded == \"\" || m_osLastOccasion == \"\"" );
+                      "m_osLastEnded == \"\" || m_LastOccasions.empty()" );
 
             m_bIgnoreFeature = true;
             m_nDepthFeature = m_nDepth;
@@ -300,13 +304,19 @@ void NASHandler::startElement( const XMLCh* const /* uri */,
         else if( EQUAL( pszLast, "Update" ) )
         {
             //CPLAssert( m_osLastEnded != "" );
-            //CPLAssert( m_osLastOccasion != "" );
+            //CPLAssert( m_LastOccasions.empty() );
             m_poReader->SetFeaturePropertyDirectly(
                 "endet", CPLStrdup(m_osLastEnded) );
-            m_poReader->SetFeaturePropertyDirectly(
-                "anlass", CPLStrdup(m_osLastOccasion) );
+
+            for( std::list<CPLString>::iterator it = m_LastOccasions.begin();
+                 it != m_LastOccasions.end();
+                 ++it )
+            {
+              m_poReader->SetFeaturePropertyDirectly(
+                  "anlass", CPLStrdup(*it) );
+            }
             m_osLastEnded = "";
-            m_osLastOccasion = "";
+            m_LastOccasions.clear();
         }
 
         return;
@@ -537,7 +547,7 @@ void NASHandler::endElement( const XMLCh* const /* uri */ ,
            else if( EQUAL( m_osLastPropertyName, "adv:anlass" ) )
            {
                CPLAssert( m_osLastPropertyValue != "" );
-               m_osLastOccasion = m_osLastPropertyValue;
+               m_LastOccasions.push_back( m_osLastPropertyValue );
            }
            else
            {
diff --git a/ogr/ogrsf_frmts/nas/nasreaderp.h b/ogr/ogrsf_frmts/nas/nasreaderp.h
index ee00eba..7c02f87 100644
--- a/ogr/ogrsf_frmts/nas/nasreaderp.h
+++ b/ogr/ogrsf_frmts/nas/nasreaderp.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: nasreaderp.h 32898 2016-01-10 14:44:10Z goatbar $
+ * $Id: nasreaderp.h 34462 2016-06-28 18:51:52Z jef $
  *
  * Project:  NAS Reader
  * Purpose:  Private Declarations for OGR NAS Reader code.
@@ -36,6 +36,7 @@
 #include "ogr_api.h"
 #include "ogr_geometry.h"
 #include "cpl_string.h"
+#include <list>
 
 IGMLReader *CreateNASReader();
 
@@ -76,7 +77,8 @@ class NASHandler : public DefaultHandler
     CPLString  m_osLastPropertyName;
     CPLString  m_osLastPropertyValue;
     CPLString  m_osLastEnded;
-    CPLString  m_osLastOccasion;
+
+    std::list<CPLString> m_LastOccasions;
 
 public:
     NASHandler( NASReader *poReader );
diff --git a/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp b/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp
index f306e44..c755488 100644
--- a/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp
+++ b/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: filegdbtable.cpp 34072 2016-04-24 13:09:01Z rouault $
+ * $Id: filegdbtable.cpp 34423 2016-06-25 10:03:48Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implements reading of FileGDB tables
@@ -603,6 +603,21 @@ int FileGDBTable::ReadTableXHeader()
 }
 
 /************************************************************************/
+/*                            ReadUTF16String()                         */
+/************************************************************************/
+
+static std::string ReadUTF16String(const GByte* pabyIter, int nCarCount)
+{
+    std::wstring osWideStr;
+    for(int j=0;j<nCarCount;j++)
+        osWideStr += pabyIter[2 * j] | (pabyIter[2 * j + 1] << 8);
+    char* pszStr = CPLRecodeFromWChar(osWideStr.c_str(), CPL_ENC_UCS2, CPL_ENC_UTF8);
+    std::string osRet(pszStr);
+    CPLFree(pszStr);
+    return osRet;
+}
+
+/************************************************************************/
 /*                                 Open()                               */
 /************************************************************************/
 
@@ -741,9 +756,7 @@ int FileGDBTable::Open(const char* pszFilename,
         pabyIter ++;
         nRemaining --;
         returnErrorIf(nRemaining < (GUInt32)(2 * nCarCount + 1) );
-        std::string osName;
-        for(int j=0;j<nCarCount;j++) //FIXME? UTF16
-            osName += pabyIter[2 * j];
+        std::string osName(ReadUTF16String(pabyIter, nCarCount));
         pabyIter += 2 * nCarCount;
         nRemaining -= 2 * nCarCount;
 
@@ -752,9 +765,7 @@ int FileGDBTable::Open(const char* pszFilename,
         pabyIter ++;
         nRemaining --;
         returnErrorIf(nRemaining < (GUInt32)(2 * nCarCount + 1) );
-        std::string osAlias;
-        for(int j=0;j<nCarCount;j++) //FIXME? UTF16
-            osAlias += pabyIter[2 * j];
+        std::string osAlias(ReadUTF16String(pabyIter, nCarCount));
         pabyIter += 2 * nCarCount;
         nRemaining -= 2 * nCarCount;
 
@@ -909,9 +920,7 @@ int FileGDBTable::Open(const char* pszFilename,
                 pabyIter ++;
                 nRemaining --;
                 returnErrorIf(nRemaining < (GUInt32)(2 * nCarCount + 1) );
-                std::string osRasterColumn;
-                for(int j=0;j<nCarCount;j++) //FIXME? UTF16
-                    osRasterColumn += pabyIter[2 * j];
+                std::string osRasterColumn(ReadUTF16String(pabyIter, nCarCount));
                 pabyIter += 2 * nCarCount;
                 nRemaining -= 2 * nCarCount;
                 poRasterField->osRasterColumnName = osRasterColumn;
@@ -923,8 +932,7 @@ int FileGDBTable::Open(const char* pszFilename,
             nRemaining -= sizeof(nLengthWKT);
 
             returnErrorIf(nRemaining < (GUInt32)(1 + nLengthWKT) );
-            for(int j=0;j<nLengthWKT/2;j++) //FIXME? UTF16
-                poField->osWKT += pabyIter[2 * j];
+            poField->osWKT = ReadUTF16String(pabyIter, nLengthWKT/2);
             pabyIter += nLengthWKT;
             nRemaining -= nLengthWKT;
 
@@ -1676,10 +1684,7 @@ int FileGDBTable::GetIndexCount()
         pabyCur += sizeof(GUInt32);
         returnErrorAndCleanupIf(nIdxNameCarCount > 1024, VSIFree(pabyIdx) );
         returnErrorAndCleanupIf((GUInt32)(pabyEnd - pabyCur) < 2 * nIdxNameCarCount, VSIFree(pabyIdx) );
-        std::string osIndexName;
-        GUInt32 j;
-        for(j=0;j<nIdxNameCarCount;j++) //FIXME? UTF16
-            osIndexName += pabyCur[2 * j];
+        std::string osIndexName(ReadUTF16String(pabyCur, nIdxNameCarCount));
         pabyCur += 2 * nIdxNameCarCount;
 
         // Skip magic fields
@@ -1690,9 +1695,7 @@ int FileGDBTable::GetIndexCount()
         pabyCur += sizeof(GUInt32);
         returnErrorAndCleanupIf(nColNameCarCount > 1024, VSIFree(pabyIdx) );
         returnErrorAndCleanupIf((GUInt32)(pabyEnd - pabyCur) < 2 * nColNameCarCount, VSIFree(pabyIdx) );
-        std::string osFieldName;
-        for(j=0;j<nColNameCarCount;j++) //FIXME? UTF16
-            osFieldName += pabyCur[2 * j];
+        std::string osFieldName(ReadUTF16String(pabyCur, nColNameCarCount));
         pabyCur += 2 * nColNameCarCount;
 
         // Skip magic field
@@ -2495,7 +2498,11 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                 }
             }
 
-            if( bHasM )
+            // It seems that absence of M is marked with a single byte
+            // with value 66. Be more tolerant and only try to parse the M
+            // array is there are at least as many remaining bytes as
+            // expected points
+            if( bHasM && pabyCur + nPoints <= pabyEnd )
             {
                 poMP->setMeasured(TRUE);
                 GIntBig dm = 0;
@@ -2597,6 +2604,17 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                     if( nParts > 1 )
                         poLS = (FileGDBOGRLineString*) poMLS->getGeometryRef(i);
 
+                    // It seems that absence of M is marked with a single byte
+                    // with value 66. Be more tolerant and only try to parse the M
+                    // array is there are at least as many remaining bytes as
+                    // expected points
+                    if( pabyCur + panPointCount[i] > pabyEnd )
+                    {
+                        if( nParts > 1 )
+                            poMLS->setMeasured(FALSE);
+                        break;
+                    }
+                    
                     MLineStringSetter lsmSetter(poLS);
                     if( !ReadMArray<MLineStringSetter>(lsmSetter,
                                     pabyCur, pabyEnd,
@@ -2659,8 +2677,13 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                                  panPointCount[i],
                                  dx, dy) )
                 {
-                    while( (int)i >= 0 )
-                        delete papoRings[i--];
+                    while( true )
+                    {
+                        delete papoRings[i];
+                        if( i == 0 )
+                            break;
+                        i--;
+                    }
                     delete[] papoRings;
                     returnError();
                 }
@@ -2677,8 +2700,8 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                                     pabyCur, pabyEnd,
                                     panPointCount[i], dz) )
                     {
-                        while( (int)i >= 0 )
-                            delete papoRings[i--];
+                        for(i=0;i<nParts;i++)
+                            delete papoRings[i];
                         delete[] papoRings;
                         returnError();
                     }
@@ -2690,6 +2713,20 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                 GIntBig dm = 0;
                 for(i=0;i<nParts;i++)
                 {
+                    // It seems that absence of M is marked with a single byte
+                    // with value 66. Be more tolerant and only try to parse the M
+                    // array is there are at least as many remaining bytes as
+                    // expected points
+                    if( pabyCur + panPointCount[i] > pabyEnd )
+                    {
+                        while( i != 0 )
+                        {
+                            --i;
+                            papoRings[i]->setMeasured(FALSE);
+                        }
+                        break;
+                    }
+                    
                     papoRings[i]->setMeasured(TRUE);
 
                     MLineStringSetter lsmSetter(papoRings[i]);
@@ -2697,8 +2734,8 @@ OGRGeometry* FileGDBOGRGeometryConverterImpl::GetAsGeometry(const OGRField* psFi
                                     pabyCur, pabyEnd,
                                     panPointCount[i], dm) )
                     {
-                        while( (int)i >= 0 )
-                            delete papoRings[i--];
+                        for(i=0;i<nParts;i++)
+                            delete papoRings[i];
                         delete[] papoRings;
                         returnError();
                     }
diff --git a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp
index 894df42..9c66afc 100644
--- a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp
+++ b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogropenfilegdblayer.cpp 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogropenfilegdblayer.cpp 34480 2016-06-30 16:07:59Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implements Open FileGDB OGR driver.
@@ -413,7 +413,9 @@ int OGROpenFileGDBLayer::BuildLayerDefinition()
 
         // Check that the first feature has actually a M value before advertizing
         // it.
-        if( poGDBGeomField->HasM() && m_poLyrTable->GetAndSelectNextNonEmptyRow(0) >= 0 )
+        if( poGDBGeomField->HasM() &&
+            m_poLyrTable->GetValidRecordCount() > 0 &&
+            m_poLyrTable->GetAndSelectNextNonEmptyRow(0) >= 0 )
         {
             const OGRField* psField = m_poLyrTable->GetFieldValue(m_iGeomFieldIdx);
             if( psField != NULL )
diff --git a/ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp b/ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp
index 617b4e0..a884986 100644
--- a/ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp
+++ b/ogr/ogrsf_frmts/pgdump/ogrpgdumplayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrpgdumplayer.cpp 33645 2016-03-05 15:43:17Z rouault $
+ * $Id: ogrpgdumplayer.cpp 34482 2016-06-30 18:57:36Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implements OGRPGDumpLayer class
@@ -32,7 +32,7 @@
 #include "cpl_string.h"
 #include "ogr_p.h"
 
-CPL_CVSID("$Id: ogrpgdumplayer.cpp 33645 2016-03-05 15:43:17Z rouault $");
+CPL_CVSID("$Id: ogrpgdumplayer.cpp 34482 2016-06-30 18:57:36Z rouault $");
 
 #define USE_COPY_UNSET -1
 
@@ -1061,7 +1061,7 @@ void OGRPGCommonAppendFieldValue(CPLString& osCommand,
     // Binary formatting
     else if( nOGRFieldType == OFTBinary )
     {
-        osCommand += "'";
+        osCommand += "E'";
 
         int nLen = 0;
         GByte* pabyData = poFeature->GetFieldAsBinary( i, &nLen );
diff --git a/ogr/ogrsf_frmts/s57/ogrs57datasource.cpp b/ogr/ogrsf_frmts/s57/ogrs57datasource.cpp
index b0fbeb5..5fa2b45 100644
--- a/ogr/ogrsf_frmts/s57/ogrs57datasource.cpp
+++ b/ogr/ogrsf_frmts/s57/ogrs57datasource.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrs57datasource.cpp 33271 2016-01-30 16:01:55Z goatbar $
+ * $Id: ogrs57datasource.cpp 34384 2016-06-20 17:09:24Z rouault $
  *
  * Project:  S-57 Translator
  * Purpose:  Implements OGRS57DataSource class
@@ -32,7 +32,7 @@
 #include "cpl_string.h"
 #include "ogr_s57.h"
 
-CPL_CVSID("$Id: ogrs57datasource.cpp 33271 2016-01-30 16:01:55Z goatbar $");
+CPL_CVSID("$Id: ogrs57datasource.cpp 34384 2016-06-20 17:09:24Z rouault $");
 
 /************************************************************************/
 /*                          OGRS57DataSource()                          */
@@ -55,12 +55,6 @@ OGRS57DataSource::OGRS57DataSource(char** papszOpenOptionsIn) :
 /* -------------------------------------------------------------------- */
 /*      Allow initialization of options from the environment.           */
 /* -------------------------------------------------------------------- */
-    if( papszOpenOptionsIn != NULL )
-    {
-        papszOptions = CSLDuplicate(papszOpenOptionsIn);
-        return;
-    }
-
     const char *pszOptString = CPLGetConfigOption( "OGR_S57_OPTIONS", NULL );
 
     if ( pszOptString == NULL )
@@ -76,6 +70,21 @@ OGRS57DataSource::OGRS57DataSource(char** papszOpenOptionsIn) :
         while( *papszCurOption )
             CPLDebug( "S57", "    %s", *papszCurOption++ );
     }
+
+/* -------------------------------------------------------------------- */
+/*      And from open options.                                          */
+/* -------------------------------------------------------------------- */
+    for(char** papszIter = papszOpenOptionsIn; papszIter && *papszIter; ++papszIter )
+    {
+        char* pszKey = NULL;
+        const char* pszValue = CPLParseNameValue(*papszIter, &pszKey);
+        if( pszKey && pszValue )
+        {
+            papszOptions = CSLSetNameValue(papszOptions, pszKey, pszValue);
+        }
+        CPLFree(pszKey);
+    }
+
 }
 
 /************************************************************************/
diff --git a/ogr/ogrsf_frmts/sosi/GNUmakefile b/ogr/ogrsf_frmts/sosi/GNUmakefile
index 0b81095..acd1bd8 100644
--- a/ogr/ogrsf_frmts/sosi/GNUmakefile
+++ b/ogr/ogrsf_frmts/sosi/GNUmakefile
@@ -2,8 +2,7 @@
 
 include ../../../GDALmake.opt
 
-OBJ	=	ogrsosidriver.o ogrsosidatasource.o ogrsosilayer.o
-# ogrsosidatatypes.o 
+OBJ	=	ogrsosidriver.o ogrsosidatasource.o ogrsosilayer.o ogrsosidatatypes.o 
 
 CPPFLAGS	:=-DLINUX -DUNIX -I.. -I../..  $(SOSI_INC) $(CPPFLAGS)
 
diff --git a/ogr/ogrsf_frmts/sosi/makefile.vc b/ogr/ogrsf_frmts/sosi/makefile.vc
index 665d85d..6044617 100644
--- a/ogr/ogrsf_frmts/sosi/makefile.vc
+++ b/ogr/ogrsf_frmts/sosi/makefile.vc
@@ -1,6 +1,6 @@
 
 OBJ	=	ogrsosidriver.obj ogrsosidatasource.obj \
-        ogrsosilayer.obj fyba_melding.obj
+        ogrsosilayer.obj fyba_melding.obj ogrsosidatatypes.obj
 
 PLUGIN_DLL = ogr_SOSI.dll
 
diff --git a/ogr/ogrsf_frmts/sosi/ogr_sosi.h b/ogr/ogrsf_frmts/sosi/ogr_sosi.h
index 4f6449f..1542475 100644
--- a/ogr/ogrsf_frmts/sosi/ogr_sosi.h
+++ b/ogr/ogrsf_frmts/sosi/ogr_sosi.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr_sosi.h 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogr_sosi.h 34420 2016-06-24 21:06:03Z rouault $
  *
  * Project:  SOSI Translator
  * Purpose:  Implements OGRSOSIDriver.
@@ -35,6 +35,11 @@
 #include "fyba.h"
 #include <map>
 
+// Note: WRITE_SUPPORT not defined, since this is only partially implemented
+
+/* interpolation of arcs(BUEP) creates # points for a full circle */
+#define ARC_INTERPOLATION_FULL_CIRCLE 36.0
+
 typedef std::map<CPLString, CPLString> S2S;
 typedef std::map<CPLString, unsigned int> S2I;
 
@@ -68,8 +73,10 @@ public:
     void                ResetReading();
     OGRFeature *        GetNextFeature();
     OGRFeatureDefn *    GetLayerDefn();
+#ifdef WRITE_SUPPORT
     OGRErr              CreateField(OGRFieldDefn *poField, int bApproxOK=TRUE);
     OGRErr              ICreateFeature(OGRFeature *poFeature);
+#endif
     int                 TestCapability( const char * );
 };
 
@@ -90,6 +97,7 @@ class OGRSOSIDataSource : public OGRDataSource {
     void                buildOGRPoint(long nSerial);
     void                buildOGRLineString(int nNumCoo, long nSerial);
     void                buildOGRMultiPoint(int nNumCoo, long nSerial);
+    void                buildOGRLineStringFromArc(long nSerial);
 
 public:
 
@@ -111,7 +119,9 @@ public:
     ~OGRSOSIDataSource();
 
     int                 Open  ( const char * pszFilename, int bUpdate);
+#ifdef WRITE_SUPPORT
     int                 Create( const char * pszFilename );
+#endif
     const char          *GetName() {
         return pszName;
     }
@@ -119,8 +129,61 @@ public:
         return nLayers;
     }
     OGRLayer            *GetLayer( int );
+#ifdef WRITE_SUPPORT
     OGRLayer            *ICreateLayer( const char *pszName, OGRSpatialReference  *poSpatialRef=NULL, OGRwkbGeometryType eGType=wkbUnknown, char **papszOptions=NULL);
+#endif
     int                 TestCapability( const char * );
 };
 
+
+/************************************************************************
+ *                           OGRSOSIDataTypes                           *
+ * OGRSOSIDataTypes provides the correct data types for some of the     *
+ * most common SOSI elements.                                           *
+ ************************************************************************/
+
+class OGRSOSISimpleDataType {
+    const char          *pszName; 
+    OGRFieldType        nType;
+
+public:
+    OGRSOSISimpleDataType ();
+    OGRSOSISimpleDataType (const char *pszName, OGRFieldType nType);
+    ~OGRSOSISimpleDataType();
+
+    void setType (const char *pszName, OGRFieldType nType);
+    const char          *GetName() {
+        return pszName;
+    };
+    OGRFieldType        GetType() {
+        return nType;
+    };
+
+};
+
+class OGRSOSIDataType {
+    OGRSOSISimpleDataType* poElements;
+    int                    nElementCount;
+public:
+    OGRSOSIDataType (int nSize);
+    ~OGRSOSIDataType();
+
+    void setElement(int nIndex, const char *name, OGRFieldType type);
+    OGRSOSISimpleDataType* getElements() {
+        return poElements;
+    };
+    int getElementCount() {
+        return nElementCount;
+    };
+};
+
+typedef std::map<CPLString, OGRSOSIDataType> C2F;
+
+void SOSIInitTypes();
+OGRSOSIDataType* SOSIGetType(CPLString name);
+int  SOSITypeToInt(const char* value);
+double  SOSITypeToReal(const char* value);
+void SOSITypeToDate(const char* value, int* date);
+void SOSITypeToDateTime(const char* value, int* date);
+
 #endif /* OGR_SOSI_H_INCLUDED */
diff --git a/ogr/ogrsf_frmts/sosi/ogrsosidatasource.cpp b/ogr/ogrsf_frmts/sosi/ogrsosidatasource.cpp
index c2bec21..c6d32f1 100644
--- a/ogr/ogrsf_frmts/sosi/ogrsosidatasource.cpp
+++ b/ogr/ogrsf_frmts/sosi/ogrsosidatasource.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrsosidatasource.cpp 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogrsosidatasource.cpp 34420 2016-06-24 21:06:03Z rouault $
  *
  * Project:  SOSI Data Source
  * Purpose:  Provide SOSI Data to OGR.
@@ -30,6 +30,7 @@
 
 #include "ogr_sosi.h"
 #include <map>
+#include <math.h>
 
 /* This is the most common encoding for SOSI files. Let's at least try if
  * it is supported, or generate a meaningful error message.               */
@@ -37,6 +38,8 @@
 #  define CPL_ENC_ISO8859_10 "ISO8859-10"
 #endif
 
+
+#ifdef WRITE_SUPPORT
 /************************************************************************/
 /*                              utility methods                         */
 /************************************************************************/
@@ -85,6 +88,7 @@ static int epsg2sosi (int nEPSG) {
     }
     return nSOSI;
 }
+#endif
 
 static int sosi2epsg (int nSOSI) {
     int nEPSG = 4326;
@@ -151,6 +155,9 @@ OGRSOSIDataSource::OGRSOSIDataSource() {
     poCurveHeaders = NULL;
 
     pszEncoding = CPL_ENC_UTF8;
+    
+    SOSIInitTypes();
+    
     nMode = MODE_READING;
 }
 
@@ -197,17 +204,20 @@ OGRSOSIDataSource::~OGRSOSIDataSource() {
 }
 
 static
-OGRFeatureDefn *defineLayer(const char *szName, OGRwkbGeometryType szType, S2I *poHeaders) {
+OGRFeatureDefn *defineLayer(const char *szName, OGRwkbGeometryType szType, S2I *poHeaders, S2I **ppoHeadersNew) {
     OGRFeatureDefn *poFeatureDefn = new OGRFeatureDefn( szName );
     poFeatureDefn->SetGeomType( szType );
-
-    for (unsigned int n=0; n<poHeaders->size(); n++) { /* adding headers in the correct order again */
-        for (S2I::iterator i=poHeaders->begin(); i!=poHeaders->end(); i++) {
-            if (n==i->second) {
-                OGRFieldDefn oFieldTemplate( i->first.c_str(), OFTString );
-                poFeatureDefn->AddFieldDefn( &oFieldTemplate );
-            }
-        }
+    S2I* poHeadersNew  = *ppoHeadersNew;
+
+    for (S2I::iterator i=poHeaders->begin(); i!=poHeaders->end(); i++) {
+                OGRSOSIDataType* poType = SOSIGetType(i->first);
+                OGRSOSISimpleDataType* poElements = poType->getElements();
+                for (int k=0; k<poType->getElementCount(); k++) {
+                    if (strcmp(poElements[k].GetName(),"")==0) continue;
+                    OGRFieldDefn oFieldTemplate( poElements[k].GetName(), poElements[k].GetType() );
+                    (*poHeadersNew)[CPLString(poElements[k].GetName())] = poFeatureDefn->GetFieldCount();
+                    poFeatureDefn->AddFieldDefn( &oFieldTemplate );
+                }
     }
     return poFeatureDefn;
 }
@@ -329,14 +339,17 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
                     }
                     break;
                 }
-                case L_KURVE: {
+                case L_KURVE:  
+                case L_LINJE:  
+                case L_BUEP:  {    /* FIXME: maybe not use the same headers for both */
                     if (poCurveHeaders->find(osKey) == poCurveHeaders->end()) {
                         iH = static_cast<int>(poCurveHeaders->size());
                         (*poCurveHeaders)[osKey] = iH;
                     }
                     break;
                 }
-                case L_PUNKT: {
+                case L_PUNKT: 
+                case L_SYMBOL: {
                     if (poPointHeaders->find(osKey) == poPointHeaders->end()) {
                         iH = static_cast<int>(poPointHeaders->size());
                         (*poPointHeaders)[osKey] = iH;
@@ -369,12 +382,19 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
             /* cannot build geometries that reference others yet */
             break;
         }
-        case L_KURVE: {
+        case L_KURVE: 
+        case L_LINJE: {
             /* Pre-build a line feature. Activate line/curve layer. */
             bCurveLayer = TRUE;
             buildOGRLineString(static_cast<int>(nNumCoo), oNextSerial.lNr);
             break;
         }
+        case L_BUEP: {
+            /* Pre-build a line feature as interpolation from an arc. Activate line/curve layer. */
+            bCurveLayer = TRUE;
+            buildOGRLineStringFromArc(oNextSerial.lNr);
+            break;
+        }
         case L_TEKST: {
             /* Pre-build a text line contour feature. Activate text layer. */
             /* Todo: observe only points 2ff if more than one point is given for follow mode */
@@ -443,7 +463,10 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
      * and adding every SOSI header encountered in the file as field. */
     S2I::iterator i;
     if (bPolyLayer) {
-		OGRFeatureDefn *poFeatureDefn = defineLayer("polygons", wkbPolygon, poPolyHeaders);
+        S2I * poHeadersNew = new S2I();
+		OGRFeatureDefn *poFeatureDefn = defineLayer("polygons", wkbPolygon, poPolyHeaders, &poHeadersNew);
+        delete poPolyHeaders;
+        poPolyHeaders = poHeadersNew;
         poFeatureDefn->Reference();
         papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poPolyHeaders );
     } else {
@@ -451,7 +474,10 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
         poPolyHeaders = NULL;
     }
     if (bCurveLayer) {
-        OGRFeatureDefn *poFeatureDefn = defineLayer("lines", wkbLineString, poCurveHeaders);
+        S2I * poHeadersNew = new S2I();
+        OGRFeatureDefn *poFeatureDefn = defineLayer("lines", wkbLineString, poCurveHeaders, &poHeadersNew);
+        delete poCurveHeaders;
+        poCurveHeaders = poHeadersNew;
         poFeatureDefn->Reference();
         papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poCurveHeaders );
     } else {
@@ -459,7 +485,10 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
         poCurveHeaders = NULL;
     }
     if (bPointLayer) {
-        OGRFeatureDefn *poFeatureDefn = defineLayer("points", wkbPoint, poPointHeaders);
+        S2I * poHeadersNew = new S2I();
+        OGRFeatureDefn *poFeatureDefn = defineLayer("points", wkbPoint, poPointHeaders, &poHeadersNew);
+        delete poPointHeaders;
+        poPointHeaders = poHeadersNew;
         poFeatureDefn->Reference();
         papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poPointHeaders );
     } else {
@@ -467,7 +496,10 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
         poPointHeaders = NULL;
     }
     if (bTextLayer) {
-        OGRFeatureDefn *poFeatureDefn = defineLayer("text", wkbMultiPoint, poTextHeaders);
+        S2I * poHeadersNew = new S2I();
+        OGRFeatureDefn *poFeatureDefn = defineLayer("text", wkbMultiPoint, poTextHeaders, &poHeadersNew);
+        delete poTextHeaders;
+        poTextHeaders = poHeadersNew;
         poFeatureDefn->Reference();
         papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poTextHeaders );
     } else {
@@ -477,7 +509,7 @@ int  OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) {
     return TRUE;
 }
 
-
+#ifdef WRITE_SUPPORT
 /************************************************************************/
 /*                              Create()                                */
 /************************************************************************/
@@ -558,6 +590,7 @@ OGRLayer *OGRSOSIDataSource::ICreateLayer( const char *pszNameIn,
     /* todo: where do we delete poLayer and poFeatureDefn? */
     return poLayer;
 }
+#endif
 
 /************************************************************************/
 /*                              GetLayer()                              */
@@ -603,6 +636,72 @@ void OGRSOSIDataSource::buildOGRLineString(int nNumCoo, long iSerial) {
     }
     papoBuiltGeometries[iSerial] = poLS;
 }
+
+static double sqr(double x) { return x * x; } 
+
+void OGRSOSIDataSource::buildOGRLineStringFromArc(long iSerial) {
+    if (papoBuiltGeometries[iSerial] != NULL) {
+        return;
+    }
+
+    OGRLineString *poLS = new OGRLineString();
+   
+    /* fetch reference points on circle (easting, northing) */
+    double e1 = 0, e2 = 0, e3 = 0;
+    double n1 = 0, n2 = 0, n3 = 0;
+    LC_GetTK(1, &e1, &n1);
+    LC_GetTK(2, &e2, &n2);
+    LC_GetTK(3, &e3, &n3);
+
+    /* helper constants */
+    double p12  = (e1 * e1 - e2 * e2 + n1 * n1 - n2 * n2) / 2;
+    double p13  = (e1 * e1 - e3 * e3 + n1 * n1 - n3 * n3) / 2;
+
+    double dE12 = e1 - e2;
+    double dE13 = e1 - e3;
+    double dN12 = n1 - n2;
+    double dN13 = n1 - n3;
+
+    /* center of the circle */
+    double cE = (dN13 * p12 - dN12 * p13) / (dE12 * dN13 - dN12 * dE13) ; 
+    double cN = (dE13 * p12 - dE12 * p13) / (dN12 * dE13 - dE12 * dN13) ;
+
+    /* radius of the circle */
+    double r = sqrt(sqr(e1 - cE) + sqr(n1 - cN));
+
+    /* angles of points A and B (1 and 3) */
+    double th1 = atan2(n1 - cN, e1 - cE);
+    double th3 = atan2(n3 - cN, e3 - cE);
+
+    /* interpolation step in radians */
+    double dth = th3 - th1;
+    if (dth < 0) {dth  += 2 * M_PI;}
+    if (dth > M_PI) { 
+      dth = - 2*M_PI + dth;
+    }
+    int    npt = (int)(ARC_INTERPOLATION_FULL_CIRCLE * dth / 2*M_PI);
+    if (npt < 0) npt=-npt;
+    if (npt < 3) npt=3;
+    poLS->setNumPoints(npt);
+    dth = dth / (npt-1);
+
+    long i;
+    double dfEast = 0, dfNorth = 0;
+    
+    for (i=0; i<npt; i++) {
+        dfEast  = cE + r * cos(th1 + dth * i);
+        dfNorth = cN + r * sin(th1 + dth * i);
+        if (dfEast != dfEast) { /* which is a wonderful property of nans */
+          CPLError( CE_Warning, CPLE_AppDefined,
+                    "Calculated %lf for point %li of %i in curve %li.", dfEast, i, npt, iSerial);
+        }
+        poLS->setPoint(i, dfEast, dfNorth);
+    }
+    papoBuiltGeometries[iSerial] = poLS;
+     
+    
+}
+
 void OGRSOSIDataSource::buildOGRPoint(long iSerial) {
     double dfEast = 0, dfNorth = 0;
     LC_GetTK(1, &dfEast, &dfNorth);
@@ -613,11 +712,11 @@ void OGRSOSIDataSource::buildOGRPoint(long iSerial) {
 /*                              TestCapability()                        */
 /************************************************************************/
 
-int OGRSOSIDataSource::TestCapability( const char * pszCap ) {
+int OGRSOSIDataSource::TestCapability( CPL_UNUSED const char * pszCap ) {
+#ifdef WRITE_SUPPORT
     if (strcmp("CreateLayer",pszCap) == 0) {
         return TRUE;
-    } else {
-        CPLDebug( "[TestCapability]","Capability %s not supported by SOSI data source", pszCap);
     }
+#endif
 	return FALSE;
 }
diff --git a/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.cpp b/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.cpp
new file mode 100644
index 0000000..04ad39d
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.cpp
@@ -0,0 +1,105 @@
+#include <map>
+#include "ogr_sosi.h"
+
+C2F oTypes;
+C2F::iterator iTypes;
+
+/*** class definitions ***/
+
+OGRSOSIDataType::OGRSOSIDataType(int nSize) {
+    poElements = new OGRSOSISimpleDataType[nSize];
+    nElementCount = nSize;
+}
+OGRSOSIDataType::~OGRSOSIDataType() {
+    //delete[] poElements;
+}
+void OGRSOSIDataType::setElement(int nIndex, const char *name, OGRFieldType type) {
+    poElements[nIndex].setType(name, type);
+}
+
+OGRSOSISimpleDataType::OGRSOSISimpleDataType () {}
+OGRSOSISimpleDataType::OGRSOSISimpleDataType (const char *name, OGRFieldType type) {
+    setType(name, type);
+}
+void OGRSOSISimpleDataType::setType (const char *name, OGRFieldType type) {
+    pszName = name;
+    nType   = type;
+}
+OGRSOSISimpleDataType::~OGRSOSISimpleDataType () {}
+
+
+/*** utility methods ***/
+
+static void addType(C2F* map, const char *key, OGRSOSIDataType *type) {
+  map->insert(std::pair<CPLString, OGRSOSIDataType>(CPLString(key),*type));
+}
+static void addSimpleType(C2F* map, const char *key, const char *gmlKey, OGRFieldType type) {
+  OGRSOSIDataType *poType = new OGRSOSIDataType(1);
+  poType->setElement(0, gmlKey, type);
+  addType(map, key, poType);
+}
+
+void SOSIInitTypes() {
+#include "ogrsosidatatypes.h"
+
+  /* Actually not headers */
+  addSimpleType(&oTypes, "PUNKT", "", OFTInteger); //ignore
+  addSimpleType(&oTypes, "KURVE", "", OFTInteger); //ignore
+  addSimpleType(&oTypes, "FLATE", "", OFTInteger); //ignore
+  addSimpleType(&oTypes, "BUEP", "", OFTInteger);  //ignore
+  addSimpleType(&oTypes, "TEKST", "", OFTInteger); //ignore
+  addSimpleType(&oTypes, "REF", "", OFTString); //ignore this
+}
+
+int SOSITypeToInt(const char* value) {
+  return atoi(value);
+}
+double SOSITypeToReal(const char* value) {
+  return CPLAtof(value);
+}
+
+void SOSITypeToDate(const char* value, int* date) {
+  char dato[9];
+  snprintf(dato, 9, "%s", value);
+  date[2] = atoi(dato+6);
+  dato[6]='\0';
+  date[1] = atoi(dato+4);
+  dato[4]='\0';
+  date[0] = atoi(dato);
+}
+
+void SOSITypeToDateTime(const char* value, int* date) {
+  char dato[15];
+  snprintf(dato, 15, "%s", value);
+  if (strlen(dato)==14) {
+    date[5] = atoi(dato+12);
+    dato[12]='\0';
+    date[4] = atoi(dato+10);
+    dato[10]='\0';
+    date[3] = atoi(dato+8);
+  } else {
+    date[3] = 0; date[4] = 0; date[5] = 0;
+  }
+  dato[8]='\0';
+  date[2] = atoi(dato+6);
+  dato[6]='\0';
+  date[1] = atoi(dato+4);
+  dato[4]='\0';
+  date[0] = atoi(dato);
+}
+
+// Leaks memory
+static OGRSOSIDataType* SOSIGetTypeFallback(CPLString name) {
+  CPLString* copy = new CPLString(name.c_str());
+  addSimpleType(&oTypes, copy->c_str(), copy->c_str(), OFTString);
+  return SOSIGetType(name);
+}
+
+OGRSOSIDataType* SOSIGetType(CPLString name) {
+  iTypes = oTypes.find(name);
+  if (iTypes != oTypes.end()) {
+    return &(iTypes->second);
+  } else {
+    return SOSIGetTypeFallback(name);
+  }
+}
diff --git a/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.h b/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.h
new file mode 100644
index 0000000..323c26d
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/ogrsosidatatypes.h
@@ -0,0 +1,3560 @@
+
+      addSimpleType(&oTypes, "ADM_GRENSE", "administrativGrense", OFTString);
+    
+      addSimpleType(&oTypes, "ADRESSE", "adresse", OFTString);
+    
+      addSimpleType(&oTypes, "ADRESSEREFKODE", "adresseReferansekode", OFTString);
+    
+      addSimpleType(&oTypes, "AJOURFØRTAV", "ajourførtAv", OFTString);
+    
+      addSimpleType(&oTypes, "AJOURFØRTDATO", "ajourførtDato", OFTDate);
+    
+      addSimpleType(&oTypes, "AKGEOLTEMA", "annetKvTema", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVA_ART", "akvaArt", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVA_ENHET", "akvaEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVA_KONSTR", "akvaKonstruksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVA_NR", "akvaKonsesjonsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVA_STATUS", "akvaKonsesjonsstatus", OFTString);
+    
+      addSimpleType(&oTypes, "AKVA_TYPE", "akvaKonsesjonstype", OFTString);
+    
+      addSimpleType(&oTypes, "AKVAKONSESJONSFORMÅL", "akvaKonsesjonsformål", OFTString);
+    
+      addSimpleType(&oTypes, "AKVATEMP", "akvaTemperatur", OFTInteger);
+    
+      addSimpleType(&oTypes, "AKVSYMBOL", "andreKvSymbol", OFTInteger);
+    
+      addSimpleType(&oTypes, "ALDERBESKRIVELSE", "alderBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "ALGE_KONS", "algeKonsentrasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "ALGE_TYP", "algeType", OFTString);
+    
+      addSimpleType(&oTypes, "ALM-TYP", "allmenningtype", OFTString);
+    
+      addSimpleType(&oTypes, "ALT_AREALBYGNING", "alternativtArealBygning", OFTReal);
+    
+      addSimpleType(&oTypes, "ALTERN_FNR", "altForekomstNr", OFTString);
+    
+      addSimpleType(&oTypes, "ALTERNATIVTNAVN", "alternativtNavn", OFTString);
+    
+      addSimpleType(&oTypes, "ANBELINTYP", "annenBergartLinjetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANDREKILDERBELASTNING", "andrekilderBelastning", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANKRINGSBRUK", "ankringsbruk", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANKRTYP", "ankringstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANLEGGNØDSTRØM", "anleggNødstrøm", OFTString);
+    
+      addSimpleType(&oTypes, "ANLEGGSNUMMER", "anleggsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "ANNEN_VANNB_ELEK", "annenVannbehandlingAvhElektrisitet", OFTString);
+    
+      addSimpleType(&oTypes, "ANNENLUFTHAVN", "annenLufthavn", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANNENMATRENHET", "annenMatrEnhet", OFTString);
+    
+      addSimpleType(&oTypes, "ANT_ANALYS", "antallAnalyser", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANT_ANS", "antallAnsatte", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANT_ÅRSV", "antallÅrsverk", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALL_BAD", "antallBad", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALL_BOENHETER", "antallBoenheter", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALL_ETASJER", "antall etasjer", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALL_ROM", "antallRom", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALL_RØKLØP", "antallRøkløp", OFTReal);
+    
+      addSimpleType(&oTypes, "ANTALL_WC", "antallWC", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALLFASTBOENDE", "antallFastboende", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALLFRITIDSBOLIGER", "antallFritidsboliger", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALLIDENTISKELYS", "antallIdentiskeLys", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALLSKISPOR", "antallSkispor", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTALLSKORSTEINER", "antallSkorsteiner", OFTInteger);
+    
+      addSimpleType(&oTypes, "ANTDRIFT", "landbruksregAntBedrifter", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARAVGRTYPE", "arealressursAvgrensingType", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARDYRKING", "arealressursDyrkbarjord", OFTInteger);
+    
+      addSimpleType(&oTypes, "AREAL", "areal", OFTReal);
+    
+      addSimpleType(&oTypes, "AREALBRUK_RESTR", "arealbrukRestriksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "AREALENHET", "arealenhet", OFTString);
+    
+      addSimpleType(&oTypes, "AREALINNSJØ", "arealInnsjø", OFTReal);
+    
+      addSimpleType(&oTypes, "AREALKILDE", "arealkilde", OFTInteger);
+    
+      addSimpleType(&oTypes, "AREALMERKNAD", "arealmerknad", OFTString);
+    
+      addSimpleType(&oTypes, "AREALNEDBØRFELT", "arealNedbørfelt", OFTString);
+    
+      addSimpleType(&oTypes, "AREALREGINE", "arealRegine", OFTReal);
+    
+      addSimpleType(&oTypes, "AREALST", "arealbruksstatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "AREALVERDI_IND", "arealverdiindikator", OFTString);
+    
+      addSimpleType(&oTypes, "ARENKEL", "arealressursGruppertEnkel", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARGRUNNF", "arealressursGrunnforhold", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARKARTSTD", "arealressursKartstandard", OFTString);
+    
+      addSimpleType(&oTypes, "ARNFJBRUK", "arealressursNaturgrunnlagForJordbruk", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARSKOGBON", "arealressursSkogbonitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "ART_ENGELSK", "engelskArtsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "ART_LATIN", "vitenskapeligArtsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "ART_NORSK", "norskArtsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "ART_TAKSONOMI", "taksonomiskKode", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARTRESLAG", "arealressursTreslag", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARTYPE", "arealressursArealtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARUTETYPE", "annenRutetype", OFTString);
+    
+      addSimpleType(&oTypes, "ARVANLIG", "arealressursGruppertVanlig", OFTInteger);
+    
+      addSimpleType(&oTypes, "ARVEGET", "arealressursVegetasjonsdekke", OFTInteger);
+    
+      addSimpleType(&oTypes, "ASKOG", "potensiellSkogbonitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "ATIL", "arealtilstand", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVFALLSDEP", "avfallDeponiEgnethet", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVFALLTYPE", "avfallType", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVGIFTSBELAGT", "avgiftsbelagt", OFTString);
+    
+      addSimpleType(&oTypes, "AVGJDATO", "avgjørelsesdato", OFTDate);
+    
+      addSimpleType(&oTypes, "AVGRENSNINGSTYPE", "avgrensningstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVKJ", "avkjørselsbestemmelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVKLARTEIERE", "avklartEiere", OFTString);
+    
+      addSimpleType(&oTypes, "AVLØP", "avløp", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVLØP_TILKNYTNING", "tilknyttetKommunaltAvløp", OFTString);
+    
+      addSimpleType(&oTypes, "AVLØPINNSJØ", "avløpInnsjø", OFTReal);
+    
+      addSimpleType(&oTypes, "AVLØPRENSEPRINSIPP", "avløpRenseprinsipp", OFTString);
+    
+      addSimpleType(&oTypes, "AVLØPSANLEGGEIERFORM", "avløpsanleggEierform", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVLØPSANLEGGTYPE", "avløpsanleggtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVSETNING", "avsetningstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "AVSETNRATE", "avsetnRate", OFTString);
+    
+      addSimpleType(&oTypes, "BAKKEOPPLØSNING", "bakkeoppløsning", OFTReal);
+    
+      addSimpleType(&oTypes, "BARMARKSLØYPETYPE", "barmarksløypeType", OFTString);
+    
+      addSimpleType(&oTypes, "BEALDERBST", "bergartAlderBestemmelse", OFTString);
+    
+      addSimpleType(&oTypes, "BEBYGD_AREAL", "bebygdAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "BEFARGEKO", "cmykFargekode", OFTString);
+    
+      addSimpleType(&oTypes, "BEHSTAT", "behandlingsstatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "BEITEBRUKERID", "reinbeitebrukerID", OFTString);
+    
+      addSimpleType(&oTypes, "BEITETID", "beitetid", OFTString);
+    
+      addSimpleType(&oTypes, "BEITETIDVEDTAK", "beitetidVedtak", OFTString);
+    
+      addSimpleType(&oTypes, "BEKJSAMSET", "bergartKjemiskSammensetning", OFTString);
+    
+      addSimpleType(&oTypes, "BEKORNSTR", "bergartKornstørrelse", OFTString);
+    
+      addSimpleType(&oTypes, "BELIGG", "omgivelsetypeTraséseksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "BELIGGENHET", "beliggenhet", OFTString);
+    
+      addSimpleType(&oTypes, "BELYSNING", "belysning", OFTString);
+    
+      addSimpleType(&oTypes, "BEREGNET", "beregningsDato", OFTDate);
+    
+      addSimpleType(&oTypes, "BEREGNETÅR", "beregnetÅr", OFTString);
+    
+      addSimpleType(&oTypes, "BERGFARGE", "bergartFarge", OFTString);
+    
+      addSimpleType(&oTypes, "BERGGRENSETYPE", "berggrunnGrensetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BESK_ELEMENT", "beskrivelseElement", OFTString);
+    
+      addSimpleType(&oTypes, "BESKRIV", "tiltaksbeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "BESKRIVELSE", "beskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "BESTEMMELSEOMRNAVN", "bestemmelseOmrådeNavn", OFTString);
+    
+      addSimpleType(&oTypes, "BESTRUKTUR", "bergartStruktur", OFTString);
+    
+      addSimpleType(&oTypes, "BESYMBOLTY", "bergartSymbol", OFTInteger);
+    
+      addSimpleType(&oTypes, "BETEKSTUR", "bergartTekstur", OFTString);
+    
+      addSimpleType(&oTypes, "BETJENINGSGRAD", "betjeningsgrad", OFTString);
+    
+      addSimpleType(&oTypes, "BILDE-BIT-PIXEL", "bitsPerPixel", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDE-FIL", "bildeFil", OFTString);
+    
+      addSimpleType(&oTypes, "PLANPÅSKRIFTTYPE", "planpåskriftype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDEKATEGORI", "bildekategori", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDEMÅLESTOKK", "bildemålestokk", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDENUMMER", "bildenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDE-SYS", "bildeSystem", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDE-TYPE", "bildeType", OFTString);
+    
+      addSimpleType(&oTypes, "BILDE-UNDERTYPE", "bildeUndertype", OFTString);
+    
+      addSimpleType(&oTypes, "BISPENUMMER", "bispenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BKLASSIFIK", "berggrunnKlassifikasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "BLOKK", "steinOgBlokk", OFTString);
+    
+      addSimpleType(&oTypes, "BLOKKAREAL", "blokkareal", OFTReal);
+    
+      addSimpleType(&oTypes, "BMANDEL", "bmAndel", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMANTALL", "bmAntall", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMARSTID", "bmÅrstid", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMART", "bmArt", OFTString);
+    
+      addSimpleType(&oTypes, "BMENHET", "bmEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMFUNK", "bmOmrådefunksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMFUNKVAL", "bmFunksjonskvalitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMKILDTYP", "bmKildetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMKILDVURD", "bmKildevurdering", OFTInteger);
+    
+      addSimpleType(&oTypes, "BMNATYP", "bmNaturtype", OFTString);
+    
+      addSimpleType(&oTypes, "BMNATYPMARIN", "bmNaturtypeMarin", OFTString);
+    
+      addSimpleType(&oTypes, "BMNATYPMARINUTF", "bmNaturtypeMarinUtforming", OFTString);
+    
+      addSimpleType(&oTypes, "BMNATYPUTF", "bmNaturtypeUtforming", OFTString);
+    
+      addSimpleType(&oTypes, "BMREGDATO", "bmRegistreringsdato", OFTDate);
+    
+      addSimpleType(&oTypes, "BMTRUETKAT", "bmTruethetskategori", OFTString);
+    
+      addSimpleType(&oTypes, "BMVERDI", "bmVerdi", OFTString);
+    
+      addSimpleType(&oTypes, "BMVILTVEKT", "bmViltvekt", OFTInteger);
+    
+      addSimpleType(&oTypes, "BNR", "bruksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BOKST", "bokstav", OFTString);
+    
+      addSimpleType(&oTypes, "BOLTTYPE", "boltType", OFTInteger);
+    
+      addSimpleType(&oTypes, "BOREDAGER", "antallBoredager", OFTInteger);
+    
+      addSimpleType(&oTypes, "BOREDATO", "boredato", OFTDate);
+    
+      addSimpleType(&oTypes, "BOREDYP", "boredyp", OFTReal);
+    
+      addSimpleType(&oTypes, "BOREFIRMA", "borefirma", OFTString);
+    
+      addSimpleType(&oTypes, "BOREINNRETN", "boreinnretningsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "BORESLUTT", "boreslutt", OFTDate);
+    
+      addSimpleType(&oTypes, "BORESTART", "borestart", OFTDate);
+    
+      addSimpleType(&oTypes, "BORETYPE", "boringType", OFTInteger);
+    
+      addSimpleType(&oTypes, "BORHELNING", "gfborehHelning", OFTInteger);
+    
+      addSimpleType(&oTypes, "BORHULLNR", "borhullNummer", OFTString);
+    
+      addSimpleType(&oTypes, "BORLENGDE", "gfborehLengde", OFTReal);
+    
+      addSimpleType(&oTypes, "BORRETNING", "gfborehRetning", OFTInteger);
+    
+      addSimpleType(&oTypes, "BOT_OK_INT", "botaniskØkologiskInteresse", OFTString);
+    
+      addSimpleType(&oTypes, "BRANSJE", "bransje", OFTString);
+    
+      addSimpleType(&oTypes, "BREDDE", "trasébredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRENNVIDDE", "brennvidde", OFTReal);
+    
+      addSimpleType(&oTypes, "BRENSELTANKNEDGR", "brenseltankNedgravd", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRETYPE", "bretype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRUDDLENGDE", "bruddlengde", OFTReal);
+    
+      addSimpleType(&oTypes, "BRUEIER", "brueier", OFTString);
+    
+      addSimpleType(&oTypes, "BRUK_GRAD", "kulturlandskapBrukGrad", OFTString);
+    
+      addSimpleType(&oTypes, "BRUKONSTRTYPE", "brukonstruksjonstype", OFTString);
+    
+      addSimpleType(&oTypes, "BRUKSAREAL", "bruksareal", OFTReal);
+    
+      addSimpleType(&oTypes, "BRUKSAREALANNET", "bruksarealTilAnnet", OFTReal);
+    
+      addSimpleType(&oTypes, "BRUKSAREALBOLIG", "bruksarealTilBolig", OFTReal);
+    
+      addSimpleType(&oTypes, "BRUKSAREALTOTALT", "bruksarealTotalt", OFTReal);
+    
+      addSimpleType(&oTypes, "BRUKSENHETSTYPE", "bruksenhetstype", OFTString);
+    
+      addSimpleType(&oTypes, "BRUKSFREKVENS", "friluftsområdeBruksfrekvens", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRUKSNAVN", "bruksnavn", OFTString);
+    
+      addSimpleType(&oTypes, "BRUMATERIAL", "brumaterial", OFTString);
+    
+      addSimpleType(&oTypes, "BRUOVERBRU", "bruOverBru", OFTString);
+    
+      addSimpleType(&oTypes, "BRUTRAFIKKTYPE", "brutrafikktype", OFTString);
+    
+      addSimpleType(&oTypes, "BRUÅPNING", "bruåpningsmåte", OFTString);
+    
+      addSimpleType(&oTypes, "BRØNN_REGNR", "brønnRegNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRØNN_RESULTAT", "brønnresultat", OFTString);
+    
+      addSimpleType(&oTypes, "BRØNNKLASSE", "petroleumsbrønnklasse", OFTString);
+    
+      addSimpleType(&oTypes, "BRØNNTYPE", "petroleumsbrønntype", OFTString);
+    
+      addSimpleType(&oTypes, "BRØYTEAREALTILGANG", "brøytearealtilgang", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRØYTEAREALTYPE", "brøytearealtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRØYTEBREDDE", "brøytebredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "BRØYTEPRIORITET", "brøyteprioritet", OFTString);
+    
+      addSimpleType(&oTypes, "BRØYTERESTRIKSJON", "brøyterestriksjon", OFTString);
+    
+      addSimpleType(&oTypes, "BRØYTESIDE", "brøyteside", OFTString);
+    
+      addSimpleType(&oTypes, "BRØYTETYPE", "brøytetype", OFTString);
+    
+      addSimpleType(&oTypes, "BUNNTYP", "bunntype", OFTString);
+    
+      addSimpleType(&oTypes, "BUNNTYPE", "bunntype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYDELSNAVN", "bydelsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "BYDELSNUMMER", "bydelsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGGHØYDEIMETER", "bygghøydeIMeter", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGGNR", "bygningsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGGSTAT", "bygningsstatus", OFTString);
+    
+      addSimpleType(&oTypes, "BYGGTYP_NBR", "bygningstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGGVERK", "byggverkbestemmelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGN_ENDR_KODE", "bygningsendringskode", OFTString);
+    
+      addSimpleType(&oTypes, "BYGN_ENDR_LØPENR", "endringsløpenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "BYGN_HIST_DATO", "bygningshistorikkDato", OFTDate);
+    
+      addSimpleType(&oTypes, "BYGN_REF_TYPE", "bygningReferansetype", OFTString);
+    
+      addSimpleType(&oTypes, "BYGN_SAKSNR", "bygnSaksnr", OFTString);
+    
+      addSimpleType(&oTypes, "BYGNINGSFUNKSJON", "bygningsfunksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "BÆREEVNEBENEVNELSE", "bæreevnebenevnelse", OFTString);
+    
+      addSimpleType(&oTypes, "BØYE_FORM", "bøyeform", OFTInteger);
+    
+      addSimpleType(&oTypes, "BÅNDLAGTFREMTIL", "båndlagtFremTil", OFTDate);
+    
+      addSimpleType(&oTypes, "CLEIER", "CL_Eier", OFTString);
+    
+      addSimpleType(&oTypes, "D", "dybde", OFTInteger);
+    
+      addSimpleType(&oTypes, "DA_ANNET", "landbruksregArealAnnet", OFTInteger);
+    
+      addSimpleType(&oTypes, "DA_JORD_D", "landbruksregArealJordIDrift", OFTReal);
+    
+      addSimpleType(&oTypes, "DA_JORD_E", "landbruksregArealJordbruk", OFTInteger);
+    
+      addSimpleType(&oTypes, "DA_SKOG", "landbruksregArealSkog", OFTInteger);
+    
+      addSimpleType(&oTypes, "DAMFORMÅL", "damFormål", OFTString);
+    
+      addSimpleType(&oTypes, "DAMFUNKSJON", "damFunksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "DAMLENGDE", "damLengde", OFTReal);
+    
+      addSimpleType(&oTypes, "DAMTYPE", "damType", OFTString);
+    
+      addSimpleType(&oTypes, "DATAFANGSTDATO", "datafangstdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "DATAUTTAKSDATO", "datauttaksdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "DATERMETOD", "dateringMetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "DATUM", "datum", OFTString);
+    
+      addSimpleType(&oTypes, "DEFORMASJONFASE", "deformasjonFase", OFTInteger);
+    
+      addSimpleType(&oTypes, "DEKKENAVN", "dekkeEnhetNavn", OFTString);
+    
+      addSimpleType(&oTypes, "DEKKETYPE", "dekketype", OFTString);
+    
+      addSimpleType(&oTypes, "DEKNINGSNUMMER", "dekningsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "DEL_BRED", "posisjonBredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "DEL_DYBD", "posisjonDybde", OFTInteger);
+    
+      addSimpleType(&oTypes, "DELOMRÅDENAVN", "delområdenavn", OFTString);
+    
+      addSimpleType(&oTypes, "DELOMRÅDENUMMER", "delområdenummer", OFTString);
+    
+      addSimpleType(&oTypes, "DELSTREKNINGSNUMMER", "delstrekningsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "DEPONISTATUS", "deponistatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "DEPONITYPE", "deponitype", OFTInteger);
+    
+      addSimpleType(&oTypes, "DESINFANLAVHELEK", "desinfAnleggAvhElektrisitet", OFTString);
+    
+      addSimpleType(&oTypes, "DIGITALISERINGSMÅLESTOKK", "digitaliseringsmålestokk", OFTInteger);
+    
+      addSimpleType(&oTypes, "DIM-BREDDE", "tekstTegnBredde", OFTReal);
+    
+      addSimpleType(&oTypes, "DIM-HØYDE", "tekstTegnHøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "DISTKODE", "reinbeitedistriktID", OFTString);
+    
+      addSimpleType(&oTypes, "DK_MANDEL", "dyrkningspotensialMandel", OFTInteger);
+    
+      addSimpleType(&oTypes, "DK_MANDEL_A", "nedklassifiseringMandel", OFTInteger);
+    
+      addSimpleType(&oTypes, "DK_NEDBOR", "nedbørsbasert", OFTInteger);
+    
+      addSimpleType(&oTypes, "DK_NEDBOR_A", "nedklassifiseringNedbør", OFTInteger);
+    
+      addSimpleType(&oTypes, "DK_VANN", "vanningsbasert", OFTInteger);
+    
+      addSimpleType(&oTypes, "DK_VANN_A", "nedklassifiseringVanning", OFTInteger);
+    
+      addSimpleType(&oTypes, "DOKUMENTASJONSTYPE", "dokumentasjonType", OFTInteger);
+    
+      addSimpleType(&oTypes, "D-REF-INT", "vertikalReferanseInternasjonalDybde", OFTInteger);
+    
+      addSimpleType(&oTypes, "DRIFTFHOLD", "driftForhold", OFTInteger);
+    
+      addSimpleType(&oTypes, "DRIFTMETOD", "driftMetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "DRSENTER", "jordregisterDriftssenter", OFTInteger);
+    
+      addSimpleType(&oTypes, "DYBDE", "dybde", OFTReal);
+    
+      addSimpleType(&oTypes, "DYBDE_MAX", "maximumsdybde", OFTReal);
+    
+      addSimpleType(&oTypes, "DYBDE_MIN", "minimumsdybde", OFTReal);
+    
+      addSimpleType(&oTypes, "DYBDEFJELL", "dybdeTilFjell", OFTReal);
+    
+      addSimpleType(&oTypes, "DYBDEKVIKKLEIRE", "dybdeTilKvikkleire", OFTReal);
+    
+      addSimpleType(&oTypes, "DYBDEMÅLEMETODE", "dybemålemetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "DYBDE-REF", "dybdeReferanse", OFTString);
+    
+      addSimpleType(&oTypes, "DYBDETYPE", "dybdetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "DYPMIDDEL", "dypMiddel", OFTInteger);
+    
+      addSimpleType(&oTypes, "DYPSTØRSTMÅLT", "dypStørstMålt", OFTInteger);
+    
+      addSimpleType(&oTypes, "SERIENUMMER", "serienummer", OFTString);
+    
+      addSimpleType(&oTypes, "DYRKING", "jordregisterDyrkingsjord", OFTString);
+    
+      addSimpleType(&oTypes, "EIER", "geodataeier", OFTString);
+    
+      addSimpleType(&oTypes, "EIERFORHOLD", "eierforhold", OFTString);
+    
+      addSimpleType(&oTypes, "EIERFORM", "eierformType", OFTInteger);
+    
+      addSimpleType(&oTypes, "EKOORD-H", "jordregisterKoordinatHøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "EKOORD-N", "jordregisterKoordinatNord", OFTInteger);
+    
+      addSimpleType(&oTypes, "EKOORD-Ø", "jordregisterKoordinatØst", OFTInteger);
+    
+      addSimpleType(&oTypes, "ENDRET_TID", "tidspunktEndring", OFTDateTime);
+    
+      addSimpleType(&oTypes, "ENDRET_TYPE", "typeEndring", OFTString);
+    
+      addSimpleType(&oTypes, "ENDRINGSGRAD", "endringsgrad", OFTString);
+    
+      addSimpleType(&oTypes, "ENERGIKILDE", "energikilde", OFTString);
+    
+      addSimpleType(&oTypes, "ENHET", "enhet", OFTReal);
+    
+      addSimpleType(&oTypes, "ENHET-D", "enhetDybde", OFTReal);
+    
+      addSimpleType(&oTypes, "ENHET-H", "enhetHøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "EROSJONGS", "erosjonsrisikoGrasdekke", OFTInteger);
+    
+      addSimpleType(&oTypes, "EROSJONHP", "erosjonsrisikoHøstpløying", OFTInteger);
+    
+      addSimpleType(&oTypes, "ETABLERINGSDATO", "etableringsdato", OFTDate);
+    
+      addSimpleType(&oTypes, "ETABLERT", "fastmerkeEtableringsdato", OFTDate);
+    
+      addSimpleType(&oTypes, "ETASJENUMMER", "etasjenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "ETASJEPLAN", "etasjeplan", OFTString);
+    
+      addSimpleType(&oTypes, "ETASJETALL", "etasjetall", OFTString);
+    
+      addSimpleType(&oTypes, "ETAT", "etat", OFTString);
+    
+      addSimpleType(&oTypes, "F_TYPE", "fiskeType", OFTInteger);
+    
+      addSimpleType(&oTypes, "FAGOMRÅD", "ledningsfagområde", OFTInteger);
+    
+      addSimpleType(&oTypes, "FALLHØYDE", "fallHøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "FAO_KODE", "faoKode", OFTString);
+    
+      addSimpleType(&oTypes, "FARTØY_ID", "fartøyIdentifikasjon", OFTString);
+    
+      addSimpleType(&oTypes, "FASADE", "fasade", OFTInteger);
+    
+      addSimpleType(&oTypes, "FBNAVN", "fiskebedriftsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "FBNR", "fiskebruksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "FBNR_FYLK", "fiskebruksnummerFylke", OFTString);
+    
+      addSimpleType(&oTypes, "FELTNAVN", "feltbetegnelse", OFTString);
+    
+      addSimpleType(&oTypes, "FELTREGISTRERTAV", "feltegistrertAv", OFTString);
+    
+      addSimpleType(&oTypes, "FIGF_ID", "figurFørSkifteIdent", OFTInteger);
+    
+      addSimpleType(&oTypes, "FILM", "film", OFTString);
+    
+      addSimpleType(&oTypes, "FIRMA", "firmanavn", OFTString);
+    
+      addSimpleType(&oTypes, "FISK_KODE", "artskode", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_BEDR_ANDEL", "fiskebedriftsandel", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_BEDR_EIER", "fiskebedriftseier", OFTString);
+    
+      addSimpleType(&oTypes, "FISKE_BEDR_OMR", "fiskebedriftsområde", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_BEDR_PROD", "fiskebedriftsprodukt", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_BEDR_SERVICE", "fiskebedriftservice", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_KAP_ENH", "fiskekapasitetEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_KAPASITET", "fiskekapasitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKE_TYPE", "fisketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERI_BRUK_TYPE", "fiskeribrukstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERI_RESS_TYPE", "fiskeriressursOmrådetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERIREDSKAP_GEN_AKTIV", "fiskeriredskapGenAktiv", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERIREDSKAP_GEN_PASSIV", "fiskeriredskapGenPassiv", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERIREDSKAP_SPES_AKTIV", "fiskeriredskapSpesAktiv", OFTInteger);
+    
+      addSimpleType(&oTypes, "FISKERIREDSKAP_SPES_PASSIV", "fiskeriredskapSpesPassiv", OFTInteger);
+    
+      addSimpleType(&oTypes, "FJELL", "fjellblotninger", OFTInteger);
+    
+      addSimpleType(&oTypes, "FJORDID", "fjordidentifikasjon", OFTString);
+    
+      addSimpleType(&oTypes, "FLODBOLGEHOYDE", "flodbolgehoyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "FLOMLAVPUNKT", "flomLavPunkt", OFTReal);
+    
+      addSimpleType(&oTypes, "FLYFIRMA", "flyfirma", OFTString);
+    
+      addSimpleType(&oTypes, "FLYHØYDE", "flyhøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "FLYRESTR", "flyRestriksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "FMADKOMST", "fastmerkeAdkomst", OFTString);
+    
+      addSimpleType(&oTypes, "FMDIM", "fastmerkeDiameter", OFTInteger);
+    
+      addSimpleType(&oTypes, "FMHREF", "fastmerkeHøyderef", OFTString);
+    
+      addSimpleType(&oTypes, "FMIDDATO", "fastmerkeIdDato", OFTDate);
+    
+      addSimpleType(&oTypes, "FMIDGML", "fastmerkeIdGammel", OFTString);
+    
+      addSimpleType(&oTypes, "FMINST", "fastmerkeInstitusjon", OFTString);
+    
+      addSimpleType(&oTypes, "FMKOMM", "fastmerkeKommune", OFTInteger);
+    
+      addSimpleType(&oTypes, "FMMERK", "fastmerkeMerknader", OFTString);
+    
+      addSimpleType(&oTypes, "FMNAVN", "fastmerkeNavn", OFTString);
+    
+      addSimpleType(&oTypes, "FMNUMMER", "fastmerkeNummer", OFTString);
+    
+      addSimpleType(&oTypes, "FMREFBER", "fastmerkeRefGrunnrisBeregning", OFTString);
+    
+      addSimpleType(&oTypes, "FMREFHBER", "fastmerkeRefHøydeBeregning", OFTString);
+    
+      addSimpleType(&oTypes, "FMRESTR", "fastmerkeRestriksjon", OFTString);
+    
+      addSimpleType(&oTypes, "FMSREF", "fastmerkeSentrumRef", OFTString);
+    
+      addSimpleType(&oTypes, "FNR", "festenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "FONTENE_TYPE", "fontenetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FOREKNAVN", "navnRastoffobj", OFTString);
+    
+      addSimpleType(&oTypes, "FOREKOM_ID", "identRastoffobj", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORHOLDANDREHUS", "forholdAndreHus", OFTString);
+    
+      addSimpleType(&oTypes, "FORHÅNDSTALL", "forhåndstall", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORLENGET_DATO", "forlengetDato", OFTDate);
+    
+      addSimpleType(&oTypes, "FORMASJON", "formasjonTotalDyp", OFTString);
+    
+      addSimpleType(&oTypes, "FORMELFLATE", "kvFormFlatetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORMELLIN", "kvFormLinjetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORMELPKT", "kvFormPunkttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORMÅLSEKSJON", "formålSeksjonKode", OFTString);
+    
+      addSimpleType(&oTypes, "FORUR_AREAL", "forurensetAreal", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORUR_GRUNNTYPE", "forurensetGrunnType", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORUR_HOVEDGRUPPE", "forurensningHovedgruppe", OFTInteger);
+    
+      addSimpleType(&oTypes, "FORV_MYND", "forvaltningMyndighet", OFTString);
+    
+      addSimpleType(&oTypes, "FORV_PLAN", "forvaltningPlan", OFTInteger);
+    
+      addSimpleType(&oTypes, "FOSSILTYPE", "fossilNavn", OFTString);
+    
+      addSimpleType(&oTypes, "FOTODATO", "fotodato", OFTDate);
+    
+      addSimpleType(&oTypes, "FOTOGRAF", "fotograf", OFTString);
+    
+      addSimpleType(&oTypes, "FOTRUTETYPE", "fotrutetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRASPORNODEKILOMETER", "fraSpornodeKilometer", OFTReal);
+    
+      addSimpleType(&oTypes, "FRASPORNODETEKST", "fraSpornodeTekst", OFTString);
+    
+      addSimpleType(&oTypes, "FRASPORNODETYPE", "fraSpornodeType", OFTString);
+    
+      addSimpleType(&oTypes, "F-REF-INT", "friseilingReferanseInternasjonal", OFTInteger);
+    
+      addSimpleType(&oTypes, "FREG", "jordregisterFreg", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRIDRIFTSTILSYN", "friluftslivsområdeDriftstilsyn", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRIEGNETHET", "friluftslivsområdeEgnethet", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRIPLANST", "friluftslivsområdePlanStatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRISEILHØYDE", "friseilingshøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "FRISEIL-REF", "frilseilingReferanse", OFTString);
+    
+      addSimpleType(&oTypes, "FRISIKRING", "friluftslivSikring", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRISPERR", "frisperring", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRISTMATRIKKELFØRINGSKRAV", "fristMatrikkelføringskrav", OFTDate);
+    
+      addSimpleType(&oTypes, "FRISTOPPMÅLING", "fristOppmåling", OFTDate);
+    
+      addSimpleType(&oTypes, "FRITILRETTELEGGING", "friluftslivsområdeTilrettelegging", OFTInteger);
+    
+      addSimpleType(&oTypes, "FRITYPE", "friluftslivsområdeType", OFTString);
+    
+      addSimpleType(&oTypes, "FRIVERDI", "friluftslivsområdeVerdi", OFTString);
+    
+      addSimpleType(&oTypes, "F-STRENG", "formatertStreng", OFTString);
+    
+      addSimpleType(&oTypes, "FUNDAMENTERING", "fundamentering", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYDELTEMA", "fylkesdeltema", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYLKESNR", "fylkesnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYRLISTEKARAKTER", "fyrlisteKarakter", OFTString);
+    
+      addSimpleType(&oTypes, "FYRLISTENUMMER", "fyrlistenummer", OFTString);
+    
+      addSimpleType(&oTypes, "FYSENHET", "fysiskEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYSISKMILJØ", "fysiskMiljø", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYSPARAM", "fysiskParameter", OFTInteger);
+    
+      addSimpleType(&oTypes, "FYSSTR", "fysiskStorrelse", OFTReal);
+    
+      addSimpleType(&oTypes, "FØLGER_TERRENGDET", "følgerTerrengdetalj", OFTString);
+    
+      addSimpleType(&oTypes, "FØRSTEDATAFANGSTDATO", "førsteDatafangstdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "FØRSTEDIGITALISERINGSDATO", "førsteDigitaliseringsdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "GARDIDNR", "landbruksregProdusentId", OFTInteger);
+    
+      addSimpleType(&oTypes, "GATENAVN", "gatenavn", OFTString);
+    
+      addSimpleType(&oTypes, "GATENR", "gatenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "GENRESTR", "generellrestriksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOALDER", "geolAlder", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOALDER_FRA", "geolMaksAlder", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOALDER_TIL", "geolMinAlder", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOBESK", "geolBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "GEO-DATUM", "geoDatumInternasjonal", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOFELTNR", "geologFeltnummer", OFTString);
+    
+      addSimpleType(&oTypes, "GEOFORMASJ", "geolFormasjonNavn", OFTString);
+    
+      addSimpleType(&oTypes, "GEOGRUPPE", "geolGruppeNavn", OFTString);
+    
+      addSimpleType(&oTypes, "GEOHOVERDI", "geolHorisontalverdi", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOKARTNR", "geolKartnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOKOORD", "geoKoordinatverdiEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOLOKNR", "geolLokalitetnummer", OFTReal);
+    
+      addSimpleType(&oTypes, "GEO-PROJ", "geoProjeksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOPÅVISNINGTYPE", "geolPavisningtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOSITENO", "geositeNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEO-SONE", "geoSoneProjeksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOVERDIVURD", "geolVerdivurdering", OFTInteger);
+    
+      addSimpleType(&oTypes, "GEOVEVERDI", "geolVertikalverdi", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFANOMALI", "geofAnomali", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFDYPSTR", "geofDyp", OFTReal);
+    
+      addSimpleType(&oTypes, "GFDYPTYPE", "geofDyptype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFFALLBREGMET", "geofFallBeregnMetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFFALLSTR", "geofFallstorrelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFFLATE", "geofFlate", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFL_INFO", "geofLinjeInfo", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFLINJE", "geofTolkLinjetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFMETODE", "geofMetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFP_INFO", "geofPunktInfo", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFSTROK", "geofStrokretning", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFTOLK", "geofTolkMetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFUTLLEN", "geofLengdeUtlegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFUTLRETN", "geofRetningUtlegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "GFUTLTYPE", "geofTypeUtlegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "GJENNOMFØRINGSFRIST", "gjennomføringsfrist", OFTDate);
+    
+      addSimpleType(&oTypes, "GJENTAKSINTERVAL", "gjentaksInterval", OFTInteger);
+    
+      addSimpleType(&oTypes, "GJERDETYPE", "sikringGjerdetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKEKSTRAKT", "geokEkstrakt", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKENHET", "geokEnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKFRADYP", "geokFraDyp", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKFRAKSJON", "geokFraksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKHORISONT", "geokHorisont", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKHOVMEDIUM", "geokHovedmedium", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKMEDIUM", "geokMedium", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKRETSNAVN", "grunnkretsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "GKTILDYP", "geokTilDyp", OFTInteger);
+    
+      addSimpleType(&oTypes, "GKVARIABEL", "geokVariabel", OFTString);
+    
+      addSimpleType(&oTypes, "GNR", "gårdsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "GR_TYPE", "grensetypeSjø", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRAVERT", "gravertTekst", OFTString);
+    
+      addSimpleType(&oTypes, "GRDANNELSE", "grotteDannelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRDIMSJOND", "grotteDimDiameter", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRDIMSJONH", "grotteDimHoyre", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRDIMSJONO", "grotteDimOver", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRDIMSJONU", "grotteDimUnder", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRDIMSJONV", "grotteDimVenstre", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRENSEMERKENEDSATTI", "grensemerkeNedsasttI", OFTString);
+    
+      addSimpleType(&oTypes, "GRENSEPUNKTNUMMER", "grensepunktnummer", OFTString);
+    
+      addSimpleType(&oTypes, "GRENSEPUNKTTYPE", "grensepunkttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRENSEVEDTAK", "grenseVedtak", OFTString);
+    
+      addSimpleType(&oTypes, "GRFORMELM", "grotteFormElement", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRGANGFORM", "grotteGaForm", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRGANGTYPE", "grotteGaType", OFTString);
+    
+      addSimpleType(&oTypes, "GRHOYDE", "grotteHoyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRLINTYPE", "grotteLinjetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GROTLEGEME", "grotteLegeme", OFTString);
+    
+      addSimpleType(&oTypes, "GROTNOYAKT", "grotteNoyaktighet", OFTString);
+    
+      addSimpleType(&oTypes, "GROTTELAST", "grotteLast", OFTInteger);
+    
+      addSimpleType(&oTypes, "GROTTENAVN", "grotteNavn", OFTString);
+    
+      addSimpleType(&oTypes, "GROTTEPLAN", "grottePlan", OFTString);
+    
+      addSimpleType(&oTypes, "GROTTLENKE", "grotteLenke", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRPKTTYPE", "grottePktType", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRPUNKTNR", "grottePktNummer", OFTString);
+    
+      addSimpleType(&oTypes, "GRUNNBORINGREF", "grunnBoringReferanse", OFTString);
+    
+      addSimpleType(&oTypes, "GRUNNFHOLD", "losmGrunnforhold", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRUNNGASS", "grunnGass", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRUNNKRETS", "grunnkretsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRUNNLINJENAVN", "grunnlinjepunktnavn", OFTString);
+    
+      addSimpleType(&oTypes, "GRUNNLINJENUMMER", "grunnlinjepunktnummer", OFTString);
+    
+      addSimpleType(&oTypes, "GRUNNRISSREFERANSESPOR", "grunnrissreferanseSpor", OFTString);
+    
+      addSimpleType(&oTypes, "GRUNNVANN", "grunnvannPotensiale", OFTInteger);
+    
+      addSimpleType(&oTypes, "GRUNNVERDI", "grunnVerdi", OFTReal);
+    
+      addSimpleType(&oTypes, "GRVARSEL", "grotteVarsel", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVAKT_PROS", "geoVernAktivProsess", OFTString);
+    
+      addSimpleType(&oTypes, "GVAREAL", "geoVernAreal", OFTString);
+    
+      addSimpleType(&oTypes, "GVDLIKEHOLD", "geoVernVedlikehold", OFTString);
+    
+      addSimpleType(&oTypes, "GVERNE_ID", "geoVernObjektId", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVERNETYPE", "geoVernTematype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVERNHTYPE", "geoVernHovedtype", OFTString);
+    
+      addSimpleType(&oTypes, "GVERNKRT_A", "geoVernAKriterie", OFTString);
+    
+      addSimpleType(&oTypes, "GVERNKRT_B", "geoVernBKriterie", OFTString);
+    
+      addSimpleType(&oTypes, "GVERNKRT_C", "geoVernCKriterie", OFTString);
+    
+      addSimpleType(&oTypes, "GVERNVERDI", "geoVernVerdi", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVGRENSETY", "geoVernGrensetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVHINNHLD", "geoVernHovInnhold", OFTString);
+    
+      addSimpleType(&oTypes, "GVINNGREP", "geoVernInngrep", OFTString);
+    
+      addSimpleType(&oTypes, "GVLITTRTUR", "geoVernLitteratur", OFTString);
+    
+      addSimpleType(&oTypes, "GVOFFNTLGJ", "geoVernOffentliggjoring", OFTString);
+    
+      addSimpleType(&oTypes, "GVOMR_NAVN", "geoVernOmrNavn", OFTString);
+    
+      addSimpleType(&oTypes, "GVPROALDER", "geoVernProsessalder", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVSAKSTATUS", "geoVernSakStatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVSTATUS", "geoVernType", OFTInteger);
+    
+      addSimpleType(&oTypes, "GVSYSTEM", "geoVernSystem", OFTString);
+    
+      addSimpleType(&oTypes, "GVTINNHLD", "geoVernTilleggInnhold", OFTString);
+    
+      addSimpleType(&oTypes, "GVVKT_PROS", "geoVernViktigProsess", OFTString);
+    
+      addSimpleType(&oTypes, "GYLDIGFRA", "gyldigFra", OFTDate);
+    
+      addSimpleType(&oTypes, "GYLDIGTIL", "gyldigTil", OFTDate);
+    
+      addSimpleType(&oTypes, "H", "høyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "H_EUREF89", "høydeOverEuref89", OFTReal);
+    
+      addSimpleType(&oTypes, "H_KAT_LANDSK", "hovedkategoriLandskap", OFTString);
+    
+      addSimpleType(&oTypes, "HAR_HEIS", "harHeis", OFTString);
+    
+      addSimpleType(&oTypes, "HASTIGHETSENHET", "hastighetsenhet", OFTString);
+    
+      addSimpleType(&oTypes, "HAVNE_D_ADM", "havnedistriktadministrasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "HAVNE_ID", "havneidentifikasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "HAVNEAVSNITTNUMMER", "havneavsnittnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "HAVNEAVSNITTSTATUS", "havneavsnittstatus", OFTString);
+    
+      addSimpleType(&oTypes, "HAVNEAVSNITTTYPE", "havneavsnitttype", OFTString);
+    
+      addSimpleType(&oTypes, "HAVNETERMINALISPSNUMMER", "havneterminalISPSnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "HAVNETERMINALNUMMER", "havneterminalnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "HAVNETERMINALSTATUS", "havneterminalstatus", OFTString);
+    
+      addSimpleType(&oTypes, "HAVNETERMINALTYPE", "havneterminaltype", OFTString);
+    
+      addSimpleType(&oTypes, "HBERGKODE", "hovedBergKode", OFTInteger);
+    
+      addSimpleType(&oTypes, "HELLING", "helling", OFTInteger);
+    
+      addSimpleType(&oTypes, "HENDELSE", "trasénodeHendelsestype", OFTInteger);
+    
+      addSimpleType(&oTypes, "HENSYNSONENAVN", "hensynSonenavn", OFTString);
+    
+      addSimpleType(&oTypes, "HFLOM", "vannstandRegHøyestRegistrerte", OFTReal);
+    
+      addSimpleType(&oTypes, "HINDERFLATE_TYPE", "hinderFlateType", OFTInteger);
+    
+      addSimpleType(&oTypes, "HINDERFLATEPENETRERINGSTYPE", "hinderflatepenetreringstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "HJELPELINJETYPE", "hjelpelinjetype", OFTString);
+    
+      addSimpleType(&oTypes, "HJEMMELSGRUNNLAG", "hjemmelsgrunnlag", OFTString);
+    
+      addSimpleType(&oTypes, "HJULTRYKK", "hjultrykk", OFTString);
+    
+      addSimpleType(&oTypes, "H-MÅLEMETODE", "målemetodeHøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "H-NØYAKTIGHET", "nøyaktighetHøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "HOB", "høydeOverBakken", OFTReal);
+    
+      addSimpleType(&oTypes, "HOLDNINGSKLASSE", "holdningsklasse", OFTInteger);
+    
+      addSimpleType(&oTypes, "HOR_BÆREKONSTR", "horisontalBærekonstr", OFTInteger);
+    
+      addSimpleType(&oTypes, "HOVEDPARSELL", "hovedParsell", OFTInteger);
+    
+      addSimpleType(&oTypes, "HOVEDTEIG", "hovedteig", OFTString);
+    
+      addSimpleType(&oTypes, "HREF", "høydereferanse", OFTString);
+    
+      addSimpleType(&oTypes, "H-REF-INT", "høydeReferanseInternasjonal", OFTInteger);
+    
+      addSimpleType(&oTypes, "HRV", "vannstandHøyesteRegulert", OFTReal);
+    
+      addSimpleType(&oTypes, "HUSHOLDBELASTNING", "husholdBelastning", OFTInteger);
+    
+      addSimpleType(&oTypes, "HUSLØPENR", "husLøpenr", OFTInteger);
+    
+      addSimpleType(&oTypes, "HUSNR", "husNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "HVANN", "vannstandHøyestRegistrert", OFTReal);
+    
+      addSimpleType(&oTypes, "HYTTE_ID", "hytteId", OFTInteger);
+    
+      addSimpleType(&oTypes, "HYTTEEIER", "hytteeier", OFTInteger);
+    
+      addSimpleType(&oTypes, "HØYDE", "høyde", OFTReal);
+    
+      addSimpleType(&oTypes, "HØYDE_TIL_NAV", "høydeTilNavet", OFTInteger);
+    
+      addSimpleType(&oTypes, "HØYDE-REF", "høyde-Referanse", OFTString);
+    
+      addSimpleType(&oTypes, "HØYDEREFERANSESPOR", "høydereferanseSpor", OFTString);
+    
+      addSimpleType(&oTypes, "HØYDE-TYPE", "høydeType", OFTString);
+    
+      addSimpleType(&oTypes, "ID", "identifikasjon", OFTString);
+    
+      addSimpleType(&oTypes, "IKRAFT", "ikrafttredelsesdato", OFTDate);
+    
+      addSimpleType(&oTypes, "IMOTOPPMERKETYPE", "imoToppmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "IMP", "impedimentprosentSkog", OFTInteger);
+    
+      addSimpleType(&oTypes, "INDEKSMIN", "indeksMineral", OFTString);
+    
+      addSimpleType(&oTypes, "INDIKATOR", "indikatorFastmerkenummer", OFTString);
+    
+      addSimpleType(&oTypes, "INDUSTRIBELASTNING", "industriBelastning", OFTInteger);
+    
+      addSimpleType(&oTypes, "INFILT", "infiltrasjonEvne", OFTInteger);
+    
+      addSimpleType(&oTypes, "INFORMASJON", "informasjon", OFTString);
+    
+      addSimpleType(&oTypes, "FAGOMRÅDEGRUPPE", "fagområdegruppe", OFTString);
+    
+      addSimpleType(&oTypes, "FAGOMRÅDE_FULLT_NAVN", "fagområdets fulle navn", OFTString);
+    
+      addSimpleType(&oTypes, "INON_AVS", "inngrepsfriSoneAvstand", OFTReal);
+    
+      addSimpleType(&oTypes, "INONSONE", "inngrepsfrieNaturområderINorgeSone", OFTString);
+    
+      addSimpleType(&oTypes, "INRT_FUNKSJON", "innretningsfunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "INRT_HOVEDTYPE", "innretningshovedtype", OFTString);
+    
+      addSimpleType(&oTypes, "INRT_MATR", "innretningsmaterialtype", OFTString);
+    
+      addSimpleType(&oTypes, "INRT_NAVN", "innretningsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "INRT_TYPE", "innretningstype", OFTString);
+    
+      addSimpleType(&oTypes, "INST_EFFEKT", "installertEffekt", OFTInteger);
+    
+      addSimpleType(&oTypes, "INSTALLASJONSBØYEKATEGORI", "installasjonsbøyekategori", OFTInteger);
+    
+      addSimpleType(&oTypes, "INSTALLERT_ÅR", "installertÅr", OFTDate);
+    
+      addSimpleType(&oTypes, "INT_STAT", "internasjonalStatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "J_LREG", "jordregisterLreg", OFTString);
+    
+      addSimpleType(&oTypes, "JERNBANEEIER", "jernbaneeier", OFTString);
+    
+      addSimpleType(&oTypes, "JERNBANETYPE", "jernbanetype", OFTString);
+    
+      addSimpleType(&oTypes, "JORD", "jordklassifikasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "JORDARB", "anbefaltJordarbeiding", OFTInteger);
+    
+      addSimpleType(&oTypes, "JORDART", "losmassetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "JREGAREAL", "jordregisterAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "JREGEKODE", "jordregisterStatusEiendom", OFTInteger);
+    
+      addSimpleType(&oTypes, "JRFIGNR", "jordregisterFigurnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "JSR_AREAL", "jordskifteArealtilstand", OFTInteger);
+    
+      addSimpleType(&oTypes, "JSVSAK", "jordskifterettenSaksnummer", OFTString);
+    
+      addSimpleType(&oTypes, "JXAREAL", "annetareal", OFTInteger);
+    
+      addSimpleType(&oTypes, "KABELTYPE", "kabeltype", OFTInteger);
+    
+      addSimpleType(&oTypes, "KAI_DYBDE", "kaiDybde", OFTReal);
+    
+      addSimpleType(&oTypes, "KAI_TYPE", "kaiTypeInformasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "KALIBRERINGSRAPPORT", "kalibreringsrapport", OFTString);
+    
+      addSimpleType(&oTypes, "KAMERATYPE", "kameratype", OFTString);
+    
+      addSimpleType(&oTypes, "KAPASITETLANGEKJØRETØY", "kapasitetLangekjøretøy", OFTInteger);
+    
+      addSimpleType(&oTypes, "KAPASITETPERSONBILER", "kapasitetPersonbiler", OFTInteger);
+    
+      addSimpleType(&oTypes, "KAPASITETPERSONEKVIVALENTER", "kapasitetPersonekvivalenter", OFTInteger);
+    
+      addSimpleType(&oTypes, "KARDINALMERKETYPE", "kardinalmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "KARTID", "kartbladindeks", OFTString);
+    
+      addSimpleType(&oTypes, "KARTLEGGINGSETAPPE", "kartleggingsetappe", OFTString);
+    
+      addSimpleType(&oTypes, "KARTREG", "kartregistrering", OFTInteger);
+    
+      addSimpleType(&oTypes, "KARTSIGNATUR", "kartsignatur", OFTString);
+    
+      addSimpleType(&oTypes, "KARTTYPE", "karttype", OFTString);
+    
+      addSimpleType(&oTypes, "KBISPENR", "bispedømmenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "KILDEPRIVATVANNF", "kildePrivatVannforsyning", OFTInteger);
+    
+      addSimpleType(&oTypes, "KJELLER", "kjeller", OFTInteger);
+    
+      addSimpleType(&oTypes, "KJERNEOMRÅDESTATUS", "kjerneområdestatus", OFTString);
+    
+      addSimpleType(&oTypes, "KJØKKENTILGANG", "kjøkkentilgang", OFTInteger);
+    
+      addSimpleType(&oTypes, "KLASSIFISERING", "kulturlandskapKlassifisering", OFTString);
+    
+      addSimpleType(&oTypes, "KLOR_FØR_FORBRUK", "klorKontakttidFørForbruk", OFTInteger);
+    
+      addSimpleType(&oTypes, "KLORO_MAKS", "klorofyllMaksimum", OFTInteger);
+    
+      addSimpleType(&oTypes, "KLOTPAR", "klotoideParameter", OFTReal);
+    
+      addSimpleType(&oTypes, "KLOTRAD1", "klotoideRadius 1", OFTReal);
+    
+      addSimpleType(&oTypes, "KLOTRAD2", "klotoideRadius 2", OFTReal);
+    
+      addSimpleType(&oTypes, "RUTEVANSKELIGHETSGRAD", "rutevanskelighetsgrad", OFTString);
+    
+      addSimpleType(&oTypes, "RWY_BÆREEVNE_BEN", "bæreevnebenevnelse", OFTString);
+    
+      addSimpleType(&oTypes, "RWY_TYPE", "rullebaneType", OFTString);
+    
+      addSimpleType(&oTypes, "RWYMERK", "rullebaneoppmerking", OFTInteger);
+    
+      addSimpleType(&oTypes, "RYDDEBREDDE", "ryddebredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "RØR_ENDE_PKT", "ledningsendepunkt", OFTString);
+    
+      addSimpleType(&oTypes, "RØR_START_PKT", "ledningsstartpunkt", OFTString);
+    
+      addSimpleType(&oTypes, "RØRLEDNINGSTYPE", "rørledningstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SAK_AVSLUTT", "sakAvsluttet", OFTString);
+    
+      addSimpleType(&oTypes, "SAKSNR", "saksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SAKSOMF", "saksomfang", OFTInteger);
+    
+      addSimpleType(&oTypes, "SAKSTYPE", "sakstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SALINITET", "salinitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SAT_KOM_ID", "satellittkommunikasjonsId", OFTString);
+    
+      addSimpleType(&oTypes, "SCANNEROPPLØSNING", "scanneroppløsning", OFTReal);
+    
+      addSimpleType(&oTypes, "SEDDYBDEME", "sedDybdeMeter", OFTReal);
+    
+      addSimpleType(&oTypes, "SEDDYBDEMS", "sedDybdeMillisekund", OFTReal);
+    
+      addSimpleType(&oTypes, "SEDKORNSTR", "sedKornstorrelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEDMEKTME", "sedMektighetMeter", OFTReal);
+    
+      addSimpleType(&oTypes, "SEDMEKTMS", "sedMektighetMillisekund", OFTReal);
+    
+      addSimpleType(&oTypes, "SEFRAK_FUNK_KODE", "sefrakFunksjonsKode", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEFRAK_FUNK_STAT", "sefrakFunksjonsstatus", OFTString);
+    
+      addSimpleType(&oTypes, "KM_ANTALL", "kulturminneAntall", OFTInteger);
+    
+      addSimpleType(&oTypes, "KM_BETEGN", "kulturminneBetegnelse", OFTString);
+    
+      addSimpleType(&oTypes, "KM_DAT", "kulturminneDatering", OFTString);
+    
+      addSimpleType(&oTypes, "KM_DATKVAL", "kulturminneDateringKvalitet", OFTString);
+    
+      addSimpleType(&oTypes, "KM_FUNK_NÅ", "kulturminneNåværendeFunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "KM_FUNK_OP", "kulturminneOpprinneligFunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "KM_HOVEDGRUPPE", "kulturminneHovedgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "KM_KATEGORI", "kulturminneKategori", OFTString);
+    
+      addSimpleType(&oTypes, "KM_MAT", "kulturminneHovedMateriale", OFTString);
+    
+      addSimpleType(&oTypes, "KM_SYNLIG", "kulturminneSynlig", OFTString);
+    
+      addSimpleType(&oTypes, "KM_VERNEVERDI", "kulturminneVerneverdi", OFTString);
+    
+      addSimpleType(&oTypes, "KODDRIFT", "landbruksregBedriftskode", OFTInteger);
+    
+      addSimpleType(&oTypes, "KOM_KALLSIGNAL", "komKallSignal", OFTString);
+    
+      addSimpleType(&oTypes, "KOM_KANAL", "komKanal", OFTString);
+    
+      addSimpleType(&oTypes, "KOMM", "kommunenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "KOMM_ALT_AREAL", "kommAlternativtAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "KOMM_ALT_AREAL2", "kommAlternativtAreal2", OFTReal);
+    
+      addSimpleType(&oTypes, "KOMMENTAR", "kommentar", OFTString);
+    
+      addSimpleType(&oTypes, "KOMMENTAR_TYPE", "kommentarType", OFTString);
+    
+      addSimpleType(&oTypes, "KOMMSEK", "kommuneSekundær", OFTInteger);
+    
+      addSimpleType(&oTypes, "KOMPONENT", "komponent", OFTString);
+    
+      addSimpleType(&oTypes, "KONSTA1", "konstantA1", OFTReal);
+    
+      addSimpleType(&oTypes, "KONSTA2", "konstantA2", OFTReal);
+    
+      addSimpleType(&oTypes, "KONSTB1", "konstantB1", OFTReal);
+    
+      addSimpleType(&oTypes, "KONSTB2", "konstantB2", OFTReal);
+    
+      addSimpleType(&oTypes, "KONSTC1", "konstantC1", OFTReal);
+    
+      addSimpleType(&oTypes, "KONSTC2", "konstantC2", OFTReal);
+    
+      addSimpleType(&oTypes, "KONTAKTPERSON", "kontaktperson", OFTString);
+    
+      addSimpleType(&oTypes, "KOORDKVALKODE", "koordinatkvalitetKode", OFTString);
+    
+      addSimpleType(&oTypes, "KOPIDATO", "kopidato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "KOPL_BRU", "koplingBruksområde", OFTString);
+    
+      addSimpleType(&oTypes, "KOPL_KAT", "koplingskategori", OFTInteger);
+    
+      addSimpleType(&oTypes, "KOPL_NAV", "koplingsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "KOPL_TYP", "koplingstype", OFTString);
+    
+      addSimpleType(&oTypes, "KORTNAVN", "kortnavn", OFTString);
+    
+      addSimpleType(&oTypes, "KOSTHOLDART", "kostholdArt", OFTString);
+    
+      addSimpleType(&oTypes, "KOSTHOLDSRÅDTYPE", "kostholdsrådType", OFTInteger);
+    
+      addSimpleType(&oTypes, "KP", "knutePunkt", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPANGITTHENSYN", "angittHensyn", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPAREALFORMÅL", "arealformål", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPBÅNDLEGGING", "båndlegging", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPDETALJERING", "detaljering", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPFARE", "fare", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPGJENNOMFØRING", "gjennomføring", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPINFRASTRUKTUR", "infrastruktur", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPINFRASTRUKTURLINJE", "infrastrukturLinje", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPJURLINJE", "juridisklinje", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPRESTENAVN", "prestegjeldnavn", OFTString);
+    
+      addSimpleType(&oTypes, "KPRESTENR", "prestegjeldnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPROSTINAVN", "prostinavn", OFTString);
+    
+      addSimpleType(&oTypes, "KPROSTINR", "prostinummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPSIKRING", "sikring", OFTInteger);
+    
+      addSimpleType(&oTypes, "KPSTØY", "støy", OFTInteger);
+    
+      addSimpleType(&oTypes, "KRAFTVERKTYP", "kraftverktype", OFTString);
+    
+      addSimpleType(&oTypes, "KRETSNAVN", "kretsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "KRETSNUMMER", "kretsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "KRETSTYPEKODE", "kretstypekode", OFTString);
+    
+      addSimpleType(&oTypes, "KRETSTYPENAVN", "kretstypenavn", OFTString);
+    
+      addSimpleType(&oTypes, "KULT_HIST_INT", "kulturhistoriskInteresse", OFTString);
+    
+      addSimpleType(&oTypes, "KVIKKLEIRESVURD", "stabilitetVurderingKvikkleire", OFTInteger);
+    
+      addSimpleType(&oTypes, "KYSTKONSTRUKSJONSTYPE", "kystkonstruksjonstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "KYSTREF", "kystreferanse", OFTString);
+    
+      addSimpleType(&oTypes, "KYSTTYP", "kysttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "KYSTVERKSDISTRIKT", "kystverksdistrikt", OFTInteger);
+    
+      addSimpleType(&oTypes, "LAGRET_DATO", "lagretDato", OFTDate);
+    
+      addSimpleType(&oTypes, "LAND1", "førsteLand", OFTString);
+    
+      addSimpleType(&oTypes, "LAND2", "annetLand", OFTString);
+    
+      addSimpleType(&oTypes, "LANDEMERKEKATEGORI", "landeberkekategori", OFTInteger);
+    
+      addSimpleType(&oTypes, "LANDKODE", "landkode", OFTString);
+    
+      addSimpleType(&oTypes, "LATERALMERKETYPE", "lateralmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LDEL", "landsdelområde", OFTInteger);
+    
+      addSimpleType(&oTypes, "LEDN_BRU", "ledningbruksområde", OFTString);
+    
+      addSimpleType(&oTypes, "LEDN_NAV", "ledningsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "LEDN_TYP", "ledningstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LEDNINGSEIER", "ledningseier", OFTString);
+    
+      addSimpleType(&oTypes, "LEKEREKRTYPE", "lekeRekreasjonstype", OFTString);
+    
+      addSimpleType(&oTypes, "LENGDE", "lengde", OFTReal);
+    
+      addSimpleType(&oTypes, "LENGDEENHET", "lengdeenhet", OFTString);
+    
+      addSimpleType(&oTypes, "LENGDEOVERLAPP", "lengdeoverlapp", OFTInteger);
+    
+      addSimpleType(&oTypes, "LENGDESEKTORLINJE1", "lengdeSektorlinje1", OFTReal);
+    
+      addSimpleType(&oTypes, "LENGDESEKTORLINJE2", "lengdeSektorlinje2", OFTReal);
+    
+      addSimpleType(&oTypes, "LETE_AREAL", "leteareal", OFTReal);
+    
+      addSimpleType(&oTypes, "LH_BEREDSKAP", "lufthavnBeredskapskode", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHAREAL", "lufthavnArealer", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHDISTTYPE", "lufthavndistansetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHELEV", "lufthavnelevasjon", OFTReal);
+    
+      addSimpleType(&oTypes, "LHFDET", "lufthavnForsvarsObjektDetalj", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHFM_TYPE", "lufthavnFastmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHINST_TYPE", "lufthavnInstrumenteringType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHLYS_OPPHØYD_NEDFELT", "lufthavnLysOpphøydNedfelt", OFTString);
+    
+      addSimpleType(&oTypes, "LHLYSFARGE", "lufthavnlysFarge", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHLYSRETN", "lufhavnLysretning", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHLYSTYPE", "lufthavnlystype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHSKILTKATEGORI", "lufthavnskiltkatagori", OFTInteger);
+    
+      addSimpleType(&oTypes, "LHSKILTLYS", "lufthavnskiltlys", OFTString);
+    
+      addSimpleType(&oTypes, "LHSKILTTYPE", "lufthavnskilttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "LINEAMENTTYPE", "lineamentType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LINK", "link", OFTString);
+    
+      addSimpleType(&oTypes, "LJORDKL", "lokalJordressurs", OFTInteger);
+    
+      addSimpleType(&oTypes, "LJORDKL_A", "nedklassifiseringLokalJordressurs", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOK_NAVN", "lokalitetsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "LOK_NR", "lokalitetsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOSLIGHET", "loslighetGrad", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOSMKORNSTR", "losmKornstorrelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOSMOVERFLATETYPE", "losmOverflateType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOVDISP", "dispensasjonType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LOVREFBESKRIVELSE", "lovreferanseBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "LOVREFERANSE", "lovreferanseType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LR_AKTIV", "landbruksregAktiv", OFTInteger);
+    
+      addSimpleType(&oTypes, "LR_TYPE", "landbruksregType", OFTInteger);
+    
+      addSimpleType(&oTypes, "LRV", "vannstandLavestRegulert", OFTReal);
+    
+      addSimpleType(&oTypes, "LUFTHAVNHINDERTREGRUPPE", "lufthavnhinderTregruppe", OFTString);
+    
+      addSimpleType(&oTypes, "LVANN", "vannstandLavestRegistrert", OFTReal);
+    
+      addSimpleType(&oTypes, "LYSHØYDE", "lyshøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "LØPENR", "bruksenhetLøpenr", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAGASINNR", "magasinNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAKSHØYDE", "makshøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "MAKSIMALREKKEVIDDE", "maksimalRekkevidde", OFTReal);
+    
+      addSimpleType(&oTypes, "MAKSSNØHØYDE", "maksSnøhøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "MANGELMATRIKKELFØRINGSKRAV", "mangelMatrikkelføringskrav", OFTString);
+    
+      addSimpleType(&oTypes, "MARKID", "jordregisterMarkslagKobling", OFTInteger);
+    
+      addSimpleType(&oTypes, "MARKSLAGAVGRTYPE", "markslagAvgrensingType", OFTInteger);
+    
+      addSimpleType(&oTypes, "MASSEENHET", "masseenhet", OFTString);
+    
+      addSimpleType(&oTypes, "MATERIALE", "materialeBolt", OFTInteger);
+    
+      addSimpleType(&oTypes, "MATERIALE_YTTERV", "materialeYttervegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "MATR_KODE", "materiellkode", OFTString);
+    
+      addSimpleType(&oTypes, "MATRIKKELKOMMUNE", "matrikkelkommune", OFTInteger);
+    
+      addSimpleType(&oTypes, "MATRTYPE", "materialType", OFTInteger);
+    
+      addSimpleType(&oTypes, "MATRUNTYPE", "materialUndertype", OFTString);
+    
+      addSimpleType(&oTypes, "MAX_ELEMENT_PKT", "maksAntallPunktGeometritype1", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAX_OBJEKT_PKT", "maksAntallPunktGeometritype2", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAX_REF_OBJEKT", "maksAntallGeometriReferanse", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAX-AVVIK", "maksimaltAvvik", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAX-N", "maksimumNord", OFTInteger);
+    
+      addSimpleType(&oTypes, "MAX-Ø", "maksimumØst", OFTInteger);
+    
+      addSimpleType(&oTypes, "MEDIUM", "medium", OFTString);
+    
+      addSimpleType(&oTypes, "MEKT50", "mektighetFemtiProsent", OFTReal);
+    
+      addSimpleType(&oTypes, "MERKEFORM", "merkeform", OFTInteger);
+    
+      addSimpleType(&oTypes, "MERKELISTENUMMER", "merkelistenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "MERKEMØNSTER", "merkemønster", OFTInteger);
+    
+      addSimpleType(&oTypes, "METADATALINK", "metadatalink", OFTString);
+    
+      addSimpleType(&oTypes, "METALINTYP", "metamorfLinjetype", OFTString);
+    
+      addSimpleType(&oTypes, "METAMOGRAD", "metamorfGrad", OFTInteger);
+    
+      addSimpleType(&oTypes, "METER-FRA", "veglenkeMeterFra", OFTInteger);
+    
+      addSimpleType(&oTypes, "METER-TIL", "veglenkeMeterTil", OFTInteger);
+    
+      addSimpleType(&oTypes, "MGENHETBESKRIV", "mgEnhetBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "MGENHETOPPLOSN", "mgEnhetOpplosning", OFTInteger);
+    
+      addSimpleType(&oTypes, "MGINSTRUMENT", "mgInstrument", OFTString);
+    
+      addSimpleType(&oTypes, "MGLINJENR", "mgLinjenummer", OFTString);
+    
+      addSimpleType(&oTypes, "MGPOSNR", "mgPosisjonnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "MGTOKTNR", "mgToktnummer", OFTString);
+    
+      addSimpleType(&oTypes, "MILITÆRØVELSETYPE", "militærøvelsetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "MILJOTIL", "miljøtiltak", OFTInteger);
+    
+      addSimpleType(&oTypes, "MINHØYDE", "minhøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "MIN-N", "minimumNord", OFTInteger);
+    
+      addSimpleType(&oTypes, "MIN-Ø", "minimumØst", OFTInteger);
+    
+      addSimpleType(&oTypes, "MYNDIGHET", "vedtaksmyndighet", OFTString);
+    
+      addSimpleType(&oTypes, "MYR", "myrklassifikasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "MÅLEMETODE", "målemetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "MÅLESTOKK", "målestokk", OFTInteger);
+    
+      addSimpleType(&oTypes, "MÅLTALL", "måltall", OFTReal);
+    
+      addSimpleType(&oTypes, "NASJONALTOPPMERKETYPE", "nasjonalToppmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "NASJVIKTIG", "rastoffViktighetOmfang", OFTString);
+    
+      addSimpleType(&oTypes, "NAVIGASJONSINSTALLASJONSEIER", "navigasjonsinstallasjonseier", OFTString);
+    
+      addSimpleType(&oTypes, "NAVLYS_KARAKTER", "navigasjonslyskarakter", OFTInteger);
+    
+      addSimpleType(&oTypes, "NAVLYSTYPE", "navlysType", OFTInteger);
+    
+      addSimpleType(&oTypes, "NAVN", "navn", OFTString);
+    
+      addSimpleType(&oTypes, "NAVNTYPE", "navnetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "NEDSENKETKANTSTEIN", "nedsenketKantstein", OFTString);
+    
+      addSimpleType(&oTypes, "NEDSTENGT_DATO", "nedstengtDato", OFTDate);
+    
+      addSimpleType(&oTypes, "NETT_NIV", "ledningsnettNivå", OFTString);
+    
+      addSimpleType(&oTypes, "NEVNER", "nevner", OFTReal);
+    
+      addSimpleType(&oTypes, "NOMINELLREKKEVIDDE", "nominellRekkevidde", OFTReal);
+    
+      addSimpleType(&oTypes, "NORD", "nord", OFTInteger);
+    
+      addSimpleType(&oTypes, "NYMATRIKULERT", "nymatrikulert", OFTString);
+    
+      addSimpleType(&oTypes, "NÆRINGSGRUPPE", "næringsgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "NØYAKTIGHET", "nøyaktighet", OFTInteger);
+    
+      addSimpleType(&oTypes, "NØYAKTIGHETSKLASSE", "nøyaktighetsklasse", OFTInteger);
+    
+      addSimpleType(&oTypes, "NÅVÆRENDE_AREAL", "nåværendeAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "OBJTYPE", "objekttypenavn", OFTString);
+    
+      addSimpleType(&oTypes, "OBSERVERTFLOM", "observertFlom", OFTReal);
+    
+      addSimpleType(&oTypes, "OBSLINID", "obsLinId", OFTString);
+    
+      addSimpleType(&oTypes, "OMKRETSINNSJØ", "omkretsInnsjø", OFTInteger);
+    
+      addSimpleType(&oTypes, "OMRKODE", "reinbeiteområdeID", OFTString);
+    
+      addSimpleType(&oTypes, "OMRNAVN", "områdenavn", OFTString);
+    
+      addSimpleType(&oTypes, "OMRTYPE", "dumpefelttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "OMRÅDEID", "områdeid", OFTInteger);
+    
+      addSimpleType(&oTypes, "OMTVISTET", "omtvistet", OFTString);
+    
+      addSimpleType(&oTypes, "OPAREALAVGRTYPE", "operativArealavgrensningtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPERATØR", "petroleumsoperatør", OFTString);
+    
+      addSimpleType(&oTypes, "OPLAREAL", "arealbruk", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPLAREALUTDYP", "arealbruksutdyping", OFTString);
+    
+      addSimpleType(&oTypes, "OPLRESTR", "arealbruksrestriksjoner", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPLRETNL", "arealbruksretningslinjer", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPARBEIDING", "opparbeiding", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPDATERINGSDATO", "oppdateringsdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "OPPDRAGSGIVER", "oppdragsgiver", OFTString);
+    
+      addSimpleType(&oTypes, "OPPGITTAREAL", "oppgittAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "OPPHAV", "opphav", OFTString);
+    
+      addSimpleType(&oTypes, "OPPMÅLINGIKKEFULLFØRT", "oppmålingIkkeFullført", OFTString);
+    
+      addSimpleType(&oTypes, "OPPMÅLTKOTE", "oppmåltKote", OFTReal);
+    
+      addSimpleType(&oTypes, "OPPMÅLTÅR", "oppmåltÅr", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPRETTET_AAR", "opprettetÅr", OFTDate);
+    
+      addSimpleType(&oTypes, "OPPRINNELIGBILDEFORMAT", "bildeType", OFTString);
+    
+      addSimpleType(&oTypes, "OPPRINNELIGBILDESYS", "BildeSystem", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPRINNELIGSOSIALTMILJØ", "opprinneligSosialtMiljø", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPRINNELSE", "opprinnelse", OFTString);
+    
+      addSimpleType(&oTypes, "OPPSTARTSÅR", "oppstartsår", OFTDate);
+    
+      addSimpleType(&oTypes, "OPPTAKSMETODE", "opptaksmetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "OPPVARMING", "oppvarming", OFTString);
+    
+      addSimpleType(&oTypes, "ORGANISK", "organiskAndel", OFTInteger);
+    
+      addSimpleType(&oTypes, "ORGNR", "organsisasjonsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "ORIENTERINGSDATA", "orienteringsdata", OFTString);
+    
+      addSimpleType(&oTypes, "ORIENTERINGSMETODE", "orienteringsmetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "ORIGINALDATAVERT", "originalDatavert", OFTString);
+    
+      addSimpleType(&oTypes, "ORIGO-N", "origoNord", OFTInteger);
+    
+      addSimpleType(&oTypes, "ORIGO-Ø", "origoØst", OFTInteger);
+    
+      addSimpleType(&oTypes, "OVERGRUPPE", "overgruppeNavn", OFTString);
+    
+      addSimpleType(&oTypes, "PBTILTAK", "tiltakstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "PETLITOKODE", "petrofLitologi", OFTString);
+    
+      addSimpleType(&oTypes, "PETMETAKODE", "petrofMetamorfose", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUM_KOORD_STATUS", "petroleumKoordinatstatus", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMLEDNINGFUNKSJON", "petroleumsledningsfunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMLEDNINGTYPE", "petroleumsledningstype", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMSANDEL", "petroleumsandel", OFTReal);
+    
+      addSimpleType(&oTypes, "PETROLEUMSDATAKILDE", "petroleumsdatakilde", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMSFELTNAVN", "petroleumsfeltnavn", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMSFELTTYPE", "petroleumsfelttype", OFTString);
+    
+      addSimpleType(&oTypes, "PETROLEUMSPARTNERE", "petroleumspartnere", OFTString);
+    
+      addSimpleType(&oTypes, "PETSTRATKODE", "petrofStratigrafi", OFTString);
+    
+      addSimpleType(&oTypes, "PILARKATEGORI", "pilarkategori", OFTInteger);
+    
+      addSimpleType(&oTypes, "PIXEL-STØRR", "pixelstørrelse", OFTReal);
+    
+      addSimpleType(&oTypes, "PLANBEST", "planbestemmelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLANERING", "planeringsgrad", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLANID", "planidentifikasjon", OFTString);
+    
+      addSimpleType(&oTypes, "PLANNAVN", "plannavn", OFTString);
+    
+      addSimpleType(&oTypes, "FORSLAGSSTILLERTYPE", "forslagsstillerType", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLANSTAT", "planstatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLANTYPE", "plantype", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLASS", "plasseringskode", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLFMERK", "oppstillingplattformmerking", OFTInteger);
+    
+      addSimpleType(&oTypes, "PLOGSJIKTTEKSTUR", "plogsjiktTekstur", OFTInteger);
+    
+      addSimpleType(&oTypes, "POBS", "observasjonstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "POLITIDISTRIKTID", "politidistriktId", OFTInteger);
+    
+      addSimpleType(&oTypes, "POS_KVAL", "posisjonKvalitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "POS_TYPE", "posisjonType", OFTInteger);
+    
+      addSimpleType(&oTypes, "BITS_PR_PIXEL", "bitsPrPixel", OFTInteger);
+    
+      addSimpleType(&oTypes, "POSTNAVN", "poststedsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "POSTNR", "postnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "PREPARERING", "løypepreparering", OFTString);
+    
+      addSimpleType(&oTypes, "PRIMÆRSTREKNINGSNUMMER", "primærstrekningsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "PRIOMR", "prioritetområde", OFTString);
+    
+      addSimpleType(&oTypes, "PRIORITET", "kulturlandskapPrioritet", OFTString);
+    
+      addSimpleType(&oTypes, "PRIVAT_KLOAKKR", "privatKloakkRensing", OFTInteger);
+    
+      addSimpleType(&oTypes, "PRODUKT", "produkt", OFTString);
+    
+      addSimpleType(&oTypes, "PRODUKT_FULLT_NAVN", "produktFullstendigNavn", OFTString);
+    
+      addSimpleType(&oTypes, "PRODUKTGRUPPE", "produktgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "PRODUSENT", "geodataprodusent", OFTString);
+    
+      addSimpleType(&oTypes, "PROJEK", "projeksjon", OFTString);
+    
+      addSimpleType(&oTypes, "PROSELV", "prosentElv", OFTReal);
+    
+      addSimpleType(&oTypes, "PROSESS_HISTORIE", "prosesshistorie", OFTString);
+    
+      addSimpleType(&oTypes, "PROSHAV", "prosentHav", OFTReal);
+    
+      addSimpleType(&oTypes, "PROSINNSJØ", "prosentInnsjø", OFTReal);
+    
+      addSimpleType(&oTypes, "PROSJEKTNAVN", "prosjektnavn", OFTString);
+    
+      addSimpleType(&oTypes, "PROSJEKTSTART", "prosjektstartår", OFTInteger);
+    
+      addSimpleType(&oTypes, "PROSLAND", "prosentLand", OFTReal);
+    
+      addSimpleType(&oTypes, "PROSTINUMMER", "prostinummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "PROVEMATR", "proveMaterial", OFTString);
+    
+      addSimpleType(&oTypes, "PTYPE", "punktType", OFTString);
+    
+      addSimpleType(&oTypes, "PUKKVERKTYPE", "pukkverktype", OFTInteger);
+    
+      addSimpleType(&oTypes, "PUMPER_NØDSTR", "pumperNødstrøm", OFTString);
+    
+      addSimpleType(&oTypes, "PUMPES_VANNET", "pumperVannet", OFTString);
+    
+      addSimpleType(&oTypes, "PUNKTBESKR", "punktBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "PUNKTFESTE", "punktfeste", OFTString);
+    
+      addSimpleType(&oTypes, "PÅVIRKNINGSGRAD", "påvirkningsgrad", OFTInteger);
+    
+      addSimpleType(&oTypes, "R_FNR", "forekomstNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "R_LNR", "lokalNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "R_ONR", "omrNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "R_PNR", "proveNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "R_RESERVER", "rastoffReserver", OFTInteger);
+    
+      addSimpleType(&oTypes, "RACONFREKVENSBÅND", "raconFrekvensbånd", OFTString);
+    
+      addSimpleType(&oTypes, "RACONKARAKTER", "raconkarakter", OFTString);
+    
+      addSimpleType(&oTypes, "RACONMORSETEGN", "raconmorsetegn", OFTString);
+    
+      addSimpleType(&oTypes, "RACONRESPONSINTERVALL", "raconresponsintervall", OFTString);
+    
+      addSimpleType(&oTypes, "RACONTYPE", "racontype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RADAR_FYR_TYPE", "radarfyrtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RADARREFLEKTOR", "radarReflektor", OFTString);
+    
+      addSimpleType(&oTypes, "RADARSTASJONSTYPE", "radarstasjonstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RADIO_FYR_TYPE", "radiofyrtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RADIOAKTIV", "radioaktivitetNiva", OFTInteger);
+    
+      addSimpleType(&oTypes, "RADIOFYRMODULASJON", "radiofyrmodulasjon", OFTString);
+    
+      addSimpleType(&oTypes, "RADIUS", "radius", OFTReal);
+    
+      addSimpleType(&oTypes, "RADRISKOMR", "naturlRadioaktivStraling", OFTInteger);
+    
+      addSimpleType(&oTypes, "RAPPORTERINGSÅR", "rapporteringsår", OFTDate);
+    
+      addSimpleType(&oTypes, "REFERANSE", "referanse", OFTString);
+    
+      addSimpleType(&oTypes, "REFERANSENUMMER", "referansenummer", OFTString);
+    
+      addSimpleType(&oTypes, "REGFORM", "reguleringsformål", OFTInteger);
+    
+      addSimpleType(&oTypes, "REGFORMUTDYP", "reguleringsformålsutdyping", OFTString);
+    
+      addSimpleType(&oTypes, "REGISTRERINGKRETSNR", "registreringKretsnr", OFTInteger);
+    
+      addSimpleType(&oTypes, "REGISTRERT_DATO", "registrertDato", OFTDate);
+    
+      addSimpleType(&oTypes, "REGMETOD", "registreringsmetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "REGULERTHØYDE", "regulertHøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "REINDRIFTANLTYP", "reindriftsanleggstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "REINDRIFTKONNAVN", "reindriftKonvensjonsområdenavn", OFTString);
+    
+      addSimpleType(&oTypes, "REKKEVIDDEGRØNN", "rekkeviddeGrønn", OFTReal);
+    
+      addSimpleType(&oTypes, "REKKEVIDDEGUL", "rekkeviddeGul", OFTReal);
+    
+      addSimpleType(&oTypes, "REKKEVIDDEHVIT", "rekkeviddeHvit", OFTReal);
+    
+      addSimpleType(&oTypes, "REKKEVIDDERØD", "rekkeviddeRød", OFTReal);
+    
+      addSimpleType(&oTypes, "RENHET", "retningsenhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "RENOVASJON", "renovasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "RESIPIENTTYPE", "resipienttype", OFTString);
+    
+      addSimpleType(&oTypes, "RESTR_OMR", "restriksjonsområde", OFTString);
+    
+      addSimpleType(&oTypes, "RESTRIKSJONSTYPE", "restriksjonstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RET_SYS", "retningsreferanse", OFTInteger);
+    
+      addSimpleType(&oTypes, "RETN", "retningsverdi", OFTReal);
+    
+      addSimpleType(&oTypes, "RETNINGSEKTORLINJE1", "retningSektorlinje1", OFTReal);
+    
+      addSimpleType(&oTypes, "RETNINGSEKTORLINJE2", "retningSektorlinje2", OFTReal);
+    
+      addSimpleType(&oTypes, "RISIKOVURDERING", "risikovurdering", OFTString);
+    
+      addSimpleType(&oTypes, "RKB", "rkb", OFTReal);
+    
+      addSimpleType(&oTypes, "RKB_TD", "rkbTotaltDyp", OFTReal);
+    
+      addSimpleType(&oTypes, "ROTASJON", "rotasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPANGITTHENSYN", "angitthensyn", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPAREALFORMÅL", "arealformål", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPBÅNDLEGGING", "båndlegging", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPDETALJERING", "detaljering", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPFARE", "fare", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPGJENNOMFØRING", "gjennomføring", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPINFRASTRUKTUR", "infrastruktur", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPJURLINJE", "juridisklinje", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPJURPUNKT", "juridiskpunkt", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPPÅSKRIFTTYPE", "påskriftType", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPSIKRING", "sikring", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPSTØY", "støy", OFTInteger);
+    
+      addSimpleType(&oTypes, "RSL_JREG", "referansesystemForLandskapJordbruksregioner", OFTString);
+    
+      addSimpleType(&oTypes, "RSL_REG", "referansesystemForLandskapRegioner", OFTString);
+    
+      addSimpleType(&oTypes, "RSL_UREG", "referansesystemForLandskapUReg", OFTString);
+    
+      addSimpleType(&oTypes, "RTALLHØY", "reintallHøyeste", OFTInteger);
+    
+      addSimpleType(&oTypes, "RTALLVEDTAK", "reintallVedtak", OFTString);
+    
+      addSimpleType(&oTypes, "RULLEBANEDISTANSETYPE", "rullebanedistansetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "RULLEBANERETNING", "rullebaneretning", OFTInteger);
+    
+      addSimpleType(&oTypes, "RUTEBREDDE", "rutebredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "RUTEFØLGER", "ruteFølger", OFTString);
+    
+      addSimpleType(&oTypes, "RUTEMERKING", "ruteMerking", OFTString);
+    
+      addSimpleType(&oTypes, "RUTENETTYPE", "rutenettype", OFTString);
+    
+      addSimpleType(&oTypes, "RUTENR", "rutenummer", OFTString);
+    
+      addSimpleType(&oTypes, "SEFRAK_TILTAK", "sefrakTiltak", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEFRAKBREDDE", "sefrakbredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEFRAKKOMMUNE", "sefrakKommune", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEFRAKLENGDE", "sefraklengde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEIL_BREDDE", "seilingsbredde", OFTReal);
+    
+      addSimpleType(&oTypes, "SEIL_DYBDE", "seilingsdybde", OFTReal);
+    
+      addSimpleType(&oTypes, "SEKSJONERT", "seksjonert", OFTString);
+    
+      addSimpleType(&oTypes, "SEKTORTEKST", "sektortekst", OFTString);
+    
+      addSimpleType(&oTypes, "SEKUNDÆRSTREKNINGSNUMMER", "sekundærstrekningsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SENTRUMSSONENAVN", "sentrumssonenavn", OFTString);
+    
+      addSimpleType(&oTypes, "SENTRUMSSONENUMMER", "sentrumssonenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEPTIKTANK", "septiktank", OFTString);
+    
+      addSimpleType(&oTypes, "SERIEKODE1", "serie1", OFTString);
+    
+      addSimpleType(&oTypes, "SERIEKODE2", "serie2", OFTString);
+    
+      addSimpleType(&oTypes, "SERIEKODE3", "serie3", OFTString);
+    
+      addSimpleType(&oTypes, "SERVMERK", "servituttMerknad", OFTString);
+    
+      addSimpleType(&oTypes, "SERVTYPE", "servituttType", OFTString);
+    
+      addSimpleType(&oTypes, "SESOMR", "reindriftSesongområde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SFOTRUTETYPE", "spesialFotrutetype", OFTString);
+    
+      addSimpleType(&oTypes, "SIDEOVERLAPP", "sideoverlapp", OFTInteger);
+    
+      addSimpleType(&oTypes, "SIGNALGRUPPE", "signalgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "SIGNALNR", "signalnummer", OFTString);
+    
+      addSimpleType(&oTypes, "SIGNALPERIODE", "signalperiode", OFTString);
+    
+      addSimpleType(&oTypes, "SIGNALSEKVENS", "signalsekvens", OFTString);
+    
+      addSimpleType(&oTypes, "SIGNH", "signalHøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "SIGNHREF", "signalHøydeRef", OFTString);
+    
+      addSimpleType(&oTypes, "SIGNTYPE", "signalType", OFTString);
+    
+      addSimpleType(&oTypes, "SIKKERÅR", "ledningsalderReferanse", OFTInteger);
+    
+      addSimpleType(&oTypes, "SIKTEDYP", "sikteDyp", OFTInteger);
+    
+      addSimpleType(&oTypes, "SIST_VURDERT_AAR", "sistVurdertÅr", OFTDate);
+    
+      addSimpleType(&oTypes, "SISTBEFART", "sisteBefaringsdato", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØ_RESTRIKSJON", "sjørestriksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØ_SIGFRQ", "sjøsignalfrekvens", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØ_STATUS", "sjøstatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØ_TRAFIKK", "sjøtrafikk", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØMERKEFARGE", "sjømerkefarge", OFTInteger);
+    
+      addSimpleType(&oTypes, "SJØMERKESYSTEM", "sjømerkesystem", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKAL_AVGR_BYGN", "skalAvgrenseBygning", OFTString);
+    
+      addSimpleType(&oTypes, "SKALAENHET", "skalaenhet", OFTString);
+    
+      addSimpleType(&oTypes, "SKILTGRUPPE", "skiltgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "SKILØYPETYPE", "skiløypetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKJERMINGFUNK", "skjermingsfunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "SKOG", "jordregisterSkogtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKOGREIS", "jordregisterSkogreisningsmark", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKOLEKRETSTYPE", "skolekretsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDALDERBEST", "skredAlderBestemmelse", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDBESKRIVELSE", "skredBeskrivelse", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDBREDDE", "skredBredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDEVAKUERING", "skredEvakuering", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDFALLHØYDE", "skredFallhoyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDFAREGR_KL", "skredFaregradKlasse", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDFAREGRADSCORE", "skredFaregradScore", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDFAREVURD", "snoSteinSkredfareVurdering", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDKONSSCORE", "skredSkadKonsekvensScore", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDKVALKARTLEGGING", "skredKvalKartlegging", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDLENGDE", "skredLengde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDMALEMETODE", "skredMalemetode", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDOBSGUID", "skredObservasjonGUID", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDOMKOMNE", "skredAntallOmkomne", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDOMRID", "skredOmrID", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDOMRNAVN", "skredOmrNavn", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDREDNING", "skredRedning", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDRISIKO_KL", "skredRisikoKvikkleireKlasse", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSKADEANNEN", "skredSkadeAnnen", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSKADEOBJEKTER", "skredSkadeObjekter", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSKADESAMFERDSEL", "skredSkadeSamferdsel", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSKADETYPE", "skredSkadType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSKADKONS_KL", "skredSkadeKonsekvensKlasse", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDSTATSANN", "skredStatistikkSannsynlighet", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDTIDHENDELSE", "skredTidspunktHendelse", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDTIDUSIKKERH", "skredTidUsikkerhet", OFTString);
+    
+      addSimpleType(&oTypes, "SKREDTYPE", "skredtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDUTLOMRHELNING", "skredUtlosningOmrHelning", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDUTLOPOMRTYPE", "skredUtlopOmrType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDUTLOSNINGOMRTYPE", "skredUtlosningOmrType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKREDVOLUM", "skredVolum", OFTString);
+    
+      addSimpleType(&oTypes, "SKRETSNAVN", "skolekretsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "SKRETSNR", "skolekretsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKRIFTKODE", "presentasjonskode", OFTInteger);
+    
+      addSimpleType(&oTypes, "SKYLD", "skyld", OFTReal);
+    
+      addSimpleType(&oTypes, "SKYVGRINDL", "skyvegrenseInndeling", OFTInteger);
+    
+      addSimpleType(&oTypes, "SLUSETYP", "sluseType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SMÅBÅTHAVNFASILITET", "småbåthavnfasilitet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SNAVN", "stedsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "SNDATO", "statusdato", OFTDate);
+    
+      addSimpleType(&oTypes, "SNITT_HØ", "snitthøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SNKILDE", "stedsnavnkilde", OFTString);
+    
+      addSimpleType(&oTypes, "SNLØPENR", "arkivløpenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SNMERK", "stedsnavnmerknad", OFTString);
+    
+      addSimpleType(&oTypes, "SNMYND", "stedsnavnVedtaksmyndighet", OFTString);
+    
+      addSimpleType(&oTypes, "SNR", "seksjonsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SNREGDATO", "stedsnavnRegistreringsdato", OFTDate);
+    
+      addSimpleType(&oTypes, "SNSAKSNR", "arkivsaksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SNSKRSTAT", "stedsnavnSkrivemåtestatus", OFTString);
+    
+      addSimpleType(&oTypes, "SNSPRÅK", "språk", OFTString);
+    
+      addSimpleType(&oTypes, "SNTYSTAT", "stedsnavnTypestatus", OFTString);
+    
+      addSimpleType(&oTypes, "SNØSCOOTERLØYPETYPE", "snøscooterløypeType", OFTString);
+    
+      addSimpleType(&oTypes, "SOGNNUMMER", "sognnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "SONENAUT", "soneNautisk", OFTInteger);
+    
+      addSimpleType(&oTypes, "SONETYPE", "sonetype", OFTString);
+    
+      addSimpleType(&oTypes, "SOSIELEMENT", "sosiElementnavn", OFTString);
+    
+      addSimpleType(&oTypes, "SOSI-NIVÅ", "sosiKompleksitetNivå", OFTInteger);
+    
+      addSimpleType(&oTypes, "SOSI-VERSJON", "sosiVersjon", OFTString);
+    
+      addSimpleType(&oTypes, "SP_ABONTRE", "skogbrplanKlassAktueltTreslag", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_AGJBON", "skogbrplanKlassAktSnittBon", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_ALDER", "skogbrplanBeskrivBestandAlder", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_ANDEREG", "skogbrplanTreslagAntTreDaaEReg", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_ANDFREG", "skogbrplanTreslagAntTreDaaFReg", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_AVOLPRDA", "skogbrplanGrunnlagVolumDaaFelt", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_AVOLTOT", "skogbrplanGrunnlagVolumBestFelt", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BAREAL", "skogbrplanBeskrivBestandDaa", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_BERTYPE", "skogbrplanGrunnlagBerType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BESTDELNR", "skogbrplanBestandDelNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BESTNR", "skogbrplanBestandNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BEVNE", "skogbrplanTerrengBæreevneBestand", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BMIDDIAM", "skogbrplanBeskrivBestSnittDiam", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BMIDGRFL", "skogbrplanBeskrivBestandSnittM2", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BMIDHO", "skogbrplanBeskrivBestandSnittH", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_BRATT", "skogbrplanTerrengBestandBratthet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_BTILVPRDA", "skogbrplanTilvekstBeregnDaa", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_BTILVPROS", "skogbrplanTilvekstBeregnProsent", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_BVOLPRDA", "skogbrplanTilvekstBeregnM3", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_DENDR", "skogbrplanAdmDatoEndring", OFTDate);
+    
+      addSimpleType(&oTypes, "SP_DREG", "skogbrplanAdmDatoEtablering", OFTDate);
+    
+      addSimpleType(&oTypes, "SP_ELEMTYPE", "skogbrplanFlerKoderElementtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_FARAND", "skogbrplanFlerKoderArealProsent", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_FAREAL", "skogbrplanFlerKoderArealDaa", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_FRAND", "skogbrplanFlerKoderSpesBehPros", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_FRAREAL", "skogbrplanFlerKoderSpesBehDaa", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_GREND", "skogbrplanTeigGrend", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_GRFL", "skogbrplanTetthetGrunnflatesum", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_HBAR", "skogbrplanBeskrivBarHøydehkl2", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_HKL", "skogbrplanBeskrivHogstklasse", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_HLAUV", "skogbrplanBeskrivLauvHøydehkl2", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_HOVEDGR", "skogbrplanGrunnlagHovedgruppe", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_HOYDE", "skogbrplanTetthetMHøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_IMPANDEL", "skogbrplanKlassImpProsent", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_IMPTYPE", "skogbrplanKlassImpType", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_LILEN", "skogbrplanTerrengLiLengde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_MINTRSP", "skogbrplanTerrengMinTranspUtst", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_PBONTRE", "skogbrplanKlassPotTreslag", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_PGJBON", "skogbrplanKlassPotSnittBon", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_PRIO", "skogbrplanTiltakProritet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_REG", "skogbrplanGrunnlagRegion", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_SJIKT", "skogbrplanBeskrivSjiktning", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_SKOGTYP", "skogbrplanBeskrivSkogtype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_SUNNH", "skogbrplanBeskrivSunnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_SVPROS", "skogbrplanGrunnlagSvinnProsent", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TAKSTTYPE", "skogbrplanGrunnlagTaksttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TARAND", "skogbrplanTiltakProsent", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TAREAL", "skogbrplanTiltakAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "SP_TEIGNR", "skogbrplanTeigNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TERJEVN", "skogbrplanTerrengJevnhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TILT", "skogbrplanTiltakBestand", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TILVKOR", "skogbrplanGrunnlagTilvekstkorr", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TNAVN", "skogbrplanTeigNavn", OFTString);
+    
+      addSimpleType(&oTypes, "SP_TOTVOL", "skogbrplanTilvekstVolumBestand", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TREEREG", "skogbrplanBeskrivTreERegulering", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TREFREG", "skogbrplanBeskrivTreFRegulering", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TRESLAG", "skogbrplanTreslag", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_TRESLHO", "skogbrplanTreslagHøyde", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_VOLAND", "skogbrplanTreslagProsent", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_VOLKORR", "skogbrplanTreslagKorrVolumUBark", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_VOLSALG", "skogbrplanTreslagSalgsvolumUBark", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_VOLUKORR", "skogbrplanTreslagUkorrVolumUBark", OFTInteger);
+    
+      addSimpleType(&oTypes, "SP_AAR", "skogbrplanTiltakÅr", OFTInteger);
+    
+      addSimpleType(&oTypes, "SPERRING", "sperring", OFTString);
+    
+      addSimpleType(&oTypes, "SPES_SKILØYPETYPE", "spesialSkiløypetype", OFTString);
+    
+      addSimpleType(&oTypes, "SPESIALMERKETYPE", "spesialmerketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SPESIALSYKKELRUTETYPE", "spesialsykkelrutetype", OFTString);
+    
+      addSimpleType(&oTypes, "SPOR_HASTIGHET", "sporhastighet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SPORANTALL", "sporantall", OFTString);
+    
+      addSimpleType(&oTypes, "SPORAVGRENINGSNR", "sporavgreningsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "SPORAVGRENINGSPUNKTNR", "sporavgreningspunktnummer", OFTString);
+    
+      addSimpleType(&oTypes, "SPORAVGRENINGSPUNKTTYPE", "sporavgreningspunkttype", OFTString);
+    
+      addSimpleType(&oTypes, "SPORAVGRENINGSTYPE", "sporavgreningstype", OFTString);
+    
+      addSimpleType(&oTypes, "SPORKM", "sporKilometer", OFTReal);
+    
+      addSimpleType(&oTypes, "SPORNUMMER", "spornummer", OFTString);
+    
+      addSimpleType(&oTypes, "SPORPUNKTNUMMER", "sporpunktnummer", OFTString);
+    
+      addSimpleType(&oTypes, "SPORPUNKTTYPE", "sporpunkttype", OFTString);
+    
+      addSimpleType(&oTypes, "SPORTYPE", "sportype", OFTString);
+    
+      addSimpleType(&oTypes, "SSR-ID", "ssrId", OFTInteger);
+    
+      addSimpleType(&oTypes, "SSR-OBJID", "objId", OFTInteger);
+    
+      addSimpleType(&oTypes, "STANDARDENHET", "standardenhet", OFTString);
+    
+      addSimpleType(&oTypes, "STASJONSFORMÅL", "stasjonsformål", OFTString);
+    
+      addSimpleType(&oTypes, "STASJONSNR", "stasjonsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "STASJONSPARAMETER", "stasjonsparameter", OFTInteger);
+    
+      addSimpleType(&oTypes, "STASJONSTYPE", "stasjonstype", OFTString);
+    
+      addSimpleType(&oTypes, "STASJONTYP", "stasjonstype", OFTString);
+    
+      addSimpleType(&oTypes, "STAT", "typeStatus", OFTInteger);
+    
+      addSimpleType(&oTypes, "STATUS", "status", OFTString);
+    
+      addSimpleType(&oTypes, "STED", "sted", OFTString);
+    
+      addSimpleType(&oTypes, "STED_VERIF", "stedfestingVerifisert", OFTString);
+    
+      addSimpleType(&oTypes, "STENGESDATO", "stengesDato", OFTDate);
+    
+      addSimpleType(&oTypes, "STORBUE", "storbue", OFTInteger);
+    
+      addSimpleType(&oTypes, "STREKNINGSNUMMER", "strekningsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "STRENG", "generellTekststreng", OFTString);
+    
+      addSimpleType(&oTypes, "STRIPENUMMER", "stripenummer", OFTString);
+    
+      addSimpleType(&oTypes, "STRUKTUROVERBIKKET", "strukturOverbikket", OFTString);
+    
+      addSimpleType(&oTypes, "STRUKTURPUNKTTYPE", "strukturPunkttype", OFTInteger);
+    
+      addSimpleType(&oTypes, "STRØMHAST", "strømhastighet", OFTReal);
+    
+      addSimpleType(&oTypes, "STRØMRETN", "strømretning", OFTInteger);
+    
+      addSimpleType(&oTypes, "STØYENHET", "støyenhet", OFTString);
+    
+      addSimpleType(&oTypes, "STØYINTERVALL", "støyintervall", OFTInteger);
+    
+      addSimpleType(&oTypes, "STØYKILDE", "støykilde", OFTString);
+    
+      addSimpleType(&oTypes, "STØYKILDEIDENTIFIKASJON", "Støykildeidentifikasjon", OFTString);
+    
+      addSimpleType(&oTypes, "STØYKILDENAVN", "støykildenavn", OFTString);
+    
+      addSimpleType(&oTypes, "STØYMETODE", "støymetode", OFTString);
+    
+      addSimpleType(&oTypes, "STØYNIVÅ", "støynivå", OFTInteger);
+    
+      addSimpleType(&oTypes, "STØYSONEKATEGORI", "støysonekategori", OFTString);
+    
+      addSimpleType(&oTypes, "SUM_ALT_AREAL", "sumAlternativtAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "SUM_ALT_AREAL2", "sumAlternativtAreal2", OFTReal);
+    
+      addSimpleType(&oTypes, "SUM_ANTALLBOENH", "sumAntallBoenheter", OFTInteger);
+    
+      addSimpleType(&oTypes, "SUM_BRUKSARTOT", "sumBruksarealTotalt", OFTReal);
+    
+      addSimpleType(&oTypes, "SUM_BRUKSTILANN", "sumBruksarealTilAnnet", OFTReal);
+    
+      addSimpleType(&oTypes, "SUM_BRUKSTILBOL", "sumBruksarealTilBolig", OFTReal);
+    
+      addSimpleType(&oTypes, "SYKKELRUTETYPE", "sykkelrutetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "SYNBARHET", "synbarhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "SYSKODE", "referansesystemKode", OFTInteger);
+    
+      addSimpleType(&oTypes, "TAKFORM", "takform", OFTInteger);
+    
+      addSimpleType(&oTypes, "TAKSKJEGG", "takskjegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "TAKTEKKING", "taktekking", OFTInteger);
+    
+      addSimpleType(&oTypes, "TDIM-BREDDE", "tekstTegnbredde", OFTReal);
+    
+      addSimpleType(&oTypes, "TDIM-HØYDE", "tekstTegnhøyde", OFTReal);
+    
+      addSimpleType(&oTypes, "TEGNFORKL", "tegnforklaring", OFTString);
+    
+      addSimpleType(&oTypes, "TEGNSETT", "tegnsett", OFTString);
+    
+      addSimpleType(&oTypes, "TEIGE_ID", "teigEtterSkifteIdent", OFTInteger);
+    
+      addSimpleType(&oTypes, "TEIGF_ID", "teigFørSkitfeIdent", OFTInteger);
+    
+      addSimpleType(&oTypes, "TEIGFLEREMATRSAMMEEIER", "teigFlereMatrSammeEier", OFTString);
+    
+      addSimpleType(&oTypes, "TEIGMEDFLEREMATRENHETER", "teigMedFlereMatrikkelenheter", OFTString);
+    
+      addSimpleType(&oTypes, "TEIGNR", "jordregisterEiendomTeigNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "TEKSTURKODE1", "teksturkode", OFTString);
+    
+      addSimpleType(&oTypes, "TEKSTURKODE2", "teksturkode2", OFTString);
+    
+      addSimpleType(&oTypes, "TEKSTURKODE3", "teksturkode3", OFTString);
+    
+      addSimpleType(&oTypes, "TELEFAXNR", "telefaxnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "TELEFONNR", "telefonnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "TELLER", "teller", OFTReal);
+    
+      addSimpleType(&oTypes, "TEMAJUST", "geolTemajustering", OFTInteger);
+    
+      addSimpleType(&oTypes, "TEMAKVAL", "temaKvalitet", OFTString);
+    
+      addSimpleType(&oTypes, "TERSKELFUNKSJON", "terskelFunksjon", OFTString);
+    
+      addSimpleType(&oTypes, "TERSKELTYP", "terskelType", OFTString);
+    
+      addSimpleType(&oTypes, "TETTSTEDNAVN", "tettstednavn", OFTString);
+    
+      addSimpleType(&oTypes, "TIDOPPHOLDVANN", "tidOppholdVann", OFTInteger);
+    
+      addSimpleType(&oTypes, "TIDREF", "tidreferanse", OFTString);
+    
+      addSimpleType(&oTypes, "TIDSANGIVELSE", "tidsangivelse", OFTInteger);
+    
+      addSimpleType(&oTypes, "TIDSENHET", "tidsenhet", OFTString);
+    
+      addSimpleType(&oTypes, "TIDSLUTT", "periodeSlutt", OFTDateTime);
+    
+      addSimpleType(&oTypes, "TIDSPUNKT", "tidspunkt", OFTDateTime);
+    
+      addSimpleType(&oTypes, "TIDSTART", "periodeStart", OFTDateTime);
+    
+      addSimpleType(&oTypes, "TILDELT_AREAL", "tildeltAreal", OFTReal);
+    
+      addSimpleType(&oTypes, "TILDELT_DATO", "tilldeltDato", OFTDate);
+    
+      addSimpleType(&oTypes, "TILGJENGELIGHETSVURDERING", "tilgjengelighetsvurdering", OFTString);
+    
+      addSimpleType(&oTypes, "TILLEGG", "flatetillegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "TILLEGGSAREAL", "tilleggsareal", OFTInteger);
+    
+      addSimpleType(&oTypes, "TILSPORNODEKILOMETER", "tilSpornodeKilometer", OFTReal);
+    
+      addSimpleType(&oTypes, "TILSPORNODETEKST", "tilSpornodeTekst", OFTString);
+    
+      addSimpleType(&oTypes, "TILSPORNODETYPE", "tilSpornodeType", OFTString);
+    
+      addSimpleType(&oTypes, "TILSYS", "tilKoordinatsystem", OFTInteger);
+    
+      addSimpleType(&oTypes, "TILTAKNR", "tiltaksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "TINGLYST", "tinglyst", OFTString);
+    
+      addSimpleType(&oTypes, "TIPPVOLUM", "deponitippVolum", OFTInteger);
+    
+      addSimpleType(&oTypes, "TOKTID", "toktId", OFTString);
+    
+      addSimpleType(&oTypes, "TOT_PROD", "totalProduksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "TOTALAREALKM2", "totalarealKm2", OFTReal);
+    
+      addSimpleType(&oTypes, "TOTALBELASTNING", "totalBelastning", OFTInteger);
+    
+      addSimpleType(&oTypes, "TRAFIKKBELASTNING", "trafikkbelastning", OFTInteger);
+    
+      addSimpleType(&oTypes, "TRAFIKKFARE", "trafikkfare", OFTString);
+    
+      addSimpleType(&oTypes, "TRE_D_NIVÅ", "treDNivå", OFTInteger);
+    
+      addSimpleType(&oTypes, "TRE_TYP", "treType", OFTInteger);
+    
+      addSimpleType(&oTypes, "TRNORD", "tekstReferansePunktNord", OFTInteger);
+    
+      addSimpleType(&oTypes, "TRØST", "tekstReferansePunktØst", OFTInteger);
+    
+      addSimpleType(&oTypes, "TSKOG", "tilleggsopplysningerSkog", OFTInteger);
+    
+      addSimpleType(&oTypes, "TSKYV", "tekstForskyvning", OFTReal);
+    
+      addSimpleType(&oTypes, "TSTED", "tettstednummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "TVIST", "tvist", OFTString);
+    
+      addSimpleType(&oTypes, "TWYMERK", "taksebaneoppmerking", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPE_BR", "trasebreddetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPE_VANNFOR_ANL", "typeVannforsyningsanlegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPEDUMPEOMRÅDE", "typeDumpeområde", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPEINNSJØ", "typeInnsjø", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPESAMFLINJE", "samferdselslinjeType", OFTInteger);
+    
+      addSimpleType(&oTypes, "TYPESAMFPUNKT", "samferdselspunkt", OFTInteger);
+    
+      addSimpleType(&oTypes, "UB_ANL_TYP", "utmarkbeiteAnleggstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "UB_DYRESL", "utmarkbeiteDyreslag", OFTString);
+    
+      addSimpleType(&oTypes, "UFULLSTENDIGAREAL", "ufullstendigAreal", OFTString);
+    
+      addSimpleType(&oTypes, "UNDERBYGNINGKONSTR", "underbygningKonstr", OFTInteger);
+    
+      addSimpleType(&oTypes, "UNDERGRUNN", "undergrunn", OFTString);
+    
+      addSimpleType(&oTypes, "UNDERLAG", "fastmerkeUnderlag", OFTInteger);
+    
+      addSimpleType(&oTypes, "UNDERLAGSTYPE", "underlagstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "UNDERSAMMENFØYNINGSKALBESTÅ", "underSammenføyningSkalBestå", OFTString);
+    
+      addSimpleType(&oTypes, "UNDERSAMMENFØYNINGSKALUTGÅ", "underSammenføyningSkalUtgå", OFTString);
+    
+      addSimpleType(&oTypes, "UNDERSOKELSENR", "undersokelseNummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "UNDERTYPE", "undertypeVersjon", OFTString);
+    
+      addSimpleType(&oTypes, "UNR", "underNr", OFTInteger);
+    
+      addSimpleType(&oTypes, "UREGJORDSAMEIE", "uregistrertJordsameie", OFTString);
+    
+      addSimpleType(&oTypes, "UTEAREAL", "uteoppholdsareal", OFTInteger);
+    
+      addSimpleType(&oTypes, "UTGÅR_DATO", "utgårDato", OFTDate);
+    
+      addSimpleType(&oTypes, "UTGÅTT", "utgått", OFTString);
+    
+      addSimpleType(&oTypes, "UTNTALL", "utnyttingstall", OFTReal);
+    
+      addSimpleType(&oTypes, "UTNTYP", "utnyttingstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "UTNYTTBAR_KAP", "utnyttbarMagasinkapasitet", OFTReal);
+    
+      addSimpleType(&oTypes, "UTSLIPPTYPE", "utslipptype", OFTString);
+    
+      addSimpleType(&oTypes, "UTV_TILL_NR", "tillatelsesnummer", OFTString);
+    
+      addSimpleType(&oTypes, "UTV_TILL_TYPE", "utvinningstillatelsestype", OFTString);
+    
+      addSimpleType(&oTypes, "UTVALGSAK", "utvalgssaksnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "UTVALGSMET", "utvalgMetode", OFTString);
+    
+      addSimpleType(&oTypes, "UUFASILITET", "universellutformingFasilitet", OFTString);
+    
+      addSimpleType(&oTypes, "VALUTAENHET", "valutaenhet", OFTString);
+    
+      addSimpleType(&oTypes, "VANNBR", "vannbredde", OFTInteger);
+    
+      addSimpleType(&oTypes, "VANNFORSYNING", "vannforsyning", OFTInteger);
+    
+      addSimpleType(&oTypes, "VANNFØRINGMIDLERE", "vannføringMidlere", OFTInteger);
+    
+      addSimpleType(&oTypes, "VANNFØRINGMINSTE", "vannføringMinste", OFTInteger);
+    
+      addSimpleType(&oTypes, "VANNFØRINGSTØRST", "vannføringStørst", OFTInteger);
+    
+      addSimpleType(&oTypes, "VANNLAGR", "vannlagringsevne", OFTInteger);
+    
+      addSimpleType(&oTypes, "VASSDRAGNAVN", "vassdragsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "VASSDRAGSNR", "vassdragsnummer", OFTString);
+    
+      addSimpleType(&oTypes, "VATNLNR", "vatnLøpenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "V-DELTA-MAX", "vertikaltDeltaMaksimum", OFTInteger);
+    
+      addSimpleType(&oTypes, "V-DELTA-MIN", "vertikaltDeltaMinimum", OFTInteger);
+    
+      addSimpleType(&oTypes, "VEDLIKEH", "vedlikeholdsansvarlig", OFTString);
+    
+      addSimpleType(&oTypes, "VEDTAK", "vedtakstype", OFTInteger);
+    
+      addSimpleType(&oTypes, "VEDTAKSDATO", "vedtaksdato", OFTDate);
+    
+      addSimpleType(&oTypes, "VEGKATEGORI", "vegkategori", OFTString);
+    
+      addSimpleType(&oTypes, "VEGNUMMER", "vegnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "VEGOVERVEG", "vegOverVeg", OFTString);
+    
+      addSimpleType(&oTypes, "VEGREKKVERKTYPE", "vegrekkverkType", OFTString);
+    
+      addSimpleType(&oTypes, "VEGSPERRINGTYPE", "vegsperringtype", OFTString);
+    
+      addSimpleType(&oTypes, "VEGSTATUS", "vegstatus", OFTString);
+    
+      addSimpleType(&oTypes, "VERDI", "verdi", OFTInteger);
+    
+      addSimpleType(&oTypes, "VERDI1", "verdi", OFTString);
+    
+      addSimpleType(&oTypes, "VERDI2", "tilVerdi", OFTString);
+    
+      addSimpleType(&oTypes, "VERDIANNA", "verdiAnnenUtnyttelseGrunn", OFTReal);
+    
+      addSimpleType(&oTypes, "VERDIBEITE", "verdiBeiterett", OFTReal);
+    
+      addSimpleType(&oTypes, "VERDIGRUNN", "verdiGrunn", OFTReal);
+    
+      addSimpleType(&oTypes, "VERDIJAKT", "verdiJaktrett", OFTReal);
+    
+      addSimpleType(&oTypes, "VERDISKOG", "verdiSkogProduksjon", OFTReal);
+    
+      addSimpleType(&oTypes, "VERIFISERINGSDATO", "verifiseringsdato", OFTDateTime);
+    
+      addSimpleType(&oTypes, "VERN_FORMAL", "verneFormål", OFTString);
+    
+      addSimpleType(&oTypes, "VERN_LOV", "vernelov", OFTString);
+    
+      addSimpleType(&oTypes, "VERN_MOT", "vernskogType", OFTInteger);
+    
+      addSimpleType(&oTypes, "VERN_PARA", "verneparagraf", OFTString);
+    
+      addSimpleType(&oTypes, "VERNEDATO", "vernedato", OFTDate);
+    
+      addSimpleType(&oTypes, "VERNEFORM", "verneform", OFTString);
+    
+      addSimpleType(&oTypes, "VERNEPLAN", "verneplan", OFTInteger);
+    
+      addSimpleType(&oTypes, "VERNTEMA", "verneTema", OFTInteger);
+    
+      addSimpleType(&oTypes, "VERNTYPE", "vernetype", OFTString);
+    
+      addSimpleType(&oTypes, "VERSJON", "versjon", OFTString);
+    
+      addSimpleType(&oTypes, "VERT_BÆREKONSTR", "vertikalBærekonstruksjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "VERTNIV", "vertikalnivå", OFTInteger);
+    
+      addSimpleType(&oTypes, "VFLATE", "delteigKlassifisering", OFTInteger);
+    
+      addSimpleType(&oTypes, "VFRADATO", "veglenkeFraDato", OFTDate);
+    
+      addSimpleType(&oTypes, "VIKTIG", "viktighet", OFTInteger);
+    
+      addSimpleType(&oTypes, "VINDRETN", "vindretning", OFTInteger);
+    
+      addSimpleType(&oTypes, "VINKELENHET", "vinkelenhet", OFTString);
+    
+      addSimpleType(&oTypes, "VIRKSOMHET", "typeRastoffVirksomhet", OFTInteger);
+    
+      addSimpleType(&oTypes, "VISUELLTYDELIGHET", "visuellTydelighet", OFTInteger);
+    
+      addSimpleType(&oTypes, "VKJORFLT", "feltoversikt", OFTString);
+    
+      addSimpleType(&oTypes, "VKRETSNAVN", "valgkretsnavn", OFTString);
+    
+      addSimpleType(&oTypes, "VKRETSNR", "valgkretsnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "VLENKEID", "veglenkeIdentifikasjon", OFTInteger);
+    
+      addSimpleType(&oTypes, "VOLUM_M3", "rastoffVolum", OFTInteger);
+    
+      addSimpleType(&oTypes, "VOLUMENHET", "volumenhet", OFTString);
+    
+      addSimpleType(&oTypes, "VOLUMINNSJØ", "volumInnsjø", OFTInteger);
+    
+      addSimpleType(&oTypes, "VRAKTYP", "vraktype", OFTInteger);
+    
+      addSimpleType(&oTypes, "VTILDATO", "veglenkeTilDato", OFTDate);
+    
+      addSimpleType(&oTypes, "VURDERING", "vurdering", OFTString);
+    
+      addSimpleType(&oTypes, "VURDERTDATO", "vurdertDato", OFTDate);
+    
+      addSimpleType(&oTypes, "VÆSKETYPE", "petroleumsvæsketype", OFTInteger);
+    
+      addSimpleType(&oTypes, "WRBKODE", "WRBgruppe", OFTString);
+    
+      addSimpleType(&oTypes, "YTTERVEGG", "yttervegg", OFTInteger);
+    
+      addSimpleType(&oTypes, "ØST", "øst", OFTInteger);
+    
+      addSimpleType(&oTypes, "ÅPNESDATO", "åpnesDato", OFTDate);
+    
+      addSimpleType(&oTypes, "ÅR", "årstall", OFTInteger);
+    
+      addSimpleType(&oTypes, "ÅRSTIDBRUK", "årstidbruk", OFTString);
+    
+      addSimpleType(&oTypes, "VEDTAKENDELIGPLANDATO", "vedtakEndeligPlanDato", OFTDate);
+    
+      addSimpleType(&oTypes, "KUNNGJØRINGSDATO", "kunngjøringsdato", OFTDate);
+    
+      addSimpleType(&oTypes, "KPBESTEMMELSEHJEMMEL", "kpBestemmelseHjemmel", OFTInteger);
+    
+      addSimpleType(&oTypes, "RPBESTEMMELSEHJEMMEL", "rpBestemmelseHjemmel", OFTInteger);
+    
+      addSimpleType(&oTypes, "CCDBRIKKELENGDE", "ccdBrikkelengde", OFTInteger);
+    
+      addSimpleType(&oTypes, "CCDBRIKKESIDE", "ccdBrikkeside", OFTInteger);
+    
+      addSimpleType(&oTypes, "BILDEOPPLØSNING", "bildeoppløsning", OFTReal);
+    
+      addSimpleType(&oTypes, "BILDEFILFORMAT", "bildefilformat", OFTInteger);
+    
+      addSimpleType(&oTypes, "STATLIGNR", "statlignummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "AEROTRIANGULERING", "aerotriangulering", OFTInteger);
+    
+      addSimpleType(&oTypes, "PROSJEKTRAPPORTLINK", "prosjektrapportlink", OFTString);
+    
+      addSimpleType(&oTypes, "BILDEFILIR", "bildefilIr", OFTString);
+    
+      addSimpleType(&oTypes, "BILDEFILPAN", "bildefilPan", OFTString);
+    
+      addSimpleType(&oTypes, "BILDEFILRGB", "bildefilRGB", OFTString);
+    
+      addSimpleType(&oTypes, "BILDEFILMULTI", "bildefilMulti", OFTString);
+    
+      addSimpleType(&oTypes, "ORTOFOTOTYPE", "ortofototype", OFTInteger);
+    
+      addSimpleType(&oTypes, "KAMERALØPENUMMER", "løpenummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "PRODUKSJONSRAPPORTLINK", "produksjonsrapportlink", OFTString);
+    
+      addSimpleType(&oTypes, "PRODUKTSPESIFIKASJONSLINK", "produktspesifikasjonslink", OFTString);
+    
+      addSimpleType(&oTypes, "SAKSÅR", "saksår", OFTInteger);
+    
+      addSimpleType(&oTypes, "SEKVENSNUMMER", "sekvensnummer", OFTInteger);
+    
+      addSimpleType(&oTypes, "UTNTALL_MIN", "utnyttingstall_minimum", OFTReal);
+    
+      addSimpleType(&oTypes, "GYLDIGTILDATO", "gyldigTilDato", OFTDate);
+    
+      addSimpleType(&oTypes, "PIXELSTØRRELSE", "pixelstørrelse", OFTReal);
+    
+      addSimpleType(&oTypes, "HENDELSESDATO", "Hendelsesdato", OFTDate);
+    
+      addSimpleType(&oTypes, "NPPLANBESTEMMELSETYPE", "planbestemmelsetype", OFTInteger);
+    
+      addSimpleType(&oTypes, "NPPLANTEMA", "planTema", OFTInteger);
+    
+      addSimpleType(&oTypes, "FAGOMRÅDE_LINK", "link til fagområde", OFTString);
+    
+      addSimpleType(&oTypes, "PRODUKT_LINK", "produktLink", OFTString);
+    
+
+OGRSOSIDataType ADRESSEBRUKSENHETType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType ADRESSEKOMMENTARType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType ADRESSEREFERANSEType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType ADRESSETILLEGGType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType AIDType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType AJOURFOeRINGType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType AKVA_KONS_INFOType = OGRSOSIDataType(7);
+     
+OGRSOSIDataType AKVA_PROeVE_INFOType = OGRSOSIDataType(9);
+     
+OGRSOSIDataType ANDELType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType AREALFORDELINGType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType BELASTNINGBOF5Type = OGRSOSIDataType(4);
+     
+OGRSOSIDataType BELASTNINGFOSFORType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType BEREGNETAREALType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType BILDEINFORMASJONType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType BMARTOBSType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType BMARTREGType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType BMKILDEType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType BMNATYPTILLEGGType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType BRUKSENHETType = OGRSOSIDataType(10);
+     
+OGRSOSIDataType BYDELIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType BYGG_KOMMENTARERType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType BYGN_STAT_HISTType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType BYGNING_TILLEGGType = OGRSOSIDataType(15);
+     
+OGRSOSIDataType BYGNINGSREFType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType DELOMRAaDEIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType DPOT_GRASType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType DPOT_KORNType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType DPOT_POTETType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType EKOORDType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType ENDRINGSFLAGGType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType ENDRINGSVURDERINGType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType ETASJEType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType ETASJEDATAType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType FELTREGISTRERTType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType FIRMA_EIERType = OGRSOSIDataType(7);
+     
+OGRSOSIDataType FISKE_BEDR_IDType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType FISKE_BEDR_INFOType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FISKE_BEDR_MARKEDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FISKE_BEDR_TJENESTEType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType FISKERI_REDSKAPType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType FISKERI_RESS_ARTType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType FISKERI_RESSURSType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FMDATOType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FMIDNYType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType FMSIGNType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FMSTATUSType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType FMTYPEType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType FORUR_GRUNN_EIENDOMType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType GRENSE_MELLOMType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType GRUNNKRETSIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType HAVNE_D_INFOType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType HOVEDMAaLRUBRIKKType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType HOVEDNRType = OGRSOSIDataType(2); // Note: fixed manually by E.Rouault. Was 1 initially, but Valgrind complained
+     
+OGRSOSIDataType HYTTEINFORMASJONType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType JORDTYPEType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType JREGMARKType = OGRSOSIDataType(10);
+     
+OGRSOSIDataType JREGTEIGType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType KAI_INFOType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType KAMERAINFORMASJONType = OGRSOSIDataType(9);
+     
+OGRSOSIDataType KM_DAT_INFOType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType KM_DATERINGType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType KOMMUNALKRETSType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType KOPIDATAType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType KOPLINGType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType KURSLINJE_INFOType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType KVALITETType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType LEDNINGType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType LEGGEAaRType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType LGIDType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType MATRIKKELADRESSEIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType MATRIKKELNUMMERType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType OVERLAPPType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType POSTType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType REGISTRERINGSVERSJONType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType RESIPIENTType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType RETNINGType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType ROeR_DIMENSJONType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SAKType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType SEFRAK_IDType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType SEFRAKFUNKSJONType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SENTRUMSSONEIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SERVType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType SKRETSIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SP_ADMType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SP_AKLASSType = OGRSOSIDataType(6);
+     
+OGRSOSIDataType SP_BESTANDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SP_BSKRIVType = OGRSOSIDataType(13);
+     
+OGRSOSIDataType SP_FLBRELEMType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType SP_GRLVOLType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType SP_TEIGType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType SP_TERKLASSType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType SP_TETTHOYDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType SP_TILTAKType = OGRSOSIDataType(5);
+     
+OGRSOSIDataType SP_TILVVOLType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType SP_TRESLType = OGRSOSIDataType(8);
+     
+OGRSOSIDataType TETTSTEDIDType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType UNIVERSELLUTFORMINGType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType UTNYTTType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType UTSLIPPType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType UTV_TILL_PARTType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType VERNType = OGRSOSIDataType(4);
+     
+OGRSOSIDataType VKRETSType = OGRSOSIDataType(2);
+     
+OGRSOSIDataType VNRType = OGRSOSIDataType(3);
+     
+OGRSOSIDataType VPAType = OGRSOSIDataType(3);
+     ADRESSEBRUKSENHETType.setElement(1, "etasjenummer", OFTInteger); 
+   ADRESSEBRUKSENHETType.setElement(2, "etasjeplan", OFTString); 
+   ADRESSEBRUKSENHETType.setElement(0, "bruksenhetLøpenr", OFTInteger); 
+   ADRESSEKOMMENTARType.setElement(0, "etat", OFTString); 
+   ADRESSEKOMMENTARType.setElement(2, "kommentar", OFTString); 
+   ADRESSEKOMMENTARType.setElement(1, "kommentarType", OFTString); 
+   ADRESSEKOMMENTARType.setElement(4, "lagretDato", OFTDate); 
+   ADRESSEKOMMENTARType.setElement(3, "saksnummer", OFTInteger); 
+   ADRESSEREFERANSEType.setElement(1, "adresseReferansekode", OFTString); 
+   ADRESSEREFERANSEType.setElement(0, "referanse", OFTString); 
+   ADRESSETILLEGGType.setElement(1, "adresseKommentar", OFTString); 
+   ADRESSETILLEGGType.setElement(2, "adresseReferanse", OFTString); 
+   ADRESSETILLEGGType.setElement(0, "kartbladindeks", OFTString); 
+   AIDType.setElement(2, "bokstav", OFTString); 
+   AIDType.setElement(0, "gatenummer", OFTInteger); 
+   AIDType.setElement(1, "husnummer", OFTInteger); 
+   AJOURFOeRINGType.setElement(1, "ajourførtAv", OFTString); 
+   AJOURFOeRINGType.setElement(0, "ajourførtDato", OFTDate); 
+   AKVA_KONS_INFOType.setElement(1, "akvaKonsesjonsnummer", OFTInteger); 
+   AKVA_KONS_INFOType.setElement(4, "konsesjonsstatus", OFTString); 
+   AKVA_KONS_INFOType.setElement(6, "konsesjonstype", OFTString); 
+   AKVA_KONS_INFOType.setElement(5, "konsesjonsformål", OFTString); 
+   AKVA_KONS_INFOType.setElement(0, "fiskebruksnummerFylke", OFTString); 
+   AKVA_KONS_INFOType.setElement(2, "lokalitetsnavn", OFTString); 
+   AKVA_KONS_INFOType.setElement(3, "lokalitetsnummer", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(7, "akvaTemperatur", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(1, "algekonsentrasjon", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(0, "algetype", OFTString); 
+   AKVA_PROeVE_INFOType.setElement(5, "klorofyllMaksimum", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(8, "salinitet", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(6, "sikteDyp", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(2, "strømretning", OFTInteger); 
+   AKVA_PROeVE_INFOType.setElement(4, "vindretning", OFTInteger); 
+   ANDELType.setElement(1, "nevner", OFTReal); 
+   ANDELType.setElement(0, "teller", OFTReal); 
+   AREALFORDELINGType.setElement(4, "prosentElv", OFTReal); 
+   AREALFORDELINGType.setElement(2, "prosentHav", OFTReal); 
+   AREALFORDELINGType.setElement(3, "prosentInnsjø", OFTReal); 
+   AREALFORDELINGType.setElement(1, "prosentLand", OFTReal); 
+   AREALFORDELINGType.setElement(0, "totalarealKm2", OFTReal); 
+   BELASTNINGBOF5Type.setElement(2, "andrekilderBelastning", OFTInteger); 
+   BELASTNINGBOF5Type.setElement(0, "husholdBelastning", OFTInteger); 
+   BELASTNINGBOF5Type.setElement(1, "industriBelastning", OFTInteger); 
+   BELASTNINGBOF5Type.setElement(3, "totalbelastning", OFTInteger); 
+   BELASTNINGFOSFORType.setElement(2, "andrekilderBelastning", OFTInteger); 
+   BELASTNINGFOSFORType.setElement(0, "husholdBelastning", OFTInteger); 
+   BELASTNINGFOSFORType.setElement(1, "industriBelastning", OFTInteger); 
+   BELASTNINGFOSFORType.setElement(3, "totalbelastning", OFTInteger); 
+   BEREGNETAREALType.setElement(0, "areal", OFTReal); 
+   BEREGNETAREALType.setElement(1, "arealmerknad", OFTString); 
+   BILDEINFORMASJONType.setElement(1, "brennvidde", OFTReal); 
+   BILDEINFORMASJONType.setElement(2, "fotograf", OFTString); 
+   BILDEINFORMASJONType.setElement(0, "kameratype", OFTString); 
+   BMARTOBSType.setElement(1, "bmAntall", OFTInteger); 
+   BMARTOBSType.setElement(0, "bmArt", OFTString); 
+   BMARTOBSType.setElement(2, "bmEnhet", OFTInteger); 
+   BMARTOBSType.setElement(3, "bmRegistreringsdato", OFTDate); 
+   BMARTREGType.setElement(6, "bmÅrstid", OFTInteger); 
+   BMARTREGType.setElement(0, "bmArt", OFTString); 
+   BMARTREGType.setElement(2, "bmOmrådefunksjon", OFTInteger); 
+   BMARTREGType.setElement(5, "bmFunksjonskvalitet", OFTInteger); 
+   BMARTREGType.setElement(7, "bmKilde", OFTString); 
+   BMARTREGType.setElement(1, "bmRegistreringsdato", OFTDate); 
+   BMARTREGType.setElement(3, "bmTruethetskategori", OFTString); 
+   BMARTREGType.setElement(4, "bmViltvekt", OFTInteger); 
+   BMKILDEType.setElement(1, "bmKildetype", OFTInteger); 
+   BMKILDEType.setElement(0, "bmKildevurdering", OFTInteger); 
+   BMNATYPTILLEGGType.setElement(1, "bmAndel", OFTInteger); 
+   BMNATYPTILLEGGType.setElement(0, "bmNaturtype", OFTString); 
+   BRUKSENHETType.setElement(7, "antallBad", OFTInteger); 
+   BRUKSENHETType.setElement(6, "antallRom", OFTInteger); 
+   BRUKSENHETType.setElement(8, "antallWC", OFTInteger); 
+   BRUKSENHETType.setElement(5, "bruksareal", OFTReal); 
+   BRUKSENHETType.setElement(4, "bruksenhetstype", OFTString); 
+   BRUKSENHETType.setElement(2, "etasjenummer", OFTInteger); 
+   BRUKSENHETType.setElement(1, "etasjeplan", OFTString); 
+   BRUKSENHETType.setElement(9, "kjøkkenTilgang", OFTInteger); 
+   BRUKSENHETType.setElement(3, "bruksenhetLøpenr", OFTInteger); 
+   BRUKSENHETType.setElement(0, "matrikkelnummer", OFTString); 
+   BYDELIDType.setElement(0, "bydelsnavn", OFTString); 
+   BYDELIDType.setElement(1, "bydelsnummer", OFTInteger); 
+   BYGG_KOMMENTARERType.setElement(3, "bygnSaksnr", OFTString); 
+   BYGG_KOMMENTARERType.setElement(0, "etat", OFTString); 
+   BYGG_KOMMENTARERType.setElement(2, "kommentar", OFTString); 
+   BYGG_KOMMENTARERType.setElement(1, "kommentarType", OFTString); 
+   BYGG_KOMMENTARERType.setElement(4, "lagretDato", OFTDate); 
+   BYGN_STAT_HISTType.setElement(0, "bygningsstatus", OFTString); 
+   BYGN_STAT_HISTType.setElement(1, "bygningshistorikkDato", OFTDate); 
+   BYGN_STAT_HISTType.setElement(2, "registrertDato", OFTDate); 
+   BYGNING_TILLEGGType.setElement(0, "alternativtArealBygning", OFTReal); 
+   BYGNING_TILLEGGType.setElement(1, "antallEtasjer", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(2, "antallRøkløp", OFTReal); 
+   BYGNING_TILLEGGType.setElement(3, "brenseltankNedgravd", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(14, "bygningKommentar", OFTString); 
+   BYGNING_TILLEGGType.setElement(13, "bygningsreferanse", OFTString); 
+   BYGNING_TILLEGGType.setElement(9, "fundamentering", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(12, "horisontalBærekonstr", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(5, "kartbladindeks", OFTString); 
+   BYGNING_TILLEGGType.setElement(6, "kildePrivatVannforsyning", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(10, "materialeIYttervegg", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(7, "privatKloakkRensing", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(8, "renovasjon", OFTInteger); 
+   BYGNING_TILLEGGType.setElement(4, "septiktank", OFTString); 
+   BYGNING_TILLEGGType.setElement(11, "vertikalBærekonstr", OFTInteger); 
+   BYGNINGSREFType.setElement(1, "bygningReferansetype", OFTString); 
+   BYGNINGSREFType.setElement(0, "referanse", OFTString); 
+   DELOMRAaDEIDType.setElement(0, "delområdenavn", OFTString); 
+   DELOMRAaDEIDType.setElement(1, "delområdenummer", OFTString); 
+   DPOT_GRASType.setElement(2, "nedbørsbasert", OFTInteger); 
+   DPOT_GRASType.setElement(3, "nedklassifiseringNedbør", OFTInteger); 
+   DPOT_GRASType.setElement(0, "vanningsbasert", OFTInteger); 
+   DPOT_GRASType.setElement(1, "nedklassifiseringVanning", OFTInteger); 
+   DPOT_KORNType.setElement(2, "nedbørsbasert", OFTInteger); 
+   DPOT_KORNType.setElement(3, "nedklassifiseringNedbør", OFTInteger); 
+   DPOT_KORNType.setElement(0, "vanningsbasert", OFTInteger); 
+   DPOT_KORNType.setElement(1, "nedklassifiseringVanning", OFTInteger); 
+   DPOT_POTETType.setElement(2, "nedbørsbasert", OFTInteger); 
+   DPOT_POTETType.setElement(3, "nedklassifiseringNedbør", OFTInteger); 
+   DPOT_POTETType.setElement(0, "vanningsbasert", OFTInteger); 
+   DPOT_POTETType.setElement(1, "nedklassifiseringVanning", OFTInteger); 
+   EKOORDType.setElement(2, "jordregisterKoordinatHøyde", OFTInteger); 
+   EKOORDType.setElement(0, "jordregisterKoordinatNord", OFTInteger); 
+   EKOORDType.setElement(1, "jordregisterKoordinatØst", OFTInteger); 
+   ENDRINGSFLAGGType.setElement(1, "tidspunktEndring", OFTDateTime); 
+   ENDRINGSFLAGGType.setElement(0, "typeEndring", OFTString); 
+   ENDRINGSVURDERINGType.setElement(0, "endringsgrad", OFTString); 
+   ENDRINGSVURDERINGType.setElement(1, "vurdertDato", OFTDate); 
+   ETASJEType.setElement(2, "antallBoenheter", OFTInteger); 
+   ETASJEType.setElement(4, "bruksarealTilAnnet", OFTReal); 
+   ETASJEType.setElement(3, "bruksarealTilBolig", OFTReal); 
+   ETASJEType.setElement(5, "bruksarealTotalt", OFTReal); 
+   ETASJEType.setElement(1, "etasjenummer", OFTInteger); 
+   ETASJEType.setElement(0, "etasjeplan", OFTString); 
+   ETASJEType.setElement(6, "kommAlternativtAreal", OFTReal); 
+   ETASJEType.setElement(7, "kommAlternativtAreal2", OFTReal); 
+   ETASJEDATAType.setElement(4, "sumAlternativtAreal", OFTReal); 
+   ETASJEDATAType.setElement(5, "sumAlternativtAreal2", OFTReal); 
+   ETASJEDATAType.setElement(0, "sumAntallBoenheter", OFTInteger); 
+   ETASJEDATAType.setElement(3, "sumBruksarealTotalt", OFTReal); 
+   ETASJEDATAType.setElement(2, "sumBruksarealTilAnnet", OFTReal); 
+   ETASJEDATAType.setElement(1, "sumBruksarealTilBolig", OFTReal); 
+   FELTREGISTRERTType.setElement(2, "ajourføring", OFTString); 
+   FELTREGISTRERTType.setElement(1, "datafangstdato", OFTDateTime); 
+   FELTREGISTRERTType.setElement(0, "feltregistrertAv", OFTString); 
+   FIRMA_EIERType.setElement(2, "adresse", OFTString); 
+   FIRMA_EIERType.setElement(0, "firmanavn", OFTString); 
+   FIRMA_EIERType.setElement(1, "bedriftseier", OFTString); 
+   FIRMA_EIERType.setElement(6, "kontaktperson", OFTString); 
+   FIRMA_EIERType.setElement(3, "postnummer", OFTInteger); 
+   FIRMA_EIERType.setElement(5, "telefaxnummer", OFTInteger); 
+   FIRMA_EIERType.setElement(4, "telefonnummer", OFTInteger); 
+   FISKE_BEDR_IDType.setElement(4, "antallAnsatte", OFTInteger); 
+   FISKE_BEDR_IDType.setElement(5, "antallÅrsverk", OFTInteger); 
+   FISKE_BEDR_IDType.setElement(0, "fiskebedriftsnavn", OFTString); 
+   FISKE_BEDR_IDType.setElement(2, "fiskebruksnummer", OFTInteger); 
+   FISKE_BEDR_IDType.setElement(1, "fiskebruksnummerFylke", OFTString); 
+   FISKE_BEDR_IDType.setElement(3, "firmaeier", OFTString); 
+   FISKE_BEDR_INFOType.setElement(1, "artskode", OFTInteger); 
+   FISKE_BEDR_INFOType.setElement(0, "fisketype", OFTInteger); 
+   FISKE_BEDR_MARKEDType.setElement(0, "fiskebedriftsandel", OFTInteger); 
+   FISKE_BEDR_MARKEDType.setElement(1, "fiskebedriftsområde", OFTInteger); 
+   FISKE_BEDR_TJENESTEType.setElement(2, "fiskebedriftservice", OFTInteger); 
+   FISKE_BEDR_TJENESTEType.setElement(1, "fiskekapasitetEnhet", OFTInteger); 
+   FISKE_BEDR_TJENESTEType.setElement(0, "fiskekapasitet", OFTInteger); 
+   FISKERI_REDSKAPType.setElement(0, "fiskeriredskapGenAktiv", OFTInteger); 
+   FISKERI_REDSKAPType.setElement(1, "fiskeriredskapGenPassiv", OFTInteger); 
+   FISKERI_REDSKAPType.setElement(2, "fiskeriredskapSpesAktiv", OFTInteger); 
+   FISKERI_REDSKAPType.setElement(3, "fiskeriredskapSpesPassiv", OFTInteger); 
+   FISKERI_RESS_ARTType.setElement(3, "engelskArtsnavn", OFTString); 
+   FISKERI_RESS_ARTType.setElement(2, "vitenskapeligArtsnavn", OFTString); 
+   FISKERI_RESS_ARTType.setElement(1, "norskArtsnavn", OFTString); 
+   FISKERI_RESS_ARTType.setElement(0, "taksonomiskKode", OFTInteger); 
+   FISKERI_RESS_ARTType.setElement(4, "faoKode", OFTString); 
+   FISKERI_RESS_ARTType.setElement(5, "artskode", OFTInteger); 
+   FISKERI_RESSURSType.setElement(0, "fiskeriressursområdeArt", OFTString); 
+   FISKERI_RESSURSType.setElement(1, "periode", OFTString); 
+   FMDATOType.setElement(1, "beregningsDato", OFTDate); 
+   FMDATOType.setElement(0, "fastmerkeEtableringsdato", OFTDate); 
+   FMIDNYType.setElement(1, "fastmerkeInstitusjon", OFTString); 
+   FMIDNYType.setElement(0, "fastmerkeKommune", OFTInteger); 
+   FMIDNYType.setElement(2, "fastmerkeNummer", OFTString); 
+   FMIDNYType.setElement(3, "indikatorFastmerkenummer", OFTString); 
+   FMSIGNType.setElement(1, "signalHøyde", OFTReal); 
+   FMSIGNType.setElement(0, "signalType", OFTString); 
+   FMSTATUSType.setElement(1, "typeStatus", OFTInteger); 
+   FMSTATUSType.setElement(0, "verifiseringsdato", OFTDateTime); 
+   FMTYPEType.setElement(0, "boltType", OFTInteger); 
+   FMTYPEType.setElement(3, "fastmerkeDiameter", OFTInteger); 
+   FMTYPEType.setElement(4, "gravertTekst", OFTString); 
+   FMTYPEType.setElement(1, "materialeBolt", OFTInteger); 
+   FMTYPEType.setElement(2, "fastmerkeUnderlag", OFTInteger); 
+   FORUR_GRUNN_EIENDOMType.setElement(1, "arealbrukRestriksjon", OFTInteger); 
+   FORUR_GRUNN_EIENDOMType.setElement(0, "matrikkelnummer", OFTString); 
+   GRENSE_MELLOMType.setElement(0, "førsteLand", OFTString); 
+   GRENSE_MELLOMType.setElement(1, "annetLand", OFTString); 
+   GRUNNKRETSIDType.setElement(1, "grunnkretsnavn", OFTString); 
+   GRUNNKRETSIDType.setElement(0, "grunnkretsnummer", OFTInteger); 
+   HAVNE_D_INFOType.setElement(1, "havnedistriktAdministrasjon", OFTInteger); 
+   HAVNE_D_INFOType.setElement(0, "kommune", OFTInteger); 
+   HOVEDMAaLRUBRIKKType.setElement(1, "bredde", OFTInteger); 
+   HOVEDMAaLRUBRIKKType.setElement(0, "lengde", OFTInteger); 
+   HOVEDNRType.setElement(1, " kommunenummer", OFTInteger); 
+   HOVEDNRType.setElement(0, "matrikkelnummer", OFTString); 
+   HYTTEINFORMASJONType.setElement(1, "betjeningsgrad", OFTString); 
+   HYTTEINFORMASJONType.setElement(0, "hytteId", OFTInteger); 
+   HYTTEINFORMASJONType.setElement(2, "hytteeier", OFTInteger); 
+   JORDTYPEType.setElement(0, "serie1", OFTString); 
+   JORDTYPEType.setElement(2, "serie2", OFTString); 
+   JORDTYPEType.setElement(4, "serie3", OFTString); 
+   JORDTYPEType.setElement(1, "tekstur1", OFTString); 
+   JORDTYPEType.setElement(3, "tekstur2", OFTString); 
+   JORDTYPEType.setElement(5, "tekstur3", OFTString); 
+   JREGMARKType.setElement(1, "potensiellSkogbonitetOmkodet", OFTInteger); 
+   JREGMARKType.setElement(0, "arealtilstand", OFTInteger); 
+   JREGMARKType.setElement(7, "jordregisterDyrkingsjord", OFTString); 
+   JREGMARKType.setElement(6, "jordregisterFreg", OFTInteger); 
+   JREGMARKType.setElement(5, "jordregisterLreg", OFTString); 
+   JREGMARKType.setElement(3, "jordklassifikasjon", OFTInteger); 
+   JREGMARKType.setElement(4, "myrklassifikasjon", OFTInteger); 
+   JREGMARKType.setElement(8, "jordregisterSkogtype", OFTInteger); 
+   JREGMARKType.setElement(9, "jordregisterSkogreisningsmark", OFTInteger); 
+   JREGMARKType.setElement(2, "tilleggsopplysningerSkog", OFTInteger); 
+   JREGTEIGType.setElement(2, "jordregisterDriftssenter", OFTInteger); 
+   JREGTEIGType.setElement(3, "jordregisterStatusEiendom", OFTInteger); 
+   JREGTEIGType.setElement(0, "matrikkelnummer", OFTString); 
+   JREGTEIGType.setElement(1, "jordregisterEiendomTeigNummer", OFTInteger); 
+   KAI_INFOType.setElement(1, "kaiDybde", OFTReal); 
+   KAI_INFOType.setElement(0, "kaiType", OFTInteger); 
+   KAI_INFOType.setElement(2, "kommunenummer", OFTInteger); 
+   KAMERAINFORMASJONType.setElement(4, "bildekategori", OFTInteger); 
+   KAMERAINFORMASJONType.setElement(3, "brennvidde", OFTReal); 
+   KAMERAINFORMASJONType.setElement(7, "film", OFTString); 
+   KAMERAINFORMASJONType.setElement(8, "kalibreringsrapport", OFTString); 
+   KAMERAINFORMASJONType.setElement(1, "kameratype", OFTString); 
+   KAMERAINFORMASJONType.setElement(0, "opptaksmetode", OFTInteger); 
+   KM_DAT_INFOType.setElement(0, "sefrakTiltak", OFTInteger); 
+   KM_DAT_INFOType.setElement(1, "tidsangivelse", OFTInteger); 
+   KM_DATERINGType.setElement(0, "kulturminneDatering", OFTString); 
+   KM_DATERINGType.setElement(1, "kulturminneDateringKvalitet", OFTString); 
+   KOMMUNALKRETSType.setElement(3, "kretsnavn", OFTString); 
+   KOMMUNALKRETSType.setElement(2, "kretsnummer", OFTString); 
+   KOMMUNALKRETSType.setElement(0, "kretstypekode", OFTString); 
+   KOMMUNALKRETSType.setElement(1, "kretstypenavn", OFTString); 
+   KOPIDATAType.setElement(2, "kopidato", OFTDateTime); 
+   KOPIDATAType.setElement(0, "områdeId", OFTInteger); 
+   KOPIDATAType.setElement(1, "originalDatavert", OFTString); 
+   KOPLINGType.setElement(1, "fagområde", OFTInteger); 
+   KOPLINGType.setElement(4, "bruksområde", OFTString); 
+   KOPLINGType.setElement(2, "koplingskategori", OFTInteger); 
+   KOPLINGType.setElement(0, "koplingsnavn", OFTString); 
+   KOPLINGType.setElement(3, "koplingstype", OFTString); 
+   KOPLINGType.setElement(7, "bildelink", OFTString); 
+   KOPLINGType.setElement(5, "materiellkode", OFTString); 
+   KOPLINGType.setElement(6, "verdi", OFTInteger); 
+   KURSLINJE_INFOType.setElement(0, "fartøyIdentifikasjon", OFTString); 
+   KURSLINJE_INFOType.setElement(1, "satellittkommunikasjonsId", OFTString); 
+   KURSLINJE_INFOType.setElement(3, "sporhastighet", OFTInteger); 
+   KURSLINJE_INFOType.setElement(2, "tidspunkt", OFTDateTime); 
+   KVALITETType.setElement(3, "målemetodeHøyde", OFTInteger); 
+   KVALITETType.setElement(4, "nøyaktighetHøyde", OFTInteger); 
+   KVALITETType.setElement(5, "maksimaltAvvik", OFTInteger); 
+   KVALITETType.setElement(0, "målemetode", OFTInteger); 
+   KVALITETType.setElement(1, "nøyaktighet", OFTInteger); 
+   KVALITETType.setElement(2, "synbarhet", OFTInteger); 
+   LEDNINGType.setElement(1, "fagområde", OFTInteger); 
+   LEDNINGType.setElement(3, "bruksområde", OFTString); 
+   LEDNINGType.setElement(0, "ledningsnavn", OFTString); 
+   LEDNINGType.setElement(2, "ledningstype", OFTInteger); 
+   LEDNINGType.setElement(7, "leggeår", OFTString); 
+   LEDNINGType.setElement(6, "lengde", OFTReal); 
+   LEDNINGType.setElement(5, "materiellkode", OFTString); 
+   LEDNINGType.setElement(4, "nettnivå", OFTString); 
+   LEGGEAaRType.setElement(0, "alderReferanse", OFTInteger); 
+   LEGGEAaRType.setElement(1, "årstall", OFTInteger); 
+   LGIDType.setElement(7, "landbruksregAktiv", OFTInteger); 
+   LGIDType.setElement(6, "landbruksregType", OFTInteger); 
+   LGIDType.setElement(0, "matrikkelnummer", OFTString); 
+   MATRIKKELADRESSEIDType.setElement(0, "matrikkelnummer", OFTString); 
+   MATRIKKELADRESSEIDType.setElement(1, "undernr", OFTInteger); 
+   MATRIKKELNUMMERType.setElement(2, "bruksnummer", OFTInteger); 
+   MATRIKKELNUMMERType.setElement(3, "festenummer", OFTInteger); 
+   MATRIKKELNUMMERType.setElement(1, "gårdsnummer", OFTInteger); 
+   MATRIKKELNUMMERType.setElement(0, "matrikkelkommune", OFTInteger); 
+   MATRIKKELNUMMERType.setElement(4, "seksjonsnummer", OFTInteger); 
+   OVERLAPPType.setElement(0, "lengdeoverlapp", OFTInteger); 
+   OVERLAPPType.setElement(1, "sideoverlapp", OFTInteger); 
+   POSTType.setElement(1, "poststedsnavn", OFTString); 
+   POSTType.setElement(0, "postnummer", OFTInteger); 
+   REGISTRERINGSVERSJONType.setElement(0, "produkt", OFTString); 
+   REGISTRERINGSVERSJONType.setElement(1, "versjon", OFTString); 
+   RESIPIENTType.setElement(2, "fjordId", OFTString); 
+   RESIPIENTType.setElement(0, "resipientnavn", OFTString); 
+   RESIPIENTType.setElement(4, "resipienttype", OFTString); 
+   RESIPIENTType.setElement(1, "vassdragsnummer", OFTString); 
+   RESIPIENTType.setElement(3, "vatnLøpenummer", OFTInteger); 
+   RETNINGType.setElement(1, "retningsenhet", OFTInteger); 
+   RETNINGType.setElement(2, "retningsreferanse", OFTInteger); 
+   RETNINGType.setElement(0, "retningsverdi", OFTReal); 
+   ROeR_DIMENSJONType.setElement(1, "lengdeenhet", OFTString); 
+   ROeR_DIMENSJONType.setElement(0, "måltall", OFTReal); 
+   SAKType.setElement(3, "vedtaksmyndighet", OFTString); 
+   SAKType.setElement(0, "saksnummer", OFTInteger); 
+   SAKType.setElement(2, "utvalgssaksnummer", OFTInteger); 
+   SAKType.setElement(1, "vedtaksdato", OFTDate); 
+   SEFRAK_IDType.setElement(2, "husLøpenr", OFTInteger); 
+   SEFRAK_IDType.setElement(1, "registreringKretsnr", OFTInteger); 
+   SEFRAK_IDType.setElement(0, "SEFRAKkommune", OFTInteger); 
+   SEFRAKFUNKSJONType.setElement(0, "sefrakFunksjonskode", OFTInteger); 
+   SEFRAKFUNKSJONType.setElement(1, "sefrakFunksjonsstatus", OFTString); 
+   SENTRUMSSONEIDType.setElement(1, "sentrumssonenavn", OFTString); 
+   SENTRUMSSONEIDType.setElement(0, "sentrumssonenummer", OFTInteger); 
+   SERVType.setElement(2, "informasjon", OFTString); 
+   SERVType.setElement(0, "matrikkelnummer", OFTString); 
+   SERVType.setElement(1, "servituttType", OFTString); 
+   SKRETSIDType.setElement(1, "skolekretsnavn", OFTString); 
+   SKRETSIDType.setElement(0, "skolekretsnummer", OFTInteger); 
+   SP_ADMType.setElement(0, "skogbrplanAdmDatoEndring", OFTDate); 
+   SP_ADMType.setElement(1, "skogbrplanAdmDatoEtablering", OFTDate); 
+   SP_AKLASSType.setElement(0, "skogbrplanKlassAktueltTreslag", OFTInteger); 
+   SP_AKLASSType.setElement(1, "skogbrplanKlassAktSnittBon", OFTInteger); 
+   SP_AKLASSType.setElement(3, "skogbrplanKlassImpProsent", OFTInteger); 
+   SP_AKLASSType.setElement(2, "skogbrplanKlassImpType", OFTInteger); 
+   SP_AKLASSType.setElement(4, "skogbrplanKlassPotTreslag", OFTInteger); 
+   SP_AKLASSType.setElement(5, "skogbrplanKlassPotSnittBon", OFTInteger); 
+   SP_BESTANDType.setElement(1, "skogbrplanBestandDelNr", OFTInteger); 
+   SP_BESTANDType.setElement(0, "skogbrplanBestandNr", OFTInteger); 
+   SP_BSKRIVType.setElement(2, "skogbrplanBeskrivBestandAlder", OFTInteger); 
+   SP_BSKRIVType.setElement(3, "skogbrplanBeskrivBestandDaa", OFTReal); 
+   SP_BSKRIVType.setElement(6, "skogbrplanBeskrivBestSnittDiam", OFTInteger); 
+   SP_BSKRIVType.setElement(4, "skogbrplanBeskrivBestandSnittM2", OFTInteger); 
+   SP_BSKRIVType.setElement(5, "skogbrplanBeskrivBestandSnittH", OFTReal); 
+   SP_BSKRIVType.setElement(7, "skogbrplanBeskrivBarHøydehkl2", OFTInteger); 
+   SP_BSKRIVType.setElement(0, "skogbrplanBeskrivHogstklasse", OFTInteger); 
+   SP_BSKRIVType.setElement(8, "skogbrplanBeskrivLauvHøydehkl2", OFTInteger); 
+   SP_BSKRIVType.setElement(9, "skogbrplanBeskrivSjiktning", OFTInteger); 
+   SP_BSKRIVType.setElement(1, "skogbrplanBeskrivSkogtype", OFTInteger); 
+   SP_BSKRIVType.setElement(10, "skogbrplanBeskrivSunnhet", OFTInteger); 
+   SP_BSKRIVType.setElement(11, "skogbrplanBeskrivTreERegulering", OFTInteger); 
+   SP_BSKRIVType.setElement(12, "skogbrplanBeskrivTreFRegulering", OFTInteger); 
+   SP_FLBRELEMType.setElement(0, "skogbrplanFlerKoderElementtype", OFTInteger); 
+   SP_FLBRELEMType.setElement(1, "skogbrplanFlerKoderArealProsent", OFTInteger); 
+   SP_FLBRELEMType.setElement(2, "skogbrplanFlerKoderArealDaa", OFTInteger); 
+   SP_FLBRELEMType.setElement(3, "skogbrplanFlerKoderSpesBehPros", OFTInteger); 
+   SP_FLBRELEMType.setElement(4, "skogbrplanFlerKoderSpesBehDaa", OFTInteger); 
+   SP_GRLVOLType.setElement(3, "skogbrplanGrunnlagVolumDaaFelt", OFTReal); 
+   SP_GRLVOLType.setElement(4, "skogbrplanGrunnlagVolumBestFelt", OFTInteger); 
+   SP_GRLVOLType.setElement(0, "skogbrplanGrunnlagBerType", OFTInteger); 
+   SP_GRLVOLType.setElement(2, "skogbrplanGrunnlagHovedgruppe", OFTInteger); 
+   SP_GRLVOLType.setElement(6, "skogbrplanGrunnlagRegion", OFTInteger); 
+   SP_GRLVOLType.setElement(5, "skogbrplanGrunnlagSvinnProsent", OFTInteger); 
+   SP_GRLVOLType.setElement(1, "skogbrplanGrunnlagTaksttype", OFTInteger); 
+   SP_GRLVOLType.setElement(7, "skogbrplanGrunnlagTilvekstkorr", OFTInteger); 
+   SP_TEIGType.setElement(3, "matrikkelnummer", OFTString); 
+   SP_TEIGType.setElement(2, "skogbrplanTeigGrend", OFTInteger); 
+   SP_TEIGType.setElement(0, "skogbrplanTeigNr", OFTInteger); 
+   SP_TEIGType.setElement(1, "skogbrplanTeigNavn", OFTString); 
+   SP_TERKLASSType.setElement(0, "skogbrplanTerrengBæreevneBestand", OFTInteger); 
+   SP_TERKLASSType.setElement(1, "skogbrplanTerrengBestandBratthet", OFTInteger); 
+   SP_TERKLASSType.setElement(2, "skogbrplanTerrengLiLengde", OFTInteger); 
+   SP_TERKLASSType.setElement(3, "skogbrplanTerrengMinTranspUtst", OFTInteger); 
+   SP_TERKLASSType.setElement(4, "skogbrplanTerrengJevnhet", OFTInteger); 
+   SP_TETTHOYDType.setElement(0, "skogbrplanTetthetGrunnflatesum", OFTInteger); 
+   SP_TETTHOYDType.setElement(1, "skogbrplanTetthetMHøyde", OFTInteger); 
+   SP_TILTAKType.setElement(3, "skogbrplanTiltakProritet", OFTInteger); 
+   SP_TILTAKType.setElement(1, "skogbrplanTiltakProsent", OFTInteger); 
+   SP_TILTAKType.setElement(4, "skogbrplanTiltakAreal", OFTReal); 
+   SP_TILTAKType.setElement(0, "skogbrplanTiltakBestand", OFTInteger); 
+   SP_TILTAKType.setElement(2, "skogbrplanTiltakÅr", OFTInteger); 
+   SP_TILVVOLType.setElement(0, "skogbrplanTilvekstBeregnDaa", OFTReal); 
+   SP_TILVVOLType.setElement(1, "skogbrplanTilvekstBeregnProsent", OFTReal); 
+   SP_TILVVOLType.setElement(2, "skogbrplanTilvekstBeregnM3", OFTReal); 
+   SP_TILVVOLType.setElement(3, "skogbrplanTilvekstVolumBestand", OFTInteger); 
+   SP_TRESLType.setElement(4, "skogbrplanTreslagAntTreDaaEReg", OFTInteger); 
+   SP_TRESLType.setElement(3, "skogbrplanTreslagAntTreDaaFReg", OFTInteger); 
+   SP_TRESLType.setElement(0, "skogbrplanTreslag", OFTInteger); 
+   SP_TRESLType.setElement(1, "skogbrplanTreslagHøyde", OFTInteger); 
+   SP_TRESLType.setElement(2, "skogbrplanTreslagProsent", OFTInteger); 
+   SP_TRESLType.setElement(5, "skogbrplanTreslagKorrVolumUBark", OFTInteger); 
+   SP_TRESLType.setElement(7, "skogbrplanTreslagSalgsvolumUBark", OFTInteger); 
+   SP_TRESLType.setElement(6, "skogbrplanTreslagUkorrVolumUBark", OFTInteger); 
+   TETTSTEDIDType.setElement(1, "tettstednavn", OFTString); 
+   TETTSTEDIDType.setElement(0, "tettstednummer", OFTInteger); 
+   UNIVERSELLUTFORMINGType.setElement(2, "informasjon", OFTString); 
+   UNIVERSELLUTFORMINGType.setElement(0, "tilgjengelighetsvurdering", OFTString); 
+   UNIVERSELLUTFORMINGType.setElement(1, "universellutformingFasilitet", OFTString); 
+   UTNYTTType.setElement(1, "utnyttingstall", OFTReal); 
+   UTNYTTType.setElement(0, "utnyttingstype", OFTInteger); 
+   UTSLIPPType.setElement(0, "komponent", OFTString); 
+   UTSLIPPType.setElement(1, "massestørrelse", OFTString); 
+   UTSLIPPType.setElement(2, "utslippType", OFTString); 
+   UTV_TILL_PARTType.setElement(1, "petroleumsandel", OFTReal); 
+   UTV_TILL_PARTType.setElement(0, "petroleumspartnere", OFTString); 
+   VERNType.setElement(0, "vernelov", OFTString); 
+   VERNType.setElement(1, "verneparagraf", OFTString); 
+   VERNType.setElement(3, "vernedato", OFTDate); 
+   VERNType.setElement(2, "vernetype", OFTString); 
+   VKRETSType.setElement(1, "valgkretsnavn", OFTString); 
+   VKRETSType.setElement(0, "valgkretsnummer", OFTInteger); 
+   VNRType.setElement(0, "vegkategori", OFTString); 
+   VNRType.setElement(2, "vegnummer", OFTInteger); 
+   VNRType.setElement(1, "vegstatus", OFTString); 
+   VPAType.setElement(0, "hovedParsell", OFTInteger); 
+   VPAType.setElement(1, "veglenkeMeterFra", OFTInteger); 
+   VPAType.setElement(2, "veglenkeMeterTil", OFTInteger); 
+   
+addType(&oTypes, "ADRESSEBRUKSENHET", &ADRESSEBRUKSENHETType);
+     
+addType(&oTypes, "ADRESSEKOMMENTAR", &ADRESSEKOMMENTARType);
+     
+addType(&oTypes, "ADRESSEREFERANSE", &ADRESSEREFERANSEType);
+     
+addType(&oTypes, "ADRESSETILLEGG", &ADRESSETILLEGGType);
+     
+addType(&oTypes, "AID", &AIDType);
+     
+addType(&oTypes, "AJOURFØRING", &AJOURFOeRINGType);
+     
+addType(&oTypes, "AKVA_KONS_INFO", &AKVA_KONS_INFOType);
+     
+addType(&oTypes, "AKVA_PRØVE_INFO", &AKVA_PROeVE_INFOType);
+     
+addType(&oTypes, "ANDEL", &ANDELType);
+     
+addType(&oTypes, "AREALFORDELING", &AREALFORDELINGType);
+     
+addType(&oTypes, "BELASTNINGBOF5", &BELASTNINGBOF5Type);
+     
+addType(&oTypes, "BELASTNINGFOSFOR", &BELASTNINGFOSFORType);
+     
+addType(&oTypes, "BEREGNETAREAL", &BEREGNETAREALType);
+     
+addType(&oTypes, "BILDEINFORMASJON", &BILDEINFORMASJONType);
+     
+addType(&oTypes, "BMARTOBS", &BMARTOBSType);
+     
+addType(&oTypes, "BMARTREG", &BMARTREGType);
+     
+addType(&oTypes, "BMKILDE", &BMKILDEType);
+     
+addType(&oTypes, "BMNATYPTILLEGG", &BMNATYPTILLEGGType);
+     
+addType(&oTypes, "BRUKSENHET", &BRUKSENHETType);
+     
+addType(&oTypes, "BYDELID", &BYDELIDType);
+     
+addType(&oTypes, "BYGG_KOMMENTARER", &BYGG_KOMMENTARERType);
+     
+addType(&oTypes, "BYGN_STAT_HIST", &BYGN_STAT_HISTType);
+     
+addType(&oTypes, "BYGNING_TILLEGG", &BYGNING_TILLEGGType);
+     
+addType(&oTypes, "BYGNINGSREF", &BYGNINGSREFType);
+     
+addType(&oTypes, "DELOMRÅDEID", &DELOMRAaDEIDType);
+     
+addType(&oTypes, "DPOT_GRAS", &DPOT_GRASType);
+     
+addType(&oTypes, "DPOT_KORN", &DPOT_KORNType);
+     
+addType(&oTypes, "DPOT_POTET", &DPOT_POTETType);
+     
+addType(&oTypes, "EKOORD", &EKOORDType);
+     
+addType(&oTypes, "ENDRINGSFLAGG", &ENDRINGSFLAGGType);
+     
+addType(&oTypes, "ENDRINGSVURDERING", &ENDRINGSVURDERINGType);
+     
+addType(&oTypes, "ETASJE", &ETASJEType);
+     
+addType(&oTypes, "ETASJEDATA", &ETASJEDATAType);
+     
+addType(&oTypes, "FELTREGISTRERT", &FELTREGISTRERTType);
+     
+addType(&oTypes, "FIRMA_EIER", &FIRMA_EIERType);
+     
+addType(&oTypes, "FISKE_BEDR_ID", &FISKE_BEDR_IDType);
+     
+addType(&oTypes, "FISKE_BEDR_INFO", &FISKE_BEDR_INFOType);
+     
+addType(&oTypes, "FISKE_BEDR_MARKED", &FISKE_BEDR_MARKEDType);
+     
+addType(&oTypes, "FISKE_BEDR_TJENESTE", &FISKE_BEDR_TJENESTEType);
+     
+addType(&oTypes, "FISKERI_REDSKAP", &FISKERI_REDSKAPType);
+     
+addType(&oTypes, "FISKERI_RESS_ART", &FISKERI_RESS_ARTType);
+     
+addType(&oTypes, "FISKERI_RESSURS", &FISKERI_RESSURSType);
+     
+addType(&oTypes, "FMDATO", &FMDATOType);
+     
+addType(&oTypes, "FMIDNY", &FMIDNYType);
+     
+addType(&oTypes, "FMSIGN", &FMSIGNType);
+     
+addType(&oTypes, "FMSTATUS", &FMSTATUSType);
+     
+addType(&oTypes, "FMTYPE", &FMTYPEType);
+     
+addType(&oTypes, "FORUR_GRUNN_EIENDOM", &FORUR_GRUNN_EIENDOMType);
+     
+addType(&oTypes, "GRENSE_MELLOM", &GRENSE_MELLOMType);
+     
+addType(&oTypes, "GRUNNKRETSID", &GRUNNKRETSIDType);
+     
+addType(&oTypes, "HAVNE_D_INFO", &HAVNE_D_INFOType);
+     
+addType(&oTypes, "HOVEDMÅLRUBRIKK", &HOVEDMAaLRUBRIKKType);
+     
+addType(&oTypes, "HOVEDNR", &HOVEDNRType);
+     
+addType(&oTypes, "HYTTEINFORMASJON", &HYTTEINFORMASJONType);
+     
+addType(&oTypes, "JORDTYPE", &JORDTYPEType);
+     
+addType(&oTypes, "JREGMARK", &JREGMARKType);
+     
+addType(&oTypes, "JREGTEIG", &JREGTEIGType);
+     
+addType(&oTypes, "KAI_INFO", &KAI_INFOType);
+     
+addType(&oTypes, "KAMERAINFORMASJON", &KAMERAINFORMASJONType);
+     
+addType(&oTypes, "KM_DAT_INFO", &KM_DAT_INFOType);
+     
+addType(&oTypes, "KM_DATERING", &KM_DATERINGType);
+     
+addType(&oTypes, "KOMMUNALKRETS", &KOMMUNALKRETSType);
+     
+addType(&oTypes, "KOPIDATA", &KOPIDATAType);
+     
+addType(&oTypes, "KOPLING", &KOPLINGType);
+     
+addType(&oTypes, "KURSLINJE_INFO", &KURSLINJE_INFOType);
+     
+addType(&oTypes, "KVALITET", &KVALITETType);
+     
+addType(&oTypes, "LEDNING", &LEDNINGType);
+     
+addType(&oTypes, "LEGGEÅR", &LEGGEAaRType);
+     
+addType(&oTypes, "LGID", &LGIDType);
+     
+addType(&oTypes, "MATRIKKELADRESSEID", &MATRIKKELADRESSEIDType);
+     
+addType(&oTypes, "MATRIKKELNUMMER", &MATRIKKELNUMMERType);
+     
+addType(&oTypes, "OVERLAPP", &OVERLAPPType);
+     
+addType(&oTypes, "POST", &POSTType);
+     
+addType(&oTypes, "REGISTRERINGSVERSJON", &REGISTRERINGSVERSJONType);
+     
+addType(&oTypes, "RESIPIENT", &RESIPIENTType);
+     
+addType(&oTypes, "RETNING", &RETNINGType);
+     
+addType(&oTypes, "RØR_DIMENSJON", &ROeR_DIMENSJONType);
+     
+addType(&oTypes, "SAK", &SAKType);
+     
+addType(&oTypes, "SEFRAK_ID", &SEFRAK_IDType);
+     
+addType(&oTypes, "SEFRAKFUNKSJON", &SEFRAKFUNKSJONType);
+     
+addType(&oTypes, "SENTRUMSSONEID", &SENTRUMSSONEIDType);
+     
+addType(&oTypes, "SERV", &SERVType);
+     
+addType(&oTypes, "SKRETSID", &SKRETSIDType);
+     
+addType(&oTypes, "SP_ADM", &SP_ADMType);
+     
+addType(&oTypes, "SP_AKLASS", &SP_AKLASSType);
+     
+addType(&oTypes, "SP_BESTAND", &SP_BESTANDType);
+     
+addType(&oTypes, "SP_BSKRIV", &SP_BSKRIVType);
+     
+addType(&oTypes, "SP_FLBRELEM", &SP_FLBRELEMType);
+     
+addType(&oTypes, "SP_GRLVOL", &SP_GRLVOLType);
+     
+addType(&oTypes, "SP_TEIG", &SP_TEIGType);
+     
+addType(&oTypes, "SP_TERKLASS", &SP_TERKLASSType);
+     
+addType(&oTypes, "SP_TETTHOYD", &SP_TETTHOYDType);
+     
+addType(&oTypes, "SP_TILTAK", &SP_TILTAKType);
+     
+addType(&oTypes, "SP_TILVVOL", &SP_TILVVOLType);
+     
+addType(&oTypes, "SP_TRESL", &SP_TRESLType);
+     
+addType(&oTypes, "TETTSTEDID", &TETTSTEDIDType);
+     
+addType(&oTypes, "UNIVERSELLUTFORMING", &UNIVERSELLUTFORMINGType);
+     
+addType(&oTypes, "UTNYTT", &UTNYTTType);
+     
+addType(&oTypes, "UTSLIPP", &UTSLIPPType);
+     
+addType(&oTypes, "UTV_TILL_PART", &UTV_TILL_PARTType);
+     
+addType(&oTypes, "VERN", &VERNType);
+     
+addType(&oTypes, "VKRETS", &VKRETSType);
+     
+addType(&oTypes, "VNR", &VNRType);
+     
+addType(&oTypes, "VPA", &VPAType);
+     
diff --git a/ogr/ogrsf_frmts/sosi/ogrsosidriver.cpp b/ogr/ogrsf_frmts/sosi/ogrsosidriver.cpp
index a7ba5fc..dd30802 100644
--- a/ogr/ogrsf_frmts/sosi/ogrsosidriver.cpp
+++ b/ogr/ogrsf_frmts/sosi/ogrsosidriver.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrsosidriver.cpp 32110 2015-12-10 17:19:40Z goatbar $
+ * $Id: ogrsosidriver.cpp 34420 2016-06-24 21:06:03Z rouault $
  *
  * Project:  SOSI Translator
  * Purpose:  Implements OGRSOSIDriver.
@@ -70,6 +70,7 @@ static GDALDataset *OGRSOSIDriverOpen( GDALOpenInfo* poOpenInfo )
     return poDS;
 }
 
+#ifdef WRITE_SUPPORT
 /************************************************************************/
 /*                              Create()                                */
 /************************************************************************/
@@ -91,13 +92,14 @@ static GDALDataset *OGRSOSIDriverCreate( const char * pszName,
     }
     return poDS;
 }
+#endif
 
 /************************************************************************/
 /*                         RegisterOGRSOSI()                            */
 /************************************************************************/
 
 void RegisterOGRSOSI() {
-    if( GDALGetDriverByName( "SOSI" ) == NULL )
+    if( GDALGetDriverByName( "SOSI" ) != NULL )
         return;
 
     GDALDriver *poDriver = new GDALDriver();
@@ -108,7 +110,9 @@ void RegisterOGRSOSI() {
     poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "drv_sosi.html" );
 
     poDriver->pfnOpen = OGRSOSIDriverOpen;
+#ifdef WRITE_SUPPORT
     poDriver->pfnCreate = OGRSOSIDriverCreate;
+#endif
     poDriver->pfnUnloadDriver = OGRSOSIDriverUnload;
 
     GetGDALDriverManager()->RegisterDriver( poDriver );
diff --git a/ogr/ogrsf_frmts/sosi/ogrsosilayer.cpp b/ogr/ogrsf_frmts/sosi/ogrsosilayer.cpp
index 051eb94..aabc72a 100644
--- a/ogr/ogrsf_frmts/sosi/ogrsosilayer.cpp
+++ b/ogr/ogrsf_frmts/sosi/ogrsosilayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrsosilayer.cpp 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogrsosilayer.cpp 34420 2016-06-24 21:06:03Z rouault $
  *
  * Project:  SOSI Translator
  * Purpose:  Implements OGRSOSILayer.
@@ -64,6 +64,7 @@ OGRFeatureDefn *OGRSOSILayer::GetLayerDefn() {
     return poFeatureDefn;
 }
 
+#ifdef WRITE_SUPPORT
 /************************************************************************/
 /*                           CreateField()                              */
 /************************************************************************/
@@ -117,6 +118,7 @@ OGRErr OGRSOSILayer::ICreateFeature(OGRFeature *poFeature) {
     LC_WsGr(poFileadm); /* Writing the header here! */
     return OGRERR_NONE;
 }
+#endif
 
 /************************************************************************/
 /*                           GetNextFeature()                           */
@@ -168,6 +170,7 @@ OGRFeature *OGRSOSILayer::GetNextFeature() {
             long nRefNr;
             unsigned char nRefStatus;
             long nRefCount;
+            bool correct = true;
             LC_GRF_STATUS oGrfStat;
 
             // Iterate through all objects that constitute this area.
@@ -176,33 +179,71 @@ OGRFeature *OGRSOSILayer::GetNextFeature() {
             while (nRefCount > 0) {
                 if (poParent->papoBuiltGeometries[nRefNr] == NULL) {
                     // This should not happen under normal operation.
-                    CPLError( CE_Fatal, CPLE_AppDefined,
-                              "Feature %li referenced by %li, but it was not "
-                              "initialized.", nRefNr, oNextSerial.lNr);
-                    return NULL;
+                    CPLError( CE_Warning, CPLE_AppDefined, "Feature %li referenced by %li, but it was not initialized. Geometry may be broken.", nRefNr, oNextSerial.lNr);
+                    correct = false;
+                    //return NULL;
+                    break;
                 }
-                OGRLineString *poCurve
-                    = (OGRLineString*)(poParent->papoBuiltGeometries[nRefNr]);
-                if (nRefStatus == LC_MED_DIG) {         /* clockwise */
+                OGRGeometry *geom = poParent->papoBuiltGeometries[nRefNr];
+                if (geom->getGeometryType() == wkbLineString) {
+                  OGRLineString *poCurve = (OGRLineString*)geom;
+                  if (nRefStatus == LC_MED_DIG) {         /* clockwise */
                     poOuter->addSubLineString(poCurve);
-                } else if (nRefStatus == LC_MOT_DIG) {  /* counter-clockwise */
-                    poOuter->addSubLineString(poCurve,poCurve->getNumPoints()-1,0);
+                  } else if (nRefStatus == LC_MOT_DIG) {  /* counter-clockwise */
+                      poOuter->addSubLineString(poCurve,poCurve->getNumPoints()-1,0);
+                  } else {
+                      CPLError( CE_Failure, CPLE_OpenFailed, "Internal error: GRF_*_OY encountered.");
+                      return NULL;
+                  }
                 } else {
-                    CPLError( CE_Failure, CPLE_OpenFailed,
-                              "Island (OEY) encountered, "
-                              "but not yet supported.");
-                    delete poOuter;
-                    return NULL;
+                    CPLError( CE_Warning, CPLE_AppDefined, "Element %li composed of non-linestrings (REF %li of type %i). Ignored.", oNextSerial.lNr, nRefNr, geom->getGeometryType());
                 }
                 nRefCount = LC_GetRefFlate(&oGrfStat, GRF_YTRE, &nRefNr, &nRefStatus, 1);
             }
 
-            OGRPolygon *poLy = new OGRPolygon();
-            poLy->addRingDirectly(poOuter);
-            poGeom = poLy;
+            if (correct) {
+              OGRPolygon *poLy = new OGRPolygon();
+              poOuter->closeRings();
+              poLy->addRingDirectly(poOuter);
+
+              OGRLinearRing *poInner = 0;
+              nRefCount = LC_GetRefFlate(&oGrfStat, GRF_INDRE, &nRefNr, &nRefStatus, 1);
+              while (nRefCount > 0) {
+                  if (nRefNr == -1) {
+                    if (poInner && (poInner->getNumPoints()>2)) {   /* If this is not the first polygon, terminate and add the last */
+                          poInner->closeRings();
+                          poLy->addRingDirectly(poInner);
+                    }
+                    poInner = new OGRLinearRing();  /* Initialize a new closed polygon */
+                  } else {
+                    if (poParent->papoBuiltGeometries[nRefNr] == NULL) { /* this shouldn't happen under normal operation */
+                        CPLError( CE_Fatal, CPLE_AppDefined, "Feature %li referenced by %li, but it was not initialized.", nRefNr, oNextSerial.lNr);
+                        return NULL;
+                    }
+                    OGRGeometry *geom = poParent->papoBuiltGeometries[nRefNr];
+                    if (geom->getGeometryType() == wkbLineString) {
+                      OGRLineString *poCurve = (OGRLineString*)geom;
+                      if (nRefStatus == LC_MED_DIG) {         /* clockwise */
+                        poInner->addSubLineString(poCurve);
+                      } else if (nRefStatus == LC_MOT_DIG) {  /* counter-clockwise */
+                          poInner->addSubLineString(poCurve,poCurve->getNumPoints()-1,0);
+                      } else {
+                          CPLError( CE_Failure, CPLE_OpenFailed, "Internal error: GRF_*_OY encountered.");
+                          return NULL;
+                      }
+                    } else {
+                        CPLError( CE_Warning, CPLE_AppDefined, "Element %li composed of non-linestrings (REF %li of type %i). Ignored.", oNextSerial.lNr, nRefNr, geom->getGeometryType());
+                    }
+                  }
+                  nRefCount = LC_GetRefFlate(&oGrfStat, GRF_INDRE, &nRefNr, &nRefStatus, 1);
+              }
+              poGeom = poLy;
+            }
             break;
         }
-        case L_KURVE: {  /* curve */
+        case L_KURVE:    /* curve */
+        case L_LINJE:    /* curve, not simplifyable */
+        case L_BUEP:  {  /* curve, interpolated from circular arc */
             oGType = wkbLineString;
 
             OGRLineString *poCurve = (OGRLineString*)(poParent->papoBuiltGeometries[oNextSerial.lNr]);
@@ -224,6 +265,9 @@ OGRFeature *OGRSOSILayer::GetNextFeature() {
             poGeom = poMP->clone();
             break;
         }
+        case L_SYMBOL: {
+            //CPLError( CE_Warning, CPLE_OpenFailed, "Geometry of type SYMBOL treated as point (PUNKT).");
+        }
         case L_PUNKT: {  /* point */
             oGType = wkbPoint;
             OGRPoint *poPoint = (OGRPoint*)(poParent->papoBuiltGeometries[oNextSerial.lNr]);
@@ -254,22 +298,61 @@ OGRFeature *OGRSOSILayer::GetNextFeature() {
 
         /* set all headers found in this group - we export everything, just in case */
         for (iHeaders = oHeaders.begin(); iHeaders != oHeaders.end(); iHeaders++) {
+            OGRSOSIDataType *poType = SOSIGetType(iHeaders->first);
+            OGRSOSISimpleDataType *poElements = poType->getElements();
+
             const char *pszLine = iHeaders->second.c_str();
-            int iHNr = poHeaderDefn->find(iHeaders->first)->second;
-            if (iHNr == -1) {
-				CPLError( CE_Warning, CPLE_AppDefined, "Could not find field definition for %s.", iHeaders->first.c_str());
-                continue;
-			}
-            if ((pszLine[0] == '\'')||(pszLine[0] == '\"')) { /* If the value is quoted, ignore these */
-                int nLen = static_cast<int>(strlen(pszLine));
-                char *pszNline = (char*)CPLMalloc(nLen-1);
-                strncpy(pszNline, pszLine+1, nLen-2);
-                pszNline[nLen-2] = '\0';
-                poFeature->SetField( iHNr, pszNline);
-                CPLFree(pszNline);
-            } else {
-                poFeature->SetField( iHNr, pszLine);
-            }
+            char** tokens = CSLTokenizeString(iHeaders->second.c_str());
+
+            for (int k=0; k<poType->getElementCount(); k++) {
+                if (tokens[k] == 0) break;
+
+                if (strcmp(poElements[k].GetName(),"")==0) continue;
+                int iHNr = poHeaderDefn->find(poElements[k].GetName())->second;
+                if (iHNr == -1) {
+	    			CPLError( CE_Warning, CPLE_AppDefined, "Could not find field definition for %s.", poElements[k].GetName());
+                    continue;
+    			}
+                OGRFieldType nType = poElements[k].GetType();
+                switch (nType) {
+                  case OFTInteger: {
+                    poFeature->SetField( iHNr, SOSITypeToInt(tokens[k]));
+                    break;
+                  }
+                  case OFTDate: {
+                    int date[3];
+                    SOSITypeToDate(tokens[k], date);
+                    poFeature->SetField( iHNr, date[0], date[1], date[2]);
+                    break;
+                  }
+                  case OFTDateTime: {
+                    int date[6];
+                    SOSITypeToDateTime(tokens[k], date);
+                    if (date[0]>0) 
+                      poFeature->SetField( iHNr, date[0], date[1], date[2], date[3], date[4], static_cast<float>(date[5]), 1);
+                    break;
+                  }
+                  case OFTReal: {
+                    poFeature->SetField( iHNr, SOSITypeToReal(tokens[k]));
+                    break;
+                  }
+                  default: { 
+                    if ((k==0)&&((pszLine[0] == '\'')||(pszLine[0] == '\"'))) { /* If the value is quoted, ignore these */
+                        int nLen = strlen(pszLine);
+                        char *pszNline = (char*)CPLMalloc(nLen-1);
+                        strncpy(pszNline, pszLine+1, nLen-2);
+                        pszNline[nLen-2] = '\0';
+                        poFeature->SetField( iHNr, pszNline);
+                        CPLFree(pszNline);
+                    } else {
+                        poFeature->SetField( iHNr, tokens[k]);
+                    }
+                    break;
+                  }
+                }
+          }
+
+          CSLDestroy(tokens);
         }
 
         if( poGeom != NULL )
@@ -305,8 +388,10 @@ int OGRSOSILayer::TestCapability( const char * pszCap ) {
 
     if( EQUAL(pszCap,OLCStringsAsUTF8) )
         return TRUE;
+#if 0
     if( EQUAL(pszCap,OLCCreateField) )
         return TRUE;
     else
+#endif
         return FALSE;
 }
diff --git a/ogr/ogrsf_frmts/sosi/tools/README b/ogr/ogrsf_frmts/sosi/tools/README
new file mode 100644
index 0000000..e3fa1eb
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/tools/README
@@ -0,0 +1,7 @@
+Use this script to create a valid "ogrsosidatatypes.h" include file based on the element definitions in the standard. You can extract the XML files by exporting the tables of the same name from the official Access-Database at
+
+http://www.primar.org/statkart.ny.no/nor/SOSI/SOSI-std/SOSI-db_versjoner/SOSI-db+-+SOSI+standarden+i+en+Access-database.d25-SwBDU1O.ips
+
+Note: to avoid too big files to be kept in SVN,  Elementdefinisjoner.xml and 
+Gruppeelement_sammensetning.xml have been put in http://download.osgeo.org/gdal/tools/sosi/
+Download them locally before running the script.
diff --git a/ogr/ogrsf_frmts/sosi/tools/basicelements.xslt b/ogr/ogrsf_frmts/sosi/tools/basicelements.xslt
new file mode 100644
index 0000000..099a886
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/tools/basicelements.xslt
@@ -0,0 +1,25 @@
+<xsl:transform version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:od="urn:schemas-microsoft-com:officedata">
+
+<xsl:variable name="and"><![CDATA[&]]></xsl:variable>
+
+<xsl:template match="/dataroot">
+  <xsl:for-each select="Elementdefinisjoner">
+    <xsl:if test="verditype!='*'">
+    <xsl:if test="verditype!='REF'">
+      addSimpleType(<xsl:value-of select="$and" disable-output-escaping="yes"/>oTypes, "<xsl:value-of select="elementnavn"/>", "<xsl:value-of select="logisk_navn"/>", <xsl:choose>
+        <xsl:when test="verditype='T'">OFTString</xsl:when>
+        <xsl:when test="verditype='H'">OFTInteger</xsl:when>
+        <xsl:when test="verditype='D'">OFTReal</xsl:when>
+        <xsl:when test="verditype='DATO'">OFTDate</xsl:when>
+        <xsl:when test="verditype='DATOTID'">OFTDateTime</xsl:when>
+        <xsl:when test="verditype='BOOLSK'">OFTString</xsl:when><!--TODO-->
+      </xsl:choose>);
+    </xsl:if>
+    </xsl:if>
+  </xsl:for-each>
+</xsl:template>
+
+</xsl:transform>
+
diff --git a/ogr/ogrsf_frmts/sosi/tools/convert.sh b/ogr/ogrsf_frmts/sosi/tools/convert.sh
new file mode 100755
index 0000000..28e1db7
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/tools/convert.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# requires xsltproc - if you are not on linux or prefer to use another XSLT processor, follow the human-readable instructions
+
+cp ../ogrsosidatatypes.h ../ogrsosidatatypes.h.bak 2>/dev/null || true                     # make a backup of the old header
+
+xsltproc basicelements.xslt Elementdefinisjoner.xml | tail -n +2  > ../ogrsosidatatypes.h  # apply basicelements.xslt, skip XML header
+head -n -1 Gruppeelement_sammensetning.xml > both.xml                                      # concatenate both input files into a single file,
+tail -n +3 Elementdefinisjoner.xml >> both.xml                                             #   moving all elements into the <dataroot> node
+xsltproc groupelements.xslt both.xml | tail -n +2 >> ../ogrsosidatatypes.h                 # apply groupelements.xslt, skip XML header
+rm both.xml                                                                                #   and attach to ogrsosidatatypes.h
diff --git a/ogr/ogrsf_frmts/sosi/tools/groupelements.xslt b/ogr/ogrsf_frmts/sosi/tools/groupelements.xslt
new file mode 100644
index 0000000..efbb88b
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/tools/groupelements.xslt
@@ -0,0 +1,62 @@
+<xsl:transform version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:od="urn:schemas-microsoft-com:officedata">
+
+<xsl:include href="unnorsk.xslt" />
+
+<xsl:variable name="and"><![CDATA[&]]></xsl:variable>
+<xsl:key name="groups" match="//gruppe_element" use="@first"/>
+
+<xsl:template match="/dataroot">
+
+  <xsl:for-each select="Gruppeelement_sammensetning">
+   <xsl:variable name="datatyp"><xsl:value-of select="datatypenavn" /></xsl:variable>
+   <xsl:variable name="dtnsafe"><xsl:call-template name="unnorsk"><xsl:with-param name="text" select="gruppe_element"/></xsl:call-template></xsl:variable>
+   <xsl:variable name="maxrf">
+     <xsl:for-each select="//Gruppeelement_sammensetning[datatypenavn=$datatyp]/rekkefølge">
+       <xsl:sort data-type="number" order="descending"/>
+       <xsl:if test="position()=1"><xsl:value-of select="."/></xsl:if>
+     </xsl:for-each>
+   </xsl:variable>
+   <xsl:if test="./datatypenavn">
+     <xsl:if test="rekkefølge=1">
+OGRSOSIDataType <xsl:value-of select="$dtnsafe" />Type = OGRSOSIDataType(<xsl:value-of select="$maxrf" />);
+     </xsl:if>
+   </xsl:if>
+  </xsl:for-each>
+
+  <xsl:for-each select="Gruppeelement_sammensetning">
+   <xsl:variable name="elemtyp"><xsl:value-of select="basis_element" /></xsl:variable>
+   <xsl:variable name="dtnsafe"><xsl:call-template name="unnorsk"><xsl:with-param name="text" select="gruppe_element"/></xsl:call-template></xsl:variable>
+   <xsl:variable name="oft">
+    <xsl:for-each select="//Elementdefinisjoner[elementnavn=$elemtyp]">
+      <xsl:choose>
+        <xsl:when test="verditype='T'">OFTString</xsl:when> 
+        <xsl:when test="verditype='H'">OFTInteger</xsl:when>
+        <xsl:when test="verditype='D'">OFTReal</xsl:when>
+        <xsl:when test="verditype='DATO'">OFTDate</xsl:when>
+        <xsl:when test="verditype='DATOTID'">OFTDateTime</xsl:when>
+        <xsl:when test="verditype='BOOLSK'">OFTString</xsl:when>
+        <xsl:otherwise>OFTString</xsl:otherwise> <!-- DEBUG: Nested complex type -->
+      </xsl:choose>
+    </xsl:for-each>
+   </xsl:variable>
+
+   <xsl:if test="./datatypenavn">
+<xsl:value-of select="$dtnsafe" />Type.setElement(<xsl:value-of select="rekkefølge -1" />, "<xsl:value-of select="egenskapsnavn" />", <xsl:value-of select="$oft" />); 
+   </xsl:if>
+  </xsl:for-each>
+
+  <xsl:for-each select="Gruppeelement_sammensetning">
+   <xsl:variable name="dtnsafe"><xsl:call-template name="unnorsk"><xsl:with-param name="text" select="gruppe_element"/></xsl:call-template></xsl:variable>
+   <xsl:if test="./datatypenavn">
+     <xsl:if test="rekkefølge=1">
+addType(<xsl:value-of select="$and" disable-output-escaping="yes"/>oTypes, "<xsl:value-of select="gruppe_element" />", <xsl:value-of select="$and" disable-output-escaping="yes"/><xsl:value-of select="$dtnsafe"/>Type);
+     </xsl:if>
+   </xsl:if>
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:transform>
+
diff --git a/ogr/ogrsf_frmts/sosi/tools/unnorsk.xslt b/ogr/ogrsf_frmts/sosi/tools/unnorsk.xslt
new file mode 100644
index 0000000..d867a03
--- /dev/null
+++ b/ogr/ogrsf_frmts/sosi/tools/unnorsk.xslt
@@ -0,0 +1,74 @@
+<xsl:transform version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:od="urn:schemas-microsoft-com:officedata">
+
+ <xsl:template name="string-replace-all">
+    <xsl:param name="text" />
+    <xsl:param name="replace" />
+    <xsl:param name="by" />
+    <xsl:choose>
+      <xsl:when test="contains($text, $replace)">
+        <xsl:value-of select="substring-before($text,$replace)" />
+        <xsl:value-of select="$by" />
+        <xsl:value-of select="substring-after($text,$replace)" />
+<!--        <xsl:call-template name="string-replace-all">
+          <xsl:with-param name="text"
+          select="substring-after($text,$replace)" />
+          <xsl:with-param name="replace" select="$replace" />
+          <xsl:with-param name="by" select="$by" />
+        </xsl:call-template>-->
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$text" />
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <!-- yay xslt 1.0 -->
+  <xsl:template name="unnorsk">
+    <xsl:param name="text" />
+    <xsl:variable name="aa">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$text" />
+      <xsl:with-param name="replace" select="'å'" />
+      <xsl:with-param name="by" select="'aa'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="Aa">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$aa" />
+      <xsl:with-param name="replace" select="'Å'" />
+      <xsl:with-param name="by" select="'Aa'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="ae">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$Aa" />
+      <xsl:with-param name="replace" select="'æ'" />
+      <xsl:with-param name="by" select="'ae'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="Ae">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$ae" />
+      <xsl:with-param name="replace" select="'Æ'" />
+      <xsl:with-param name="by" select="'Ae'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="oe">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$Ae" />
+      <xsl:with-param name="replace" select="'ø'" />
+      <xsl:with-param name="by" select="'oe'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:variable name="Oe">
+    <xsl:call-template name="string-replace-all">
+      <xsl:with-param name="text" select="$oe" />
+      <xsl:with-param name="replace" select="'Ø'" />
+      <xsl:with-param name="by" select="'Oe'" />
+    </xsl:call-template>
+    </xsl:variable>
+    <xsl:value-of select="$Oe" />
+  </xsl:template>
+</xsl:transform>
diff --git a/ogr/ogrsf_frmts/vfk/vfkreadersqlite.cpp b/ogr/ogrsf_frmts/vfk/vfkreadersqlite.cpp
index ecdde6f..e72a5b2 100644
--- a/ogr/ogrsf_frmts/vfk/vfkreadersqlite.cpp
+++ b/ogr/ogrsf_frmts/vfk/vfkreadersqlite.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: vfkreadersqlite.cpp 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: vfkreadersqlite.cpp 34258 2016-05-23 11:49:11Z martinl $
  *
  * Project:  VFK Reader (SQLite)
  * Purpose:  Implements VFKReaderSQLite class.
@@ -113,18 +113,58 @@ VFKReaderSQLite::VFKReaderSQLite(const char *pszFilename) : VFKReader(pszFilenam
     */
 
     CPLDebug("OGR-VFK", "New DB: %s Spatial: %s",
-	     m_bNewDb ? "yes" : "no", m_bSpatial ? "yes" : "no");
+             m_bNewDb ? "yes" : "no", m_bSpatial ? "yes" : "no");
 
+    char* pszErrMsg;
     if (SQLITE_OK != sqlite3_open(osDbName, &m_poDB)) {
         CPLError(CE_Failure, CPLE_AppDefined,
-                 "Creating SQLite DB failed");
+                 "Creating SQLite DB failed: %s",
+                 sqlite3_errmsg(m_poDB));
     }
-    else {
-        char* pszErrMsg = NULL;
-        CPL_IGNORE_RET_VAL(sqlite3_exec(m_poDB, "PRAGMA synchronous = OFF", NULL, NULL, &pszErrMsg));
+
+    if (!m_bNewDb) {
+        char** papszResult;
+        int nRowCount, nColCount;
+        
+        /* check if DB is up-to-date datasource */
+        pszErrMsg = NULL;
+        papszResult = NULL;
+        nRowCount = nColCount = 0;
+        osCommand.Printf("SELECT * FROM %s LIMIT 1", VFK_DB_TABLE);
+        sqlite3_get_table(m_poDB,
+                          osCommand.c_str(),
+                          &papszResult,
+                          &nRowCount, &nColCount, &pszErrMsg);
+        sqlite3_free_table(papszResult);
         sqlite3_free(pszErrMsg);
+        pszErrMsg = NULL;
+        
+        if (nColCount != 6) {
+            /* it seems that DB is outdated, let's create new DB from
+             * scratch */
+            if (SQLITE_OK != sqlite3_close(m_poDB)) {
+                CPLError(CE_Failure, CPLE_AppDefined,
+                         "Closing SQLite DB failed: %s",
+                         sqlite3_errmsg(m_poDB));
+            }
+            VSIUnlink(osDbName);
+            if (SQLITE_OK != sqlite3_open(osDbName, &m_poDB)) {
+                CPLError(CE_Failure, CPLE_AppDefined,
+                         "Creating SQLite DB failed: %s",
+                         sqlite3_errmsg(m_poDB));
+            }
+            CPLDebug("OGR-VFK", "Internal DB (%s) is invalid - will be re-created",
+                     m_pszDBname);
+
+            m_bNewDb = TRUE;
+        }
     }
 
+    pszErrMsg = NULL;
+    CPL_IGNORE_RET_VAL(sqlite3_exec(m_poDB, "PRAGMA synchronous = OFF",
+                                    NULL, NULL, &pszErrMsg));
+    sqlite3_free(pszErrMsg);
+    
     if (m_bNewDb) {
         /* new DB, create support metadata tables */
         osCommand.Printf("CREATE TABLE %s (file_name text, table_name text, num_records integer, "
@@ -146,7 +186,7 @@ VFKReaderSQLite::~VFKReaderSQLite()
     /* close tmp SQLite DB */
     if (SQLITE_OK != sqlite3_close(m_poDB)) {
         CPLError(CE_Failure, CPLE_AppDefined,
-                 "Closing SQLite DB failed\n  %s",
+                 "Closing SQLite DB failed: %s",
                  sqlite3_errmsg(m_poDB));
     }
     CPLDebug("OGR-VFK", "Internal DB (%s) closed",
diff --git a/ogr/ogrsf_frmts/vrt/drv_vrt.html b/ogr/ogrsf_frmts/vrt/drv_vrt.html
index 3f6d7f9..f5db130 100644
--- a/ogr/ogrsf_frmts/vrt/drv_vrt.html
+++ b/ogr/ogrsf_frmts/vrt/drv_vrt.html
@@ -138,12 +138,11 @@ The type of geometry encoding is indicated with the <b>encoding</b> attribute wh
 value "WKT", "WKB" or "PointFromColumns".<br>
 If the encoding is "WKT" or "WKB" then the <b>field</b> attribute will have
 the name of the field containing the WKT or WKB geometry.<br>
-If the encoding is "PointFromColumns" then the <b>x</b>, <b>y</b> and <b>z</b> attributes
-will have the names of the columns to be used for the X, Y and Z coordinates.
-The <b>z</b> attribute is optional.<br>
-Starting with GDAL 1.7.0, the optional <b>reportSrcColumn</b> attribute can be used to specify
-whether the source geometry fields (the fields set in the <b>field</b>, <b>x</b>, <b>x</b>
-or <b>z</b> attributes) should be reported as fields of the VRT layer. It defaults to TRUE.
+If the encoding is "PointFromColumns" then the <b>x</b>, <b>y</b>, <b>z</b> and <b>m</b> attributes
+will have the names of the columns to be used for the X, Y, Z and M coordinates.
+The <b>z</b> and <b>m</b> attributes are optional (m only supported since OGR 2.1.1).<br>
+The optional <b>reportSrcColumn</b> attribute can be used to specify
+whether the source geometry fields (the fields set in the <b>field</b>, <b>x</b>, <b>y</b>, <b>z</b>, <b>m</b> attributes) should be reported as fields of the VRT layer. It defaults to TRUE.
 If set to FALSE, the source geometry fields will only be used to build the geometry of the features of the VRT layer.</li>
 <p>
 Starting with OGR 1.11, the GeometryField element can be repeated as many times
diff --git a/ogr/ogrsf_frmts/vrt/ogr_vrt.h b/ogr/ogrsf_frmts/vrt/ogr_vrt.h
index 1d2d0ba..dfaa632 100644
--- a/ogr/ogrsf_frmts/vrt/ogr_vrt.h
+++ b/ogr/ogrsf_frmts/vrt/ogr_vrt.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr_vrt.h 33714 2016-03-13 05:42:13Z goatbar $
+ * $Id: ogr_vrt.h 34203 2016-05-10 14:06:35Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Private definitions for OGR/VRT driver.
@@ -70,7 +70,7 @@ class OGRVRTGeomFieldProps
         int                 iGeomField;
 
                             // VGS_PointFromColumn
-        int                 iGeomXField, iGeomYField, iGeomZField;
+        int                 iGeomXField, iGeomYField, iGeomZField, iGeomMField;
         int                 bReportSrcColumn;
         int                 bUseSpatialSubquery;
 
diff --git a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp
index 734b005..69b3355 100644
--- a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp
+++ b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrvrtlayer.cpp 34079 2016-04-24 18:44:29Z rouault $
+ * $Id: ogrvrtlayer.cpp 34203 2016-05-10 14:06:35Z rouault $
  *
  * Project:  OpenGIS Simple Features Reference Implementation
  * Purpose:  Implements OGRVRTLayer class.
@@ -34,7 +34,7 @@
 #include "ogrpgeogeometry.h"
 #include <string>
 
-CPL_CVSID("$Id: ogrvrtlayer.cpp 34079 2016-04-24 18:44:29Z rouault $");
+CPL_CVSID("$Id: ogrvrtlayer.cpp 34203 2016-05-10 14:06:35Z rouault $");
 
 #define UNSUPPORTED_OP_READ_ONLY "%s : unsupported operation on a read-only datasource."
 
@@ -53,6 +53,7 @@ OGRVRTGeomFieldProps::OGRVRTGeomFieldProps() :
     iGeomXField(-1),
     iGeomYField(-1),
     iGeomZField(-1),
+    iGeomMField(-1),
     bReportSrcColumn(TRUE),
     bUseSpatialSubquery(FALSE),
     bNullable(TRUE)
@@ -329,6 +330,8 @@ int OGRVRTLayer::ParseGeometryField(CPLXMLNode* psNode,
             CPLGetXMLValue( psNode, "y", "missing" ) );
         poProps->iGeomZField = GetSrcLayerDefn()->GetFieldIndex(
             CPLGetXMLValue( psNode, "z", "missing" ) );
+        poProps->iGeomMField = GetSrcLayerDefn()->GetFieldIndex(
+            CPLGetXMLValue( psNode, "m", "missing" ) );
 
         if( poProps->iGeomXField == -1 || poProps->iGeomYField == -1 )
         {
@@ -339,10 +342,11 @@ int OGRVRTLayer::ParseGeometryField(CPLXMLNode* psNode,
 
         if( pszGType == NULL )
         {
+            poProps->eGeomType = wkbPoint;
             if( poProps->iGeomZField != -1 )
-                poProps->eGeomType = wkbPoint25D;
-            else
-                poProps->eGeomType = wkbPoint;
+                poProps->eGeomType = OGR_GT_SetZ(poProps->eGeomType);
+            if( poProps->iGeomMField != -1 )
+                poProps->eGeomType = OGR_GT_SetM(poProps->eGeomType);
         }
     }
     else
@@ -1033,6 +1037,7 @@ try_again:
                     (iSrcField == apoGeomFieldProps[iGF]->iGeomXField ||
                      iSrcField == apoGeomFieldProps[iGF]->iGeomYField ||
                      iSrcField == apoGeomFieldProps[iGF]->iGeomZField ||
+                     iSrcField == apoGeomFieldProps[iGF]->iGeomMField ||
                      (apoGeomFieldProps[iGF]->eGeometryStyle != VGS_Direct &&
                       iSrcField == apoGeomFieldProps[iGF]->iGeomField)) )
                 {
@@ -1533,15 +1538,23 @@ retry:
         }
         else if( eGeometryStyle == VGS_PointFromColumns )
         {
+            OGRPoint* poPoint;
             if( apoGeomFieldProps[i]->iGeomZField != -1 )
-                poDstFeat->SetGeomFieldDirectly( i,
-                    new OGRPoint( poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomXField ),
+            {
+                poPoint = new OGRPoint( poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomXField ),
                                 poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomYField ),
-                                poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomZField ) ) );
+                                poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomZField ) );
+            }
             else
-                poDstFeat->SetGeomFieldDirectly( i,
-                    new OGRPoint( poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomXField ),
-                                poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomYField ) ) );
+            {
+                poPoint = new OGRPoint( poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomXField ),
+                                poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomYField ) );
+            }
+            if( apoGeomFieldProps[i]->iGeomMField >= 0 )
+            {
+                poPoint->setM( poSrcFeat->GetFieldAsDouble( apoGeomFieldProps[i]->iGeomMField ) );
+            }
+            poDstFeat->SetGeomFieldDirectly( i, poPoint );
         }
         else
         {
@@ -1793,6 +1806,11 @@ OGRFeature* OGRVRTLayer::TranslateVRTFeatureToSrcFeature( OGRFeature* poVRTFeatu
                         poSrcFeat->SetField( apoGeomFieldProps[i]->iGeomZField,
                                              ((OGRPoint*)poGeom)->getZ() );
                     }
+                    if( apoGeomFieldProps[i]->iGeomMField != -1 )
+                    {
+                        poSrcFeat->SetField( apoGeomFieldProps[i]->iGeomMField,
+                                             ((OGRPoint*)poGeom)->getM() );
+                    }
                 }
             }
         }
@@ -1822,7 +1840,8 @@ OGRFeature* OGRVRTLayer::TranslateVRTFeatureToSrcFeature( OGRFeature* poVRTFeatu
                  anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomField) ||
                 anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomXField ||
                 anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomYField ||
-                anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomZField)
+                anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomZField ||
+                anSrcField[iVRTField] == apoGeomFieldProps[i]->iGeomMField)
             {
                 bSkip = TRUE;
                 break;
@@ -2343,7 +2362,8 @@ OGRErr OGRVRTLayer::SetIgnoredFields( const char **papszFields )
                     {
                         if( (iSrcField == apoGeomFieldProps[iGeomVRTField]->iGeomXField ||
                              iSrcField == apoGeomFieldProps[iGeomVRTField]->iGeomYField ||
-                             iSrcField == apoGeomFieldProps[iGeomVRTField]->iGeomZField) )
+                             iSrcField == apoGeomFieldProps[iGeomVRTField]->iGeomZField ||
+                             iSrcField == apoGeomFieldProps[iGeomVRTField]->iGeomMField) )
                         {
                             bOKToIgnore = FALSE;
                             break;
@@ -2402,6 +2422,9 @@ OGRErr OGRVRTLayer::SetIgnoredFields( const char **papszFields )
             iSrcField = apoGeomFieldProps[iVRTField]->iGeomZField;
             if (iSrcField >= 0)
                 panSrcFieldsUsed[iSrcField] = TRUE;
+            iSrcField = apoGeomFieldProps[iVRTField]->iGeomMField;
+            if (iSrcField >= 0)
+                panSrcFieldsUsed[iSrcField] = TRUE;
         }
         /* Similarly for other kinds of geometry fields */
         else if( eGeometryStyle == VGS_WKT || eGeometryStyle == VGS_WKB ||
diff --git a/ogr/ogrsf_frmts/wfs/ogr_wfs.h b/ogr/ogrsf_frmts/wfs/ogr_wfs.h
index c88be7f..fd4cb0f 100644
--- a/ogr/ogrsf_frmts/wfs/ogr_wfs.h
+++ b/ogr/ogrsf_frmts/wfs/ogr_wfs.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr_wfs.h 32177 2015-12-14 07:25:30Z goatbar $
+ * $Id: ogr_wfs.h 34401 2016-06-24 12:34:12Z rouault $
  *
  * Project:  WFS Translator
  * Purpose:  Definition of classes for OGR WFS driver.
@@ -187,6 +187,8 @@ class OGRWFSLayer : public OGRLayer
     virtual OGRErr      CommitTransaction();
     virtual OGRErr      RollbackTransaction();
 
+    virtual OGRErr      SetIgnoredFields( const char **papszFields );
+
     int                 HasLayerDefn() { return poFeatureDefn != NULL; }
 
     OGRFeatureDefn*     ParseSchema(CPLXMLNode* psSchema);
diff --git a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp
index b2cda9e..08d370e 100644
--- a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp
+++ b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogrwfslayer.cpp 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogrwfslayer.cpp 34401 2016-06-24 12:34:12Z rouault $
  *
  * Project:  WFS Translator
  * Purpose:  Implements OGRWFSLayer class.
@@ -34,7 +34,7 @@
 #include "cpl_http.h"
 #include "parsexsd.h"
 
-CPL_CVSID("$Id: ogrwfslayer.cpp 33713 2016-03-12 17:41:57Z goatbar $");
+CPL_CVSID("$Id: ogrwfslayer.cpp 34401 2016-06-24 12:34:12Z rouault $");
 
 
 /************************************************************************/
@@ -1153,6 +1153,16 @@ void OGRWFSLayer::ResetReading()
         poBaseLayer->ResetReading();
 }
 
+/************************************************************************/
+/*                         SetIgnoredFields()                           */
+/************************************************************************/
+
+OGRErr OGRWFSLayer::SetIgnoredFields( const char **papszFields )
+{
+    bReloadNeeded = TRUE;
+    ResetReading();
+    return OGRLayer::SetIgnoredFields(papszFields);
+}
 
 /************************************************************************/
 /*                           GetNextFeature()                           */
@@ -1433,7 +1443,7 @@ int OGRWFSLayer::TestCapability( const char * pszCap )
     }
     else if( EQUAL(pszCap,OLCIgnoreFields) )
     {
-        return poBaseDS == NULL;
+        return TRUE;
     }
 
     return FALSE;
diff --git a/port/cpl_port.h b/port/cpl_port.h
index 74c33d6..36b15df 100644
--- a/port/cpl_port.h
+++ b/port/cpl_port.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: cpl_port.h 33907 2016-04-07 00:37:06Z goatbar $
+ * $Id: cpl_port.h 34135 2016-04-27 21:44:07Z rouault $
  *
  * Project:  CPL - Common Portability Library
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -547,6 +547,12 @@ static inline char* CPL_afl_friendly_strstr(const char* haystack, const char* ne
 #  define CPLIsNan(x) _isnan(x)
 #  define CPLIsInf(x) (!_isnan(x) && !_finite(x))
 #  define CPLIsFinite(x) _finite(x)
+#elif defined(HAVE_CXX11) && HAVE_CXX11 && defined(__GNUC__)
+/* When including <cmath> in C++11 the isnan() macro is undefined, so that */
+/* std::isnan() can work (#6489). This is a GCC specific workaround for now. */
+#  define CPLIsNan(x)    __builtin_isnan(x)
+#  define CPLIsInf(x)    __builtin_isinf(x)
+#  define CPLIsFinite(x) __builtin_isfinite(x)
 #else
 #  define CPLIsNan(x) isnan(x)
 #  ifdef isinf
diff --git a/port/cpl_vsi_error.cpp b/port/cpl_vsi_error.cpp
index 60b3b95..46b57e2 100644
--- a/port/cpl_vsi_error.cpp
+++ b/port/cpl_vsi_error.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: cpl_vsi_error.cpp 33763 2016-03-21 16:31:17Z rouault $
+ * $Id: cpl_vsi_error.cpp 34355 2016-06-16 08:55:20Z rouault $
  *
  * Project:  VSI Virtual File System
  * Purpose:  Implement an error system for reporting file system errors.
@@ -44,7 +44,7 @@
 #define TIMESTAMP_DEBUG
 //#define MEMORY_DEBUG
 
-CPL_CVSID("$Id: cpl_vsi_error.cpp 33763 2016-03-21 16:31:17Z rouault $");
+CPL_CVSID("$Id: cpl_vsi_error.cpp 34355 2016-06-16 08:55:20Z rouault $");
 
 static const int DEFAULT_LAST_ERR_MSG_SIZE =
 #if !defined(HAVE_VSNPRINTF)
@@ -164,7 +164,7 @@ void    VSIErrorV( VSIErrorNum err_no, const char *fmt, va_list args )
                             sizeof(VSIErrorContext)
                             - DEFAULT_LAST_ERR_MSG_SIZE
                             + psCtx->nLastErrMsgMax + 1) );
-            CPLSetTLS( CTLS_ERRORCONTEXT, psCtx, TRUE );
+            CPLSetTLS( CTLS_VSIERRORCONTEXT, psCtx, TRUE );
         }
 
         va_end( wrk_args );
diff --git a/port/cpl_vsi_virtual.h b/port/cpl_vsi_virtual.h
index 66ccc60..cdb7ae2 100644
--- a/port/cpl_vsi_virtual.h
+++ b/port/cpl_vsi_virtual.h
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: cpl_vsi_virtual.h 33759 2016-03-21 09:33:06Z rouault $
+ * $Id: cpl_vsi_virtual.h 34165 2016-05-03 13:14:27Z rouault $
  *
  * Project:  VSI Virtual File System
  * Purpose:  Declarations for classes related to the virtual filesystem.
@@ -202,7 +202,7 @@ VSIVirtualHandle CPL_DLL *VSICreateBufferedReaderHandle(VSIVirtualHandle* poBase
 VSIVirtualHandle* VSICreateBufferedReaderHandle(VSIVirtualHandle* poBaseHandle,
                                                 const GByte* pabyBeginningContent,
                                                 vsi_l_offset nCheatFileSize);
-VSIVirtualHandle* VSICreateCachedFile( VSIVirtualHandle* poBaseHandle, size_t nChunkSize = 32768, size_t nCacheSize = 0 );
+VSIVirtualHandle CPL_DLL *VSICreateCachedFile( VSIVirtualHandle* poBaseHandle, size_t nChunkSize = 32768, size_t nCacheSize = 0 );
 VSIVirtualHandle CPL_DLL *VSICreateGZipWritable( VSIVirtualHandle* poBaseHandle, int bRegularZLibIn, int bAutoCloseBaseHandle );
 
 #endif /* ndef CPL_VSI_VIRTUAL_H_INCLUDED */
diff --git a/port/cpl_vsil_unix_stdio_64.cpp b/port/cpl_vsil_unix_stdio_64.cpp
index 8d7f323..a4a94b6 100644
--- a/port/cpl_vsil_unix_stdio_64.cpp
+++ b/port/cpl_vsil_unix_stdio_64.cpp
@@ -1,5 +1,5 @@
 /**********************************************************************
- * $Id: cpl_vsil_unix_stdio_64.cpp 33758 2016-03-21 09:06:22Z rouault $
+ * $Id: cpl_vsil_unix_stdio_64.cpp 34353 2016-06-16 08:23:41Z rouault $
  *
  * Project:  CPL - Common Portability Library
  * Purpose:  Implement VSI large file api for Unix platforms with fseek64()
@@ -66,7 +66,7 @@
 #include <errno.h>
 #include <new>
 
-CPL_CVSID("$Id: cpl_vsil_unix_stdio_64.cpp 33758 2016-03-21 09:06:22Z rouault $");
+CPL_CVSID("$Id: cpl_vsil_unix_stdio_64.cpp 34353 2016-06-16 08:23:41Z rouault $");
 
 #if defined(UNIX_STDIO_64)
 
@@ -526,7 +526,7 @@ VSIUnixStdioFilesystemHandler::Open( const char *pszFilename,
 
     if( fp == NULL )
     {
-        if(bSetError) { VSIError(VSIE_FileError, "%s", strerror(nError)); }
+        if(bSetError) { VSIError(VSIE_FileError, "%s: %s", pszFilename, strerror(nError)); }
         errno = nError;
         return NULL;
     }
diff --git a/swig/include/ogr.i b/swig/include/ogr.i
index 6beedc4..8deeeed 100644
--- a/swig/include/ogr.i
+++ b/swig/include/ogr.i
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: ogr.i 33911 2016-04-07 12:34:39Z ajolma $
+ * $Id: ogr.i 34224 2016-05-13 06:04:34Z ajolma $
  *
  * Project:  OGR Core SWIG Interface declarations.
  * Purpose:  OGR declarations.
@@ -2020,8 +2020,7 @@ public:
   int GetGeomFieldIndex(int i) {
       if (i < 0 || i >= OGR_FD_GetGeomFieldCount(self))
           CPLError(CE_Failure, 1, FIELD_INDEX_ERROR_TMPL, i);
-      else
-          return i;
+      return i;
   }
 #endif
 
diff --git a/swig/include/perl/gdal_perl.i b/swig/include/perl/gdal_perl.i
index 29e65fe..5f46db5 100644
--- a/swig/include/perl/gdal_perl.i
+++ b/swig/include/perl/gdal_perl.i
@@ -140,8 +140,8 @@ use Geo::OSR;
 # Note that the 1/100000 digits may be used to create more than one
 # CPAN release from one GDAL release.
 
-our $VERSION = '2.0100';
-our $GDAL_VERSION = '2.1.0';
+our $VERSION = '2.0101';
+our $GDAL_VERSION = '2.1.1';
 
 =pod
 
@@ -1103,12 +1103,15 @@ sub Warped {
 
 sub Warp {
     my ($self, $dest, $options, $progress, $progress_data) = @_;
+    # can be run as object method (one dataset) and as package sub (a list of datasets)
     $options = Geo::GDAL::GDALWarpAppOptions->new(Geo::GDAL::make_processing_options($options));
     my $b = blessed($dest);
+    $self = [$self] unless ref $self eq 'ARRAY';
     if ($b && $b eq 'Geo::GDAL::Dataset') {
         Geo::GDAL::wrapper_GDALWarpDestDS($dest, $self, $options, $progress, $progress_data);
     } else {
-        return $self->stdout_redirection_wrapper(
+        return stdout_redirection_wrapper(
+            $self,
             $dest,
             \&Geo::GDAL::wrapper_GDALWarpDestName,
             $options, $progress, $progress_data
diff --git a/swig/include/perl/ogr_perl.i b/swig/include/perl/ogr_perl.i
index 19a4605..3b360e2 100644
--- a/swig/include/perl/ogr_perl.i
+++ b/swig/include/perl/ogr_perl.i
@@ -120,7 +120,7 @@ ALTERED_DESTROY(OGRGeometryShadow, OGRc, delete_Geometry)
 %perlcode %{
 
 package Geo::OGR;
-our $VERSION = '2.0100'; # this needs to be the same as that in gdal_perl.i
+our $VERSION = '2.0101'; # this needs to be the same as that in gdal_perl.i
 
 sub Driver {
     return 'Geo::GDAL::Driver' unless @_;
diff --git a/swig/perl/lib/Geo/GDAL.pm b/swig/perl/lib/Geo/GDAL.pm
index 7b4d332..31248c0 100644
--- a/swig/perl/lib/Geo/GDAL.pm
+++ b/swig/perl/lib/Geo/GDAL.pm
@@ -1003,8 +1003,8 @@ use Geo::OSR;
 # Note that the 1/100000 digits may be used to create more than one
 # CPAN release from one GDAL release.
 
-our $VERSION = '2.0100';
-our $GDAL_VERSION = '2.1.0';
+our $VERSION = '2.0101';
+our $GDAL_VERSION = '2.1.1';
 
 =pod
 
@@ -1966,12 +1966,15 @@ sub Warped {
 
 sub Warp {
     my ($self, $dest, $options, $progress, $progress_data) = @_;
+    # can be run as object method (one dataset) and as package sub (a list of datasets)
     $options = Geo::GDAL::GDALWarpAppOptions->new(Geo::GDAL::make_processing_options($options));
     my $b = blessed($dest);
+    $self = [$self] unless ref $self eq 'ARRAY';
     if ($b && $b eq 'Geo::GDAL::Dataset') {
         Geo::GDAL::wrapper_GDALWarpDestDS($dest, $self, $options, $progress, $progress_data);
     } else {
-        return $self->stdout_redirection_wrapper(
+        return stdout_redirection_wrapper(
+            $self,
             $dest,
             \&Geo::GDAL::wrapper_GDALWarpDestName,
             $options, $progress, $progress_data
diff --git a/swig/perl/lib/Geo/OGR.pm b/swig/perl/lib/Geo/OGR.pm
index 5556313..a286c88 100644
--- a/swig/perl/lib/Geo/OGR.pm
+++ b/swig/perl/lib/Geo/OGR.pm
@@ -893,7 +893,7 @@ package Geo::OGR;
 
 
 package Geo::OGR;
-our $VERSION = '2.0100'; # this needs to be the same as that in gdal_perl.i
+our $VERSION = '2.0101'; # this needs to be the same as that in gdal_perl.i
 
 sub Driver {
     return 'Geo::GDAL::Driver' unless @_;
diff --git a/swig/perl/ogr_wrap.cpp b/swig/perl/ogr_wrap.cpp
index aa87394..42d2738 100644
--- a/swig/perl/ogr_wrap.cpp
+++ b/swig/perl/ogr_wrap.cpp
@@ -2837,8 +2837,7 @@ SWIGINTERN OGRGeomFieldDefnShadow *OGRFeatureDefnShadow_GetGeomFieldDefn__SWIG_1
 SWIGINTERN int OGRFeatureDefnShadow_GetGeomFieldIndex__SWIG_0(OGRFeatureDefnShadow *self,int i){
       if (i < 0 || i >= OGR_FD_GetGeomFieldCount(self))
           CPLError(CE_Failure, 1, FIELD_INDEX_ERROR_TMPL, i);
-      else
-          return i;
+      return i;
   }
 SWIGINTERN int OGRFeatureDefnShadow_GetGeomFieldIndex__SWIG_1(OGRFeatureDefnShadow *self,char const *name){
       // Do not issue an error if the field doesn't exist. It is intended to be silent
diff --git a/swig/perl/t/alg.t b/swig/perl/t/alg.t
index 156d759..a6831d8 100644
--- a/swig/perl/t/alg.t
+++ b/swig/perl/t/alg.t
@@ -2,7 +2,7 @@ use strict;
 use warnings;
 use v5.10;
 use Scalar::Util 'blessed';
-use Test::More tests => 7;
+use Test::More tests => 9;
 BEGIN { use_ok('Geo::GDAL') };
 
 {
@@ -80,3 +80,25 @@ BEGIN { use_ok('Geo::GDAL') };
     $d = $b2->ReadTile;
     ok($d->[0][0] == 13, "Distance raster");
 }
+
+{
+    my $d = Geo::GDAL::Driver('MEM')->Create(Width => 20, Height => 20, Type => 'Byte');
+    my $dest = '/vsimem/tmp';
+    my $result;
+    eval {
+        $result = $d->Warp($dest, {to => 'SRC_METHOD=NO_GEOTRANSFORM'});
+        $result = blessed($result);
+    };
+    ok($@ eq '' && $result && $result eq 'Geo::GDAL::Dataset', "Warp dataset ($result) $@");
+}
+
+{
+    my $d = Geo::GDAL::Driver('MEM')->Create(Width => 20, Height => 20, Type => 'Byte');
+    my $dest = '/vsimem/tmp';
+    my $result;
+    eval {
+        $result = Geo::GDAL::Dataset::Warp([$d], $dest, {to => 'SRC_METHOD=NO_GEOTRANSFORM'});
+        $result = blessed($result);
+    };
+    ok($@ eq '' && $result && $result eq 'Geo::GDAL::Dataset', "Warp datasets ($result) $@");
+}
diff --git a/swig/python/scripts/gdal_polygonize.py b/swig/python/scripts/gdal_polygonize.py
index 15a041c..1f8c7c8 100755
--- a/swig/python/scripts/gdal_polygonize.py
+++ b/swig/python/scripts/gdal_polygonize.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 #******************************************************************************
-#  $Id: gdal_polygonize.py 33790 2016-03-26 12:42:12Z goatbar $
+#  $Id: gdal_polygonize.py 34304 2016-05-27 17:46:17Z rouault $
 #
 #  Project:  GDAL Python Interface
 #  Purpose:  Application for converting raster data to a vector polygon layer.
@@ -182,7 +182,7 @@ if dst_layer is None:
         srs = osr.SpatialReference()
         srs.ImportFromWkt( src_ds.GetProjectionRef() )
 
-    dst_layer = dst_ds.CreateLayer(dst_layername, srs = srs )
+    dst_layer = dst_ds.CreateLayer(dst_layername, geom_type=ogr.wkbPolygon, srs = srs )
 
     if dst_fieldname is None:
         dst_fieldname = 'DN'
diff --git a/swig/python/setup.py b/swig/python/setup.py
index 85d8799..6a4232d 100644
--- a/swig/python/setup.py
+++ b/swig/python/setup.py
@@ -7,7 +7,7 @@
 # Howard Butler hobu.inc at gmail.com
 
 
-gdal_version = '2.1.0'
+gdal_version = '2.1.1'
 
 import sys
 import os

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



More information about the Pkg-grass-devel mailing list