[libcitygml] 01/07: Imported Upstream version 2.0.4

Bas Couwenberg sebastic at debian.org
Fri Jan 20 15:53:08 UTC 2017


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

sebastic pushed a commit to branch master
in repository libcitygml.

commit f848bf182d807261c126f85619ebd0e0fa398df2
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Jan 20 16:32:12 2017 +0100

    Imported Upstream version 2.0.4
---
 .gitignore                                         |   1 +
 .travis.yml                                        |  20 ++-
 CMakeLists.txt                                     |   4 +-
 osgplugin/README                                   |  22 ---
 osgplugin/ReaderWriterCityGML.cpp                  |  14 +-
 sources/CMakeLists.txt                             |  39 +++++-
 sources/include/citygml/appearancemanager.h        |   6 +-
 sources/include/citygml/appearancetarget.h         |  10 +-
 sources/include/citygml/attributesmap.h            |  55 ++++++++
 sources/include/citygml/citygml.h                  |   4 +-
 sources/include/citygml/citygml_api.h.in           |  10 +-
 sources/include/citygml/citygmlfactory.h           |   4 +-
 sources/include/citygml/citygmllogger.h            |  26 +++-
 sources/include/citygml/citymodel.h                |   2 +-
 sources/include/citygml/cityobject.h               |  91 ++++++------
 sources/include/citygml/enum_type_bitmask.h        |  48 +++++++
 sources/include/citygml/featureobject.h            |   4 +-
 sources/include/citygml/geometry.h                 |  10 +-
 sources/include/citygml/geometrymanager.h          |   2 +-
 sources/include/citygml/implictgeometry.h          |   2 +-
 sources/include/citygml/object.h                   |   7 +-
 sources/include/citygml/polygon.h                  |  24 +++-
 sources/include/citygml/polygonmanager.h           |   2 +-
 sources/include/citygml/tesselator.h               |   6 +-
 sources/include/citygml/texture.h                  |   2 +-
 sources/include/citygml/texturetargetdefinition.h  |   4 +-
 sources/include/parser/appearanceelementparser.h   |   4 +-
 sources/include/parser/citygmldocumentparser.h     |   2 +-
 sources/include/parser/citymodelelementparser.h    |   2 +-
 sources/include/parser/cityobjectelementparser.h   |   7 +-
 sources/include/parser/geometryelementparser.h     |   2 +-
 .../parser/georeferencedtextureelementparser.h     |   2 +-
 .../include/parser/implicitgeometryelementparser.h |   2 +-
 sources/include/parser/linearringelementparser.h   |   2 +-
 sources/include/parser/linestringelementparser.h   |   2 +-
 sources/include/parser/materialelementparser.h     |   2 +-
 sources/include/parser/nodetypes.h                 |   2 +
 sources/include/parser/polygonelementparser.h      |   2 +-
 sources/include/parser/textureelementparser.h      |   2 +-
 sources/src/citygml/appearance.cpp                 |   2 +-
 sources/src/citygml/appearancemanager.cpp          |  12 +-
 sources/src/citygml/appearancetarget.cpp           |  10 +-
 sources/src/citygml/attributesmap.cpp              | 109 +++++++++++++++
 sources/src/citygml/citygmlfactory.cpp             |  38 +++---
 sources/src/citygml/citymodel.cpp                  |   8 +-
 sources/src/citygml/cityobject.cpp                 | 152 +++++++++++----------
 sources/src/citygml/envelope.cpp                   |   2 +-
 sources/src/citygml/featureobject.cpp              |   4 +-
 sources/src/citygml/geometry.cpp                   |   6 +-
 sources/src/citygml/geometrymanager.cpp            |   8 +-
 sources/src/citygml/georeferencedtexture.cpp       |   2 +-
 sources/src/citygml/implictgeometry.cpp            |   4 +-
 sources/src/citygml/linearring.cpp                 |  12 +-
 sources/src/citygml/material.cpp                   |   2 +-
 sources/src/citygml/materialtargetdefinition.cpp   |   2 +-
 sources/src/citygml/object.cpp                     |  14 +-
 sources/src/citygml/polygon.cpp                    |  30 ++--
 sources/src/citygml/polygonmanager.cpp             |   8 +-
 sources/src/citygml/tesselator.cpp                 |   5 +-
 sources/src/citygml/texture.cpp                    |   4 +-
 sources/src/citygml/texturecoordinates.cpp         |   4 +-
 sources/src/citygml/texturetargetdefinition.cpp    |   4 +-
 sources/src/citygml/transformmatrix.cpp            |   2 +-
 sources/src/parser/addressparser.cpp               |  40 ++++--
 sources/src/parser/appearanceelementparser.cpp     |  14 +-
 sources/src/parser/attributes.cpp                  |   2 +-
 sources/src/parser/citygmldocumentparser.cpp       |   9 +-
 sources/src/parser/citygmlelementparser.cpp        |   4 +-
 sources/src/parser/citymodelelementparser.cpp      |   8 +-
 sources/src/parser/cityobjectelementparser.cpp     |  87 ++++++++++--
 sources/src/parser/delayedchoiceelementparser.cpp  |   2 +-
 sources/src/parser/geocoordinatetransformer.cpp    |  46 ++++---
 sources/src/parser/geometryelementparser.cpp       |   8 +-
 .../parser/georeferencedtextureelementparser.cpp   |   6 +-
 sources/src/parser/gmlfeaturecollectionparser.cpp  |  10 +-
 .../src/parser/implicitgeometryelementparser.cpp   |   6 +-
 sources/src/parser/linearringelementparser.cpp     |   6 +-
 sources/src/parser/linestringelementparser.cpp     |   6 +-
 sources/src/parser/materialelementparser.cpp       |   6 +-
 sources/src/parser/nodetypes.cpp                   |   6 +-
 sources/src/parser/parserxercesc.cpp               |  41 +++---
 sources/src/parser/polygonelementparser.cpp        |   6 +-
 sources/src/parser/sequenceparser.cpp              |   2 +-
 sources/src/parser/textureelementparser.cpp        |  12 +-
 test/citygmltest.cpp                               |   2 +-
 85 files changed, 807 insertions(+), 418 deletions(-)

diff --git a/.gitignore b/.gitignore
index a70a610..cd1439e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ CMakeLists.txt.user*
 install
 build/
 buildRelease/
+*.autosave
diff --git a/.travis.yml b/.travis.yml
index 47781ae..4b87d82 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,24 @@
 language: cpp
+sudo: false
 compiler:
   - gcc
   - clang
 before_install:
   - echo $LANG
   - echo $LC_ALL
-  - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
-  - sudo apt-get update -qq
-  - sudo apt-get update --fix-missing
-  - if [ $TRAVIS_OS_NAME == linux ]; then sudo apt-get install -y libxerces-c-dev libxerces-c3.1 libgdal1h libgdal-dev cmake; fi
-  - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi
   - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
 script: mkdir build && cd build && cmake ../ && make
+addons:
+  apt:
+    sources:
+      - ubuntu-toolchain-r-test
+      - george-edison55-precise-backports
+    packages:
+      - libxerces-c-dev
+      - libxerces-c3.1
+      - libgdal1h
+      - libgdal-dev
+      - cmake-data
+      - cmake
+      - g++-4.8
+      - gcc-4.8
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d193f0b..c61ae8f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,10 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8.2 FATAL_ERROR)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0 FATAL_ERROR)
 
 PROJECT ( libcitygml )
 
 set(META_VERSION_MAJOR       "2")
 set(META_VERSION_MINOR       "0")
-set(META_VERSION_PATCH       "0")
+set(META_VERSION_PATCH       "4")
 
 set(META_VERSION             "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}")
 
diff --git a/osgplugin/README b/osgplugin/README
deleted file mode 100644
index 9bf6b6a..0000000
--- a/osgplugin/README
+++ /dev/null
@@ -1,22 +0,0 @@
-libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM
-
-http://code.google.com/p/libcitygml
-
-To use libcitygml with OpenSceneGraph (min 2.8), here is some instructions:
-	- Copy FindCityGML.cmake and FindXerces.cmake from libcitygml/CMakeModules
-		to $(OSG_SRC_DIR)/CMakeModules
-	- Copy libcitygml/test/osgplugin/* to $(OSG_SRC_DIR)/src/osgPlugins/citygml
-	- Add the following line to $(OSG_SRC_DIR)/src/osgPlugins/CMakeLists.txt
-		ADD_SUBDIRECTORY(citygml)
-
-Use CMake to reconfigure OpenSceneGraph installation.
-Generate project and build!
-
-You can use Open Scene Graph plugin with LibXml2 or Xerces (default),
-according to your libcitygml building configuration.
-WARNING: no control is done, it is your responsability to select the
-	corresponding parameters. (i.e. if your build libcitygml with libxml2,
-	you have to select LibXml2 when configuring the Open Scene Graph plugin.
-
-Please report any bugs to http://code.google.com/p/libcitygml/issues/list
-Thank you.
\ No newline at end of file
diff --git a/osgplugin/ReaderWriterCityGML.cpp b/osgplugin/ReaderWriterCityGML.cpp
index d611ff7..bce2dd1 100644
--- a/osgplugin/ReaderWriterCityGML.cpp
+++ b/osgplugin/ReaderWriterCityGML.cpp
@@ -48,6 +48,7 @@
 
 class CityGMLOSGPluginLogger : public citygml::CityGMLLogger {
 public:
+
     virtual void log(LOGLEVEL level, const std::string& message, const char* file, int line) const
     {
         std::ostream& stream = getLogStreamFor(level);
@@ -63,10 +64,6 @@ public:
         stream << " " << message << std::endl;
     }
 
-    virtual bool isEnabledFor(LOGLEVEL) const
-    {
-        return true;
-    }
 private:
     std::ostream& getLogStreamFor(LOGLEVEL level) const {
         switch(level) {
@@ -398,9 +395,12 @@ void createOsgGeometryFromCityGMLGeometry(const citygml::Geometry& geometry, Cit
         setMaterial(stateset, p, settings);
         setTexture(stateset, geom, p, settings);
 
-        if (settings._storeGeomIDs) {
-            geom->addDescription(p.getId());
-        }
+#if OSG_VERSION_GREATER_OR_EQUAL(3,3,2)
+            if (settings._storeGeomIDs) {
+                geom->addDescription(p.getId());
+            }
+#endif
+
 
         geometryContainer->addDrawable( geom );
     }
diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt
index 1a52087..6597402 100644
--- a/sources/CMakeLists.txt
+++ b/sources/CMakeLists.txt
@@ -1,3 +1,4 @@
+include(GenerateExportHeader)
 SET( target citygml )
 
 ADD_DEFINITIONS( -DCITYGML_LIBRARY )
@@ -14,9 +15,18 @@ ENDIF( LIBCITYGML_DYNAMIC )
 
 configure_file(include/citygml/citygml_api.h.in ${CMAKE_BINARY_DIR}/include/citygml/citygml_api.h)
 
-INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/sources/include ${XERCESC_INCLUDE}  ${ICONV_INCLUDE_DIR} ${GLU_INCLUDE_PATH} ${GDAL_INCLUDE_DIR} ${CMAKE_BINARY_DIR}/include)
+SET(EXPORT_HEADER_FILE_NAME ${PROJECT_BINARY_DIR}/include/citygml/citygml_export.h)
+
+INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/sources/include
+                        ${XERCESC_INCLUDE}
+                        ${ICONV_INCLUDE_DIR}
+                        ${GLU_INCLUDE_PATH}
+                        ${GDAL_INCLUDE_DIR}
+                        ${CMAKE_BINARY_DIR}/include
+                        ${PROJECT_BINARY_DIR}/include)
 
 SET(SOURCES
+  src/citygml/attributesmap.cpp
   src/citygml/citymodel.cpp
   src/citygml/tesselator.cpp
   src/citygml/object.cpp
@@ -73,9 +83,17 @@ SET(SOURCES
   src/parser/implicitgeometryelementparser.cpp
   src/parser/addressparser.cpp
 )
+if(UNIX)
+  if (APPLE)
+    set_source_files_properties(src/citygml/tesselator.cpp PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations") # for warnings: 'glu*' is deprecated...
+  endif (APPLE)
+endif(UNIX)
 
 SET(PUBLIC_HEADER
   ${CMAKE_BINARY_DIR}/include/citygml/citygml_api.h
+  ${CMAKE_BINARY_DIR}/include/citygml/citygml_export.h
+  include/citygml/attributesmap.h
+  include/citygml/enum_type_bitmask.h
   include/citygml/citygmllogger.h
   include/citygml/polygon.h
   include/citygml/material.h
@@ -149,6 +167,11 @@ SET(HEADERS
 
 ADD_LIBRARY( ${target} ${LIBCITYGML_USER_DEFINED_DYNAMIC_OR_STATIC} ${SOURCES} ${HEADERS} )
 
+
+generate_export_header(citygml
+                        EXPORT_MACRO_NAME LIBCITYGML_EXPORT
+                        EXPORT_FILE_NAME ${EXPORT_HEADER_FILE_NAME})
+
 TARGET_LINK_LIBRARIES( ${target} ${XERCESC_LIBRARIES} ${OPENGL_LIBRARIES} ${GDAL_LIBRARY} )
 
 set_target_properties( ${target} PROPERTIES
@@ -162,12 +185,24 @@ INSTALL(
     LIBRARY DESTINATION ${LIB_INSTALL_DIR}
     ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
 )
+
+
 # FIXME: Do not run for OS X framework
 INSTALL(
-    FILES        ${PUBLIC_HEADER}
+    FILES        
+      ${PUBLIC_HEADER}
     DESTINATION  ${INCLUDE_INSTALL_DIR}
 )
 
+INSTALL(
+    FILES        
+      ${EXPORT_HEADER_FILE_NAME}
+    DESTINATION  
+      ${INCLUDE_INSTALL_DIR}
+)
+      
+
 configure_file(citygml.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/citygml.pc)
+
 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/citygml.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
 
diff --git a/sources/include/citygml/appearancemanager.h b/sources/include/citygml/appearancemanager.h
index 2820c7e..926f898 100644
--- a/sources/include/citygml/appearancemanager.h
+++ b/sources/include/citygml/appearancemanager.h
@@ -55,9 +55,9 @@ namespace citygml {
 
 
     protected:
-        std::unordered_map<std::string, std::shared_ptr<Appearance>> m_appearancesMap;
-        std::vector<std::shared_ptr<MaterialTargetDefinition>> m_materialTargetDefinitions;
-        std::vector<std::shared_ptr<TextureTargetDefinition>> m_texTargetDefinitions;
+        std::unordered_map<std::string, std::shared_ptr<Appearance> > m_appearancesMap;
+        std::vector<std::shared_ptr<MaterialTargetDefinition> > m_materialTargetDefinitions;
+        std::vector<std::shared_ptr<TextureTargetDefinition> > m_texTargetDefinitions;
         std::unordered_set<std::string> m_themes;
         std::unordered_map<std::string, AppearanceTarget*> m_appearanceTargetsMap;
         std::shared_ptr<CityGMLLogger> m_logger;
diff --git a/sources/include/citygml/appearancetarget.h b/sources/include/citygml/appearancetarget.h
index 9a47e54..1269c36 100644
--- a/sources/include/citygml/appearancetarget.h
+++ b/sources/include/citygml/appearancetarget.h
@@ -22,7 +22,7 @@ namespace citygml {
     class AppearanceTarget : public citygml::Object {
     public:
 
-        void addTargetDefinition(std::shared_ptr<AppearanceTargetDefinition<Appearance>> targetDef);
+        void addTargetDefinition(std::shared_ptr<AppearanceTargetDefinition<Appearance> > targetDef);
         void addTargetDefinition(std::shared_ptr<TextureTargetDefinition> targetDef);
         void addTargetDefinition(std::shared_ptr<MaterialTargetDefinition> targetDef);
 
@@ -44,11 +44,11 @@ namespace citygml {
 
 
     private:
-        std::unordered_map<std::string, std::shared_ptr<MaterialTargetDefinition>> m_themeMatMapFront;
-        std::unordered_map<std::string, std::shared_ptr<MaterialTargetDefinition>> m_themeMatMapBack;
+        std::unordered_map<std::string, std::shared_ptr<MaterialTargetDefinition> > m_themeMatMapFront;
+        std::unordered_map<std::string, std::shared_ptr<MaterialTargetDefinition> > m_themeMatMapBack;
 
-        std::unordered_map<std::string, std::shared_ptr<TextureTargetDefinition>> m_themeTexMapFront;
-        std::unordered_map<std::string, std::shared_ptr<TextureTargetDefinition>> m_themeTexMapBack;
+        std::unordered_map<std::string, std::shared_ptr<TextureTargetDefinition> > m_themeTexMapFront;
+        std::unordered_map<std::string, std::shared_ptr<TextureTargetDefinition> > m_themeTexMapBack;
 
     };
 }
diff --git a/sources/include/citygml/attributesmap.h b/sources/include/citygml/attributesmap.h
new file mode 100644
index 0000000..c8eaa41
--- /dev/null
+++ b/sources/include/citygml/attributesmap.h
@@ -0,0 +1,55 @@
+#pragma once
+
+#include <string>
+#include <map>
+
+#include <citygml/citygml_api.h>
+
+namespace citygml
+{
+
+/**
+ * @brief The AttributeType enum represents the data type of an object attribute
+ */
+enum class AttributeType
+{
+    String,
+    Double,
+    Integer,
+    Date,
+    Uri
+};
+
+/**
+ * @brief The AttributeValue class stores an attribute value and its data type
+ */
+class LIBCITYGML_EXPORT AttributeValue
+{
+public:
+    AttributeValue();
+    AttributeValue(const char* value);
+    AttributeValue(const std::string& value, AttributeType type=AttributeType::String);
+    AttributeValue(double value);
+    AttributeValue(int value);
+    
+
+    void setType(AttributeType type);
+    AttributeType getType() const;
+
+    void setValue(const std::string& value, AttributeType type=AttributeType::String);
+    void setValue(double value);
+    void setValue(int value);
+
+    std::string asString() const;
+    double asDouble(double defaultValue=0.0) const;
+    int asInteger(int defaultValue=0) const;
+private:
+    AttributeType m_type;
+    std::string m_value;
+};
+
+std::ostream& operator<<(std::ostream& os, const AttributeValue& o);
+
+typedef std::map<std::string, AttributeValue> AttributesMap;
+
+} // namespace citygml
diff --git a/sources/include/citygml/citygml.h b/sources/include/citygml/citygml.h
index 7f38105..6f317b1 100644
--- a/sources/include/citygml/citygml.h
+++ b/sources/include/citygml/citygml.h
@@ -44,7 +44,7 @@ namespace citygml
     class Material;
     class AppearanceManager;
 
