diff --git a/CMakeLists.txt b/CMakeLists.txt
index 72360855b282dc21465f605b90ede511482ef590..c016eeb712842fff3282f12a6dc553d2d185279f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,57 +49,44 @@ get_filename_component(BUILD_DIR_NAME ${CMAKE_BINARY_DIR} NAME)
 FetchContent_Declare(
     Tadah.MODELS
     GIT_REPOSITORY https://git.ecdf.ed.ac.uk/tadah/models.git
-    GIT_TAG origin/main
-    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../MODELS
-    PATCH_COMMAND  mkdir -p ${BUILD_DIR_NAME}
-    BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../MODELS/${BUILD_DIR_NAME}
+    GIT_TAG origin/develop
+    #SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../MODELS
+    #PATCH_COMMAND  mkdir -p ${BUILD_DIR_NAME}
+    #BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../MODELS/${BUILD_DIR_NAME}
     )
 
 FetchContent_MakeAvailable(Tadah.MODELS)
 
-file(GLOB MLIP_SRC CONFIGURE_DEPENDS "*.cpp" "*.h" "*.hpp")
-file(GLOB_RECURSE ANALYTICS_SRC CONFIGURE_DEPENDS 
-    "analytics/*.cpp" "analytics/*.h" "analytics/*.hpp")
-file(GLOB_RECURSE DESIGN_MATRIX_SRC CONFIGURE_DEPENDS 
-    "design_matrix/*.cpp" "design_matrix/*.h" "design_matrix/*.hpp")
-file(GLOB_RECURSE MODELS_SRC CONFIGURE_DEPENDS 
-    "models/*.cpp" "models/*.h" "models/*.hpp")
-file(GLOB_RECURSE OUTPUT_SRC CONFIGURE_DEPENDS 
-    "output/*.cpp" "output/*.h" "output/*.hpp")
-#file(GLOB_RECURSE UTILS_SRC CONFIGURE_DEPENDS "utils/*.cpp")
-
-add_library(tadah.mlip.obj OBJECT
-    ${MLIP_SRC}
-    ${ANALYTICS_SRC}
-    ${DESIGN_MATRIX_SRC}
-    ${MODELS_SRC}
-    ${OUTPUT_SRC}
-    )
-
-target_link_libraries(tadah.mlip.obj PRIVATE config::rc)
+file(GLOB MLIP_SRC CONFIGURE_DEPENDS "src/*.cpp")
+add_library(tadah.mlip ${MLIP_SRC})
+target_link_libraries(tadah.mlip PRIVATE config::rc)
+target_link_libraries(tadah.mlip PUBLIC Tadah.MODELS)
+target_include_directories(tadah.mlip PUBLIC include)
+target_include_directories(tadah.mlip PUBLIC ${Tadah.MODELS_SOURCE_DIR}/include)
+target_include_directories(tadah.mlip PUBLIC ${Tadah.CORE_SOURCE_DIR}/include)
+target_include_directories(tadah.mlip PUBLIC ${Tadah.CORE_SOURCE_DIR}/external/toml11)
 
 if(TADAH_ENABLE_OPENMP)
     find_package(OpenMP REQUIRED)
-    target_link_libraries(tadah.mlip.obj PUBLIC OpenMP::OpenMP_CXX)
+    target_link_libraries(tadah.mlip PUBLIC OpenMP::OpenMP_CXX)
 endif()
 
 if (TADAH_BUILD_MPI)
     find_package(MPI REQUIRED)
-    target_link_libraries(tadah.mlip.obj PUBLIC MPI::MPI_CXX)
+    target_link_libraries(tadah.mlip PUBLIC MPI::MPI_CXX)
     add_compile_definitions(TADAH_BUILD_MPI)
 endif()
 
-add_library(tadah.mlip $<TARGET_OBJECTS:tadah.mlip.obj>)
 
 if(TADAH_BUILD_TESTS)
     include(CTest) 
     add_subdirectory(tests)
 endif()
 
