diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
index 785714776aba55ace772c3ae027c5abe27e8ff29..3a526472cc669d8af9ebb89613e5b5dc89f7599d 100644
--- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
+++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
@@ -216,7 +216,9 @@ void NodePartitionedMeshReader::readPropertiesBinary(
     std::ifstream is(fname_cfg.c_str(), std::ios::binary | std::ios::in);
     if (!is)
     {
-        WARN("Could not open file '%s' in binary mode.", fname_cfg.c_str());
+        WARN("Could not open file '%s'.\n"
+             "\tYou can ignore this warning if the mesh does not contain %s-"
+             "wise property data.", fname_cfg.c_str(), item_type.data());
         return;
     }
     std::size_t number_of_properties = 0;
@@ -269,7 +271,9 @@ void NodePartitionedMeshReader::readPropertiesBinary(
     is.open(fname_val.c_str(), std::ios::binary | std::ios::in);
     if (!is)
     {
-        ERR("Could not open file '%s' in binary mode.", fname_val.c_str());
+        ERR("Could not open file '%s'\n."
+            "\tYou can ignore this warning if the mesh does not contain %s-"
+             "wise property data.", fname_val.c_str(), item_type.data());
     }
 
     readDomainSpecificPartOfPropertyVectors(vec_pvmd, *pvpmd, t, is, p);
diff --git a/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h b/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h
deleted file mode 100644
index 7a4103b84f10c39b62c5166d32dd5a86a47f1c2a..0000000000000000000000000000000000000000
--- a/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * \copyright
- * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- */
-
-#pragma once
-
-#include <vector>
-
-#include <logog/include/logog.hpp>
-
-#include "NumLib/DOF/LocalToGlobalIndexMap.h"
-
-#include "LocalDataInitializer.h"
-
-namespace ProcessLib
-{
-namespace ThermoMechanics
-{
-namespace detail
-{
-template <unsigned GlobalDim, int DisplacementDim,
-          template <typename, typename, unsigned, int>
-          class LocalAssemblerImplementation,
-          typename LocalAssemblerInterface, typename... ExtraCtorArgs>
-void createLocalAssemblers(
-    NumLib::LocalToGlobalIndexMap const& dof_table,
-    std::vector<MeshLib::Element*> const& mesh_elements,
-    std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
-    ExtraCtorArgs&&... extra_ctor_args)
-{
-    // Shape matrices initializer
-    using LocalDataInitializer =
-        LocalDataInitializer<LocalAssemblerInterface,
-                             LocalAssemblerImplementation, GlobalDim,
-                             DisplacementDim, ExtraCtorArgs...>;
-
-    DBUG("Create local assemblers.");
-    // Populate the vector of local assemblers.
-    local_assemblers.resize(mesh_elements.size());
-
-    LocalDataInitializer initializer(dof_table);
-
-    DBUG("Calling local assembler builder for all mesh elements.");
-    GlobalExecutor::transformDereferenced(
-        initializer, mesh_elements, local_assemblers,
-        std::forward<ExtraCtorArgs>(extra_ctor_args)...);
-}
-
-}  // namespace detail
-
-/*! Creates local assemblers for each element of the given \c mesh.
- *
- * \tparam LocalAssemblerImplementation the individual local assembler type
- * \tparam LocalAssemblerInterface the general local assembler interface
- * \tparam ExtraCtorArgs types of additional constructor arguments.
- *         Those arguments will be passed to the constructor of
- *         \c LocalAssemblerImplementation.
- *
- * The first two template parameters cannot be deduced from the arguments.
- * Therefore they always have to be provided manually.
- */
-template <int DisplacementDim, template <typename, typename, unsigned, int>
-                               class LocalAssemblerImplementation,
-          typename LocalAssemblerInterface, typename... ExtraCtorArgs>
-void createLocalAssemblers(
-    const unsigned dimension,
-    std::vector<MeshLib::Element*> const& mesh_elements,
-    NumLib::LocalToGlobalIndexMap const& dof_table,
-    std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
-    ExtraCtorArgs&&... extra_ctor_args)
-{
-    DBUG("Create local assemblers.");
-
-    switch (dimension)
-    {
-        case 2:
-            detail::createLocalAssemblers<2, DisplacementDim,
-                                          LocalAssemblerImplementation>(
-                dof_table, mesh_elements, local_assemblers,
-                std::forward<ExtraCtorArgs>(extra_ctor_args)...);
-            break;
-        case 3:
-            detail::createLocalAssemblers<3, DisplacementDim,
-                                          LocalAssemblerImplementation>(
-                dof_table, mesh_elements, local_assemblers,
-                std::forward<ExtraCtorArgs>(extra_ctor_args)...);
-            break;
-        default:
-            OGS_FATAL(
-                "Meshes with dimension different than two and three are not "
-                "supported.");
-    }
-}
-}  // ThermoMechanics
-
-}  // ProcessLib
diff --git a/ProcessLib/ThermoMechanics/LocalDataInitializer.h b/ProcessLib/ThermoMechanics/LocalDataInitializer.h
deleted file mode 100644
index 3e766a497563b8d916d11d5476783c9c81628afa..0000000000000000000000000000000000000000
--- a/ProcessLib/ThermoMechanics/LocalDataInitializer.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * \copyright
- * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-#pragma once
-
-#include <functional>
-#include <memory>
-#include <type_traits>
-#include <typeindex>
-#include <typeinfo>
-#include <unordered_map>
-
-#include "MeshLib/Elements/Elements.h"
-#include "NumLib/DOF/LocalToGlobalIndexMap.h"
-#include "NumLib/Fem/Integration/GaussIntegrationPolicy.h"
-
-#ifndef OGS_MAX_ELEMENT_DIM
-static_assert(false, "The macro OGS_MAX_ELEMENT_DIM is undefined.");
-#endif
-
-#ifndef OGS_MAX_ELEMENT_ORDER
-static_assert(false, "The macro OGS_MAX_ELEMENT_ORDER is undefined.");
-#endif
-
-// The following macros decide which element types will be compiled, i.e.
-// which element types will be available for use in simulations.
-
-#ifdef OGS_ENABLE_ELEMENT_SIMPLEX
-#define ENABLED_ELEMENT_TYPE_SIMPLEX 1u
-#else
-#define ENABLED_ELEMENT_TYPE_SIMPLEX 0u
-#endif
-
-#ifdef OGS_ENABLE_ELEMENT_CUBOID
-#define ENABLED_ELEMENT_TYPE_CUBOID 1u << 1
-#else
-#define ENABLED_ELEMENT_TYPE_CUBOID 0u
-#endif
-
-#ifdef OGS_ENABLE_ELEMENT_PRISM
-#define ENABLED_ELEMENT_TYPE_PRISM 1u << 2
-#else
-#define ENABLED_ELEMENT_TYPE_PRISM 0u
-#endif
-
-#ifdef OGS_ENABLE_ELEMENT_PYRAMID
-#define ENABLED_ELEMENT_TYPE_PYRAMID 1u << 3
-#else
-#define ENABLED_ELEMENT_TYPE_PYRAMID 0u
-#endif
-
-// Dependent element types.
-// Faces of tets, pyramids and prisms are triangles
-#define ENABLED_ELEMENT_TYPE_TRI                                       \
-    ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
-     (ENABLED_ELEMENT_TYPE_PRISM))
-// Faces of hexes, pyramids and prisms are quads
-#define ENABLED_ELEMENT_TYPE_QUAD                                     \
-    ((ENABLED_ELEMENT_TYPE_CUBOID) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
-     (ENABLED_ELEMENT_TYPE_PRISM))
-
-// All enabled element types
-#define OGS_ENABLED_ELEMENTS                                          \
-    ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_CUBOID) | \
-     (ENABLED_ELEMENT_TYPE_PYRAMID) | (ENABLED_ELEMENT_TYPE_PRISM))
-
-// Include only what is needed (Well, the conditions are not sharp).
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0
-#include "NumLib/Fem/ShapeFunction/ShapeTet10.h"
-#include "NumLib/Fem/ShapeFunction/ShapeTet4.h"
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0
-#include "NumLib/Fem/ShapeFunction/ShapeTri3.h"
-#include "NumLib/Fem/ShapeFunction/ShapeTri6.h"
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0
-#include "NumLib/Fem/ShapeFunction/ShapeHex20.h"
-#include "NumLib/Fem/ShapeFunction/ShapeHex8.h"
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0
-#include "NumLib/Fem/ShapeFunction/ShapeQuad4.h"
-#include "NumLib/Fem/ShapeFunction/ShapeQuad8.h"
-#include "NumLib/Fem/ShapeFunction/ShapeQuad9.h"
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0
-#include "NumLib/Fem/ShapeFunction/ShapePrism15.h"
-#include "NumLib/Fem/ShapeFunction/ShapePrism6.h"
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0
-#include "NumLib/Fem/ShapeFunction/ShapePyra13.h"
-#include "NumLib/Fem/ShapeFunction/ShapePyra5.h"
-#endif
-
-namespace ProcessLib
-{
-namespace ThermoMechanics
-{
-/// The LocalDataInitializer is a functor creating a local assembler data with
-/// corresponding to the mesh element type shape functions and calling
-/// initialization of the new local assembler data.
-/// For example for MeshLib::Quad a local assembler data with template argument
-/// NumLib::ShapeQuad4 is created.
-template <typename LocalAssemblerInterface,
-          template <typename, typename, unsigned, int> class LocalAssemblerData,
-          unsigned GlobalDim, int DisplacementDim, typename... ConstructorArgs>
-class LocalDataInitializer final
-{
-public:
-    using LADataIntfPtr = std::unique_ptr<LocalAssemblerInterface>;
-
-    explicit LocalDataInitializer(
-        NumLib::LocalToGlobalIndexMap const& dof_table)
-        : _dof_table(dof_table)
-    {
-// /// Quads and Hexahedra ///////////////////////////////////
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Quad))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeQuad4>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Hex))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeHex8>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Quad8))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeQuad8>();
-        _builder[std::type_index(typeid(MeshLib::Quad9))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeQuad9>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Hex20))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeHex20>();
-#endif
-
-// /// Simplices ////////////////////////////////////////////////
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Tri))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeTri3>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Tet))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeTet4>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Tri6))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeTri6>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Tet10))] =
-            makeLocalAssemblerBuilder<NumLib::ShapeTet10>();
-#endif
-
-// /// Prisms ////////////////////////////////////////////////////
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Prism))] =
-            makeLocalAssemblerBuilder<NumLib::ShapePrism6>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Prism15))] =
-            makeLocalAssemblerBuilder<NumLib::ShapePrism15>();
-#endif
-
-// /// Pyramids //////////////////////////////////////////////////
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
-        _builder[std::type_index(typeid(MeshLib::Pyramid))] =
-            makeLocalAssemblerBuilder<NumLib::ShapePyra5>();
-#endif
-
-#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
-    OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
-        _builder[std::type_index(typeid(MeshLib::Pyramid13))] =
-            makeLocalAssemblerBuilder<NumLib::ShapePyra13>();
-#endif
-    }
-
-    /// Sets the provided \c data_ptr to the newly created local assembler data.
-    ///
-    /// \attention
-    /// The index \c id is not necessarily the mesh item's id. Especially when
-    /// having multiple meshes it will differ from the latter.
-    void operator()(std::size_t const id,
-                    MeshLib::Element const& mesh_item,
-                    LADataIntfPtr& data_ptr,
-                    ConstructorArgs&&... args) const
-    {
-        auto const type_idx = std::type_index(typeid(mesh_item));
-        auto const it = _builder.find(type_idx);
-
-        if (it != _builder.end())
-        {
-            auto const num_local_dof = _dof_table.getNumberOfElementDOF(id);
-            data_ptr = it->second(mesh_item, num_local_dof,
-                                  std::forward<ConstructorArgs>(args)...);
-        }
-        else
-        {
-            OGS_FATAL(
-                "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
-                " Maybe you have disabled this mesh element type in your build "
-                "configuration or this process requires higher order elements.",
-                type_idx.name());
-        }
-    }
-
-private:
-    using LADataBuilder =
-        std::function<LADataIntfPtr(MeshLib::Element const& e,
-                                    std::size_t const local_matrix_size,
-                                    ConstructorArgs&&...)>;
-
-    template <typename ShapeFunction>
-    using IntegrationMethod = typename NumLib::GaussIntegrationPolicy<
-        typename ShapeFunction::MeshElement>::IntegrationMethod;
-
-    template <typename ShapeFunction>
-    using LAData =
-        LocalAssemblerData<ShapeFunction, IntegrationMethod<ShapeFunction>,
-                           GlobalDim, DisplacementDim>;
-
-    /// A helper forwarding to the correct version of makeLocalAssemblerBuilder
-    /// depending whether the global dimension is less than the shape function's
-    /// dimension or not.
-    template <typename ShapeFunction>
-    static LADataBuilder makeLocalAssemblerBuilder()
-    {
-        return makeLocalAssemblerBuilder<ShapeFunction>(
-            static_cast<std::integral_constant<
-                bool, (GlobalDim >= ShapeFunction::DIM)>*>(nullptr));
-    }
-
-    /// Mapping of element types to local assembler constructors.
-    std::unordered_map<std::type_index, LADataBuilder> _builder;
-
-    NumLib::LocalToGlobalIndexMap const& _dof_table;
-
-    // local assembler builder implementations.
-private:
-    /// Generates a function that creates a new LocalAssembler of type
-    /// LAData<ShapeFunction>. Only functions with shape function's dimension
-    /// less or equal to the global dimension are instantiated, e.g.  following
-    /// combinations of shape functions and global dimensions: (Line2, 1),
-    /// (Line2, 2), (Line2, 3), (Hex20, 3) but not (Hex20, 2) or (Hex20, 1).
-    template <typename ShapeFunction>
-    static LADataBuilder makeLocalAssemblerBuilder(std::true_type*)
-    {
-        return [](MeshLib::Element const& e,
-                  std::size_t const local_matrix_size,
-                  ConstructorArgs&&... args) {
-            return LADataIntfPtr{new LAData<ShapeFunction>{
-                e, local_matrix_size, std::forward<ConstructorArgs>(args)...}};
-        };
-    }
-
-    /// Returns nullptr for shape functions whose dimensions are less than the
-    /// global dimension.
-    template <typename ShapeFunction>
-    static LADataBuilder makeLocalAssemblerBuilder(std::false_type*)
-    {
-        return nullptr;
-    }
-};
-
-}  // namespace ThermoMechanics
-}  // namespace ProcessLib
-
-#undef ENABLED_ELEMENT_TYPE_SIMPLEX
-#undef ENABLED_ELEMENT_TYPE_CUBOID
-#undef ENABLED_ELEMENT_TYPE_PYRAMID
-#undef ENABLED_ELEMENT_TYPE_PRISM
-#undef ENABLED_ELEMENT_TYPE_TRI
-#undef ENABLED_ELEMENT_TYPE_QUAD
-#undef OGS_ENABLED_ELEMENTS
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
index abf3837395987b822a3b4d29bd01602b80bfec83..b2cf8df0b0303c6853939d39738aafb899383f90 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
@@ -13,7 +13,7 @@
 
 #include "NumLib/DOF/DOFTableUtil.h"
 #include "ProcessLib/Process.h"
-#include "ProcessLib/ThermoMechanics/CreateLocalAssemblers.h"
+#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h"
 
 #include "ThermoMechanicsFEM.h"
 #include "ThermoMechanicsProcessData.h"
@@ -61,11 +61,10 @@ private:
         MeshLib::Mesh const& mesh,
         unsigned const integration_order) override
     {
-        ProcessLib::ThermoMechanics::createLocalAssemblers<DisplacementDim,
-                                                           LocalAssemblerData>(
-            mesh.getDimension(), mesh.getElements(), dof_table,
-            _local_assemblers, mesh.isAxiallySymmetric(), integration_order,
-            _process_data);
+        ProcessLib::SmallDeformation::createLocalAssemblers<
+        DisplacementDim, ThermoMechanicsLocalAssembler>(
+        mesh.getElements(), dof_table, _local_assemblers,
+        mesh.isAxiallySymmetric(), integration_order, _process_data);
 
         // TODO move the two data members somewhere else.
         // for extrapolation of secondary variables