diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt
index 6de9f7ae0..ec2bf57d0 100644
--- a/xs/CMakeLists.txt
+++ b/xs/CMakeLists.txt
@@ -19,96 +19,178 @@ endif ()
 
 add_library(libslic3r STATIC
     ${LIBDIR}/libslic3r/BoundingBox.cpp
+    ${LIBDIR}/libslic3r/BoundingBox.hpp
     ${LIBDIR}/libslic3r/BridgeDetector.cpp
+    ${LIBDIR}/libslic3r/BridgeDetector.hpp
     ${LIBDIR}/libslic3r/ClipperUtils.cpp
+    ${LIBDIR}/libslic3r/ClipperUtils.hpp
     ${LIBDIR}/libslic3r/Config.cpp
+    ${LIBDIR}/libslic3r/Config.hpp
     ${LIBDIR}/libslic3r/EdgeGrid.cpp
+    ${LIBDIR}/libslic3r/EdgeGrid.hpp
     ${LIBDIR}/libslic3r/ExPolygon.cpp
+    ${LIBDIR}/libslic3r/ExPolygon.hpp
     ${LIBDIR}/libslic3r/ExPolygonCollection.cpp
+    ${LIBDIR}/libslic3r/ExPolygonCollection.hpp
     ${LIBDIR}/libslic3r/Extruder.cpp
+    ${LIBDIR}/libslic3r/Extruder.hpp
     ${LIBDIR}/libslic3r/ExtrusionEntity.cpp
+    ${LIBDIR}/libslic3r/ExtrusionEntity.hpp
     ${LIBDIR}/libslic3r/ExtrusionEntityCollection.cpp
+    ${LIBDIR}/libslic3r/ExtrusionEntityCollection.hpp
     ${LIBDIR}/libslic3r/ExtrusionSimulator.cpp
+    ${LIBDIR}/libslic3r/ExtrusionSimulator.hpp
     ${LIBDIR}/libslic3r/Fill/Fill.cpp
+    ${LIBDIR}/libslic3r/Fill/Fill.hpp
     ${LIBDIR}/libslic3r/Fill/Fill3DHoneycomb.cpp
+    ${LIBDIR}/libslic3r/Fill/Fill3DHoneycomb.hpp
     ${LIBDIR}/libslic3r/Fill/FillBase.cpp
+    ${LIBDIR}/libslic3r/Fill/FillBase.hpp
     ${LIBDIR}/libslic3r/Fill/FillConcentric.cpp
+    ${LIBDIR}/libslic3r/Fill/FillConcentric.hpp
     ${LIBDIR}/libslic3r/Fill/FillHoneycomb.cpp
+    ${LIBDIR}/libslic3r/Fill/FillHoneycomb.hpp
     ${LIBDIR}/libslic3r/Fill/FillPlanePath.cpp
+    ${LIBDIR}/libslic3r/Fill/FillPlanePath.hpp
     ${LIBDIR}/libslic3r/Fill/FillRectilinear.cpp
+    ${LIBDIR}/libslic3r/Fill/FillRectilinear.hpp
     ${LIBDIR}/libslic3r/Fill/FillRectilinear2.cpp
+    ${LIBDIR}/libslic3r/Fill/FillRectilinear2.hpp
     ${LIBDIR}/libslic3r/Fill/FillRectilinear3.cpp
+    ${LIBDIR}/libslic3r/Fill/FillRectilinear3.hpp
     ${LIBDIR}/libslic3r/Flow.cpp
+    ${LIBDIR}/libslic3r/Flow.hpp
     ${LIBDIR}/libslic3r/Format/AMF.cpp
+    ${LIBDIR}/libslic3r/Format/AMF.hpp
     ${LIBDIR}/libslic3r/Format/OBJ.cpp
+    ${LIBDIR}/libslic3r/Format/OBJ.hpp
     ${LIBDIR}/libslic3r/Format/objparser.cpp
+    ${LIBDIR}/libslic3r/Format/objparser.hpp
     ${LIBDIR}/libslic3r/Format/PRUS.cpp
+    ${LIBDIR}/libslic3r/Format/PRUS.hpp
     ${LIBDIR}/libslic3r/Format/STL.cpp
-    ${LIBDIR}/libslic3r/GCode.cpp
+    ${LIBDIR}/libslic3r/Format/STL.hpp
     ${LIBDIR}/libslic3r/GCode/Analyzer.cpp
+    ${LIBDIR}/libslic3r/GCode/Analyzer.hpp
     ${LIBDIR}/libslic3r/GCode/CoolingBuffer.cpp
+    ${LIBDIR}/libslic3r/GCode/CoolingBuffer.hpp
     ${LIBDIR}/libslic3r/GCode/PressureEqualizer.cpp
+    ${LIBDIR}/libslic3r/GCode/PressureEqualizer.hpp
     ${LIBDIR}/libslic3r/GCode/SpiralVase.cpp
+    ${LIBDIR}/libslic3r/GCode/SpiralVase.hpp
     ${LIBDIR}/libslic3r/GCode/ToolOrdering.cpp
+    ${LIBDIR}/libslic3r/GCode/ToolOrdering.hpp
+    ${LIBDIR}/libslic3r/GCode/WipeTower.hpp
     ${LIBDIR}/libslic3r/GCode/WipeTowerPrusaMM.cpp
+    ${LIBDIR}/libslic3r/GCode/WipeTowerPrusaMM.hpp
+    ${LIBDIR}/libslic3r/GCode.cpp
+    ${LIBDIR}/libslic3r/GCode.hpp
     ${LIBDIR}/libslic3r/GCodeReader.cpp
+    ${LIBDIR}/libslic3r/GCodeReader.hpp
     ${LIBDIR}/libslic3r/GCodeSender.cpp
+    ${LIBDIR}/libslic3r/GCodeSender.hpp
     ${LIBDIR}/libslic3r/GCodeTimeEstimator.cpp
+    ${LIBDIR}/libslic3r/GCodeTimeEstimator.hpp
     ${LIBDIR}/libslic3r/GCodeWriter.cpp
+    ${LIBDIR}/libslic3r/GCodeWriter.hpp
     ${LIBDIR}/libslic3r/Geometry.cpp
+    ${LIBDIR}/libslic3r/Geometry.hpp
+    ${LIBDIR}/libslic3r/Int128.hpp
+#    ${LIBDIR}/libslic3r/KdTree.hpp
     ${LIBDIR}/libslic3r/Layer.cpp
+    ${LIBDIR}/libslic3r/Layer.hpp
     ${LIBDIR}/libslic3r/LayerRegion.cpp
+    ${LIBDIR}/libslic3r/libslic3r.h
     ${LIBDIR}/libslic3r/Line.cpp
+    ${LIBDIR}/libslic3r/Line.hpp
     ${LIBDIR}/libslic3r/Model.cpp
+    ${LIBDIR}/libslic3r/Model.hpp
     ${LIBDIR}/libslic3r/MotionPlanner.cpp
+    ${LIBDIR}/libslic3r/MotionPlanner.hpp
     ${LIBDIR}/libslic3r/MultiPoint.cpp
+    ${LIBDIR}/libslic3r/MultiPoint.hpp
+    ${LIBDIR}/libslic3r/MutablePriorityQueue.hpp
     ${LIBDIR}/libslic3r/PerimeterGenerator.cpp
+    ${LIBDIR}/libslic3r/PerimeterGenerator.hpp
     ${LIBDIR}/libslic3r/PlaceholderParser.cpp
+    ${LIBDIR}/libslic3r/PlaceholderParser.hpp
     ${LIBDIR}/libslic3r/Point.cpp
+    ${LIBDIR}/libslic3r/Point.hpp
     ${LIBDIR}/libslic3r/Polygon.cpp
+    ${LIBDIR}/libslic3r/Polygon.hpp
     ${LIBDIR}/libslic3r/Polyline.cpp
+    ${LIBDIR}/libslic3r/Polyline.hpp
     ${LIBDIR}/libslic3r/PolylineCollection.cpp
+    ${LIBDIR}/libslic3r/PolylineCollection.hpp
     ${LIBDIR}/libslic3r/Print.cpp
+    ${LIBDIR}/libslic3r/Print.hpp
     ${LIBDIR}/libslic3r/PrintConfig.cpp
+    ${LIBDIR}/libslic3r/PrintConfig.hpp
     ${LIBDIR}/libslic3r/PrintObject.cpp
     ${LIBDIR}/libslic3r/PrintRegion.cpp
     ${LIBDIR}/libslic3r/Slicing.cpp
+    ${LIBDIR}/libslic3r/Slicing.hpp
     ${LIBDIR}/libslic3r/SlicingAdaptive.cpp
+    ${LIBDIR}/libslic3r/SlicingAdaptive.hpp
     ${LIBDIR}/libslic3r/SupportMaterial.cpp
+    ${LIBDIR}/libslic3r/SupportMaterial.hpp
     ${LIBDIR}/libslic3r/Surface.cpp
+    ${LIBDIR}/libslic3r/Surface.hpp
     ${LIBDIR}/libslic3r/SurfaceCollection.cpp
+    ${LIBDIR}/libslic3r/SurfaceCollection.hpp
     ${LIBDIR}/libslic3r/SVG.cpp
+    ${LIBDIR}/libslic3r/SVG.hpp
     ${LIBDIR}/libslic3r/TriangleMesh.cpp
+    ${LIBDIR}/libslic3r/TriangleMesh.hpp
+#    ${LIBDIR}/libslic3r/utils.cpp
+    ${LIBDIR}/libslic3r/Utils.hpp
 )
 
 add_library(libslic3r_gui STATIC
     ${LIBDIR}/slic3r/GUI/3DScene.cpp
+    ${LIBDIR}/slic3r/GUI/3DScene.hpp
     ${LIBDIR}/slic3r/GUI/GLShader.cpp
+    ${LIBDIR}/slic3r/GUI/GLShader.hpp
     ${LIBDIR}/slic3r/GUI/GUI.cpp
+    ${LIBDIR}/slic3r/GUI/GUI.hpp
 )
 
 add_library(admesh STATIC
     ${LIBDIR}/admesh/connect.cpp
     ${LIBDIR}/admesh/normals.cpp
     ${LIBDIR}/admesh/shared.cpp
+    ${LIBDIR}/admesh/stl.h
     ${LIBDIR}/admesh/stl_io.cpp
     ${LIBDIR}/admesh/stlinit.cpp
     ${LIBDIR}/admesh/util.cpp
 )
 