-    typedef unsigned int CityObjectsTypeMask;
+    typedef EnumClassBitmask<CityObject::CityObjectsType> CityObjectsTypeMask;
 
 
     ///////////////////////////////////////////////////////////////////////////////
@@ -64,7 +64,7 @@ namespace citygml
     {
     public:
         ParserParams()
-            : objectsMask( CityObject::CityObjectsType::COT_All )
+            : objectsMask(CityObject::CityObjectsType::COT_All)
             , minLOD( 0 )
             , maxLOD( 4 )
             , optimize( false )
diff --git a/sources/include/citygml/citygml_api.h.in b/sources/include/citygml/citygml_api.h.in
index eb84e8f..bfacbca 100644
--- a/sources/include/citygml/citygml_api.h.in
+++ b/sources/include/citygml/citygml_api.h.in
@@ -9,12 +9,4 @@
                                                         (major == LIBCITYGML_VERSION_MAJOR && (minor > LIBCITYGML_VERSION_MINOR || \
                                                         (minor == LIBCITYGML_VERSION_MINOR && revision > LIBCITYGML_VERSION_REVISION)))
 
-#if defined( _MSC_VER ) && defined( LIBCITYGML_DYNAMIC )
-#	ifdef LIBCITYGML_BUILD
-#		define LIBCITYGML_EXPORT __declspec( dllexport )
-#	else
-#		define LIBCITYGML_EXPORT __declspec( dllimport )
-#	endif
-#else
-#	define LIBCITYGML_EXPORT
-#endif
+#include <citygml/citygml_export.h>
diff --git a/sources/include/citygml/citygmlfactory.h b/sources/include/citygml/citygmlfactory.h
index b6c9a44..8bd3357 100644
--- a/sources/include/citygml/citygmlfactory.h
+++ b/sources/include/citygml/citygmlfactory.h
@@ -1,7 +1,7 @@
 #pragma once
 
-#include "citygml/geometry.h"
-#include "citygml/cityobject.h"
+#include <citygml/geometry.h>
+#include <citygml/cityobject.h>
 
 #include <memory>
 
diff --git a/sources/include/citygml/citygmllogger.h b/sources/include/citygml/citygmllogger.h
index fcbf5c3..59e74da 100644
--- a/sources/include/citygml/citygmllogger.h
+++ b/sources/include/citygml/citygmllogger.h
@@ -9,20 +9,34 @@ namespace citygml {
     class LIBCITYGML_EXPORT CityGMLLogger {
     public:
         enum class LOGLEVEL {
-            LL_ERROR,
-            LL_WARNING,
-            LL_INFO,
-            LL_DEBUG,
-            LL_TRACE
+            LL_ERROR = 4,
+            LL_WARNING = 3,
+            LL_INFO = 2,
+            LL_DEBUG = 1,
+            LL_TRACE = 0
         };
 
+        CityGMLLogger(LOGLEVEL level = LOGLEVEL::LL_ERROR):m_logLevel(level){}
+
         /**
          * @brief logs a message. Might be called from different threads.
          */
         virtual void log(LOGLEVEL level, const std::string& message, const char* file=nullptr, int line=-1) const = 0;
 
-        virtual bool isEnabledFor(LOGLEVEL level) const = 0;
+        virtual bool isEnabledFor(LOGLEVEL level) const {
+            return level >= getLogLevel();
+        };
+
+        virtual LOGLEVEL getLogLevel() const{
+            return m_logLevel;
+        };
+
+        virtual LOGLEVEL setLogLevel(LOGLEVEL level) {
+            return m_logLevel = level;
+        };
+    private:
 
+        LOGLEVEL m_logLevel;
     };
 
     /**
diff --git a/sources/include/citygml/citymodel.h b/sources/include/citygml/citymodel.h
index 16f20ec..760c893 100644
--- a/sources/include/citygml/citymodel.h
+++ b/sources/include/citygml/citymodel.h
@@ -16,7 +16,7 @@ namespace citygml {
     class CityObject;
     class CityGMLFactory;
 
-    typedef std::vector<std::unique_ptr<CityObject>> CityObjects;
+    typedef std::vector<std::unique_ptr<CityObject> > CityObjects;
     typedef std::vector<const CityObject*> ConstCityObjects;
     typedef std::map< CityObject::CityObjectsType, std::vector<const CityObject*> > CityObjectsMap;
 
diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h
index 00f19b0..0b0e01c 100644
--- a/sources/include/citygml/cityobject.h
+++ b/sources/include/citygml/cityobject.h
@@ -5,7 +5,7 @@
 
 #include <citygml/featureobject.h>
 #include <citygml/citygml_api.h>
-
+#include <citygml/enum_type_bitmask.h>
 class Tesselator;
 
 namespace citygml {
@@ -22,47 +22,52 @@ namespace citygml {
     {
     public:
 
-        enum CityObjectsType {
-            COT_GenericCityObject           = 1 << 0,
-            COT_Building                    = 1 << 1,
-            COT_Room                        = 1 << 2,
-            COT_BuildingInstallation        = 1 << 3,
-            COT_BuildingFurniture           = 1 << 4,
-            COT_Door                        = 1 << 5,
-            COT_Window                      = 1 << 6,
-            COT_CityFurniture               = 1 << 7,
-            COT_Track                       = 1 << 8,
-            COT_Road                        = 1 << 9,
-            COT_Railway                     = 1 << 10,
-            COT_Square                      = 1 << 11,
-            COT_PlantCover                  = 1 << 12,
-            COT_SolitaryVegetationObject    = 1 << 13,
-            COT_WaterBody                   = 1 << 14,
-            COT_ReliefFeature               = 1 << 15,
-            COT_LandUse                     = 1 << 16,
-            COT_Tunnel						= 1 << 17,
-            COT_Bridge						= 1 << 18,
-            COT_BridgeConstructionElement	= 1 << 19,
-            COT_BridgeInstallation			= 1 << 20,
-            COT_BridgePart                  = 1 << 21,
-            COT_BuildingPart                = 1 << 22,
-
-            COT_WallSurface                 = 1 << 23,
-            COT_RoofSurface                 = 1 << 24,
-            COT_GroundSurface               = 1 << 25,
-            COT_ClosureSurface              = 1 << 26,
-            COT_FloorSurface                = 1 << 27,
-            COT_InteriorWallSurface         = 1 << 28,
-            COT_CeilingSurface              = 1 << 29,
-            COT_CityObjectGroup             = 1 << 30,
+        enum class CityObjectsType : uint64_t {
+            COT_GenericCityObject           = 1ll,
+            COT_Building                    = 1ll<< 1,
+            COT_Room                        = 1ll<< 2,
+            COT_BuildingInstallation        = 1ll<< 3,
+            COT_BuildingFurniture           = 1ll<< 4,
+            COT_Door                        = 1ll<< 5,
+            COT_Window                      = 1ll<< 6,
+            COT_CityFurniture               = 1ll<< 7,
+            COT_Track                       = 1ll<< 8,
+            COT_Road                        = 1ll<< 9,
+            COT_Railway                     = 1ll<< 10,
+            COT_Square                      = 1ll<< 11,
+            COT_PlantCover                  = 1ll<< 12,
+            COT_SolitaryVegetationObject    = 1ll<< 13,
+            COT_WaterBody                   = 1ll<< 14,
+            COT_ReliefFeature               = 1ll<< 15,
+            COT_LandUse                     = 1ll<< 16,
+            COT_Tunnel						= 1ll<< 17,
+            COT_Bridge						= 1ll<< 18,
+            COT_BridgeConstructionElement	= 1ll<< 19,
+            COT_BridgeInstallation			= 1ll<< 20,
+            COT_BridgePart                  = 1ll<< 21,
+            COT_BuildingPart                = 1ll<< 22,
+
+            COT_WallSurface                 = 1ll<< 23,
+            COT_RoofSurface                 = 1ll<< 24,
+            COT_GroundSurface               = 1ll<< 25,
+            COT_ClosureSurface              = 1ll<< 26,
+            COT_FloorSurface                = 1ll<< 27,
+            COT_InteriorWallSurface         = 1ll<< 28,
+            COT_CeilingSurface              = 1ll<< 29,
+            COT_CityObjectGroup             = 1ll<< 30,
+            COT_OuterCeilingSurface         = 1ll<< 31,
+            COT_OuterFloorSurface           = 1ll<< 32,
+            
 
             // covers all supertypes of tran::_TransportationObject that are not Track, Road, Railway or Square...
             // there are to many for to few bits to explicitly enumerate them. However Track, Road, Railway or Square should be used most of the time
-            COT_TransportationObject        = 1 << 31,
+            COT_TransportationObject        = 1ll<< 33,
 
-            COT_All                         = 0xFFFFFFFF
+            COT_All                         = 0xFFFFFFFFFFFFFFFFll
         };
-
+        
+        
+        
         CityObject( const std::string& id, CityObjectsType type );
 
         // Get the object type
@@ -105,9 +110,9 @@ namespace citygml {
     protected:
         CityObjectsType m_type;
 
-        std::vector<std::unique_ptr<Geometry>> m_geometries;
-        std::vector<std::unique_ptr<ImplicitGeometry>> m_implicitGeometries;
-        std::vector<std::unique_ptr<CityObject>> m_children;
+        std::vector<std::unique_ptr<Geometry> > m_geometries;
+        std::vector<std::unique_ptr<ImplicitGeometry> > m_implicitGeometries;
+        std::vector<std::unique_ptr<CityObject> > m_children;
         std::unique_ptr<Address> m_address;
     };
 
@@ -115,4 +120,10 @@ namespace citygml {
 
     std::string cityObjectsTypeToString(const CityObject::CityObjectsType& t);
     CityObject::CityObjectsType cityObjectsTypeFromString(const std::string& s, bool& valid);
+    
+    
+    
 }
+
+ENUM_CLASS_BITWISE_OPERATORS_DEFS(citygml::CityObject::CityObjectsType);
+
diff --git a/sources/include/citygml/enum_type_bitmask.h b/sources/include/citygml/enum_type_bitmask.h
new file mode 100644
index 0000000..e823279
--- /dev/null
+++ b/sources/include/citygml/enum_type_bitmask.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <type_traits>
+
+template <typename T>
+class EnumClassBitmask
+{
+private:
+    T t;
+
+public:
+    typedef typename std::underlying_type<T>::type underlying_type;
+
+    /*constexpr*/ EnumClassBitmask() : t(T(0)) {}
+    /*constexpr*/ EnumClassBitmask(T t) : t(t) {}
+    /*constexpr*/ explicit EnumClassBitmask(underlying_type t) : t(T(t)) {}
+
+    /*constexpr*/ /*explicit*/ operator bool() const { return bool(t); }
+   /*constexpr*/ operator T() { return t; }
+
+    /*constexpr*/ EnumClassBitmask operator|(T r) const { return EnumClassBitmask(t | r); }
+    /*constexpr*/ EnumClassBitmask operator&(T r) const { return EnumClassBitmask(t & r); }
+    /*constexpr*/ EnumClassBitmask operator^(T r) const { return EnumClassBitmask(t ^ r); }
+    /*constexpr*/ EnumClassBitmask operator~() const { return EnumClassBitmask(~t); }
+
+    const EnumClassBitmask& operator|=(T r) { t = t | r; return *this; }
+    const EnumClassBitmask& operator&=(T r) { t = t & r; return *this; }
+    const EnumClassBitmask& operator^=(T r) { t = t ^ r; return *this; }
+
+   bool operator==(const EnumClassBitmask& r) { return underlying_type(t) == underlying_type(r.t); }
+   bool operator==(const T& r) { return underlying_type(t) == underlying_type(r); }
+
+    const EnumClassBitmask& setFromUnderlyingType(underlying_type value) { t = T(value); return *this; }
+};
+
+#define ENUM_CLASS_BITWISE_OPERATORS(type_name) \
+/*constexpr*/ type_name operator|(type_name l, type_name r) { return type_name(std::underlying_type<type_name>::type(l) | std::underlying_type<type_name>::type(r)); } \
+/*constexpr*/ type_name operator&(type_name l, type_name r) { return type_name(std::underlying_type<type_name>::type(l) & std::underlying_type<type_name>::type(r)); } \
+/*constexpr*/ type_name operator^(type_name l, type_name r) { return type_name(std::underlying_type<type_name>::type(l) ^ std::underlying_type<type_name>::type(r)); } \
+/*constexpr*/ type_name operator~(type_name l) { return type_name(~std::underlying_type<type_name>::type(l)); }
+
+#define ENUM_CLASS_BITWISE_OPERATORS_DEFS(type_name) \
+/*constexpr*/ type_name operator|(type_name l, type_name r); \
+/*constexpr*/ type_name operator&(type_name l, type_name r); \
+/*constexpr*/ type_name operator^(type_name l, type_name r);\
+/*constexpr*/ type_name operator~(type_name l);
+
+
diff --git a/sources/include/citygml/featureobject.h b/sources/include/citygml/featureobject.h
index 1a0ca31..35d812d 100644
--- a/sources/include/citygml/featureobject.h
+++ b/sources/include/citygml/featureobject.h
@@ -2,8 +2,8 @@
 
 #include <memory>
 
-#include "citygml/citygml_api.h"
-#include "citygml/object.h"
+#include <citygml/object.h>
+#include <citygml/envelope.h>
 
 namespace citygml {
 
diff --git a/sources/include/citygml/geometry.h b/sources/include/citygml/geometry.h
index c8e4b04..bb12435 100644
--- a/sources/include/citygml/geometry.h
+++ b/sources/include/citygml/geometry.h
@@ -32,7 +32,9 @@ namespace citygml {
             GT_Closure          = 1 << 4,
             GT_Floor            = 1 << 5,
             GT_InteriorWall     = 1 << 6,
-            GT_Ceiling          = 1 << 7
+            GT_Ceiling          = 1 << 7,
+            GT_OuterCeiling     = 1 << 8,
+            GT_OuterFloor       = 1 << 9
         };
 
         unsigned int getLOD() const;
@@ -80,10 +82,10 @@ namespace citygml {
 
         unsigned int m_lod;
 
-        std::vector<std::shared_ptr<Geometry>> m_childGeometries;
+        std::vector<std::shared_ptr<Geometry> > m_childGeometries;
 
-        std::vector<std::shared_ptr<Polygon>> m_polygons;
-        std::vector<std::shared_ptr<LineString>> m_lineStrings;
+        std::vector<std::shared_ptr<Polygon> > m_polygons;
+        std::vector<std::shared_ptr<LineString> > m_lineStrings;
     };
 
     std::ostream& operator<<( std::ostream& os, const citygml::Geometry& s );
diff --git a/sources/include/citygml/geometrymanager.h b/sources/include/citygml/geometrymanager.h
index 297d006..0e29b8c 100644
--- a/sources/include/citygml/geometrymanager.h
+++ b/sources/include/citygml/geometrymanager.h
@@ -36,7 +36,7 @@ namespace citygml {
 
         std::shared_ptr<CityGMLLogger> m_logger;
         std::vector<GeometryRequest> m_geometryRequests;
-        std::unordered_map<std::string, std::shared_ptr<Geometry>> m_sharedGeometries;
+        std::unordered_map<std::string, std::shared_ptr<Geometry> > m_sharedGeometries;
     };
 
 }
diff --git a/sources/include/citygml/implictgeometry.h b/sources/include/citygml/implictgeometry.h
index 81ad53f..8fe8282 100644
--- a/sources/include/citygml/implictgeometry.h
+++ b/sources/include/citygml/implictgeometry.h
@@ -39,7 +39,7 @@ namespace citygml {
 
         TransformationMatrix     m_matrix;
         TVec3d                   m_referencePoint;
-        std::vector<std::shared_ptr<Geometry>>   m_geometries;
+        std::vector<std::shared_ptr<Geometry> >   m_geometries;
         std::string              m_srsName;
     };
 }