-set(TADAH_MLIP_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/tadah/MLIP)
-file(GLOB MLIP_H CONFIGURE_DEPENDS "*.h" "*.hpp")
-install(FILES ${MLIP_H} DESTINATION ${TADAH_MLIP_INSTALL_DIR})
-install(DIRECTORY analytics DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
-install(DIRECTORY design_matrix DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
-install(DIRECTORY models DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
-install(DIRECTORY output DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
+#set(TADAH_MLIP_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/tadah/MLIP)
+#file(GLOB MLIP_H CONFIGURE_DEPENDS "*.h" "*.hpp")
+#install(FILES ${MLIP_H} DESTINATION ${TADAH_MLIP_INSTALL_DIR})
+#install(DIRECTORY analytics DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
+#install(DIRECTORY design_matrix DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
+#install(DIRECTORY models DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
+#install(DIRECTORY output DESTINATION ${TADAH_MLIP_INSTALL_DIR} FILES_MATCHING REGEX "(.+.h|.+.hpp)")
diff --git a/design_matrix/functions/basis_functions/dm_bf_all.h b/design_matrix/functions/basis_functions/dm_bf_all.h
deleted file mode 100644
index b985440ba45ce69cce950fa582b02c44c4782467..0000000000000000000000000000000000000000
--- a/design_matrix/functions/basis_functions/dm_bf_all.h
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "dm_bf_linear.h"
-#include "dm_bf_polynomial2.h"
diff --git a/design_matrix/functions/basis_functions/dm_bf_base.cpp b/design_matrix/functions/basis_functions/dm_bf_base.cpp
deleted file mode 100644
index 4ed6543ac99c63a86b17182007b0fe7acd69f72c..0000000000000000000000000000000000000000
--- a/design_matrix/functions/basis_functions/dm_bf_base.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "dm_bf_base.h"
-DM_BF_Base::~DM_BF_Base() {}
diff --git a/design_matrix/functions/dm_f_all.h b/design_matrix/functions/dm_f_all.h
deleted file mode 100644
index 38a31839eb25cbcb666bc7021d3f510f4604e4fc..0000000000000000000000000000000000000000
--- a/design_matrix/functions/dm_f_all.h
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "basis_functions/dm_bf_all.h"
-#include "kernels/dm_kern_all.h"
diff --git a/design_matrix/functions/dm_function_base.cpp b/design_matrix/functions/dm_function_base.cpp
deleted file mode 100644
index 6db860efa0127540bf7b21801c09c9d2b2760dfc..0000000000000000000000000000000000000000
--- a/design_matrix/functions/dm_function_base.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "dm_function_base.h"
-
diff --git a/design_matrix/functions/kernels/dm_kern_all.h b/design_matrix/functions/kernels/dm_kern_all.h
deleted file mode 100644
index 0f050e617da6c0f2790656d3c4aa74519a2fd603..0000000000000000000000000000000000000000
--- a/design_matrix/functions/kernels/dm_kern_all.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "dm_kern_base.h"
-#include "dm_kern_linear.h"
-#include "dm_kern_rbf.h"
-#include "dm_kern_lq.h"
-#include "dm_kern_polynomial.h"
-#include "dm_kern_sigmoid.h"
-#include "dm_kern_quadratic.h"
diff --git a/analytics/analytics.h b/include/tadah/mlip/analytics/analytics.h
similarity index 95%
rename from analytics/analytics.h
rename to include/tadah/mlip/analytics/analytics.h
index d813c33aa0d54d0e577eaf173c035a2165645692..4a7dc4a48fda2d8c790cccdb82b7792d75f89575 100644
--- a/analytics/analytics.h
+++ b/include/tadah/mlip/analytics/analytics.h
@@ -1,8 +1,8 @@
 #ifndef ANALYTICS_H
 #define ANALYTICS_H
 
-#include "../structure_db.h"
-#include "../../CORE/core_types.h"
+#include <tadah/mlip/structure_db.h>
+#include <tadah/core/core_types.h>
 
 
 /** Class for analysing and comparing datasets
diff --git a/analytics/statistics.h b/include/tadah/mlip/analytics/statistics.h
similarity index 94%
rename from analytics/statistics.h
rename to include/tadah/mlip/analytics/statistics.h
index 8c0245e8d8e7b966176ac33a7af2c0353e191e6f..0d86664a567fea6a3f8bfd72632de0b7ac978e86 100644
--- a/analytics/statistics.h
+++ b/include/tadah/mlip/analytics/statistics.h
@@ -1,7 +1,7 @@
 #ifndef STATISTICS_H
 #define STATISTICS_H
 
-#include "../../CORE/core_types.h"
+#include <tadah/core/core_types.h>
 
 /** Some basis statistical tools */
 class Statistics {
diff --git a/atom.h b/include/tadah/mlip/atom.h
similarity index 96%
rename from atom.h
rename to include/tadah/mlip/atom.h
index dfef91a950b1c3d708223e969250cf2af446cb6e..4a6fd8719b89b28972b40c39a87fef831f1e2e56 100644
--- a/atom.h
+++ b/include/tadah/mlip/atom.h
@@ -1,10 +1,11 @@
 #ifndef ATOM_H
 #define ATOM_H
 
+#include <tadah/core/element.h>
+#include <tadah/core/core_types.h>
+
 #include <string>
 #include <iostream>
-#include "../CORE/element.h"
-#include "../CORE/core_types.h"
 
 /**
  * Container to represent atom properties
diff --git a/descriptors_calc.h b/include/tadah/mlip/descriptors_calc.h
similarity index 90%
rename from descriptors_calc.h
rename to include/tadah/mlip/descriptors_calc.h
index 06e82c7806a85b7c2fd4ebdd87925f5fbcb8bc17..640a86227922792c57250fd16ad40fe1242b0d81 100644
--- a/descriptors_calc.h
+++ b/include/tadah/mlip/descriptors_calc.h
@@ -1,16 +1,16 @@
 #ifndef DESCRIPTORS_CALC_H
 #define DESCRIPTORS_CALC_H
 
-#include "descriptors_calc_base.h"
-#include "../CORE/config/config.h"
-#include "structure.h"
-#include "structure_db.h"
-#include "st_descriptors.h"
-#include "st_descriptors_db.h"
-#include "../MODELS/descriptors/d2/d2_base.h"
-#include "../MODELS/descriptors/d3/d3_base.h"
-#include "../MODELS/descriptors/dm/dm_base.h"
-#include "../MODELS/cutoffs/cutoffs.h"
+#include <tadah/mlip/descriptors_calc_base.h>
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/structure_db.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/mlip/st_descriptors_db.h>
+#include <tadah/core/config.h>
+#include <tadah/models/descriptors/d2/d2_base.h>
+#include <tadah/models/descriptors/d3/d3_base.h>
+#include <tadah/models/descriptors/dm/dm_base.h>
+#include <tadah/models/cutoffs.h>
 
 /** \brief Descriptors calculator
  *
diff --git a/descriptors_calc.hpp b/include/tadah/mlip/descriptors_calc.hpp
similarity index 99%
rename from descriptors_calc.hpp
rename to include/tadah/mlip/descriptors_calc.hpp
index 5d5cdfe3a6bae08c35b2092eaabb8dc5ac361f5c..5afb987346586758255464ae46bfac7c422f7e77 100644
--- a/descriptors_calc.hpp
+++ b/include/tadah/mlip/descriptors_calc.hpp
@@ -4,7 +4,7 @@
 // This file is includeed back to descriptors_calc.h
 // So There is no need to include headers
 // Useful for debugging though...
-#include "descriptors_calc.h"
+#include <tadah/mlip/descriptors_calc.h>
 
 #include <cstdio>
 template <typename D2, typename D3, typename DM, typename C2, typename C3, typename CM>
diff --git a/descriptors_calc_base.h b/include/tadah/mlip/descriptors_calc_base.h
similarity index 64%
rename from descriptors_calc_base.h
rename to include/tadah/mlip/descriptors_calc_base.h
index 0d5d9db978b09e8ebc3cb9e27193e39028b5f65d..a56c26f328d261161e21688d844aad0e68c90ddf 100644
--- a/descriptors_calc_base.h
+++ b/include/tadah/mlip/descriptors_calc_base.h
@@ -1,10 +1,10 @@
 #ifndef DC_Base_H
 #define DC_Base_H
 
-#include "structure.h"
-#include "structure_db.h"
-#include "st_descriptors.h"
-#include "st_descriptors_db.h"
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/structure_db.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/mlip/st_descriptors_db.h>
 
 class DC_Base {
     public:
diff --git a/design_matrix/design_matrix.h b/include/tadah/mlip/design_matrix/design_matrix.h
similarity index 97%
rename from design_matrix/design_matrix.h
rename to include/tadah/mlip/design_matrix/design_matrix.h
index 5c08a9af654e1d989c00c642c8cceff2d6032725..3f87b5fec3bb6b1188e33da264b93ab0af37c2d2 100644
--- a/design_matrix/design_matrix.h
+++ b/include/tadah/mlip/design_matrix/design_matrix.h
@@ -1,12 +1,13 @@
 #ifndef DESIGN_MATRIX_H
 #define DESIGN_MATRIX_H
 
+#include <tadah/mlip/st_descriptors_db.h>
+#include <tadah/mlip/structure_db.h>
+#include <tadah/mlip/descriptors_calc.h>
+#include <tadah/mlip/normaliser.h>
+#include <tadah/core/config.h>
+
 #include <stdexcept>
-#include "../../CORE/config/config.h"
-#include "../st_descriptors_db.h"
-#include "../structure_db.h"
-#include "../descriptors_calc.h"
-#include "../normaliser.h"
 
 
 class DesignMatrixBase {
diff --git a/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_all.h b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_all.h
new file mode 100644
index 0000000000000000000000000000000000000000..48179cf65d71ab9692485bdc246206e5417910b1
--- /dev/null
+++ b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_all.h
@@ -0,0 +1,2 @@
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_linear.h>
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_polynomial2.h>
diff --git a/design_matrix/functions/basis_functions/dm_bf_base.h b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h
similarity index 74%
rename from design_matrix/functions/basis_functions/dm_bf_base.h
rename to include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h
index 2ef9da16b71d0a5b3445b4905f89da6ea5764a04..98b1c37b7dee207fb9a0c545336f773609d3470c 100644
--- a/design_matrix/functions/basis_functions/dm_bf_base.h
+++ b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h
@@ -1,12 +1,13 @@
 #ifndef DM_BASIS_FUNCTIONS_H
 #define DM_BASIS_FUNCTIONS_H
 
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/core/core_types.h>
+#include <tadah/models/functions/basis_functions/bf_base.h>
+
 #include <iostream>
-#include "../dm_function_base.h"
-#include "../../../../CORE/core_types.h"
-#include "../../../../MODELS/functions/basis_functions/bf_base.h"
-#include "../../../structure.h"
-#include "../../../st_descriptors.h"
 
 struct DM_BF_Base: public DM_Function_Base, public virtual BF_Base {
     virtual ~DM_BF_Base();
diff --git a/design_matrix/functions/basis_functions/dm_bf_linear.h b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_linear.h
similarity index 82%
rename from design_matrix/functions/basis_functions/dm_bf_linear.h
rename to include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_linear.h
index 36b7813e8eed54323d0391313bb5434f289db4e6..107ac2626401144ccf912759e2042b7f44b43f7e 100644
--- a/design_matrix/functions/basis_functions/dm_bf_linear.h
+++ b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_linear.h
@@ -1,8 +1,8 @@
 #ifndef DM_BF_LINEAR_H
 #define DM_BF_LINEAR_H
 
-#include "dm_bf_base.h"
-#include "../../../../MODELS/functions/basis_functions/bf_linear.h"
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h>
+#include <tadah/models/functions/basis_functions/bf_linear.h>
 
 struct DM_BF_Linear: public DM_BF_Base, public BF_Linear
 {
diff --git a/design_matrix/functions/basis_functions/dm_bf_polynomial2.h b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_polynomial2.h
similarity index 82%
rename from design_matrix/functions/basis_functions/dm_bf_polynomial2.h
rename to include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_polynomial2.h
index ff8f6342ce207148f4c428520703f4f33cc555a0..b0ce41382901c53e23fc9f5d4ced860c0c2599d0 100644
--- a/design_matrix/functions/basis_functions/dm_bf_polynomial2.h
+++ b/include/tadah/mlip/design_matrix/functions/basis_functions/dm_bf_polynomial2.h
@@ -1,7 +1,8 @@
 #ifndef DM_BF_POLYNOMIAL2_H
 #define DM_BF_POLYNOMIAL2_H
-#include "dm_bf_base.h"
-#include "../../../../MODELS/functions/basis_functions/bf_polynomial2.h"
+
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h>
+#include <tadah/models/functions/basis_functions/bf_polynomial2.h>
 
 struct DM_BF_Polynomial2: public DM_BF_Base, public BF_Polynomial2
 {
diff --git a/include/tadah/mlip/design_matrix/functions/dm_f_all.h b/include/tadah/mlip/design_matrix/functions/dm_f_all.h
new file mode 100644
index 0000000000000000000000000000000000000000..201905ab6ced5873fb618ea606034c7c2e5065cc
--- /dev/null
+++ b/include/tadah/mlip/design_matrix/functions/dm_f_all.h
@@ -0,0 +1,2 @@
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_all.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_all.h>
diff --git a/design_matrix/functions/dm_function_base.h b/include/tadah/mlip/design_matrix/functions/dm_function_base.h
similarity index 81%
rename from design_matrix/functions/dm_function_base.h
rename to include/tadah/mlip/design_matrix/functions/dm_function_base.h
index 1838f8661ce71773442764f2ab7d7d83ea679886..6b7b5a9afc5c305d943b2dc57e276da8d70b73e7 100644
--- a/design_matrix/functions/dm_function_base.h
+++ b/include/tadah/mlip/design_matrix/functions/dm_function_base.h
@@ -1,12 +1,12 @@
 #ifndef DM_FUNCTION_H
 #define DM_FUNCTION_H
 
-#include "../../../CORE/config/config.h"
-#include "../../../CORE/registry.h"
-#include "../../../CORE/core_types.h"
-#include "../../../MODELS/functions/function_base.h"
-#include "../../structure.h"
-#include "../../st_descriptors.h"
+#include <tadah/core/config.h>
+#include <tadah/core/registry.h>
+#include <tadah/core/core_types.h>
+#include <tadah/models/functions/function_base.h>
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/st_descriptors.h>
 
 #include <iomanip>
 #include <iostream>
diff --git a/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_all.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_all.h
new file mode 100644
index 0000000000000000000000000000000000000000..b53a2f63d862fecb09f6410c744ee549d13c5784
--- /dev/null
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_all.h
@@ -0,0 +1,7 @@
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_linear.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_rbf.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_lq.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_polynomial.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_sigmoid.h>
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_quadratic.h>
diff --git a/design_matrix/functions/kernels/dm_kern_base.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h
similarity index 80%
rename from design_matrix/functions/kernels/dm_kern_base.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h
index 929b3a112393a1f7812224c867d53a3dda1b75c8..cf0c12f38e19c7b7ee22279a68a233e0f0920c78 100644
--- a/design_matrix/functions/kernels/dm_kern_base.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h
@@ -1,12 +1,13 @@
 #ifndef DM_KERN_BASE_H
 #define DM_KERN_BASE_H
 
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/core/core_types.h>
+#include <tadah/models/functions/kernels/kern_base.h>
+
 #include <iostream>
-#include "../dm_function_base.h"
-#include "../../../../CORE/core_types.h"
-#include "../../../../MODELS/functions/kernels/kern_base.h"
-#include "../../../structure.h"
-#include "../../../st_descriptors.h"
 
 /** \brief Abstract class to be used as a base for all kernels.
  *
diff --git a/design_matrix/functions/kernels/dm_kern_linear.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_linear.h
similarity index 87%
rename from design_matrix/functions/kernels/dm_kern_linear.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_linear.h
index d677d2815433f2a0568d38d016a53b19ac1a3bbc..5c75dad56262708a78bcba2b35ce0dbefd4aefda 100644
--- a/design_matrix/functions/kernels/dm_kern_linear.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_linear.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_LINEAR_H
 #define DM_KERN_LINEAR_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_linear.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_linear.h>
 /**
  * Linear kernel also knows as dot product kernel
  *
diff --git a/design_matrix/functions/kernels/dm_kern_lq.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_lq.h
similarity index 60%
rename from design_matrix/functions/kernels/dm_kern_lq.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_lq.h
index dc77a8362108dc910901e474a1f8788d482411f2..f0b44451955e6c2e1f7f592397d318d2599fa31b 100644
--- a/design_matrix/functions/kernels/dm_kern_lq.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_lq.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_LQ_H
 #define DM_KERN_LQ_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_lq.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_lq.h>
 
 class DM_Kern_LQ :  public DM_Kern_Base, public Kern_LQ {
     public:
diff --git a/design_matrix/functions/kernels/dm_kern_polynomial.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_polynomial.h
similarity index 64%
rename from design_matrix/functions/kernels/dm_kern_polynomial.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_polynomial.h
index 2a5695fd2b7bf402b334b659d7e06f72d9a48d3e..5094370338d006531c85b4450a81878d7fcb6653 100644
--- a/design_matrix/functions/kernels/dm_kern_polynomial.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_polynomial.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_POLYNOMIAL_H
 #define DM_KERN_POLYNOMIAL_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_polynomial.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_polynomial.h>
 
 class DM_Kern_Polynomial :  public DM_Kern_Base, public Kern_Polynomial {
     public:
diff --git a/design_matrix/functions/kernels/dm_kern_quadratic.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_quadratic.h
similarity index 63%
rename from design_matrix/functions/kernels/dm_kern_quadratic.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_quadratic.h
index 3f432cf6b28fd3effcd9cb85255ef8fc633a1cfb..ecb85350cdc42c698547432ae1965124bd6fcde5 100644
--- a/design_matrix/functions/kernels/dm_kern_quadratic.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_quadratic.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_QUADRATIC_H
 #define DM_KERN_QUADRATIC_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_quadratic.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_quadratic.h>
 
 class DM_Kern_Quadratic :  public DM_Kern_Base, public Kern_Quadratic {
     public:
diff --git a/design_matrix/functions/kernels/dm_kern_rbf.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_rbf.h
similarity index 60%
rename from design_matrix/functions/kernels/dm_kern_rbf.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_rbf.h
index 8851e3ad996eba99af40570809764885f8b2eab8..7e1251afe93a266366024cf5d22a43869287d84a 100644
--- a/design_matrix/functions/kernels/dm_kern_rbf.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_rbf.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_RBF_H
 #define DM_KERN_RBF_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_rbf.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_rbf.h>
 
 class DM_Kern_RBF :  public DM_Kern_Base, public Kern_RBF {
     public:
diff --git a/design_matrix/functions/kernels/dm_kern_sigmoid.h b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_sigmoid.h
similarity index 62%
rename from design_matrix/functions/kernels/dm_kern_sigmoid.h
rename to include/tadah/mlip/design_matrix/functions/kernels/dm_kern_sigmoid.h
index 0c18643c70134aebbd3fe905831043175d622e32..c62a50ef586e4dd76390d5d710deec129c679d46 100644
--- a/design_matrix/functions/kernels/dm_kern_sigmoid.h
+++ b/include/tadah/mlip/design_matrix/functions/kernels/dm_kern_sigmoid.h
@@ -1,8 +1,8 @@
 #ifndef DM_KERN_SIGMOID_H
 #define DM_KERN_SIGMOID_H
 
-#include "dm_kern_base.h"
-#include "../../../../MODELS/functions/kernels/kern_sigmoid.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
+#include <tadah/models/functions/kernels/kern_sigmoid.h>
 
 class DM_Kern_Sigmoid :  public DM_Kern_Base, public Kern_Sigmoid {
     public:
diff --git a/models/basis.h b/include/tadah/mlip/models/basis.h
similarity index 95%
rename from models/basis.h
rename to include/tadah/mlip/models/basis.h
index 509d170d3dcb1a5b566f9eccede0cb7cfafc6610..74a4071bd4a7d5b3c084e505c5afd4fb7d77287a 100644
--- a/models/basis.h
+++ b/include/tadah/mlip/models/basis.h
@@ -1,10 +1,10 @@
 #ifndef BASIS_H
 #define BASIS_H
 
-#include "../../CORE/config/config.h"
-#include "../../CORE/core_types.h"
-#include "../st_descriptors_db.h"
-#include "../st_descriptors.h"
+#include <tadah/mlip/st_descriptors_db.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/core/core_types.h>
+#include <tadah/core/config.h>
 
 #include <numeric>
 #include <stdexcept>
diff --git a/include/tadah/mlip/models/m_all.h b/include/tadah/mlip/models/m_all.h
new file mode 100644
index 0000000000000000000000000000000000000000..d155789207e9ecc83fe25187a50bd95dd15d526b
--- /dev/null
+++ b/include/tadah/mlip/models/m_all.h
@@ -0,0 +1,3 @@
+//#include "m_tadah_base.h"
+#include <tadah/mlip/models/m_blr.h>
+#include <tadah/mlip/models/m_krr.h>
diff --git a/models/m_blr.h b/include/tadah/mlip/models/m_blr.h
similarity index 97%
rename from models/m_blr.h
rename to include/tadah/mlip/models/m_blr.h
index ae4146170ff232a73400a438a1da1c0ff7a9c5b7..4a88a4545d1a228ed2cdc6b09184e5db2fe153ed 100644
--- a/models/m_blr.h
+++ b/include/tadah/mlip/models/m_blr.h
@@ -1,3 +1,19 @@
+#ifndef M_BLR_H
+#define M_BLR_H
+
+#include <tadah/mlip/models/m_tadah_base.h>
+#include <tadah/mlip/descriptors_calc.h>
+#include <tadah/mlip/design_matrix/design_matrix.h>
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+#include <tadah/mlip/normaliser.h>
+#include <tadah/models/m_blr_train.h>
+#include <tadah/core/config.h>
+
+#include <limits>
+#include <stdexcept>
+#include <type_traits>
+#include <iostream>
+
 /** Bayesian Linear Regression
  *
  * Model supported training modes:
@@ -50,22 +66,6 @@
  *
  * @tparam BF DM_BF_Base child, Basis function
  */
-#ifndef M_BLR_H
-#define M_BLR_H
-
-#include "m_tadah_base.h"
-#include "../descriptors_calc.h"
-#include "../design_matrix/design_matrix.h"
-#include "../design_matrix/functions/dm_function_base.h"
-#include "../normaliser.h"
-#include "../../MODELS/m_blr_train.h"
-#include "../../CORE/config/config.h"
-
-#include <limits>
-#include <stdexcept>
-#include <type_traits>
-#include <iostream>
-
 
 template
 <class BF=DM_Function_Base&>
diff --git a/models/m_krr.h b/include/tadah/mlip/models/m_krr.h
similarity index 97%
rename from models/m_krr.h
rename to include/tadah/mlip/models/m_krr.h
index 73443a32c870bd7c133809836e8322ff8331080a..a2cc52fce598e1ba3ed836a5cc85ff3a8dc638ce 100644
--- a/models/m_krr.h
+++ b/include/tadah/mlip/models/m_krr.h
@@ -1,13 +1,14 @@
 #ifndef M_KRR_H
 #define M_KRR_H
 
-#include "basis.h"
-#include "m_tadah_base.h"
-#include "../descriptors_calc.h"
-#include "../design_matrix/design_matrix.h"
-#include "../design_matrix/functions/dm_function_base.h"
-#include "../../MODELS/m_krr_train.h"
-#include "../../CORE/config/config.h"
+#include <tadah/mlip/models/m_tadah_base.h>
+#include <tadah/mlip/descriptors_calc.h>
+#include <tadah/mlip/design_matrix/design_matrix.h>
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+#include <tadah/mlip/normaliser.h>
+#include <tadah/models/m_krr_train.h>
+#include <tadah/core/config.h>
+#include <tadah/mlip/models/basis.h>
 
 #include <limits>
 #include <stdexcept>
diff --git a/models/m_tadah_base.h b/include/tadah/mlip/models/m_tadah_base.h
similarity index 91%
rename from models/m_tadah_base.h
rename to include/tadah/mlip/models/m_tadah_base.h
index f0f4a31c950f4fa9fb8576c83c549926fc3c40fe..c98e4e67c49dc501d8af526ee77fba4e2ba37e57 100644
--- a/models/m_tadah_base.h
+++ b/include/tadah/mlip/models/m_tadah_base.h
@@ -1,15 +1,15 @@
 #ifndef M_TADAH_BASE_H
 #define M_TADAH_BASE_H
 
-#include "../structure.h"
-#include "../structure_db.h"
-#include "../st_descriptors.h"
-#include "../st_descriptors_db.h"
-#include "../normaliser.h"
-#include "../descriptors_calc_base.h"
-#include "../../CORE/core_types.h"
-#include "../../MODELS/m_core.h"
-#include "../../MODELS/m_predict.h"
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/structure_db.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/mlip/st_descriptors_db.h>
+#include <tadah/mlip/normaliser.h>
+#include <tadah/mlip/descriptors_calc_base.h>
+#include <tadah/core/core_types.h>
+#include <tadah/models/m_core.h>
+#include <tadah/models/m_predict.h>
 
 /** This interface provides functionality required from all models.
  */
diff --git a/nn_finder.h b/include/tadah/mlip/nn_finder.h
similarity index 90%
rename from nn_finder.h
rename to include/tadah/mlip/nn_finder.h
index 16df1aa0ec9fc1bec0fa8807eca56c12dab9b45f..e263514881ae56944fe22cabec39b8218534db8f 100644
--- a/nn_finder.h
+++ b/include/tadah/mlip/nn_finder.h
@@ -1,9 +1,9 @@
 #ifndef NN_FINDER_H
 #define NN_FINDER_H
 
-#include "../CORE/config/config.h"
-#include "structure.h"
-#include "structure_db.h"
+#include <tadah/core/config.h>
+#include <tadah/mlip/structure.h>
+#include <tadah/mlip/structure_db.h>
 
 /** Nearest Neighbour Finder
  *
diff --git a/normaliser.h b/include/tadah/mlip/normaliser.h
similarity index 95%
rename from normaliser.h
rename to include/tadah/mlip/normaliser.h
index 66e1252dc53aaca0998dc56ae659983c7c7f3d59..72e8be17b58cba85a1761360313df9da5fc454b4 100644
--- a/normaliser.h
+++ b/include/tadah/mlip/normaliser.h
@@ -1,10 +1,10 @@
 #ifndef NORMALISER_H
 #define NORMALISER_H
 
-#include "st_descriptors_db.h"
-#include "../CORE/normaliser_core.h"
-#include "../CORE/config/config.h"
-#include "../CORE/core_types.h"
+#include <tadah/mlip/st_descriptors_db.h>
+#include <tadah/core/normaliser_core.h>
+#include <tadah/core/config.h>
+#include <tadah/core/core_types.h>
 
 #include <limits>
 #include <stdexcept>
diff --git a/output/output.h b/include/tadah/mlip/output/output.h
similarity index 97%
rename from output/output.h
rename to include/tadah/mlip/output/output.h
index 4394a6dce1032c2418dd2a3ff37abcf5e7c41bae..c9957890b9c7cf41dafe582c68a476cc7e183709 100644
--- a/output/output.h
+++ b/include/tadah/mlip/output/output.h
@@ -1,13 +1,16 @@
+#ifndef OUTPUT_H
+#define OUTPUT_H
+
+#include <tadah/mlip/structure_db.h>
+#include <tadah/core/config.h>
+#include <tadah/core/utils/utils.h>
+#include <tadah/core/core_types.h>
+
 #include <ios>
 #include <iostream>
 #include <iomanip>
 #include <string>
 
-#include "../../CORE/config/config.h"
-#include "../structure_db.h"
-#include "../../CORE/utils/utils.h"
-#include "../../CORE/core_types.h"
-
 class Output {
     private:
         Config &pot_config;
@@ -188,3 +191,4 @@ class Output {
             out_stress.close();
         }
 };
+#endif // !OUTPUT_H
diff --git a/st_descriptors.h b/include/tadah/mlip/st_descriptors.h
similarity index 94%
rename from st_descriptors.h
rename to include/tadah/mlip/st_descriptors.h
index b487c02d05a5148132ef9686cb02b6cc404859c1..56618d5dda034f5e5e912c467a7238c232a312bf 100644
--- a/st_descriptors.h
+++ b/include/tadah/mlip/st_descriptors.h
@@ -1,9 +1,9 @@
 #ifndef ST_DESCRIPTORS_H
 #define ST_DESCRIPTORS_H
 
-#include "structure.h"
-#include "../CORE/config/config.h"
-#include "../CORE/core_types.h"
+#include <tadah/mlip/structure.h>
+#include <tadah/core/config.h>
+#include <tadah/core/core_types.h>
 
 #include <vector>
 
diff --git a/st_descriptors_db.h b/include/tadah/mlip/st_descriptors_db.h
similarity index 88%
rename from st_descriptors_db.h
rename to include/tadah/mlip/st_descriptors_db.h
index 54b569cad90a3d2cb8e7f9d0ff94f18b930692a2..db8843c33b715d77d445322582bd7f678ee5d2d0 100644
--- a/st_descriptors_db.h
+++ b/include/tadah/mlip/st_descriptors_db.h
@@ -1,9 +1,9 @@
 #ifndef ST_DESCRIPTORS_DB_H
 #define ST_DESCRIPTORS_DB_H
 
-#include "../CORE/config/config.h"
-#include "st_descriptors.h"
-#include "structure_db.h"
+#include <tadah/core/config.h>
+#include <tadah/mlip/st_descriptors.h>
+#include <tadah/mlip/structure_db.h>
 
 
 /** \brief Container for StDescriptors.
diff --git a/structure.h b/include/tadah/mlip/structure.h
similarity index 99%
rename from structure.h
rename to include/tadah/mlip/structure.h
index 5b12357afb55cb06dd88ef34ee151d0584fb320f..f42580ef505487d6ff4f23b61ad69cf56728ea5e 100644
--- a/structure.h
+++ b/include/tadah/mlip/structure.h
@@ -1,8 +1,8 @@
 #ifndef STRUCTURE_h
 #define STRUCTURE_h
 
-#include "atom.h"
-#include "../CORE/core_types.h"
+#include <tadah/mlip/atom.h>
+#include <tadah/core/core_types.h>
 
 #include <string>
 #include <iostream>
diff --git a/structure_db.h b/include/tadah/mlip/structure_db.h
similarity index 98%
rename from structure_db.h
rename to include/tadah/mlip/structure_db.h
index 37bceddfefd76dfd74d181660ba937e528705e16..678a5e3cf380c89e27e9a529a155632dc6e86499 100644
--- a/structure_db.h
+++ b/include/tadah/mlip/structure_db.h
@@ -1,8 +1,8 @@
 #ifndef STRUCTURE_DB_h
 #define STRUCTURE_DB_h
 
-#include "structure.h"
-#include "../CORE/config/config.h"
+#include <tadah/mlip/structure.h>
+#include <tadah/core/config.h>
 
 #include <string>
 #include <iostream>
diff --git a/trainer.h b/include/tadah/mlip/trainer.h
similarity index 98%
rename from trainer.h
rename to include/tadah/mlip/trainer.h
index 3f72c8cd5d01ac47c638b7b7f79e95bcf8c90d63..aa56caeb096263cd1160af647d3b3a3e50e833bb 100644
--- a/trainer.h
+++ b/include/tadah/mlip/trainer.h
@@ -1,14 +1,15 @@
 #ifndef MPI_TRAINER_H
 #define MPI_TRAINER_H
+#include <tadah/mlip/descriptors_calc.h>
+#include <tadah/mlip/design_matrix/design_matrix.h>
+#include <tadah/mlip/trainer.h>
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+#include <tadah/mlip/models/m_tadah_base.h>
+#include <tadah/mlip/nn_finder.h>
+#include <tadah/core/config.h>
+#include <tadah/models/dc_selector.h>
+
 #include <iostream>
-#include "../CORE/config/config.h"
-#include "../MODELS/dc_selector.h"
-#include "descriptors_calc.h"
-#include "../MLIP/design_matrix/design_matrix.h"
-#include "../MLIP/trainer.h"
-#include "design_matrix/functions/dm_function_base.h"
-#include "models/m_tadah_base.h"
-#include "nn_finder.h"
 
 class Trainer {
   public:
diff --git a/version.h b/include/tadah/mlip/version.h
similarity index 100%
rename from version.h
rename to include/tadah/mlip/version.h
diff --git a/models/m_all.h b/models/m_all.h
deleted file mode 100644
index 21c64a18dde91e348cf02d60b85bebe522f5cc22..0000000000000000000000000000000000000000
--- a/models/m_all.h
+++ /dev/null
@@ -1,3 +0,0 @@
-//#include "m_tadah_base.h"
-#include "m_blr.h"
-#include "m_krr.h"
diff --git a/models/m_blr.cpp b/models/m_blr.cpp
deleted file mode 100644
index 69350920423fc69d44c18c6744b3abd1725c582f..0000000000000000000000000000000000000000
--- a/models/m_blr.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "m_blr.h"
-#include "../../CORE/registry.h"
diff --git a/models/m_krr.cpp b/models/m_krr.cpp
deleted file mode 100644
index 03322f52f00937f1f4a3954b5dede0da748596b1..0000000000000000000000000000000000000000
--- a/models/m_krr.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "m_krr.h"
-#include "../../CORE/registry.h"
diff --git a/models/m_krr_work.h b/models/m_krr_work.h
deleted file mode 100644
index e962d145bb44c6a87cc37f814ef59a789f314396..0000000000000000000000000000000000000000
--- a/models/m_krr_work.h
+++ /dev/null
@@ -1,357 +0,0 @@
-#ifndef M_KRR_H
-#define M_KRR_H
-
-#include "basis.h"
-#include "m_tadah_base.h"
-#include "../descriptors_calc.h"
-#include "../design_matrix/design_matrix.h"
-#include "../design_matrix/functions/dm_function_base.h"
-#include "../../MODELS/m_krr_train.h"
-#include "../../CORE/config/config.h"
-
-#include <limits>
-#include <stdexcept>
-#include <type_traits>
-#include <iostream>
-
-/** Kernel Ridge Regression implemented via Empirical Kernel Map
- *
- * **Optional Config keys**:
- *
- *  - \ref LAMBDA = 0  -> use OLS
- *  - \ref LAMBDA > 0  -> manually set to given value
- *  - \ref LAMBDA = -1 -> use evidence approximation to find \f$\lambda\f$
- *  - \ref SBASIS N    -> Use N basis functions when nonlinear K is used
- *
- * @tparam K DM_Kern_Base child, Kernel function
- */
-template
-<class K=DM_Function_Base&>
-class M_KRR: public M_Tadah_Base,
-    public M_KRR_Train<K>
-    //public M_KRR_Predict<K>
-{
-
-    public:
-
-        /** This constructor will preapare this object for either training
-         *  or prediction (if potential is provides as a Config)
-         *
-         * Usage example:
-         *
-         * \code{.cpp}
-         * Config config("Config");
-         * M_KRR<Kern_Linear> krr(config);
-         * \endcode
-         *
-         */
-        using M_KRR_Train<K>::config;
-        using M_KRR_Train<K>::kernel;
-        using M_KRR_Train<K>::ekm;
-        M_KRR(Config &c):
-            M_KRR_Train<K>(c),
-            basis(c),
-            desmat(kernel,c)
-    {
-        norm = Normaliser(c);
-        //if (kernel.get_label()!="Kern_Linear" && config.exist("BASIS")) {
-        if (config.exist("BASIS")) {
-            basis.read_basis_from_config();
-            for (int i=0; i<basis.b.cols(); ++i)
-                std::cout << basis.b.col(i) << std::endl;
-            kernel.set_basis(basis.b);
-        }
-    }
-
-        /** This constructor will preapare this object for either training
-         *  or prediction (if potential is provides as a Config)
-         *
-         * Usage example:
-
-         * \code{.cpp}
-         * Config config("Config");
-         * Kern_Linear kernel(config);
-         * M_KRR<> krr(kernel, config);
-         * \endcode
-         *
-         */
-        M_KRR(K &kernel, Config &c):
-            M_KRR_Train<K>(kernel,c),
-            basis(c),
-            desmat(kernel,c)
-    {
-        norm = Normaliser(c);
-        //if (kernel.get_label()!="Kern_Linear" && config.exist("BASIS")) {
-        if (config.exist("BASIS")) {
-            basis.read_basis_from_config();
-            for (int i=0; i<basis.b.cols(); ++i)
-                std::cout << basis.b.col(i) << std::endl;
-            kernel.set_basis(basis.b);
-        }
-    }
-
-        double epredict(const aed_type2 &aed) {
-            return kernel.epredict(weights,aed);
-        };
-
-        double fpredict(const fd_type &fdij, const aed_type2 &aedi, const size_t k) {
-            return kernel.fpredict(weights,fdij,aedi,k);
-        }
-
-        force_type fpredict(const fd_type &fdij, const aed_type2 &aedi) {
-            return kernel.fpredict(weights,fdij,aedi);
-        }
-
-        void train(StDescriptorsDB &st_desc_db, const StructureDB &stdb) {
-
-            //if(config.template get<bool>("NORM"))
-            //    norm = Normaliser(config,st_desc_db);
-
-            desmat.build(st_desc_db,stdb);
-            train(desmat);
-        }
-
-        void train(StructureDB &stdb, DC_Base &dc) {
-
-            // NEW IMPLEMENTATION OF KRR //
-            std::string force=config.template get<std::string>("FORCE");
-            std::string stress=config.template get<std::string>("STRESS");
-            config.remove("FORCE");
-            config.remove("STRESS");
-            config.add("FORCE", "false");
-            config.add("STRESS", "false");
-            StDescriptorsDB st_desc_db_temp = dc.calc(stdb);
-            if(config.template get<bool>("NORM")) {
-                norm = Normaliser(config);
-                norm.learn(st_desc_db_temp);
-                norm.normalise(st_desc_db_temp);
-            }
-            config.remove("FORCE");
-            config.remove("STRESS");
-            config.add("FORCE", force);
-            config.add("STRESS", stress);
-            basis.prep_basis_for_krr(st_desc_db_temp,stdb);
-            kernel.set_basis(basis.b);
-            M_KRR_Train<K>::train2(basis);
-        }
-
-        Structure predict(const Config &c, StDescriptors &std, const Structure &st) {
-            // Used by tadah interface when predicting without -e flag
-            if(config.template get<bool>("NORM") && !std.normalised && kernel.get_label()!="Kern_Linear")
-                norm.normalise(std);
-            return M_Tadah_Base::predict(c,std,st);
-        }
-
-        StructureDB predict(Config &c, const StructureDB &stdb, DC_Base &dc) {
-            return M_Tadah_Base::predict(c,stdb,dc);
-        }
-
-        Config get_param_file() {
-            Config c = config;
-            c.remove("ALPHA");
-            c.remove("BETA");
-            c.remove("DBFILE");
-            c.remove("FORCE");
-            c.remove("STRESS");
-            c.remove("VERBOSE");
-
-            c.clear_internal_keys();
-            c.remove("MODEL");
-            c.add("MODEL", label);
-            c.add("MODEL", kernel.get_label());
-
-            for (size_t i=0;i<weights.size();++i) {
-                c.add("WEIGHTS", weights(i));
-            }
-
-            if(config.template get<bool>("NORM")) {
-                for (size_t i=0;i<norm.mean.size();++i) {
-                    c.add("NMEAN", norm.mean[i]);
-                }
-                for (size_t i=0;i<norm.std_dev.size();++i) {
-                    c.add("NSTDEV", norm.std_dev[i]);
-                }
-            }
-            //if (kernel.get_label()!="Kern_Linear") {
-                // dump basis to the config file file
-                // make sure keys are not accidently assigned
-                if (c.exist("SBASIS"))
-                    c.remove("SBASIS");
-                if (c.exist("BASIS"))
-                    c.remove("BASIS");
-                c.add("SBASIS", basis.b.cols());
-                for (size_t i=0;i<basis.b.cols();++i) {
-                    for (size_t j=0;j<basis.b.rows();++j) {
-                        c.add("BASIS", basis.b(j,i));
-                    }
-                }
-            //}
-            return c;
-        }
-        StructureDB predict(Config config_pred, StructureDB &stdb, DC_Base &dc,
-                aed_type2 &predicted_error) {
-
-            LinearRegressor::read_sigma(config_pred,Sigma);
-            DesignMatrix<K> dm(kernel,config_pred);
-            dm.scale=false; // do not scale energy, forces and stresses
-            dm.build(stdb,norm,dc);
-
-            //ekm.configure(basis.b);
-            //ekm.project(dm.Phi);
-
-
-
-            // compute error
-            predicted_error = T_MDMT_diag(dm.Phi, Sigma);
-            double beta = config.template get<double>("BETA");
-            predicted_error += 1.0/beta;
-
-            // compute energy, forces and stresses
-            aed_type2 Tpred = T_dgemv(dm.Phi, weights);
-
-            // Construct StructureDB object with predicted values
-            StructureDB stdb_;
-            stdb_.structures.resize(stdb.size());
-            size_t i=0;
-            for (size_t s=0; s<stdb.size(); ++s) {
-                stdb_(s) = Structure(stdb(s));
-
-                predicted_error(i) = sqrt(predicted_error(i));
-
-                stdb_(s).energy = Tpred(i++);
-                if (config_pred.get<bool>("FORCE")) {
-                    for (size_t a=0; a<stdb(s).natoms(); ++a) {
-                        for (size_t k=0; k<3; ++k) {
-                            predicted_error(i) = sqrt(predicted_error(i));
-                            stdb_(s).atoms[a].force[k] = Tpred(i++);
-                        }
-                    }
-                }
-                if (config_pred.get<bool>("STRESS")) {
-                    for (size_t x=0; x<3; ++x) {
-                        for (size_t y=x; y<3; ++y) {
-                            predicted_error(i) = sqrt(predicted_error(i));
-                            stdb_(s).stress(x,y) = Tpred(i++);
-                            if (x!=y)
-                                stdb_(s).stress(y,x) = stdb_(s).stress(x,y);
-                        }
-                    }
-                }
-            }
-            return stdb_;
-        }
-        StructureDB predict(StructureDB &stdb) {
-            if(!trained) throw std::runtime_error("This object is not trained!\n\
-                    Hint: check different predict() methods.");
-
-            phi_type &Phi = desmat.Phi;
-
-            // compute energy, forces and stresses
-            aed_type2 Tpred = T_dgemv(Phi, weights);
-
-            double eweightglob=config.template get<double>("EWEIGHT");
-            double fweightglob=config.template get<double>("FWEIGHT");
-            double sweightglob=config.template get<double>("SWEIGHT");
-
-            // Construct StructureDB object with predicted values
-            StructureDB stdb_;
-            stdb_.structures.resize(stdb.size());
-            size_t s=0;
-            size_t i=0;
-            while (i<Phi.rows()) {
-
-                stdb_(s).energy = Tpred(i++)*stdb(s).natoms()/eweightglob/stdb(s).eweight;
-                if (config.template get<bool>("FORCE")) {
-                    stdb_(s).atoms.resize(stdb(s).natoms());
-                    for (size_t a=0; a<stdb(s).natoms(); ++a) {
-                        for (size_t k=0; k<3; ++k) {
-                            stdb_(s).atoms[a].force[k] = Tpred(i++)/fweightglob/stdb(s).fweight;
-                        }
-                    }
-                }
-                if (config.template get<bool>("STRESS")) {
-                    for (size_t x=0; x<3; ++x) {
-                        for (size_t y=x; y<3; ++y) {
-                            stdb_(s).stress(x,y) = Tpred(i++)/sweightglob/stdb(s).sweight;
-                            if (x!=y)
-                                stdb_(s).stress(y,x) = stdb_(s).stress(x,y);
-                        }
-                    }
-                }
-                s++;
-            }
-            return stdb_;
-        }
-
-    private:
-        std::string label="M_KRR";
-        Basis<K> basis;
-        DesignMatrix<K> desmat;
-
-        t_type convert_to_nweights(const t_type &weights) const {
-            if(kernel.get_label()!="Kern_Linear") {
-                throw std::runtime_error("Cannot convert weights to nweights for\n\
-                        non linear kernel\n");
-            }
-            t_type kw(weights.rows());
-            kw.set_zero();
-            if(config.template get<bool>("NORM") && kernel.get_label()=="Kern_Linear") {
-                // normalise weights such that when predict is called
-                // we can supply it with a non-normalised descriptor
-                kw.resize(weights.rows());
-                kw(0) = weights(0);
-                for (size_t i=1; i<weights.size(); ++i) {
-
-                    if (norm.std_dev[i] > std::numeric_limits<double>::min())
-                        kw(i) = weights(i) / norm.std_dev[i];
-                    else
-                        kw(i) = weights(i);
-
-                    kw(0) -= norm.mean[i]*kw(i);
-
-                }
-            }
-            return kw;
-        }
-        // The opposite of convert_to_nweights()
-        t_type convert_to_weights(const t_type &kw) const {
-            if(kernel.get_label()!="Kern_Linear") {
-                throw std::runtime_error("Cannot convert nweights to weights for\n\
-                        non linear kernel\n");
-            }
-            // convert normalised weights back to "normal"
-            t_type w(kw.rows());
-            w.set_zero();
-            w(0) = kw(0);
-            for (size_t i=1; i<kw.size(); ++i) {
-                if (norm.std_dev[i] > std::numeric_limits<double>::min())
-                    w(i) = kw(i) * norm.std_dev[i];
-                else
-                    w(i) = kw(i);
-
-                w(0) += kw(i)*norm.mean[i];
-            }
-            return w;
-        }
-
-        template <typename D>
-            void train(D &desmat) {
-                phi_type &Phi = desmat.Phi;
-                t_type &T = desmat.T;
-                M_KRR_Train<K>::train(Phi,T);
-
-                //if (config.template get<bool>("NORM") &&
-                //        kernel.get_label()=="Kern_Linear") {
-                //    weights = convert_to_nweights(weights);
-                //}
-            }
-
-        // Do we want to confuse user with those and make them public?
-        // Either way they must be stated as below to silence clang warning
-        using M_KRR_Train<K>::predict;
-        using M_KRR_Train<K>::train;
-        using M_KRR_Train<K>::trained;
-        using M_KRR_Train<K>::weights;
-        using M_KRR_Train<K>::Sigma;
-};
-#endif
diff --git a/analytics/analytics.cpp b/src/analytics.cpp
similarity index 98%
rename from analytics/analytics.cpp
rename to src/analytics.cpp
index 9a8b3ea3de828d86bcba40738b07e06ef6bbc65f..4865127337529b0cc2c13c16dfaa138c0e4f92c1 100644
--- a/analytics/analytics.cpp
+++ b/src/analytics.cpp
@@ -1,5 +1,5 @@
-#include "analytics.h"
-#include "statistics.h"
+#include <tadah/mlip/analytics/analytics.h>
+#include <tadah/mlip/analytics/statistics.h>
 
 Analytics::Analytics(const StructureDB &st, const StructureDB &stp):
     st(st),
diff --git a/atom.cpp b/src/atom.cpp
similarity index 91%
rename from atom.cpp
rename to src/atom.cpp
index 98cd9291c287c3b05c150aa8df70afd6bd1ae9d5..a84be1e3ab60da955af783fff4d203c3d457328a 100644
--- a/atom.cpp
+++ b/src/atom.cpp
@@ -1,5 +1,5 @@
-#include "atom.h"
-#include "../CORE/periodic_table.h"
+#include <tadah/mlip/atom.h>
+#include <tadah/core/periodic_table.h>
 #include <iomanip>
 
 Atom::Atom() {}
diff --git a/src/dm_bf_base.cpp b/src/dm_bf_base.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e68de39417b717811cc30da8c434ada3f4a9a2de
--- /dev/null
+++ b/src/dm_bf_base.cpp
@@ -0,0 +1,2 @@
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_base.h>
+DM_BF_Base::~DM_BF_Base() {}
diff --git a/design_matrix/functions/basis_functions/dm_bf_linear.cpp b/src/dm_bf_linear.cpp
similarity index 96%
rename from design_matrix/functions/basis_functions/dm_bf_linear.cpp
rename to src/dm_bf_linear.cpp
index 8b3241a035dabc0f951350ff5ae6aeaa61efa6e0..f04f66e4921900f8ec3dea20e5c5adae8bc3fd1d 100644
--- a/design_matrix/functions/basis_functions/dm_bf_linear.cpp
+++ b/src/dm_bf_linear.cpp
@@ -1,4 +1,4 @@
-#include "dm_bf_linear.h"
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_linear.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_BF_Linear> DM_BF_Linear_1( "BF_Linear" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_BF_Linear> DM_BF_Linear_2( "BF_Linear" );
diff --git a/design_matrix/functions/basis_functions/dm_bf_polynomial2.cpp b/src/dm_bf_polynomial2.cpp
similarity index 97%
rename from design_matrix/functions/basis_functions/dm_bf_polynomial2.cpp
rename to src/dm_bf_polynomial2.cpp
index 9543e92baf97cdf2b4d1058e837b288ff1ee945b..51c3f561ce32df7c67017f379ec9f76a5eb3f123 100644
--- a/design_matrix/functions/basis_functions/dm_bf_polynomial2.cpp
+++ b/src/dm_bf_polynomial2.cpp
@@ -1,4 +1,4 @@
-#include "dm_bf_polynomial2.h"
+#include <tadah/mlip/design_matrix/functions/basis_functions/dm_bf_polynomial2.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_BF_Polynomial2> DM_BF_Polynomial2_1( "BF_Polynomial2" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_BF_Polynomial2> DM_BF_Polynomial2_2( "BF_Polynomial2" );
diff --git a/design_matrix/functions/dm_f_all.cpp b/src/dm_f_all.cpp
similarity index 96%
rename from design_matrix/functions/dm_f_all.cpp
rename to src/dm_f_all.cpp
index 5d174a089f9e1fdd668a8171b26c5e56bbc15dff..64a583a2ead0ea791730a3e0b5d00f8d0e78e84c 100644
--- a/design_matrix/functions/dm_f_all.cpp
+++ b/src/dm_f_all.cpp
@@ -1,4 +1,4 @@
-#include "dm_f_all.h"
+#include <tadah/mlip/design_matrix/functions/dm_f_all.h>
 
 template<> CONFIG::Registry<DM_Function_Base>::Map CONFIG::Registry<DM_Function_Base>::registry{};
 template<> CONFIG::Registry<DM_Function_Base,Config&>::Map CONFIG::Registry<DM_Function_Base,Config&>::registry{};
diff --git a/src/dm_function_base.cpp b/src/dm_function_base.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8c7af9b405e4ed2a9de97a58ac8b770b7a68f62b
--- /dev/null
+++ b/src/dm_function_base.cpp
@@ -0,0 +1,2 @@
+#include <tadah/mlip/design_matrix/functions/dm_function_base.h>
+
diff --git a/design_matrix/functions/kernels/dm_kern_base.cpp b/src/dm_kern_base.cpp
similarity index 97%
rename from design_matrix/functions/kernels/dm_kern_base.cpp
rename to src/dm_kern_base.cpp
index 7227a1b1c5e7039456d976ea98d5f1628a91c632..92d62af48cb6227225fd049ada42970b2bfed683 100644
--- a/design_matrix/functions/kernels/dm_kern_base.cpp
+++ b/src/dm_kern_base.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_base.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_base.h>
 
 DM_Kern_Base::~DM_Kern_Base() {}
 size_t DM_Kern_Base::get_phi_cols(const Config &)
diff --git a/design_matrix/functions/kernels/dm_kern_linear.cpp b/src/dm_kern_linear.cpp
similarity index 97%
rename from design_matrix/functions/kernels/dm_kern_linear.cpp
rename to src/dm_kern_linear.cpp
index 28fa629f3607bf7271c61cb45c9cf2144f0bf0d1..c04a361d072d474389ef8b0bcbdee9cc25340ba2 100644
--- a/design_matrix/functions/kernels/dm_kern_linear.cpp
+++ b/src/dm_kern_linear.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_linear.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_linear.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_Linear> DM_Kern_Linear_1( "Kern_Linear" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_Linear> DM_Kern_Linear_2( "Kern_Linear" );
diff --git a/design_matrix/functions/kernels/dm_kern_lq.cpp b/src/dm_kern_lq.cpp
similarity index 80%
rename from design_matrix/functions/kernels/dm_kern_lq.cpp
rename to src/dm_kern_lq.cpp
index 590406ca712793ed36bfea7e7c701c903d169f29..0333db06a7ce4a9c9113e4b484bc1dc007d43db4 100644
--- a/design_matrix/functions/kernels/dm_kern_lq.cpp
+++ b/src/dm_kern_lq.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_lq.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_lq.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_LQ> DM_Kern_LQ_1( "Kern_LQ" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_LQ> DM_Kern_LQ_2( "Kern_LQ" );
diff --git a/design_matrix/functions/kernels/dm_kern_polynomial.cpp b/src/dm_kern_polynomial.cpp
similarity index 83%
rename from design_matrix/functions/kernels/dm_kern_polynomial.cpp
rename to src/dm_kern_polynomial.cpp
index b533b005a5ca1fae0c88dfb2a3f1a77a5f8af6bf..b5fccbd4ab82ae3c397a002abcdadddeacb582c8 100644
--- a/design_matrix/functions/kernels/dm_kern_polynomial.cpp
+++ b/src/dm_kern_polynomial.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_polynomial.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_polynomial.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_Polynomial> DM_Kern_Polynomial_1( "Kern_Polynomial" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_Polynomial> DM_Kern_Polynomial_2( "Kern_Polynomial" );
diff --git a/design_matrix/functions/kernels/dm_kern_quadratic.cpp b/src/dm_kern_quadratic.cpp
similarity index 83%
rename from design_matrix/functions/kernels/dm_kern_quadratic.cpp
rename to src/dm_kern_quadratic.cpp
index f710de24c65c74d6b3bd37fe0317222eb31476d2..402c7771f57933a289a08802eddc6de1ad79ddfb 100644
--- a/design_matrix/functions/kernels/dm_kern_quadratic.cpp
+++ b/src/dm_kern_quadratic.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_quadratic.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_quadratic.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_Quadratic> DM_Kern_Quadratic_1( "Kern_Quadratic" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_Quadratic> DM_Kern_Quadratic_2( "Kern_Quadratic" );
diff --git a/design_matrix/functions/kernels/dm_kern_rbf.cpp b/src/dm_kern_rbf.cpp
similarity index 81%
rename from design_matrix/functions/kernels/dm_kern_rbf.cpp
rename to src/dm_kern_rbf.cpp
index 2a2112af1de5997daeaed1fff42d66d41a2e6c97..7ff05ef7af2d432ef6a82e33d1118c1d1ae31374 100644
--- a/design_matrix/functions/kernels/dm_kern_rbf.cpp
+++ b/src/dm_kern_rbf.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_rbf.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_rbf.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_RBF> DM_Kern_RBF_1( "Kern_RBF" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_RBF> DM_Kern_RBF_2( "Kern_RBF" );
diff --git a/design_matrix/functions/kernels/dm_kern_sigmoid.cpp b/src/dm_kern_sigmoid.cpp
similarity index 82%
rename from design_matrix/functions/kernels/dm_kern_sigmoid.cpp
rename to src/dm_kern_sigmoid.cpp
index bf847236a791d25fa1120e425ba8309af909ab63..d1fb598553daa2c9fb695f2da49c3393e246ed6e 100644
--- a/design_matrix/functions/kernels/dm_kern_sigmoid.cpp
+++ b/src/dm_kern_sigmoid.cpp
@@ -1,4 +1,4 @@
-#include "dm_kern_sigmoid.h"
+#include <tadah/mlip/design_matrix/functions/kernels/dm_kern_sigmoid.h>
 
 //CONFIG::Registry<DM_Function_Base>::Register<DM_Kern_Sigmoid> DM_Kern_Sigmoid_1( "Kern_Sigmoid" );
 //CONFIG::Registry<DM_Function_Base,Config&>::Register<DM_Kern_Sigmoid> DM_Kern_Sigmoid_2( "Kern_Sigmoid" );
diff --git a/models/m_all.cpp b/src/m_all.cpp
similarity index 89%
rename from models/m_all.cpp
rename to src/m_all.cpp
index 6d50651b2e08b1e13a5a227c4a6004359da7c24f..9c67972b5feb51734dcf20972aec98237cbfab37 100644
--- a/models/m_all.cpp
+++ b/src/m_all.cpp
@@ -1,4 +1,4 @@
-#include "m_all.h"
+#include <tadah/mlip/models/m_all.h>
 
 template<> CONFIG::Registry<M_Tadah_Base,DM_Function_Base&,Config&>::Map CONFIG::Registry<M_Tadah_Base,DM_Function_Base&,Config&>::registry{};
 CONFIG::Registry<M_Tadah_Base,DM_Function_Base&,Config&>::Register<M_KRR<>> M_KRR_1("M_KRR");
diff --git a/src/m_blr.cpp b/src/m_blr.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bdb85a73602412308a15ce55a4977f548d0ba742
--- /dev/null
+++ b/src/m_blr.cpp
@@ -0,0 +1,2 @@
+#include <tadah/mlip/models/m_blr.h>
+#include <tadah/core/registry.h>
diff --git a/src/m_krr.cpp b/src/m_krr.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d3cff341128e424be5e57afe5723901340524082
--- /dev/null
+++ b/src/m_krr.cpp
@@ -0,0 +1,2 @@
+#include <tadah/mlip/models/m_krr.h>
+#include <tadah/core/registry.h>
diff --git a/models/m_tadah_base.cpp b/src/m_tadah_base.cpp
similarity index 98%
rename from models/m_tadah_base.cpp
rename to src/m_tadah_base.cpp
index 1ebf99c56fd548ed9fe2a360412ad758214fdbb6..11cac065b7dff94a3c0eb954d44c95b9c88ab74c 100644
--- a/models/m_tadah_base.cpp
+++ b/src/m_tadah_base.cpp
@@ -1,4 +1,4 @@
-#include "m_tadah_base.h"
+#include <tadah/mlip/models/m_tadah_base.h>
 
 void M_Tadah_Base::
 fpredict(const size_t a, force_type &v,
diff --git a/nn_finder.cpp b/src/nn_finder.cpp
similarity index 99%
rename from nn_finder.cpp
rename to src/nn_finder.cpp
index 8b63a42d8521220aed18f34d2ffe7c559df39ecc..1fedb4e9d1700c2b7af56652d8b0b28cfa8b84b4 100644
--- a/nn_finder.cpp
+++ b/src/nn_finder.cpp
@@ -1,4 +1,4 @@
-#include "nn_finder.h"
+#include <tadah/mlip/nn_finder.h>
 #include <limits>
 
 NNFinder::NNFinder(Config &config):
diff --git a/st_descriptors.cpp b/src/st_descriptors.cpp
similarity index 97%
rename from st_descriptors.cpp
rename to src/st_descriptors.cpp
index bb9a5c2bb070d8183ec92d00f19ec8f9fbcb28db..e7a2840877adeec62b05e229996df94007c0dd82 100644
--- a/st_descriptors.cpp
+++ b/src/st_descriptors.cpp
@@ -1,4 +1,4 @@
-#include "st_descriptors.h"
+#include <tadah/mlip/st_descriptors.h>
 
 StDescriptors::StDescriptors(const Structure &s, const Config &c):
     // fully initialize aed
diff --git a/st_descriptors_db.cpp b/src/st_descriptors_db.cpp
similarity index 90%
rename from st_descriptors_db.cpp
rename to src/st_descriptors_db.cpp
index 87c1591dead7f33b69a18ae2b461f94239732bd0..9f80ce091580001b8afbf471dc5b92401206fbe0 100644
--- a/st_descriptors_db.cpp
+++ b/src/st_descriptors_db.cpp
@@ -1,4 +1,4 @@
-#include "st_descriptors_db.h"
+#include <tadah/mlip/st_descriptors_db.h>
 
 StDescriptorsDB::StDescriptorsDB(const StructureDB &stdb, Config &config):
     st_descs(stdb.size())
diff --git a/analytics/statistics.cpp b/src/statistics.cpp
similarity index 94%
rename from analytics/statistics.cpp
rename to src/statistics.cpp
index fce801956a8a6391734a8027dcfb91147a36b6bb..255d86761eb19c2008b62246bdf9f8ea181677bd 100644
--- a/analytics/statistics.cpp
+++ b/src/statistics.cpp
@@ -1,4 +1,5 @@
-#include "statistics.h"
+#include <tadah/mlip/analytics/statistics.h>
+
 #include <cmath>
 
 double Statistics::res_sum_sq(const vec &obs, const vec &pred) {
diff --git a/structure.cpp b/src/structure.cpp
similarity index 98%
rename from structure.cpp
rename to src/structure.cpp
index e3d504c8e5fb2edb86faf483ed719c37c9871077..d6e0b8d64f0464f4f6e9a439bc10f560bcfcba7f 100644
--- a/structure.cpp
+++ b/src/structure.cpp
@@ -1,7 +1,8 @@
-#include "structure.h"
+#include <tadah/mlip/structure.h>
+#include <tadah/core/periodic_table.h>
+
 #include <stdexcept>
 #include <cmath>
-#include "../CORE/periodic_table.h"
 
 Structure::Structure() {}
 
diff --git a/structure_db.cpp b/src/structure_db.cpp
similarity index 98%
rename from structure_db.cpp
rename to src/structure_db.cpp
index da7f8fc489c44d4cd7f7f1e7590393fdc9fb7419..c6e973307f30a4960893e6d5fc9186a9d3b3e426 100644
--- a/structure_db.cpp
+++ b/src/structure_db.cpp
@@ -1,4 +1,4 @@
-#include "structure_db.h"
+#include <tadah/mlip/structure_db.h>
 
 StructureDB::StructureDB() {}
 StructureDB::StructureDB(const Config &config) {
diff --git a/tests/test_atom.cpp b/tests/test_atom.cpp
deleted file mode 100644
index fa435f18d86a9f88b9271dd2b009d6a89b5f6be7..0000000000000000000000000000000000000000
--- a/tests/test_atom.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "catch2/catch.hpp"
-#include "../atom.h"
-#include <string>
-
-
-char symbol1[]="Ti";
-int Z1 = 22;
-Vec3d pos1(1.0,2.0,3.0);
-Vec3d force1(4.0,5.0,6.0);
-Element element1(symbol1,Z1);
-
-char symbol2[]="Nb";
-int Z2 = 41;
-Vec3d pos2(-1.0,-2.0,-3.0);
-Vec3d force2(-4.0,-5.0,-6.0);
-Element element2(symbol2,Z2);
-
-TEST_CASE( "Testing Atom class constructor", "[atom]" ) {
-
-
-    // Trivial case 1/2
-    Atom a(element1, 1.0, 2.0, 3.0, 
-            4.0, 5.0, 6.0);
-
-    REQUIRE( pos1 == a.position );
-    REQUIRE( force1 == a.force );
-    REQUIRE( symbol1[0] == a.symbol[0] );
-    REQUIRE( symbol1[1] == a.symbol[1] );
-    REQUIRE( Z1 == a.Z );
-
-    // Trivial case 2/2
-    Atom b;
-    b.position = pos1;
-    b.force = force1;
-    b.symbol[0] = symbol1[0];
-    b.symbol[1] = symbol1[1];
-    b.Z = Z1;
-
-    REQUIRE( pos1 == b.position );
-    REQUIRE( force1 == b.force );
-    REQUIRE( symbol1[0] == b.symbol[0] );
-    REQUIRE( symbol1[1] == b.symbol[1] );
-    REQUIRE( Z1 == b.Z );
-
-    REQUIRE( a == b );
-}
-TEST_CASE( "Testing Atom operator==", "[atom_operator==]" ) {
-    Atom a(element1, 1.0, 2.0, 3.0, 
-            4.0, 5.0, 6.0);
-    Atom b(element1, 1.0, 2.0, 3.0, 
-            4.0, 5.0, 6.0);
-    REQUIRE(a==b);
-
-    Atom c(element2, -1.0, -2.0, -3.0, 
-            -4.0, -5.0, -6.0);
-    REQUIRE(!(a==c));
-}
-TEST_CASE( "Testing Atom copy", "[atom_copy]" ) {
-    Atom a(element1, 1.0, 2.0, 3.0, 
-            4.0, 5.0, 6.0);
-    Atom b=a;
-    REQUIRE(a==b);
-}
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
deleted file mode 100644
index 8d417220ea552077e1c9c123fa6724032fd68054..0000000000000000000000000000000000000000
--- a/tests/test_main.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
-#include "catch2/catch.hpp"
-// No test in this file...
diff --git a/tests/test_structure.cpp b/tests/test_structure.cpp
deleted file mode 100644
index 99a46a06d6cc8133e3a634a7632b726678eda642..0000000000000000000000000000000000000000
--- a/tests/test_structure.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <string>
-#include <filesystem>
-#include "catch2/catch.hpp"
-#include "../atom.h"
-#include "../structure.h"
-
-// Conversion factor from eV/A^3 to kbar;
-double fac = 1602.1766208;
-
-TEST_CASE( "Testing Structure class volume", "[structure_volume]" ) {
-    //using vec=Eigen::Vector3d;
-
-    //std::string symbol="Ti";
-    //std::string name="Titanium";
-    //int Z = 22;
-    //vec pos(1.0,2.0,3.0);
-    //vec force(4.0,5.0,6.0);
-    //Element element(symbol,name,Z);
-
-    //Atom a(element, 1.0, 2.0, 3.0, 
-    //        4.0, 5.0, 6.0);
-
-    Structure st;
-    // Integer volume
-    st.cell.load(2,-1,3,
-               3,2,-4,
-              -2,0,1);
-
-    REQUIRE(st.get_volume() == 11 );
-
-    // double volume
-    st.cell.load(5.0147,5.0104,-5.0018,
-              -9.9924,-3.3395,-9.9662,
-              -25.6396,38.4594,12.8198);
-
-    REQUIRE(st.get_volume() == Approx(5980.0279772134).epsilon(1e-10));
-
-
-}
-TEST_CASE( "Testing Structure virial pressure calculations", "[structure_virial_pressures]" ) {
-
-    Structure st;
-    st.cell.load(9.374769,0.0,0.0,
-               0.0,9.374769,0.0,
-               0.0,0.0,9.374769);
-
-    REQUIRE(st.get_volume() == Approx(823.91));
-
-    st.stress.load(257.0893807653,0.0,0.0,
-                 0.0,257.0893807653,0.0,
-                 0.0,0.0,257.0893807653);
-    REQUIRE(fac*st.get_virial_pressure() == Approx(499.93));
-
-}
-TEST_CASE( "Testing Structure read and write", "[structure_read_write]" ) {
-    Structure st;
-    st.read("tests_data/structure_1.dat");
-
-    REQUIRE(st.get_volume() == Approx(989.521812));
-
-    REQUIRE(fac*st.get_virial_pressure() == Approx(26.705578));
-    REQUIRE(fac*st.get_pressure(300) == Approx(28.965914));
-    REQUIRE(fac*st.get_pressure(0) == Approx(26.705578));
-
-    std::string tempfile = std::tmpnam(nullptr);
-    st.save(tempfile);
-
-    Structure st_temp;
-    st_temp.read(tempfile);
-
-    REQUIRE(st_temp.get_volume() == Approx(989.521812));
-
-    REQUIRE(fac*st_temp.get_virial_pressure() == Approx(26.705578));
-    REQUIRE(fac*st_temp.get_pressure(300) == Approx(28.965914));
-    REQUIRE(fac*st_temp.get_pressure(0) == Approx(26.705578));
-
-    REQUIRE(st==st_temp);
-
-    std::remove(tempfile.c_str());
-
-}
-TEST_CASE( "Testing Structure compare", "[structure_compare]" ) {
-    Structure st;
-    st.read("tests_data/structure_1.dat");
-    std::string tempfile = std::tmpnam(nullptr);
-    st.save(tempfile);
-
-    Structure st_temp;
-    st_temp.read(tempfile);
-
-    SECTION("Compare unchanged") {
-        REQUIRE(st==st_temp);
-    }
-    SECTION("Compare symbols") {
-        REQUIRE(st==st_temp);
-        st_temp.atoms[0].symbol[0]='X';
-        st_temp.atoms[0].symbol[1]='X';
-        REQUIRE(!(st==st_temp));
-    }
-    SECTION("Compare position") {
-        REQUIRE(st==st_temp);
-        st_temp.atoms[0].position(0.12,0.13,10.14);
-        REQUIRE(!(st==st_temp));
-    }
-    SECTION("Compare force") {
-        REQUIRE(st==st_temp);
-        st_temp.atoms[0].force(1.12, 0.13, 0.134);
-        REQUIRE(!(st==st_temp));
-    }
-
-    std::remove(tempfile.c_str());
-}
-TEST_CASE( "Testing Structure copy", "[structure_copy]" ) {
-    Structure st;
-    st.read("tests_data/structure_1.dat");
-    Structure st2=st;
-        REQUIRE(st==st2);
-}
diff --git a/utils/DX_FD.h b/utils/DX_FD.h
deleted file mode 100644
index d5acbaa32b01e846ce649066dd431920268bd588..0000000000000000000000000000000000000000
--- a/utils/DX_FD.h
+++ /dev/null
@@ -1,272 +0,0 @@
-#ifndef TADAH_DX_FD_H
-#define TADAH_DX_FD_H
-#include "../../CORE/config/config.h"
-#include "../../CORE/core_types.h"
-#include "../../MODELS/descriptors/d_all.h"
-#include "../../MODELS/cutoffs/cut_all.h"
-#include "../../LIBS/Eigen/Dense"
-#include <vector>
-
-typedef Eigen::VectorXd rhoi_type;
-class DX_FD {
-    public:
-        DX_FD() {};
-        template <typename D2, typename C>
-            void test_d2() {
-                double rcut = 6.0;
-                Config config;
-                config.remove("INIT2B");
-                config.remove("VERBOSE");
-                config.remove("BIAS");
-                config.add("VERBOSE", 1);
-                config.add("INIT2B","true");
-                config.add("BIAS","false");
-                config.add("RCUT2B",rcut);
-                config.add("CGRID2B","-1 5 1.1 5.0");
-                //std::cout << config << std::endl;
-                C cutoff(rcut);
-                D2 d2(config);
-                test_d2(&d2,&cutoff);
-            }
-        void test_d2(D2_Base *d2, Cut_Base *cutoff, double h=1e-4) {
-
-            // Setup
-            aed_type2 aed(d2->size());
-            aed_type2 aedp(d2->size());
-            aed_type2 aedn(d2->size());
-
-            // Initial configuration
-            Atom a1("a1",0.1,7.2,1.3,0,0,0);
-            Atom a2("a2",2.2,4.1,1.8,0,0,0);
-            double r12 = (a1.position-a2.position).norm();
-            double fc12 = cutoff->calc(r12);
-            double fcp12 = cutoff->calc_prime(r12);  // cutoff prime
-
-            // "Positive" displacement
-            double r12p = r12+h;
-            double fc12p = cutoff->calc(r12p);
-
-            // "Negative" displacement
-            double r12n = r12-h;
-            double fc12n = cutoff->calc(r12n);
-
-            d2->calc_aed(r12, r12*r12,fc12,aed);
-            d2->calc_aed(r12p, r12p*r12p,fc12p,aedp);
-            d2->calc_aed(r12n, r12n*r12n,fc12n,aedn);
-
-            fd_type fd(d2->size(),3);    // true fd
-            fd_type fd1a(d2->size(),3);   // finite difference fd(approx)
-
-            d2->calc_dXijdri(r12,r12*r12,fc12,fcp12,fd);
-            d2->calc_fd_approx(r12,fc12p,fc12n,aedp,aedn,fd1a,h);
-
-            std::cout << "\nfd:\n" <<  fd << std::endl;
-            std::cout << "\nfda:\n" <<  fd1a << std::endl;
-            std::cout << "\nfd-fd1a:\n" <<  fd-fd1a << std::endl;
-        }
-        template <typename DM, typename C>
-            void test_dm() {
-                double rcut = 5.3;
-                Config config;
-                config.remove("INITMB");
-                config.add("INITMB","true");
-                config.remove("BIAS");
-                config.add("BIAS","false");
-                config.add("RCUTMB",rcut);
-                config.add("AGRIDMB",3);
-                config.add("SGRIDMB","-2 3 0.01 0.4");
-                config.add("CGRIDMB","-1 2 0.0 3.0");
-                config.add("SETFL","/home/s1351949/PROJECTS/tadah/workspace/Ta/Ta1_Ravelo_2013.eam.alloy");
-                config.remove("VERBOSE");
-                config.add("VERBOSE", 0);
-                //std::cout << config << std::endl;
-                C cutoff(rcut);
-                DM dm(config);
-                test_dm(&dm,&cutoff);
-            }
-        void test_dm(DM_Base *dm, Cut_Base *cutoff, double h=1e-4) {
-
-            // Initial configuration
-            vec3d r1(0.0,0.1,0.0);
-            vec3d r2(1.1,0.3,1.1);
-            vec3d r3(3.1,4.2,0.8);
-            vec3d r4(2.1,0.0,3.8);
-
-            std::vector<vec3d> rs = {r1,r2,r3,r4};
-            std::cout << "  True FD: " << std::endl;
-            std::vector<fd_type> fdi = calc_true_fd_dm(dm,cutoff,rs);
-            std::cout << "  Finite difference FD: " << std::endl;
-            std::vector<fd_type> fda = calc_apporx_fd_dm(dm,cutoff,rs,h);
-
-            std::cout << "  Difference True-Approximation: " << std::endl;
-            for (size_t i=0; i<fdi.size(); ++i) {
-                std::cout << "fd" << i << ":\n" <<  fdi[i]-fda[i] << std::endl;
-            }
-
-
-        }
-        std::vector<fd_type> calc_true_fd_dm(DM_Base *dm, Cut_Base *cutoff, std::vector<vec3d> &rs) {
-            vec3d
-            // Copy vector to matrix
-            Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> rsm(rs.size(),3);   // [N,3]
-            for (size_t i=0; i<rs.size(); ++i ) {
-                for (size_t j=0; j<3; ++j ) {
-                    rsm(i,j) = rs[i][j];
-                }
-            }
-
-            Eigen::Matrix<vec3d,Eigen::Dynamic,Eigen::Dynamic> vecij(rs.size(),rs.size()); // [N,N]
-            std::vector<aed_type> aeds(rs.size(), aed_type(dm->size()));
-            std::vector<rhoi_type> rhois(rs.size());
-            Eigen::Matrix<fd_type,Eigen::Dynamic,Eigen::Dynamic> fdij(rs.size(),rs.size()); // [N,N]
-            std::vector<fd_type> fdi(rs.size()); // [N,1]
-
-
-            // Initialize all data structures
-            for (size_t i=0; i<rs.size(); ++i ) {
-                dm->init_rhoi(rhois[i]);
-                aeds[i].set_zero();
-                fdi[i] = fd_type(dm->size(),3);
-                fdi[i].set_zero();
-                for (size_t j=i+1; j<rs.size(); ++j ) {
-                    fdij(i,j) = fd_type(dm->size(),3);
-                    fdij(i,j).set_zero();
-                }
-            }
-
-            for (size_t i=0; i<rs.size(); ++i ) {
-                for (size_t j=0; j<rs.size(); ++j ) {
-                    vecij(i,j) = rsm.row(i) - rsm.row(j);
-                }
-            }
-
-            for (size_t i=0; i<rs.size(); ++i ) {
-
-                // Calculate densities
-                for (size_t j=i+1; j<rs.size(); ++j ) {
-                    vec3d &vij = vecij(i,j);
-                    vec3d &vji = vecij(j,i);
-                    double rij = vij.norm();
-                    double fcij = cutoff->calc(rij);
-                    dm->calc_rho(rij,rij*rij,fcij,vij,rhois[i]);
-                    dm->calc_rho(rij,rij*rij,fcij,vji,rhois[j]);
-                }
-
-                // Calculate energy and derivative of the embedding
-                // function at the atom
-                dm->calc_aed(rhois[i], aeds[i]);
-
-            }
-
-            for (size_t i=0; i<rs.size(); ++i ) {
-
-                for (size_t j=i+1; j<rs.size(); ++j ) {
-                    vec3d &vij = vecij(i,j);
-                    double rij = vij.norm();
-                    double fcij = cutoff->calc(rij);
-                    double fcpij = cutoff->calc_prime(rij);
-                    int mode = dm->calc_dXijdri_dXjidri(rij,rij*rij,vij,fcij,fcpij,rhois[i],rhois[j],fdij(i,j));
-                    if (mode==0) {
-                        for (size_t k=0; k<3; ++k ) {
-                            fdi[i].col(k) += vij(k)*fdij(i,j).col(0)/rij;
-                            fdi[j].col(k) -= vij(k)*fdij(i,j).col(0)/rij;
-                        }
-                    }
-                    else {
-                        fdi[i] += fdij(i,j);
-                        fdi[j] -= fdij(i,j);
-                    }
-                }
-                std::cout << "fd" << i << ":\n" <<  fdi[i] << std::endl;
-            }
-
-            return fdi;
-        }
-        std::vector<fd_type> calc_apporx_fd_dm(DM_Base *dm, Cut_Base *cutoff, std::vector<vec3d> &rs, double h) {
-            // Copy vector to matrix
-            Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> rsp(rs.size(),3);   // [N,3]
-            Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> rsn(rs.size(),3);   // [N,3]
-
-            Eigen::Matrix<vec3d,Eigen::Dynamic,Eigen::Dynamic> vecijp(rs.size(),rs.size()); // [N,N]
-            Eigen::Matrix<vec3d,Eigen::Dynamic,Eigen::Dynamic> vecijn(rs.size(),rs.size()); // [N,N]
-            std::vector<aed_type> aedp(rs.size(), aed_type(dm->size()));
-            std::vector<aed_type> aedn(rs.size(), aed_type(dm->size()));
-            std::vector<rhoi_type> rhoip(rs.size());
-            std::vector<rhoi_type> rhoin(rs.size());
-            std::vector<fd_type> fdi(rs.size()); // [N,1]
-
-            // reset all positions
-            for (size_t i=0; i<rs.size(); ++i ) {
-                fdi[i] = fd_type(dm->size(),3);
-                fdi[i].set_zero();
-                dm->init_rhoi(rhoip[i]);
-                dm->init_rhoi(rhoin[i]);
-                aedn[i].set_zero();
-                for (size_t k=0; k<3; ++k ) {
-                    rsp(i,k) = rs[i][k];
-                    rsn(i,k) = rs[i][k];
-                }
-            }
-
-
-
-            for (size_t ii=0; ii<rs.size(); ++ii ) {
-                for (size_t k=0; k<3; ++k ) {
-
-                    // displace atom ii by h in +/-k direction
-                    rsp(ii,k) = rs[ii][k] + h;
-                    rsn(ii,k) = rs[ii][k] - h;
-
-                    // reset arrays for new k
-                    for (size_t i=0; i<rs.size(); ++i ) {
-                        aedp[i].set_zero();
-                        aedn[i].set_zero();
-                        rhoip[i].set_zero();
-                        rhoin[i].set_zero);
-                    }
-
-                    for (size_t i=0; i<rs.size(); ++i ) {
-                        for (size_t j=i+1; j<rs.size(); ++j ) {
-                            vecijp(i,j) = rsp.row(i) - rsp.row(j);
-                            vecijn(i,j) = rsn.row(i) - rsn.row(j);
-                            vec3d vijp = vecijp(i,j);
-                            vec3d vijn = vecijn(i,j);
-                            vec3d vjip = -vijp;
-                            vec3d vjin = -vijn;
-                            double rijp = vijp.norm();
-                            double rijn = vijn.norm();
-                            double fcijp = cutoff->calc(rijp);
-                            double fcijn = cutoff->calc(rijn);
-                            dm->calc_rho(rijp,rijp*rijp,fcijp,vijp,rhoip[i]);
-                            dm->calc_rho(rijp,rijp*rijp,fcijp,vjip,rhoip[j]);
-                            dm->calc_rho(rijn,rijn*rijn,fcijn,vijn,rhoin[i]);
-                            dm->calc_rho(rijn,rijn*rijn,fcijn,vjin,rhoin[j]);
-                        }
-
-                        dm->calc_aed(rhoip[i], aedp[i]);
-                        dm->calc_aed(rhoin[i], aedn[i]);
-                        fdi[ii].col(k) += (aedp[i]-aedn[i])/(2*h);
-                    }
-                    // reset back position for next k
-                    rsp(ii,k) = rs[ii][k];
-                    rsn(ii,k) = rs[ii][k];
-                }
-
-                std::cout << "fd" << ii << ":\n" <<  fdi[ii] << std::endl;
-            }
-            return fdi;
-        }
-
-
-};
-class Lattice {
-    public:
-        double a; // lattice parameter
-        double b; // lattice parameter
-        double c; // lattice parameter
-        double alpha; // Angle
-        double betta; // Angle
-        double gamma; // Angle
-};
-#endif
-