-add_library(clipper STATIC ${LIBDIR}/clipper.cpp)
+add_library(clipper STATIC 
+    ${LIBDIR}/clipper.cpp
+    ${LIBDIR}/clipper.hpp
+)
 
-add_library(polypartition STATIC ${LIBDIR}/polypartition.cpp)
+add_library(polypartition STATIC 
+    ${LIBDIR}/polypartition.cpp
+    ${LIBDIR}/polypartition.h
+)
 
 add_library(poly2tri STATIC
     ${LIBDIR}/poly2tri/common/shapes.cc
+    ${LIBDIR}/poly2tri/common/shapes.h
+    ${LIBDIR}/poly2tri/common/utils.h
+    ${LIBDIR}/poly2tri/poly2tri.h
     ${LIBDIR}/poly2tri/sweep/advancing_front.cc
+    ${LIBDIR}/poly2tri/sweep/advancing_front.h
     ${LIBDIR}/poly2tri/sweep/cdt.cc
-    ${LIBDIR}/poly2tri/sweep/sweep_context.cc
+    ${LIBDIR}/poly2tri/sweep/cdt.h
     ${LIBDIR}/poly2tri/sweep/sweep.cc
+    ${LIBDIR}/poly2tri/sweep/sweep.h
+    ${LIBDIR}/poly2tri/sweep/sweep_context.cc
+    ${LIBDIR}/poly2tri/sweep/sweep_context.h
 )
 