diff --git a/sources/include/citygml/object.h b/sources/include/citygml/object.h
index 964fc30..a8eb302 100644
--- a/sources/include/citygml/object.h
+++ b/sources/include/citygml/object.h
@@ -1,14 +1,11 @@
 #pragma once
 
 #include <string>
-#include <map>
 
 #include <citygml/citygml_api.h>
+#include <citygml/attributesmap.h>
 
 namespace citygml {
-
-    typedef std::map< std::string, std::string > AttributesMap;
-
     /**
      * @brief The base object associated with an unique id and a set of attributes (key-value pairs)
      */
@@ -27,7 +24,7 @@ namespace citygml {
 
         virtual ~Object() {}
 
-        void setAttribute(const std::string& name, const std::string& value, bool overwrite = true );
+        void setAttribute(const std::string& name, const std::string& value, AttributeType type = AttributeType::String, bool overwrite = true );
 
     protected:
 
diff --git a/sources/include/citygml/polygon.h b/sources/include/citygml/polygon.h
index 5025b4e..a0167bd 100644
--- a/sources/include/citygml/polygon.h
+++ b/sources/include/citygml/polygon.h
@@ -84,6 +84,22 @@ namespace citygml {
 
         void finish(Tesselator& tesselator , bool optimize, std::shared_ptr<CityGMLLogger> logger);
 
+        std::shared_ptr<LinearRing> exteriorRing(){
+            return m_exteriorRing;
+        }
+
+        const std::shared_ptr<LinearRing> exteriorRing() const{
+            return m_exteriorRing;
+        }
+
+        std::vector<std::shared_ptr<LinearRing> >& interiorRings() {
+            return m_interiorRings;
+        }
+
+        const std::vector<std::shared_ptr<LinearRing> >& interiorRings() const{
+            return m_interiorRings;
+        }
+
         virtual ~Polygon();
 
     protected:
@@ -106,12 +122,12 @@ namespace citygml {
         TVec3d computeNormal();
 
         std::vector<TVec3d> m_vertices;
-        std::unordered_map<std::string, std::vector<TVec2f>> m_themeToFrontTexCoordsMap;
-        std::unordered_map<std::string, std::vector<TVec2f>> m_themeToBackTexCoordsMap;
+        std::unordered_map<std::string, std::vector<TVec2f> > m_themeToFrontTexCoordsMap;
+        std::unordered_map<std::string, std::vector<TVec2f> > m_themeToBackTexCoordsMap;
         std::vector<unsigned int> m_indices;
 
-        std::unique_ptr<LinearRing> m_exteriorRing;
-        std::vector<std::unique_ptr<LinearRing>> m_interiorRings;
+        std::shared_ptr<LinearRing> m_exteriorRing;
+        std::vector<std::shared_ptr<LinearRing> > m_interiorRings;
 
         bool m_negNormal;
         bool m_finished;
diff --git a/sources/include/citygml/polygonmanager.h b/sources/include/citygml/polygonmanager.h
index d920deb..b8a45de 100644
--- a/sources/include/citygml/polygonmanager.h
+++ b/sources/include/citygml/polygonmanager.h
@@ -36,7 +36,7 @@ namespace citygml {
 
         std::shared_ptr<CityGMLLogger> m_logger;
         std::vector<PolygonRequest> m_polygonRequests;
-        std::unordered_map<std::string, std::shared_ptr<Polygon>> m_sharedPolygons;
+        std::unordered_map<std::string, std::shared_ptr<Polygon> > m_sharedPolygons;
     };
 
 }
diff --git a/sources/include/citygml/tesselator.h b/sources/include/citygml/tesselator.h
index 86befba..a26ff57 100644
--- a/sources/include/citygml/tesselator.h
+++ b/sources/include/citygml/tesselator.h
@@ -30,7 +30,7 @@
   #include <GL/glu.h>
 #endif
 
-#include "citygml/vecs.hpp"
+#include <citygml/vecs.hpp>
 #include <vector>
 #include <list>
 #include <memory>
@@ -59,7 +59,7 @@ public:
 
     // Tesselation result access
     const std::vector<TVec3d> getVertices() const;
-    const std::vector<std::vector<TVec2f>>& getTexCoords() const { return _texCoordsLists; }
+    const std::vector<std::vector<TVec2f> >& getTexCoords() const { return _texCoordsLists; }
     const std::vector<unsigned int>& getIndices() const;
 
 private:
@@ -75,7 +75,7 @@ private:
     GLenum  _curMode;
 
     std::list<TVec3d> _vertices;
-    std::vector<std::vector<TVec2f>> _texCoordsLists;
+    std::vector<std::vector<TVec2f> > _texCoordsLists;
     std::list<unsigned int> _indices;
     std::vector<unsigned int> _outIndices;
 
diff --git a/sources/include/citygml/texture.h b/sources/include/citygml/texture.h
index 6d73d3a..7afe134 100644
--- a/sources/include/citygml/texture.h
+++ b/sources/include/citygml/texture.h
@@ -42,7 +42,7 @@ namespace citygml {
         TVec4f getBorderColor() const;
         void setBorderColor(TVec4f color);
 
-        std::string toString() const;
+        std::string toString() const override;
 
         virtual std::shared_ptr<Texture> asTexture() override;
         virtual std::shared_ptr<const Texture> asTexture() const override;
diff --git a/sources/include/citygml/texturetargetdefinition.h b/sources/include/citygml/texturetargetdefinition.h
index a9893c7..6bdf5bb 100644
--- a/sources/include/citygml/texturetargetdefinition.h
+++ b/sources/include/citygml/texturetargetdefinition.h
@@ -46,7 +46,7 @@ namespace citygml {
 
     protected:
         TextureTargetDefinition(const std::string& targetID, std::shared_ptr<Texture> appearance, const std::string& id);
-        std::vector<std::shared_ptr<TextureCoordinates>> m_coordinatesList;
-        std::unordered_map<std::string, std::shared_ptr<TextureCoordinates>> m_idTexCoordMap;
+        std::vector<std::shared_ptr<TextureCoordinates> > m_coordinatesList;
+        std::unordered_map<std::string, std::shared_ptr<TextureCoordinates> > m_idTexCoordMap;
     };
 }
diff --git a/sources/include/parser/appearanceelementparser.h b/sources/include/parser/appearanceelementparser.h
index 8cfb1f4..43937f1 100644
--- a/sources/include/parser/appearanceelementparser.h
+++ b/sources/include/parser/appearanceelementparser.h
@@ -16,7 +16,7 @@ namespace citygml {
         AppearanceElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
 
     protected:
@@ -30,7 +30,7 @@ namespace citygml {
         virtual Object* getObject() override;
 
     private:
-        std::vector<std::shared_ptr<Appearance>> m_surfaceDataList;
+        std::vector<std::shared_ptr<Appearance> > m_surfaceDataList;
         std::shared_ptr<Object> m_appearanceObj;
         std::string m_theme;
     };
diff --git a/sources/include/parser/citygmldocumentparser.h b/sources/include/parser/citygmldocumentparser.h
index c9f7a24..cb17a13 100644
--- a/sources/include/parser/citygmldocumentparser.h
+++ b/sources/include/parser/citygmldocumentparser.h
@@ -64,7 +64,7 @@ namespace citygml {
         bool checkCurrentElementUnownOrUnexpected_start(const std::string& name);
         bool checkCurrentElementUnownOrUnexpected_end(const std::string& name);
 
-        std::stack<std::shared_ptr<ElementParser>> m_parserStack;
+        std::stack<std::shared_ptr<ElementParser> > m_parserStack;
 
         /**
          * @brief The currently active parser (the one on which startElement or endElement was called last)
diff --git a/sources/include/parser/citymodelelementparser.h b/sources/include/parser/citymodelelementparser.h
index eb16c39..94eb4b1 100644
--- a/sources/include/parser/citymodelelementparser.h
+++ b/sources/include/parser/citymodelelementparser.h
@@ -13,7 +13,7 @@ namespace citygml {
         CityModelElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(CityModel*)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
 
     protected:
diff --git a/sources/include/parser/cityobjectelementparser.h b/sources/include/parser/cityobjectelementparser.h
index d149aa8..ff1df25 100644
--- a/sources/include/parser/cityobjectelementparser.h
+++ b/sources/include/parser/cityobjectelementparser.h
@@ -7,7 +7,7 @@
 #include <unordered_set>
 #include <mutex>
 
-#include "citygml/cityobject.h"
+#include <citygml/cityobject.h>
 
 namespace citygml {
 
@@ -16,7 +16,7 @@ namespace citygml {
         CityObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(CityObject*)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
 
@@ -32,10 +32,12 @@ namespace citygml {
     private:
         static void initializeTypeIDTypeMap();
         static void initializeAttributesSet();
+        static AttributeType getAttributeType(const NodeType::XMLNode& node);
 
         CityObject* m_model;
         std::function<void(CityObject*)> m_callback;
         std::string m_lastAttributeName;
+        AttributeType m_lastAttributeType;
 
         // The nodes that are valid CityObjects
         static std::mutex initializedTypeIDMutex;
@@ -44,6 +46,7 @@ namespace citygml {
 
         static std::mutex initializedAttributeSetMutex;
         static std::unordered_set<int> attributesSet;
+        static std::unordered_map<int, AttributeType> attributeTypeMap;
         static bool attributesSetInitialized;
 
         void parseGeometryForLODLevel(int lod);
diff --git a/sources/include/parser/geometryelementparser.h b/sources/include/parser/geometryelementparser.h
index 5b8d871..3a107c6 100644
--- a/sources/include/parser/geometryelementparser.h
+++ b/sources/include/parser/geometryelementparser.h
@@ -16,7 +16,7 @@ namespace citygml {
                               int lodLevel, CityObject::CityObjectsType parentType, std::function<void(Geometry*)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
         // CityGMLElementParser interface
diff --git a/sources/include/parser/georeferencedtextureelementparser.h b/sources/include/parser/georeferencedtextureelementparser.h
index 5eee158..eef6154 100644
--- a/sources/include/parser/georeferencedtextureelementparser.h
+++ b/sources/include/parser/georeferencedtextureelementparser.h
@@ -14,7 +14,7 @@ namespace citygml {
         GeoReferencedTextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(std::shared_ptr<GeoreferencedTexture>)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
 
     protected:
diff --git a/sources/include/parser/implicitgeometryelementparser.h b/sources/include/parser/implicitgeometryelementparser.h
index 06dfc04..d3a62c6 100644
--- a/sources/include/parser/implicitgeometryelementparser.h
+++ b/sources/include/parser/implicitgeometryelementparser.h
@@ -16,7 +16,7 @@ namespace citygml {
                               int lodLevel, CityObject::CityObjectsType parentType, std::function<void(ImplicitGeometry*)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
         // CityGMLElementParser interface
diff --git a/sources/include/parser/linearringelementparser.h b/sources/include/parser/linearringelementparser.h
index c9413f0..bfa03f3 100644
--- a/sources/include/parser/linearringelementparser.h
+++ b/sources/include/parser/linearringelementparser.h
@@ -13,7 +13,7 @@ namespace citygml {
         LinearRingElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, bool interior, std::function<void(LinearRing*)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
         // CityGMLElementParser interface
diff --git a/sources/include/parser/linestringelementparser.h b/sources/include/parser/linestringelementparser.h
index c21643e..d3d8a83 100644
--- a/sources/include/parser/linestringelementparser.h
+++ b/sources/include/parser/linestringelementparser.h
@@ -14,7 +14,7 @@ namespace citygml {
         LineStringElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(std::shared_ptr<LineString>)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
         // CityGMLElementParser interface
diff --git a/sources/include/parser/materialelementparser.h b/sources/include/parser/materialelementparser.h
index 90e0e9c..f08504a 100644
--- a/sources/include/parser/materialelementparser.h
+++ b/sources/include/parser/materialelementparser.h
@@ -15,7 +15,7 @@ namespace citygml {
         MaterialElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(std::shared_ptr<Material>)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         bool handlesElement(const NodeType::XMLNode &node) const override;
 
     protected:
diff --git a/sources/include/parser/nodetypes.h b/sources/include/parser/nodetypes.h
index df85a5e..c78d04d 100644
--- a/sources/include/parser/nodetypes.h
+++ b/sources/include/parser/nodetypes.h
@@ -206,6 +206,8 @@ namespace citygml {
         NODETYPE( BLDG, FloorSurface )
         NODETYPE( BLDG, InteriorWallSurface )
         NODETYPE( BLDG, CeilingSurface )
+        NODETYPE( BLDG, OuterCeilingSurface )
+        NODETYPE( BLDG, OuterFloorSurface )
         NODETYPE( BLDG, BuildingFurniture )
 
         NODETYPE( BLDG, CityFurniture )
diff --git a/sources/include/parser/polygonelementparser.h b/sources/include/parser/polygonelementparser.h
index 315df87..794fc2c 100644
--- a/sources/include/parser/polygonelementparser.h
+++ b/sources/include/parser/polygonelementparser.h
@@ -14,7 +14,7 @@ namespace citygml {
         PolygonElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(std::shared_ptr<Polygon>)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
     protected:
         // CityGMLElementParser interface
diff --git a/sources/include/parser/textureelementparser.h b/sources/include/parser/textureelementparser.h
index 4fdd560..c5725d0 100644
--- a/sources/include/parser/textureelementparser.h
+++ b/sources/include/parser/textureelementparser.h
@@ -17,7 +17,7 @@ namespace citygml {
         TextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void(std::shared_ptr<Texture>)> callback);
 
         // ElementParser interface
-        virtual std::string elementParserName() const;
+        virtual std::string elementParserName() const override;
         virtual bool handlesElement(const NodeType::XMLNode &node) const override;
 
     protected:
diff --git a/sources/src/citygml/appearance.cpp b/sources/src/citygml/appearance.cpp
index 4e7ffb8..7412d6f 100644
--- a/sources/src/citygml/appearance.cpp
+++ b/sources/src/citygml/appearance.cpp
@@ -1,4 +1,4 @@
-#include "citygml/appearance.h"
+#include <citygml/appearance.h>
 
 #include <algorithm>
 
diff --git a/sources/src/citygml/appearancemanager.cpp b/sources/src/citygml/appearancemanager.cpp
index d2e36d2..93821d7 100644
--- a/sources/src/citygml/appearancemanager.cpp
+++ b/sources/src/citygml/appearancemanager.cpp
@@ -1,9 +1,9 @@
-#include "citygml/appearancemanager.h"
-#include "citygml/appearance.h"
-#include "citygml/appearancetarget.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/materialtargetdefinition.h"
-#include "citygml/texturetargetdefinition.h"
+#include <citygml/appearancemanager.h>
+#include <citygml/appearance.h>
+#include <citygml/appearancetarget.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/materialtargetdefinition.h>
+#include <citygml/texturetargetdefinition.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/appearancetarget.cpp b/sources/src/citygml/appearancetarget.cpp
index 047de91..4f6e7d2 100644
--- a/sources/src/citygml/appearancetarget.cpp
+++ b/sources/src/citygml/appearancetarget.cpp
@@ -1,8 +1,8 @@
-#include "citygml/appearancetarget.h"
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/materialtargetdefinition.h"
-#include "citygml/appearancetargetdefinition.h"
-#include "citygml/appearance.h"
+#include <citygml/appearancetarget.h>
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/materialtargetdefinition.h>
+#include <citygml/appearancetargetdefinition.h>
+#include <citygml/appearance.h>
 
 #include <unordered_set>
 #include <algorithm>
diff --git a/sources/src/citygml/attributesmap.cpp b/sources/src/citygml/attributesmap.cpp
new file mode 100644
index 0000000..e9a7d40
--- /dev/null
+++ b/sources/src/citygml/attributesmap.cpp
@@ -0,0 +1,109 @@
+#include <citygml/attributesmap.h>
+
+#include <sstream>
+
+namespace citygml {
+
+AttributeValue::AttributeValue()
+    : m_type(AttributeType::String)
+{
+}
+
+AttributeValue::AttributeValue(const char* value)
+    : m_type(AttributeType::String)
+    , m_value(value)
+{
+
+}
+
+AttributeValue::AttributeValue(const std::string& value, AttributeType type)
+    : m_type(type)
+    , m_value(value)
+{
+
+}
+
+AttributeValue::AttributeValue(double value)
+{
+    setValue(value);
+}
+
+AttributeValue::AttributeValue(int value)
+{
+    setValue(value);
+}
+
+void AttributeValue::setType(AttributeType type)
+{
+    m_type = type;
+}
+
+AttributeType AttributeValue::getType() const
+{
+    return m_type;
+}
+
+void AttributeValue::setValue(const std::string& value, AttributeType type)
+{
+    m_type = type;
+    m_value = value;
+}
+
+void AttributeValue::setValue(double value)
+{
+    m_type = AttributeType::Double;
+
+    std::stringstream sstream;
+    sstream << value;
+    m_value = sstream.str();
+}
+
+void AttributeValue::setValue(int value)
+{
+    m_type = AttributeType::Integer;
+
+    std::stringstream sstream;
+    sstream << value;
+    m_value = sstream.str();
+}
+
+std::string AttributeValue::asString() const
+{
+    return m_value;
+}
+
+double AttributeValue::asDouble(double defaultValue) const
+{
+    double value = defaultValue;
+
+    if (m_type == AttributeType::Double)
+    {
+        std::stringstream sstream;
+        sstream << m_value;
+        sstream >> value;
+    }
+
+    return value;
+}
+
+int AttributeValue::asInteger(int defaultValue) const
+{
+    int value = defaultValue;
+
+    if (m_type == AttributeType::Integer)
+    {
+        std::stringstream sstream;
+        sstream << m_value;
+        sstream >> value;
+    }
+
+    return value;
+}
+
+std::ostream& operator<<(std::ostream& os, const AttributeValue& o)
+{
+    os << o.asString();
+    return os;
+}
+
+} // namespace citygml
diff --git a/sources/src/citygml/citygmlfactory.cpp b/sources/src/citygml/citygmlfactory.cpp
index 739f43d..ba85d1e 100644
--- a/sources/src/citygml/citygmlfactory.cpp
+++ b/sources/src/citygml/citygmlfactory.cpp
@@ -1,20 +1,20 @@
-#include "citygml/citygmlfactory.h"
-#include "citygml/appearancemanager.h"
-#include "citygml/polygonmanager.h"
-#include "citygml/geometrymanager.h"
-#include "citygml/cityobject.h"
-#include "citygml/appearancetarget.h"
-#include "citygml/polygon.h"
-#include "citygml/linestring.h"
-#include "citygml/implictgeometry.h"
-#include "citygml/texture.h"
-#include "citygml/georeferencedtexture.h"
-#include "citygml/material.h"
-#include "citygml/materialtargetdefinition.h"
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/citymodel.h"
-#include "citygml/implictgeometry.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/cityobject.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/appearancemanager.h>
+#include <citygml/polygonmanager.h>
+#include <citygml/geometrymanager.h>
+#include <citygml/appearancetarget.h>
+#include <citygml/polygon.h>
+#include <citygml/linestring.h>
+#include <citygml/implictgeometry.h>
+#include <citygml/texture.h>
+#include <citygml/georeferencedtexture.h>
+#include <citygml/material.h>
+#include <citygml/materialtargetdefinition.h>
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/citymodel.h>
+#include <citygml/implictgeometry.h>
+#include <citygml/citygmllogger.h>
 
 namespace citygml {
 
@@ -54,6 +54,10 @@ namespace citygml {
             return Geometry::GeometryType::GT_InteriorWall;
         case CityObject::CityObjectsType::COT_CeilingSurface:
             return Geometry::GeometryType::GT_Ceiling;
+        case CityObject::CityObjectsType::COT_OuterCeilingSurface:
+            return Geometry::GeometryType::GT_OuterCeiling;
+        case CityObject::CityObjectsType::COT_OuterFloorSurface:
+            return Geometry::GeometryType::GT_OuterFloor;
         default:
             return Geometry::GeometryType::GT_Unknown;
         }
diff --git a/sources/src/citygml/citymodel.cpp b/sources/src/citygml/citymodel.cpp
index eab81ce..9f411dd 100644
--- a/sources/src/citygml/citymodel.cpp
+++ b/sources/src/citygml/citymodel.cpp
@@ -17,10 +17,10 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include "citygml/citymodel.h"
-#include "citygml/appearancemanager.h"
-#include "citygml/appearance.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/citymodel.h>
+#include <citygml/appearancemanager.h>
+#include <citygml/appearance.h>
+#include <citygml/citygmllogger.h>
 
 #include <float.h>
 #include <string.h>
diff --git a/sources/src/citygml/cityobject.cpp b/sources/src/citygml/cityobject.cpp
index 5c9bdee..a3b1473 100644
--- a/sources/src/citygml/cityobject.cpp
+++ b/sources/src/citygml/cityobject.cpp
@@ -1,14 +1,16 @@
-#include "citygml/cityobject.h"
-#include "citygml/geometry.h"
-#include "citygml/implictgeometry.h"
-#include "citygml/appearancemanager.h"
-#include "citygml/citygml.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/address.h"
+#include <citygml/cityobject.h>
+#include <citygml/geometry.h>
+#include <citygml/implictgeometry.h>
+#include <citygml/appearancemanager.h>
+#include <citygml/citygml.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/address.h>
 
 #include <unordered_map>
 #include <algorithm>
 
+ENUM_CLASS_BITWISE_OPERATORS(citygml::CityObject::CityObjectsType);
+
 namespace citygml {
 
     CityObject::CityObject(const std::string& id, CityObject::CityObjectsType type)  : FeatureObject( id ), m_type( type )
@@ -119,14 +121,14 @@ namespace citygml {
 
     std::ostream& operator<<( std::ostream& os, const CityObject& o )
     {
-        os << o.getType() << ": " << o.getId() << std::endl;
+        os << static_cast<uint64_t>(o.getType()) << ": " << o.getId() << std::endl;
         os << "  Envelope: " << o.getEnvelope() << std::endl;
 
         AttributesMap::const_iterator it = o.getAttributes().begin();
         while ( it != o.getAttributes().end() )
         {
             os << "  + " << it->first << ": " << it->second << std::endl;
-            it++;
+            ++it;
         }
 
         for (unsigned int i = 0; i < o.getGeometriesCount(); i++) {
@@ -141,67 +143,71 @@ namespace citygml {
     std::string cityObjectsTypeToString(const CityObject::CityObjectsType& t)
     {
         switch (t) {
-        case CityObject::COT_GenericCityObject:
+        case CityObject::CityObjectsType::COT_GenericCityObject:
             return "GenericCityObject";
-        case CityObject::COT_Building:
+        case CityObject::CityObjectsType::COT_Building:
             return "Building";
-        case CityObject::COT_Room:
+        case CityObject::CityObjectsType::COT_Room:
             return "Room";
-        case CityObject::COT_BuildingInstallation:
+        case CityObject::CityObjectsType::COT_BuildingInstallation:
             return "BuildingInstallation";
-        case CityObject::COT_BuildingFurniture:
+        case CityObject::CityObjectsType::COT_BuildingFurniture:
             return "BuildingFurniture";
-        case CityObject::COT_Door:
+        case CityObject::CityObjectsType::COT_Door:
             return "Door";
-        case CityObject::COT_Window:
+        case CityObject::CityObjectsType::COT_Window:
             return "Window";
-        case CityObject::COT_CityFurniture:
+        case CityObject::CityObjectsType::COT_CityFurniture:
             return "CityFurniture";
-        case CityObject::COT_Track:
+        case CityObject::CityObjectsType::COT_Track:
             return "Track";
-        case CityObject::COT_Road:
+        case CityObject::CityObjectsType::COT_Road:
             return "Road";
-        case CityObject::COT_Railway:
+        case CityObject::CityObjectsType::COT_Railway:
             return "Railway";
-        case CityObject::COT_Square:
+        case CityObject::CityObjectsType::COT_Square:
             return "Square";
-        case CityObject::COT_PlantCover:
+        case CityObject::CityObjectsType::COT_PlantCover:
             return "PlantCover";
-        case CityObject::COT_SolitaryVegetationObject:
+        case CityObject::CityObjectsType::COT_SolitaryVegetationObject:
             return "SolitaryVegetationObject";
-        case CityObject::COT_WaterBody:
+        case CityObject::CityObjectsType::COT_WaterBody:
             return "WaterBody";
-        case CityObject::COT_ReliefFeature:
+        case CityObject::CityObjectsType::COT_ReliefFeature:
             return "ReliefFeature";
-        case CityObject::COT_LandUse:
+        case CityObject::CityObjectsType::COT_LandUse:
             return "LandUse";
-        case CityObject::COT_Tunnel:
+        case CityObject::CityObjectsType::COT_Tunnel:
             return "Tunnel";
-        case CityObject::COT_Bridge:
+        case CityObject::CityObjectsType::COT_Bridge:
             return "Bridge";
-        case CityObject::COT_BridgeConstructionElement:
+        case CityObject::CityObjectsType::COT_BridgeConstructionElement:
             return "BridgeConstructionElement";
-        case CityObject::COT_BridgeInstallation:
+        case CityObject::CityObjectsType::COT_BridgeInstallation:
             return "BridgeInstallation";
-        case CityObject::COT_BridgePart:
+        case CityObject::CityObjectsType::COT_BridgePart:
             return "BridgePart";
-        case CityObject::COT_BuildingPart:
+        case CityObject::CityObjectsType::COT_BuildingPart:
             return "BuildingPart";
-        case CityObject::COT_WallSurface:
+        case CityObject::CityObjectsType::COT_WallSurface:
             return "WallSurface";
-        case CityObject::COT_RoofSurface:
+        case CityObject::CityObjectsType::COT_RoofSurface:
             return "RoofSurface";
-        case CityObject::COT_GroundSurface:
+        case CityObject::CityObjectsType::COT_GroundSurface:
             return "GroundSurface";
-        case CityObject::COT_ClosureSurface:
+        case CityObject::CityObjectsType::COT_ClosureSurface:
             return "ClosureSurface";
-        case CityObject::COT_FloorSurface:
+        case CityObject::CityObjectsType::COT_FloorSurface:
             return "FloorSurface";
-        case CityObject::COT_InteriorWallSurface:
+        case CityObject::CityObjectsType::COT_InteriorWallSurface:
             return "InteriorWallSurface";
-        case CityObject::COT_CeilingSurface:
+        case CityObject::CityObjectsType::COT_CeilingSurface:
             return "CeilingSurface";
-        case CityObject::COT_TransportationObject:
+        case CityObject::CityObjectsType::COT_OuterCeilingSurface:
+            return "OuterCeilingSurface";
+        case CityObject::CityObjectsType::COT_OuterFloorSurface:
+            return "OuterFloorSurface";
+        case CityObject::CityObjectsType::COT_TransportationObject:
             return "TransportationObject";
         default:
             return "Unknown";
@@ -215,37 +221,39 @@ namespace citygml {
     }
 
     std::unordered_map<std::string, CityObject::CityObjectsType> stringTypeMap = {
-         {cityObjectsTypeToLowerString(CityObject::COT_GenericCityObject), CityObject::COT_GenericCityObject},
-         {cityObjectsTypeToLowerString(CityObject::COT_Building), CityObject::COT_Building},
-         {cityObjectsTypeToLowerString(CityObject::COT_Room), CityObject::COT_Room},
-         {cityObjectsTypeToLowerString(CityObject::COT_BuildingInstallation), CityObject::COT_BuildingInstallation},
-         {cityObjectsTypeToLowerString(CityObject::COT_BuildingFurniture), CityObject::COT_BuildingFurniture},
-         {cityObjectsTypeToLowerString(CityObject::COT_Door), CityObject::COT_Door},
-         {cityObjectsTypeToLowerString(CityObject::COT_Window), CityObject::COT_Window},
-         {cityObjectsTypeToLowerString(CityObject::COT_CityFurniture), CityObject::COT_CityFurniture},
-         {cityObjectsTypeToLowerString(CityObject::COT_Track), CityObject::COT_Track},
-         {cityObjectsTypeToLowerString(CityObject::COT_Road), CityObject::COT_Road},
-         {cityObjectsTypeToLowerString(CityObject::COT_Railway), CityObject::COT_Railway},
-         {cityObjectsTypeToLowerString(CityObject::COT_Square), CityObject::COT_Square},
-         {cityObjectsTypeToLowerString(CityObject::COT_PlantCover), CityObject::COT_PlantCover},
-         {cityObjectsTypeToLowerString(CityObject::COT_SolitaryVegetationObject), CityObject::COT_SolitaryVegetationObject},
-         {cityObjectsTypeToLowerString(CityObject::COT_WaterBody), CityObject::COT_WaterBody},
-         {cityObjectsTypeToLowerString(CityObject::COT_ReliefFeature), CityObject::COT_ReliefFeature},
-         {cityObjectsTypeToLowerString(CityObject::COT_LandUse), CityObject::COT_LandUse},
-         {cityObjectsTypeToLowerString(CityObject::COT_Tunnel), CityObject::COT_Tunnel},
-         {cityObjectsTypeToLowerString(CityObject::COT_Bridge), CityObject::COT_Bridge},
-         {cityObjectsTypeToLowerString(CityObject::COT_BridgeConstructionElement), CityObject::COT_BridgeConstructionElement},
-         {cityObjectsTypeToLowerString(CityObject::COT_BridgeInstallation), CityObject::COT_BridgeInstallation},
-         {cityObjectsTypeToLowerString(CityObject::COT_BridgePart), CityObject::COT_BridgePart},
-         {cityObjectsTypeToLowerString(CityObject::COT_BuildingPart), CityObject::COT_BuildingPart},
-         {cityObjectsTypeToLowerString(CityObject::COT_WallSurface), CityObject::COT_WallSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_RoofSurface), CityObject::COT_RoofSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_GroundSurface), CityObject::COT_GroundSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_ClosureSurface), CityObject::COT_ClosureSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_FloorSurface), CityObject::COT_FloorSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_InteriorWallSurface), CityObject::COT_InteriorWallSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_CeilingSurface), CityObject::COT_CeilingSurface},
-         {cityObjectsTypeToLowerString(CityObject::COT_TransportationObject), CityObject::COT_TransportationObject}
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_GenericCityObject), CityObject::CityObjectsType::COT_GenericCityObject},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Building), CityObject::CityObjectsType::COT_Building},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Room), CityObject::CityObjectsType::COT_Room},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingInstallation), CityObject::CityObjectsType::COT_BuildingInstallation},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingFurniture), CityObject::CityObjectsType::COT_BuildingFurniture},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Door), CityObject::CityObjectsType::COT_Door},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Window), CityObject::CityObjectsType::COT_Window},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_CityFurniture), CityObject::CityObjectsType::COT_CityFurniture},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Track), CityObject::CityObjectsType::COT_Track},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Road), CityObject::CityObjectsType::COT_Road},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Railway), CityObject::CityObjectsType::COT_Railway},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Square), CityObject::CityObjectsType::COT_Square},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_PlantCover), CityObject::CityObjectsType::COT_PlantCover},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_SolitaryVegetationObject), CityObject::CityObjectsType::COT_SolitaryVegetationObject},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_WaterBody), CityObject::CityObjectsType::COT_WaterBody},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_ReliefFeature), CityObject::CityObjectsType::COT_ReliefFeature},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_LandUse), CityObject::CityObjectsType::COT_LandUse},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Tunnel), CityObject::CityObjectsType::COT_Tunnel},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Bridge), CityObject::CityObjectsType::COT_Bridge},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgeConstructionElement), CityObject::CityObjectsType::COT_BridgeConstructionElement},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgeInstallation), CityObject::CityObjectsType::COT_BridgeInstallation},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgePart), CityObject::CityObjectsType::COT_BridgePart},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingPart), CityObject::CityObjectsType::COT_BuildingPart},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_WallSurface), CityObject::CityObjectsType::COT_WallSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_RoofSurface), CityObject::CityObjectsType::COT_RoofSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_GroundSurface), CityObject::CityObjectsType::COT_GroundSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_ClosureSurface), CityObject::CityObjectsType::COT_ClosureSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_FloorSurface), CityObject::CityObjectsType::COT_FloorSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_InteriorWallSurface), CityObject::CityObjectsType::COT_InteriorWallSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_CeilingSurface), CityObject::CityObjectsType::COT_CeilingSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_OuterCeilingSurface), CityObject::CityObjectsType::COT_OuterCeilingSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_OuterFloorSurface), CityObject::CityObjectsType::COT_OuterFloorSurface},
+         {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_TransportationObject), CityObject::CityObjectsType::COT_TransportationObject}
     };
 
     CityObject::CityObjectsType cityObjectsTypeFromString(const std::string& s, bool& valid)
@@ -260,7 +268,7 @@ namespace citygml {
             return it->second;
         }
 
-        return CityObject::COT_All;
+        return CityObject::CityObjectsType::COT_All;
     }
 
 }
diff --git a/sources/src/citygml/envelope.cpp b/sources/src/citygml/envelope.cpp
index f0e9275..b8c6de3 100644
--- a/sources/src/citygml/envelope.cpp
+++ b/sources/src/citygml/envelope.cpp
@@ -1,4 +1,4 @@
-#include "citygml/envelope.h"
+#include <citygml/envelope.h>
 
 #include <numeric>
 #include <cmath>
diff --git a/sources/src/citygml/featureobject.cpp b/sources/src/citygml/featureobject.cpp
index 5765604..d548b2d 100644
--- a/sources/src/citygml/featureobject.cpp
+++ b/sources/src/citygml/featureobject.cpp
@@ -1,6 +1,6 @@
-#include "citygml/featureobject.h"
+#include <citygml/featureobject.h>
 
-#include "citygml/envelope.h"
+#include <citygml/envelope.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/geometry.cpp b/sources/src/citygml/geometry.cpp
index 1118c07..e35609b 100644
--- a/sources/src/citygml/geometry.cpp
+++ b/sources/src/citygml/geometry.cpp
@@ -1,4 +1,4 @@
-#include "citygml/geometry.h"
+#include <citygml/geometry.h>
 
 #include <citygml/polygon.h>
 #include <citygml/appearancemanager.h>
@@ -92,6 +92,10 @@ namespace citygml {
             return "InteriorWall";
         case GeometryType::GT_Ceiling:
             return "Ceiling";
+        case GeometryType::GT_OuterCeiling:
+            return "OuterCeiling";
+        case GeometryType::GT_OuterFloor:
+            return "OuterFloor";
         default:
             return "Unknown";
         }
diff --git a/sources/src/citygml/geometrymanager.cpp b/sources/src/citygml/geometrymanager.cpp
index 1bdfbb6..63eaebe 100644
--- a/sources/src/citygml/geometrymanager.cpp
+++ b/sources/src/citygml/geometrymanager.cpp
@@ -1,8 +1,8 @@
-#include "citygml/geometrymanager.h"
+#include <citygml/geometrymanager.h>
 
-#include "citygml/geometry.h"
-#include "citygml/implictgeometry.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/geometry.h>
+#include <citygml/implictgeometry.h>
+#include <citygml/citygmllogger.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/georeferencedtexture.cpp b/sources/src/citygml/georeferencedtexture.cpp
index be8aba0..389e1a8 100644
--- a/sources/src/citygml/georeferencedtexture.cpp
+++ b/sources/src/citygml/georeferencedtexture.cpp
@@ -1,4 +1,4 @@
-#include "citygml/georeferencedtexture.h"
+#include <citygml/georeferencedtexture.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/implictgeometry.cpp b/sources/src/citygml/implictgeometry.cpp
index 32b576f..1bc1b4c 100644
--- a/sources/src/citygml/implictgeometry.cpp
+++ b/sources/src/citygml/implictgeometry.cpp
@@ -1,5 +1,5 @@
-#include "citygml/implictgeometry.h"
-#include "citygml/geometry.h"
+#include <citygml/implictgeometry.h>
+#include <citygml/geometry.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/linearring.cpp b/sources/src/citygml/linearring.cpp
index 8a77db5..a91d299 100644
--- a/sources/src/citygml/linearring.cpp
+++ b/sources/src/citygml/linearring.cpp
@@ -1,8 +1,8 @@
-#include "citygml/linearring.h"
-#include "citygml/texturecoordinates.h"
-#include "citygml/texture.h"
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/linearring.h>
+#include <citygml/texturecoordinates.h>
+#include <citygml/texture.h>
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/citygmllogger.h>
 #include <float.h>
 #include <assert.h>
 
@@ -66,7 +66,7 @@ namespace citygml {
     {
         // Currently TextureCoordinates sharing via xlink is not supported (every TextureTargetDefinition is the
         // sole owner of its TextureCoordinate objects... if this ever changes use an unordered_set for the texture coordinates
-        std::vector<std::shared_ptr<TextureCoordinates>> coordinatesList;
+        std::vector<std::shared_ptr<TextureCoordinates> > coordinatesList;
 
         bool textureCoordinatesVerticesMismatch = false;
 
diff --git a/sources/src/citygml/material.cpp b/sources/src/citygml/material.cpp
index 976f72e..689edbf 100644
--- a/sources/src/citygml/material.cpp
+++ b/sources/src/citygml/material.cpp
@@ -1,4 +1,4 @@
-#include "citygml/material.h"
+#include <citygml/material.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/materialtargetdefinition.cpp b/sources/src/citygml/materialtargetdefinition.cpp
index 24399e0..667379c 100644
--- a/sources/src/citygml/materialtargetdefinition.cpp
+++ b/sources/src/citygml/materialtargetdefinition.cpp
@@ -1,4 +1,4 @@
-#include "citygml/materialtargetdefinition.h"
+#include <citygml/materialtargetdefinition.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/object.cpp b/sources/src/citygml/object.cpp
index f147481..702ae35 100644
--- a/sources/src/citygml/object.cpp
+++ b/sources/src/citygml/object.cpp
@@ -1,4 +1,4 @@
-#include "citygml/object.h"
+#include <citygml/object.h>
 
 #include <sstream>
 #include <iostream>
@@ -22,27 +22,27 @@ namespace citygml {
 
     std::string Object::getAttribute(const std::string& name) const
     {
-        std::map< std::string, std::string >::const_iterator elt = m_attributes.find( name );
-        return elt != m_attributes.end() ? elt->second : "";
+        AttributesMap::const_iterator elt = m_attributes.find( name );
+        return elt != m_attributes.end() ? elt->second.asString() : "";
     }
 
-    const AttributesMap&Object::getAttributes() const
+    const AttributesMap& Object::getAttributes() const
     {
         return m_attributes;
     }
 
-    AttributesMap&Object::getAttributes()
+    AttributesMap& Object::getAttributes()
     {
         return m_attributes;
     }
 
-    void Object::setAttribute(const std::string& name, const std::string& value, bool overwrite)
+    void Object::setAttribute(const std::string& name, const std::string& value, AttributeType type, bool overwrite)
     {
         if ( !overwrite )
         {
             if ( m_attributes.count(name) > 1 ) return;
         }
-        m_attributes[ name ] = value;
+        m_attributes[ name ] = AttributeValue(value, type);
     }
 
     std::ostream& operator<<( std::ostream& os, const Object& o )
diff --git a/sources/src/citygml/polygon.cpp b/sources/src/citygml/polygon.cpp
index a31962a..9dcc755 100644
--- a/sources/src/citygml/polygon.cpp
+++ b/sources/src/citygml/polygon.cpp
@@ -1,11 +1,11 @@
-#include "citygml/polygon.h"
-#include "citygml/appearance.h"
-#include "citygml/texture.h"
-#include "citygml/texturecoordinates.h"
-#include "citygml/tesselator.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/materialtargetdefinition.h"
+#include <citygml/polygon.h>
+#include <citygml/appearance.h>
+#include <citygml/texture.h>
+#include <citygml/texturecoordinates.h>
+#include <citygml/tesselator.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/materialtargetdefinition.h>
 
 #include <algorithm>
 #include <stdexcept>
@@ -134,7 +134,7 @@ namespace citygml {
             m_exteriorRing->removeDuplicateVertices( texTargetDefinitions, logger );
         }
 
-        for ( std::unique_ptr<LinearRing>& ring : m_interiorRings )
+        for ( auto& ring : m_interiorRings )
         {
             ring->removeDuplicateVertices( texTargetDefinitions, logger );
         }
@@ -157,8 +157,8 @@ namespace citygml {
         return coords->getCoords();
     }
 
-    std::vector<std::vector<TVec2f>> Polygon::getTexCoordListsForRing(const LinearRing& ring, const std::vector<std::string>& themesFront, const std::vector<std::string>& themesBack) {
-        std::vector<std::vector<TVec2f>> texCoordsLists;
+    std::vector<std::vector<TVec2f> > Polygon::getTexCoordListsForRing(const LinearRing& ring, const std::vector<std::string>& themesFront, const std::vector<std::string>& themesBack) {
+        std::vector<std::vector<TVec2f> > texCoordsLists;
 
         for (const std::string& theme : themesFront) {
             texCoordsLists.push_back(getTexCoordsForRingAndTheme(ring, theme, true));
@@ -186,7 +186,7 @@ namespace citygml {
             m_exteriorRing->forgetVertices();
         }
 
-        for ( std::unique_ptr<LinearRing>& ring : m_interiorRings )
+        for ( auto& ring : m_interiorRings )
         {
             tesselator.addContour( ring->getVertices(), getTexCoordListsForRing(*ring, themesFront, themesBack) );
             ring->forgetVertices();
@@ -200,7 +200,7 @@ namespace citygml {
             return;
         }
 
-        const std::vector<std::vector<TVec2f>>& texCoordLists = tesselator.getTexCoords();
+        const std::vector<std::vector<TVec2f> >& texCoordLists = tesselator.getTexCoords();
 
         for (size_t i = 0; i < themesFront.size(); i++) {
             assert(texCoordLists.at(i).size() == m_vertices.size());
@@ -256,10 +256,10 @@ namespace citygml {
         }
 
         if ( ring->isExterior() ) {
-            m_exteriorRing = std::unique_ptr<LinearRing>(ring);
+            m_exteriorRing = std::shared_ptr<LinearRing>(ring);
         }
         else {
-            m_interiorRings.push_back( std::unique_ptr<LinearRing>(ring) );
+            m_interiorRings.push_back( std::shared_ptr<LinearRing>(ring) );
         }
     }
 
diff --git a/sources/src/citygml/polygonmanager.cpp b/sources/src/citygml/polygonmanager.cpp
index 5340c1f..78a51b2 100644
--- a/sources/src/citygml/polygonmanager.cpp
+++ b/sources/src/citygml/polygonmanager.cpp
@@ -1,8 +1,8 @@
-#include "citygml/polygonmanager.h"
+#include <citygml/polygonmanager.h>
 
-#include "citygml/polygon.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/geometry.h"
+#include <citygml/polygon.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/geometry.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/tesselator.cpp b/sources/src/citygml/tesselator.cpp
index 7b85bc8..757f737 100644
--- a/sources/src/citygml/tesselator.cpp
+++ b/sources/src/citygml/tesselator.cpp
@@ -22,7 +22,7 @@
 #define NOMINMAX
 #endif
 
-#include "citygml/tesselator.h"
+#include <citygml/tesselator.h>
 #ifndef WIN32
 #	include <stdint.h>
 #endif
@@ -32,6 +32,7 @@
 
 #include <iostream>
 #include <assert.h>
+#include <algorithm>
 
 Tesselator::Tesselator(std::shared_ptr<citygml::CityGMLLogger> logger )
 {
@@ -79,7 +80,7 @@ const std::vector<unsigned int>& Tesselator::getIndices() const
     return _outIndices;
 }
 
-void Tesselator::addContour(const std::vector<TVec3d>& pts, std::vector<std::vector<TVec2f>> textureCoordinatesLists )
+void Tesselator::addContour(const std::vector<TVec3d>& pts, std::vector<std::vector<TVec2f> > textureCoordinatesLists )
 {
     unsigned int len = pts.size();
     if ( len < 3 ) return;
diff --git a/sources/src/citygml/texture.cpp b/sources/src/citygml/texture.cpp
index 42b7dd8..428743b 100644
--- a/sources/src/citygml/texture.cpp
+++ b/sources/src/citygml/texture.cpp
@@ -1,5 +1,5 @@
-#include "citygml/texture.h"
-#include "citygml/utils.h"
+#include <citygml/texture.h>
+#include <citygml/utils.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/texturecoordinates.cpp b/sources/src/citygml/texturecoordinates.cpp
index dea3397..472af15 100644
--- a/sources/src/citygml/texturecoordinates.cpp
+++ b/sources/src/citygml/texturecoordinates.cpp
@@ -1,5 +1,5 @@
-#include "citygml/texturecoordinates.h"
-#include "citygml/linearring.h"
+#include <citygml/texturecoordinates.h>
+#include <citygml/linearring.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/texturetargetdefinition.cpp b/sources/src/citygml/texturetargetdefinition.cpp
index 6b74ef5..c0a2971 100644
--- a/sources/src/citygml/texturetargetdefinition.cpp
+++ b/sources/src/citygml/texturetargetdefinition.cpp
@@ -1,5 +1,5 @@
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/texturecoordinates.h"
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/texturecoordinates.h>
 
 namespace citygml {
 
diff --git a/sources/src/citygml/transformmatrix.cpp b/sources/src/citygml/transformmatrix.cpp
index 85d2afa..16b1c53 100644
--- a/sources/src/citygml/transformmatrix.cpp
+++ b/sources/src/citygml/transformmatrix.cpp
@@ -1,4 +1,4 @@
-#include "citygml/transformmatrix.h"
+#include <citygml/transformmatrix.h>
 
 namespace citygml {
 
diff --git a/sources/src/parser/addressparser.cpp b/sources/src/parser/addressparser.cpp
index f6f1162..3e5084a 100644
--- a/sources/src/parser/addressparser.cpp
+++ b/sources/src/parser/addressparser.cpp
@@ -10,6 +10,30 @@
 #include <functional>
 
 namespace citygml {
+	void setCountry(Address* address, std::string const &country)
+	{
+		address->setCountry(country);
+	}
+
+	void setLocality(Address* address, std::string const &locality)
+	{
+		address->setLocality(locality);
+	}
+
+	void setThoroughfareName(Address* address, std::string const &thoroughfareName)
+	{
+		address->setThoroughfareName(thoroughfareName);
+	}
+
+	void setThoroughfareNumber(Address *address, std::string const &thoroughfareNumber)
+	{
+		address->setThoroughfareNumber(thoroughfareNumber);
+	}
+
+	void setPostalCode(Address* address, std::string const &postalCode)
+	{
+		address->setPostalCode(postalCode);
+	}
 
     namespace {
 
@@ -20,7 +44,7 @@ namespace citygml {
 
         auto k_rootElements = std::unordered_set<NodeType::XMLNode>();
         auto k_subElements = std::unordered_set<NodeType::XMLNode>();
-        auto k_dataElements = std::unordered_map<NodeType::XMLNode, std::function<void(Address*, const std::string&)>>();
+        auto k_dataElements = std::unordered_map<NodeType::XMLNode, std::function<void(Address*, const std::string&)> >();
 
         std::mutex g_nodeSetMutex;
         bool g_nodeSetsInitialized = false;
@@ -43,13 +67,11 @@ namespace citygml {
                         NodeType::XAL_ThoroughfareNode
                     };
 
-                    k_dataElements = {
-                        { NodeType::XAL_CountryNameNode, &Address::setCountry },
-                        { NodeType::XAL_LocalityNameNode, &Address::setLocality },
-                        { NodeType::XAL_ThoroughfareNameNode, &Address::setThoroughfareName },
-                        { NodeType::XAL_ThoroughfareNumberNode, &Address::setThoroughfareNumber },
-                        { NodeType::XAL_PostalCodeNumberNode, &Address::setPostalCode }
-                    };
+					k_dataElements[NodeType::XAL_CountryNameNode] = &setCountry;
+					k_dataElements[NodeType::XAL_LocalityNameNode] = &setLocality;
+					k_dataElements[NodeType::XAL_ThoroughfareNameNode] = &setThoroughfareName;
+					k_dataElements[NodeType::XAL_ThoroughfareNumberNode] = &setThoroughfareNumber;
+					k_dataElements[NodeType::XAL_PostalCodeNumberNode] = &setPostalCode;
 
                     g_nodeSetsInitialized = true;
                 }
@@ -82,7 +104,7 @@ namespace citygml {
             throw std::runtime_error("Unexpected start tag found.");
         }
 
-        m_address = make_unique<Address>(attributes.getCityGMLIDAttribute());
+        m_address = citygml::make_unique<Address>(attributes.getCityGMLIDAttribute());
         return true;
     }
 
diff --git a/sources/src/parser/appearanceelementparser.cpp b/sources/src/parser/appearanceelementparser.cpp
index 2f6456c..1ae9195 100644
--- a/sources/src/parser/appearanceelementparser.cpp
+++ b/sources/src/parser/appearanceelementparser.cpp
@@ -12,13 +12,13 @@
 #include "parser/georeferencedtextureelementparser.h"
 #include "parser/skipelementparser.h"
 
-#include "citygml/appearance.h"
-#include "citygml/texture.h"
-#include "citygml/material.h"
-#include "citygml/georeferencedtexture.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/object.h"
+#include <citygml/appearance.h>
+#include <citygml/texture.h>
+#include <citygml/material.h>
+#include <citygml/georeferencedtexture.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/object.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/attributes.cpp b/sources/src/parser/attributes.cpp
index d5b1af1..132f884 100644
--- a/sources/src/parser/attributes.cpp
+++ b/sources/src/parser/attributes.cpp
@@ -2,7 +2,7 @@
 #include "parser/parserutils.hpp"
 #include "parser/documentlocation.h"
 
-#include "citygml/citygmllogger.h"
+#include <citygml/citygmllogger.h>
 
 #include "sstream"
 
diff --git a/sources/src/parser/citygmldocumentparser.cpp b/sources/src/parser/citygmldocumentparser.cpp
index a792d39..3a25d98 100644
--- a/sources/src/parser/citygmldocumentparser.cpp
+++ b/sources/src/parser/citygmldocumentparser.cpp
@@ -5,10 +5,10 @@
 #include "parser/citymodelelementparser.h"
 #include "parser/geocoordinatetransformer.h"
 
-#include "citygml/citygmllogger.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citymodel.h"
-#include "citygml/tesselator.h"
+#include <citygml/citygmllogger.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citymodel.h>
+#include <citygml/tesselator.h>
 
 #include <stdexcept>
 
@@ -133,6 +133,7 @@ namespace citygml {
                     CITYGML_LOG_INFO(m_logger, "Finished coordinates transformation .");
                 } catch (const std::runtime_error& e) {
                     CITYGML_LOG_ERROR(m_logger, "Coordinate transformation aborted: " << e.what());
+                    throw e;
                 }
             }
 
diff --git a/sources/src/parser/citygmlelementparser.cpp b/sources/src/parser/citygmlelementparser.cpp
index 16e93d7..5a30c86 100644
--- a/sources/src/parser/citygmlelementparser.cpp
+++ b/sources/src/parser/citygmlelementparser.cpp
@@ -1,7 +1,7 @@
 #include "parser/citygmlelementparser.h"
 
-#include "citygml/utils.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/utils.h>
+#include <citygml/citygmllogger.h>
 
 #include "parser/citygmldocumentparser.h"
 #include "parser/documentlocation.h"
diff --git a/sources/src/parser/citymodelelementparser.cpp b/sources/src/parser/citymodelelementparser.cpp
index 9d2b135..915dd91 100644
--- a/sources/src/parser/citymodelelementparser.cpp
+++ b/sources/src/parser/citymodelelementparser.cpp
@@ -6,10 +6,10 @@
 #include "parser/cityobjectelementparser.h"
 #include "parser/appearanceelementparser.h"
 
-#include "citygml/citymodel.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/cityobject.h"
+#include <citygml/citymodel.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/cityobject.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp
index 4c7ec16..dd43786 100644
--- a/sources/src/parser/cityobjectelementparser.cpp
+++ b/sources/src/parser/cityobjectelementparser.cpp
@@ -11,9 +11,9 @@
 #include "parser/linestringelementparser.h"
 #include "parser/addressparser.h"
 
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/address.h"
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/address.h>
 
 #include <stdexcept>
 #include <iostream>
@@ -25,16 +25,18 @@ namespace citygml {
 
     std::unordered_map<int, CityObject::CityObjectsType> CityObjectElementParser::typeIDTypeMap = std::unordered_map<int, CityObject::CityObjectsType>();
     std::unordered_set<int> CityObjectElementParser::attributesSet = std::unordered_set<int>();
+    std::unordered_map<int, AttributeType> CityObjectElementParser::attributeTypeMap;
 
     std::mutex CityObjectElementParser::initializedTypeIDMutex;
     std::mutex CityObjectElementParser::initializedAttributeSetMutex;
 
-    #define HANDLE_TYPE( prefix, elementName ) std::pair<int, CityObject::CityObjectsType>(NodeType::prefix ## _ ## elementName ## Node.typeID(), CityObject::COT_ ## elementName)
+    #define HANDLE_TYPE( prefix, elementName ) std::pair<int, CityObject::CityObjectsType>(NodeType::prefix ## _ ## elementName ## Node.typeID(), CityObject::CityObjectsType::COT_## elementName)
     #define HANDLE_GROUP_TYPE( prefix, elementName, enumtype ) std::pair<int, CityObject::CityObjectsType>(NodeType::prefix ## _ ## elementName ## Node.typeID(), enumtype)
     #define HANDLE_ATTR( prefix, elementName ) NodeType::prefix ## _ ## elementName ## Node.typeID()
 
     CityObjectElementParser::CityObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr<CityGMLLogger> logger, std::function<void (CityObject*)> callback)
         : GMLFeatureCollectionElementParser(documentParser, factory, logger)
+        , m_lastAttributeType(AttributeType::String)
     {
         m_callback = callback;
     }
@@ -71,9 +73,9 @@ namespace citygml {
                 typeIDTypeMap.insert(HANDLE_TYPE(VEG, PlantCover));
                 typeIDTypeMap.insert(HANDLE_TYPE(VEG, SolitaryVegetationObject));
                 typeIDTypeMap.insert(HANDLE_TYPE(WTR, WaterBody));
-                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterSurface, CityObject::COT_WaterBody));
-                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterGroundSurface, CityObject::COT_WaterBody));
-                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterClosureSurface, CityObject::COT_WaterBody));
+                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterSurface, CityObject::CityObjectsType::COT_WaterBody));
+                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterGroundSurface, CityObject::CityObjectsType::COT_WaterBody));
+                typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterClosureSurface, CityObject::CityObjectsType::COT_WaterBody));
                 typeIDTypeMap.insert(HANDLE_TYPE(LUSE, LandUse));
                 typeIDTypeMap.insert(HANDLE_TYPE(SUB, Tunnel));
                 typeIDTypeMap.insert(HANDLE_TYPE(BRID, Bridge));
@@ -87,6 +89,8 @@ namespace citygml {
                 typeIDTypeMap.insert(HANDLE_TYPE(BLDG, FloorSurface));
                 typeIDTypeMap.insert(HANDLE_TYPE(BLDG, InteriorWallSurface));
                 typeIDTypeMap.insert(HANDLE_TYPE(BLDG, CeilingSurface));
+                typeIDTypeMap.insert(HANDLE_TYPE(BLDG, OuterCeilingSurface));
+                typeIDTypeMap.insert(HANDLE_TYPE(BLDG, OuterFloorSurface));
                 typeIDTypeMap.insert(HANDLE_TYPE(GRP, CityObjectGroup));
                 typeIDTypeMap.insert(HANDLE_TYPE(DEM, ReliefFeature));
 
@@ -143,11 +147,71 @@ namespace citygml {
                 attributesSet.insert(HANDLE_ATTR(WTR, Usage));
                 attributesSet.insert(HANDLE_ATTR(WTR, WaterLevel));
 
+
+                attributeTypeMap[HANDLE_ATTR(CORE, CreationDate)] = AttributeType::Date;
+                attributeTypeMap[HANDLE_ATTR(CORE, TerminationDate)] = AttributeType::Date;
+                attributeTypeMap[HANDLE_ATTR(BLDG, Type)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(BLDG, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(BLDG, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(BLDG, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(BLDG, YearOfConstruction)] = AttributeType::Date;
+                attributeTypeMap[HANDLE_ATTR(BLDG, YearOfDemolition)] = AttributeType::Date;
+                attributeTypeMap[HANDLE_ATTR(BLDG, StoreyHeightsAboveGround)] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(BLDG, StoreyHeightsBelowGround)] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(BLDG, StoreysBelowGround)] = AttributeType::Integer;
+                attributeTypeMap[HANDLE_ATTR(BLDG, StoreysAboveGround)] = AttributeType::Integer;
+                attributeTypeMap[HANDLE_ATTR(BLDG, MeasuredHeight)] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(BLDG, RoofType)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(VEG, Class )] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(VEG, Function )] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(VEG, AverageHeight )] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(VEG, Species )] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(VEG, Height )] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(VEG, TrunkDiameter )] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(VEG, CrownDiameter )] = AttributeType::Double;
+                attributeTypeMap[HANDLE_ATTR(FRN, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(FRN, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GRP, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GRP, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GRP, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GEN, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GEN, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(GEN, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(LUSE, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(LUSE, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(LUSE, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(DEM, Lod)] = AttributeType::Integer;
+                attributeTypeMap[HANDLE_ATTR(TRANS, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(TRANS, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(TRANS, SurfaceMaterial)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(WTR, Class)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(WTR, Function)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(WTR, Usage)] = AttributeType::String;
+                attributeTypeMap[HANDLE_ATTR(WTR, WaterLevel)] = AttributeType::Double;
+
                 attributesSetInitialized = true;
             }
         }
     }
 
+    AttributeType CityObjectElementParser::getAttributeType(const NodeType::XMLNode& node)
+    {
+        if (node == NodeType::GEN_StringAttributeNode) {
+            return AttributeType::String;
+        } else if (node == NodeType::GEN_DoubleAttributeNode) {
+            return AttributeType::Double;
+        } else if (node == NodeType::GEN_IntAttributeNode) {
+            return AttributeType::Integer;
+        } else if (node == NodeType::GEN_DateAttributeNode) {
+            return AttributeType::Date;
+        } else if (node == NodeType::GEN_UriAttributeNode) {
+            return AttributeType::Uri;
+        } else {
+            // fallback to string for other types
+            return AttributeType::String;
+        }
+    }
+
     bool CityObjectElementParser::handlesElement(const NodeType::XMLNode& node) const
     {
         initializeTypeIDTypeMap();
@@ -193,7 +257,7 @@ namespace citygml {
              || node == NodeType::GEN_UriAttributeNode) {
 
             m_lastAttributeName = attributes.getAttribute("name");
-
+            m_lastAttributeType = getAttributeType(node);
         } else if (attributesSet.count(node.typeID()) > 0 || node == NodeType::GEN_ValueNode) {
 
             return true;
@@ -349,12 +413,13 @@ namespace citygml {
              || node == NodeType::GEN_UriAttributeNode) {
 
             m_lastAttributeName = "";
-            return true;
+            m_lastAttributeType = AttributeType::String;
 
+            return true;
         } else if (node == NodeType::GEN_ValueNode) {
 
             if (!m_lastAttributeName.empty()) {
-                m_model->setAttribute(m_lastAttributeName, characters);
+                m_model->setAttribute(m_lastAttributeName, characters, m_lastAttributeType);
             } else {
                 CITYGML_LOG_WARN(m_logger, "Found value node (" << NodeType::GEN_ValueNode << ") outside attribute node... ignore.");
             }
@@ -362,7 +427,7 @@ namespace citygml {
             return true;
         } else if (attributesSet.count(node.typeID()) > 0) {
             if (!characters.empty()) {
-                m_model->setAttribute(node.name(), characters);
+                m_model->setAttribute(node.name(), characters, attributeTypeMap.at(node.typeID()));
             }
             return true;
         } else if (node == NodeType::BLDG_BoundedByNode
diff --git a/sources/src/parser/delayedchoiceelementparser.cpp b/sources/src/parser/delayedchoiceelementparser.cpp
index ebba494..ad18a18 100644
--- a/sources/src/parser/delayedchoiceelementparser.cpp
+++ b/sources/src/parser/delayedchoiceelementparser.cpp
@@ -3,7 +3,7 @@
 #include "parser/documentlocation.h"
 #include "parser/citygmldocumentparser.h"
 
-#include "citygml/citygmllogger.h"
+#include <citygml/citygmllogger.h>
 
 #include <sstream>
 #include <stdexcept>
diff --git a/sources/src/parser/geocoordinatetransformer.cpp b/sources/src/parser/geocoordinatetransformer.cpp
index abff46e..dfce731 100644
--- a/sources/src/parser/geocoordinatetransformer.cpp
+++ b/sources/src/parser/geocoordinatetransformer.cpp
@@ -1,14 +1,14 @@
 #include "parser/geocoordinatetransformer.h"
 
-#include "citygml/citygmllogger.h"
-#include "citygml/citymodel.h"
-#include "citygml/cityobject.h"
-#include "citygml/implictgeometry.h"
-#include "citygml/geometry.h"
-#include "citygml/polygon.h"
-#include "citygml/linestring.h"
-#include "citygml/vecs.hpp"
-#include "citygml/envelope.h"
+#include <citygml/citygmllogger.h>
+#include <citygml/citymodel.h>
+#include <citygml/cityobject.h>
+#include <citygml/implictgeometry.h>
+#include <citygml/geometry.h>
+#include <citygml/polygon.h>
+#include <citygml/linestring.h>
+#include <citygml/vecs.hpp>
+#include <citygml/envelope.h>
 
 #ifdef USE_GDAL
 #include "ogrsf_frmts.h"
@@ -19,12 +19,11 @@ class GeoTransform
 {
 public:
     GeoTransform( const std::string& destURN, std::shared_ptr<citygml::CityGMLLogger> logger )
+		: m_destSRSURN(destURN)
+		, m_sourceURN("")
+		, m_transformation(nullptr)
+		, m_logger(logger)
     {
-        m_logger = logger;
-        m_transformation = nullptr;
-        m_destSRSURN = destURN;
-        m_sourceURN = "";
-
         OGRErr err = m_destSRS.SetFromUserInput(destURN.c_str());
 
         if (err != OGRERR_NONE) {
@@ -33,13 +32,13 @@ public:
         }
     }
 
-    GeoTransform(const GeoTransform& other) {
-        m_logger = other.m_logger;
-        m_destSRSURN = other.m_destSRSURN;
-        m_destSRS = other.m_destSRS;
-        m_sourceURN = "";
-
-        m_transformation = nullptr;
+    GeoTransform(const GeoTransform& other)
+		: m_destSRS(other.m_destSRS)
+		, m_destSRSURN(other.m_destSRSURN)
+		, m_sourceURN("")
+		, m_transformation(nullptr)
+		, m_logger(other.m_logger)
+	{
     }
 
     ~GeoTransform()
@@ -290,6 +289,11 @@ class GeoTransform {
 
 namespace citygml {
 
+	GeoCoordinateTransformer::GeoCoordinateTransformer(const std::string& destSRS, std::shared_ptr<CityGMLLogger> logger)
+	{
+		m_destinationSRS = destSRS;
+		m_logger = logger;
+	}
 
     void GeoCoordinateTransformer::transformToDestinationSRS(CityModel* model) {
         CITYGML_LOG_WARN(m_logger, "Coordinate transformation to " << m_destinationSRS << " requested, but libcitygml was build without GDAL. The coordinates will not be transformed.");
diff --git a/sources/src/parser/geometryelementparser.cpp b/sources/src/parser/geometryelementparser.cpp
index e5b78bd..d6f2f57 100644
--- a/sources/src/parser/geometryelementparser.cpp
+++ b/sources/src/parser/geometryelementparser.cpp
@@ -9,10 +9,10 @@
 #include "parser/delayedchoiceelementparser.h"
 #include "parser/sequenceparser.h"
 
-#include "citygml/geometry.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/polygon.h"
+#include <citygml/geometry.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/polygon.h>
 
 #include <mutex>
 
diff --git a/sources/src/parser/georeferencedtextureelementparser.cpp b/sources/src/parser/georeferencedtextureelementparser.cpp
index 6520ab5..32f5b06 100644
--- a/sources/src/parser/georeferencedtextureelementparser.cpp
+++ b/sources/src/parser/georeferencedtextureelementparser.cpp
@@ -7,9 +7,9 @@
 #include "parser/documentlocation.h"
 #include "parser/skipelementparser.h"
 
-#include "citygml/georeferencedtexture.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/georeferencedtexture.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/gmlfeaturecollectionparser.cpp b/sources/src/parser/gmlfeaturecollectionparser.cpp
index 472e50f..7c529d9 100644
--- a/sources/src/parser/gmlfeaturecollectionparser.cpp
+++ b/sources/src/parser/gmlfeaturecollectionparser.cpp
@@ -4,11 +4,11 @@
 #include "parser/parserutils.hpp"
 #include "parser/nodetypes.h"
 
-#include "citygml/citygmllogger.h"
-#include "citygml/envelope.h"
-#include "citygml/object.h"
-#include "citygml/vecs.hpp"
-#include "citygml/featureobject.h"
+#include <citygml/citygmllogger.h>
+#include <citygml/envelope.h>
+#include <citygml/object.h>
+#include <citygml/vecs.hpp>
+#include <citygml/featureobject.h>
 
 
 #include <stdexcept>
diff --git a/sources/src/parser/implicitgeometryelementparser.cpp b/sources/src/parser/implicitgeometryelementparser.cpp
index 91fd904..a71be09 100644
--- a/sources/src/parser/implicitgeometryelementparser.cpp
+++ b/sources/src/parser/implicitgeometryelementparser.cpp
@@ -12,9 +12,9 @@
 #include "parser/polygonelementparser.h"
 #include "parser/delayedchoiceelementparser.h"
 
-#include "citygml/implictgeometry.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/implictgeometry.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/linearringelementparser.cpp b/sources/src/parser/linearringelementparser.cpp
index 25d60c0..ad07381 100644
--- a/sources/src/parser/linearringelementparser.cpp
+++ b/sources/src/parser/linearringelementparser.cpp
@@ -7,9 +7,9 @@
 #include "parser/documentlocation.h"
 #include "parser/parserutils.hpp"
 
-#include "citygml/linearring.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/linearring.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/linestringelementparser.cpp b/sources/src/parser/linestringelementparser.cpp
index 6cb6fb9..3aebf21 100644
--- a/sources/src/parser/linestringelementparser.cpp
+++ b/sources/src/parser/linestringelementparser.cpp
@@ -7,9 +7,9 @@
 #include "parser/documentlocation.h"
 #include "parser/parserutils.hpp"
 
-#include "citygml/linestring.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/linestring.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <mutex>
 #include <stdexcept>
diff --git a/sources/src/parser/materialelementparser.cpp b/sources/src/parser/materialelementparser.cpp
index 228534d..9c7d411 100644
--- a/sources/src/parser/materialelementparser.cpp
+++ b/sources/src/parser/materialelementparser.cpp
@@ -8,9 +8,9 @@
 #include "parser/parserutils.hpp"
 #include "parser/skipelementparser.h"
 
-#include "citygml/material.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/material.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <stdexcept>
 
diff --git a/sources/src/parser/nodetypes.cpp b/sources/src/parser/nodetypes.cpp
index 8b75cf4..247933b 100644
--- a/sources/src/parser/nodetypes.cpp
+++ b/sources/src/parser/nodetypes.cpp
@@ -1,5 +1,5 @@
 #include "parser/nodetypes.h"
-#include "citygml/utils.h"
+#include <citygml/utils.h>
 
 namespace citygml {
 
@@ -263,6 +263,8 @@ namespace citygml {
                 INITIALIZE_NODE( BLDG, FloorSurface )
                 INITIALIZE_NODE( BLDG, InteriorWallSurface )
                 INITIALIZE_NODE( BLDG, CeilingSurface )
+                INITIALIZE_NODE( BLDG, OuterCeilingSurface )
+                INITIALIZE_NODE( BLDG, OuterFloorSurface )
                 INITIALIZE_NODE( BLDG, BuildingFurniture )
                 INITIALIZE_NODE( BLDG, RoofType)
 
@@ -640,6 +642,8 @@ namespace citygml {
     DEFINE_NODE( BLDG, FloorSurface )
     DEFINE_NODE( BLDG, InteriorWallSurface )
     DEFINE_NODE( BLDG, CeilingSurface )
+    DEFINE_NODE( BLDG, OuterCeilingSurface )
+    DEFINE_NODE( BLDG, OuterFloorSurface )
     DEFINE_NODE( BLDG, BuildingFurniture )
     DEFINE_NODE( BLDG, RoofType)
 
diff --git a/sources/src/parser/parserxercesc.cpp b/sources/src/parser/parserxercesc.cpp
index 1ee2649..2d3dd6f 100644
--- a/sources/src/parser/parserxercesc.cpp
+++ b/sources/src/parser/parserxercesc.cpp
@@ -14,14 +14,15 @@
 * GNU Lesser General Public License for more details.
 */
 
-#include "citygml/citygml.h"
+#include <citygml/citygml.h>
+#include <citygml/citygmllogger.h>
 
 #include <fstream>
 #include <string>
 #include <memory>
 #include <mutex>
 
-#include "citygml/citygmllogger.h"
+#include <citygml/citygml_api.h>
 #include "parser/citygmldocumentparser.h"
 #include "parser/documentlocation.h"
 #include "parser/attributes.h"
@@ -62,9 +63,11 @@ std::shared_ptr<XMLCh> toXercesString(const std::string& str) {
 
 class DocumentLocationXercesAdapter : public citygml::DocumentLocation {
 public:
-    DocumentLocationXercesAdapter(const std::string& fileName) {
-        m_locator = nullptr;
-        m_fileName = fileName;
+    explicit DocumentLocationXercesAdapter(const std::string& fileName)
+		: m_locator(nullptr)
+		, m_fileName(fileName)
+	{
+        
     }
 
     void setLocator(const xercesc::Locator* locator) {
@@ -140,12 +143,12 @@ public:
         CityGMLDocumentParser::endDocument();
     }
 
-    virtual void setDocumentLocator(const xercesc::Locator* const locator) {
+    virtual void setDocumentLocator(const xercesc::Locator* const locator) override {
         m_documentLocation.setLocator(locator);
     }
 
     // CityGMLDocumentParser interface
-    virtual const citygml::DocumentLocation& getDocumentLocation() const {
+    virtual const citygml::DocumentLocation& getDocumentLocation() const override {
         return m_documentLocation;
     }
 protected:
@@ -157,7 +160,7 @@ protected:
 class StdBinInputStream : public xercesc::BinInputStream
 {
 public:
-    StdBinInputStream( std::istream& stream ) : BinInputStream(), m_stream( stream ) {}
+    explicit StdBinInputStream( std::istream& stream ) : BinInputStream(), m_stream( stream ) {}
 
     virtual ~StdBinInputStream() {}
 
@@ -180,7 +183,7 @@ private:
 class StdBinInputSource : public xercesc::InputSource
 {
 public:
-    StdBinInputSource( std::istream& stream ) : m_stream( stream ) {}
+    explicit StdBinInputSource( std::istream& stream ) : m_stream( stream ) {}
 
     virtual xercesc::BinInputStream* makeStream() const
     {
@@ -200,6 +203,11 @@ namespace citygml
 
     class StdLogger : public CityGMLLogger {
     public:
+
+        StdLogger(LOGLEVEL level = LOGLEVEL::LL_ERROR):CityGMLLogger(level){
+
+        };
+
         virtual void log(LOGLEVEL level, const std::string& message, const char* file, int line) const
         {
             std::ostream& stream = level == LOGLEVEL::LL_ERROR ? std::cerr : std::cout;
@@ -231,12 +239,7 @@ namespace citygml
             }
 
             stream << " " << message << std::endl;
-        }
-
-        virtual bool isEnabledFor(LOGLEVEL) const
-        {
-            return true;
-        }
+        }     
     };
 
     std::mutex xerces_init_mutex;
@@ -258,7 +261,7 @@ namespace citygml
             xerces_init_mutex.unlock();
         }
         catch (const xercesc::XMLException& e) {
-            CITYGML_LOG_ERROR(logger, "Could not initialize xercesc XMLPlatformUtils, a XML Exception occured : " << toStdString(e.getMessage()));
+            CITYGML_LOG_ERROR(logger, "Could not initialize xercesc XMLPlatformUtils, a XML Exception occurred : " << toStdString(e.getMessage()));
             return false;
         }
 
@@ -286,15 +289,15 @@ namespace citygml
         }
         catch ( const xercesc::XMLException& e )
         {
-            CITYGML_LOG_ERROR(logger, "XML Exception occured: " << toStdString(e.getMessage()));
+            CITYGML_LOG_ERROR(logger, "XML Exception occurred: " << toStdString(e.getMessage()));
         }
         catch ( const xercesc::SAXParseException& e )
         {
-            CITYGML_LOG_ERROR(logger, "SAXParser Exception occured: " << toStdString(e.getMessage()));
+            CITYGML_LOG_ERROR(logger, "SAXParser Exception occurred: " << toStdString(e.getMessage()));
         }
         catch ( const std::exception& e )
         {
-            CITYGML_LOG_ERROR(logger, "Unexpected Exception occured: " << e.what());
+            CITYGML_LOG_ERROR(logger, "Unexpected Exception occurred: " << e.what());
         }
 #endif
 
diff --git a/sources/src/parser/polygonelementparser.cpp b/sources/src/parser/polygonelementparser.cpp
index 9adb1ec..7e6637e 100644
--- a/sources/src/parser/polygonelementparser.cpp
+++ b/sources/src/parser/polygonelementparser.cpp
@@ -7,9 +7,9 @@
 #include "parser/documentlocation.h"
 #include "parser/linearringelementparser.h"
 
-#include "citygml/polygon.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
+#include <citygml/polygon.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
 
 #include <mutex>
 #include <stdexcept>
diff --git a/sources/src/parser/sequenceparser.cpp b/sources/src/parser/sequenceparser.cpp
index e732918..b68b1f5 100644
--- a/sources/src/parser/sequenceparser.cpp
+++ b/sources/src/parser/sequenceparser.cpp
@@ -1,6 +1,6 @@
 #include "parser/sequenceparser.h"
 
-#include "citygml/citygmllogger.h"
+#include <citygml/citygmllogger.h>
 #include "parser/documentlocation.h"
 #include "parser/citygmldocumentparser.h"
 
diff --git a/sources/src/parser/textureelementparser.cpp b/sources/src/parser/textureelementparser.cpp
index f1100a6..67861fe 100644
--- a/sources/src/parser/textureelementparser.cpp
+++ b/sources/src/parser/textureelementparser.cpp
@@ -8,12 +8,12 @@
 #include "parser/parserutils.hpp"
 #include "parser/skipelementparser.h"
 
-#include "citygml/cityobject.h"
-#include "citygml/citygmlfactory.h"
-#include "citygml/citygmllogger.h"
-#include "citygml/texture.h"
-#include "citygml/texturetargetdefinition.h"
-#include "citygml/texturecoordinates.h"
+#include <citygml/cityobject.h>
+#include <citygml/citygmlfactory.h>
+#include <citygml/citygmllogger.h>
+#include <citygml/texture.h>
+#include <citygml/texturetargetdefinition.h>
+#include <citygml/texturecoordinates.h>
 
 #include <stdexcept>
 
diff --git a/test/citygmltest.cpp b/test/citygmltest.cpp
index 9ccf60f..0765b20 100644
--- a/test/citygmltest.cpp
+++ b/test/citygmltest.cpp
@@ -113,7 +113,7 @@ int main( int argc, char **argv )
     if ( log )
     {
         std::cout << std::endl << "Objects hierarchy:" << std::endl;
-        const citygml::ConstCityObjects& roots = city->getRootCityObjects();
+//        const citygml::ConstCityObjects& roots = city->getRootCityObjects();
 
 //        for ( unsigned int i = 0; i < roots.size(); i++ ) analyzeObject( roots[ i ], 2 );
     }

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



More information about the Pkg-grass-devel mailing list