-add_library(nowide STATIC 
+add_library(nowide STATIC
     ${LIBDIR}/boost/nowide/args.hpp
     ${LIBDIR}/boost/nowide/cenv.hpp
     ${LIBDIR}/boost/nowide/config.hpp
@@ -127,13 +209,26 @@ add_library(nowide STATIC
 )
 
 add_library(Shiny STATIC
+    ${LIBDIR}/Shiny/Shiny.h
+    ${LIBDIR}/Shiny/ShinyConfig.h
+    ${LIBDIR}/Shiny/ShinyData.h
+    ${LIBDIR}/Shiny/ShinyMacros.h
     ${LIBDIR}/Shiny/ShinyManager.c
+    ${LIBDIR}/Shiny/ShinyManager.h
     ${LIBDIR}/Shiny/ShinyNode.c
+    ${LIBDIR}/Shiny/ShinyNode.h
     ${LIBDIR}/Shiny/ShinyNodePool.c
+    ${LIBDIR}/Shiny/ShinyNodePool.h
     ${LIBDIR}/Shiny/ShinyNodeState.c
+    ${LIBDIR}/Shiny/ShinyNodeState.h
     ${LIBDIR}/Shiny/ShinyOutput.c
+    ${LIBDIR}/Shiny/ShinyOutput.h
+    ${LIBDIR}/Shiny/ShinyPrereqs.h
     ${LIBDIR}/Shiny/ShinyTools.c
+    ${LIBDIR}/Shiny/ShinyTools.h
+    ${LIBDIR}/Shiny/ShinyVersion.h
     ${LIBDIR}/Shiny/ShinyZone.c
+    ${LIBDIR}/Shiny/ShinyZone.h
 )
 
 # Generate the Slic3r Perl module (XS) typemap file.
@@ -150,7 +245,7 @@ add_custom_command(
 # Generate the Slic3r Perl module (XS) main.xs file.
 set(XS_MAIN_XS ${CMAKE_CURRENT_BINARY_DIR}/main.xs)
 #FIXME list the dependecies explicitely, add dependency on the typemap.
-file(GLOB XS_XSP_FILES 
+file(GLOB XS_XSP_FILES
     ${LIBDIR}/xsp/BoundingBox.xsp
     ${LIBDIR}/xsp/BridgeDetector.xsp
     ${LIBDIR}/xsp/Clipper.xsp
@@ -205,7 +300,7 @@ add_custom_command(
 )
 
 # Define the Perl XS shared library.
-add_library(XS SHARED 
+add_library(XS SHARED
     ${XS_MAIN_CPP}
     ${LIBDIR}/perlglue.cpp
     ${LIBDIR}/libslic3r/utils.cpp