diff --git a/CMakeLists.txt b/CMakeLists.txt
index acfefb8c1bed8650be1956964b0e8e5353ddd483..8445adff5cc49c87da01b6781e18bdbf25046d25 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,27 +1,43 @@
 cmake_minimum_required( VERSION 3.30 FATAL_ERROR )
 
+message(VERBOSE "Entering libcdi")
 project(libcdi VERSION 2.5.1 LANGUAGES C )
 set(CMAKE_C_STANDARD 11)
 
+include(CTest)
 include(CheckIncludeFile)
 
-configure_file (
-  "${PROJECT_SOURCE_DIR}/cmake/cdi_config.h.in"
-  "${PROJECT_SOURCE_DIR}/src/config.h"
-  )
+# enable default internal libs
+add_compile_definitions(HAVE_LIBGRIB=1)
+add_compile_definitions(HAVE_LIBCGRIBEX=1)
+add_compile_definitions(HAVE_LIBEXTRA=1)
+add_compile_definitions(HAVE_LIBSERVICE=1)
+add_compile_definitions(HAVE_LIBIEG=1)
 
-#NetCDF
+# ecCodes
+find_package(eccodes)
+if (${eccodes_FOUND})
+  add_compile_definitions(HAVE_LIBGRIB_API=${eccodes_FOUND})
+  message(VERBOSE "added compile definition HAVE_LIBGRIB_API=${eccodes_FOUND}")
+else()
+  message(WARNING "netcdf not found, compiling without netcdf")
+endif ()
+
+# NetCDF
 find_package(netCDF COMPONENTS C REQUIRED)
-set(netcdf_flag HAVE_LIBNETCDF)
-set(netcdf_flag ${HAVE_LIBNETCDF})
 check_include_file("netcdf.h" ${netcdf_flag} C)
 if (${netCDF_FOUND})
-    message(STATUS "added compile definition HAVE_LIBNETCDF=${netCDF_FOUND}")
-    add_compile_definitions(HAVE_LIBNETCDF=${netCDF_FOUND})
+  message(VERBOSE "added compile definition HAVE_LIBNETCDF=${netCDF_FOUND}")
+  message(VERBOSE "added compile definition HAVE_NETCDF4=${netCDF_FOUND}")
+  add_compile_definitions(HAVE_LIBNETCDF=${netCDF_FOUND})
+  add_compile_definitions(HAVE_NETCDF4=${netCDF_FOUND})
 else()
   message(WARNING "netcdf not found, compiling without netcdf")
 endif ()
 
+message(VERBOSE "looking for config.h in: ${PROJECT_BINARY_DIR}/src")
+include_directories( "${PROJECT_BINARY_DIR}/src/config.h")
+
 
 #adding subdirectories
 ## lib and general files
@@ -29,3 +45,6 @@ add_subdirectory(src)
 ## cdi executable
 add_subdirectory(app)
 
+#tests
+add_subdirectory( tests )
+
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index ce87f49683bff30ea6f52c4f06e33dc4d1bf135e..73253a6a1bcb5bfc3e040316791229889c3ddd22 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -6,7 +6,4 @@ target_include_directories(cdi PUBLIC
   $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
   $<INSTALL_INTERFACE:include
 )
-
-target_link_libraries(cdi PUBLIC cdilib netCDF::netcdf ${HDF5_LIBS} pthread)
-
-target_compile_definitions(cdi PUBLIC HAVE_CONFIG_H)
+target_link_libraries(cdi PUBLIC cdilib netCDF::netcdf pthread)
diff --git a/cmake/cdi_config.h.in b/cmake/cdi_config.h.in
deleted file mode 100644
index e3bfd3225b75696f7fcb8e82af0f6f5b8acccba8..0000000000000000000000000000000000000000
--- a/cmake/cdi_config.h.in
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef cdi_config_h
-#define cdi_config_h
-
-#define PACKAGE_NAME      "@PROJECT_NAME@"
-
-#define VERSION           "@PROJECT_VERSION@"
-
-#define CDI               1
-
-#define HAVE_LIBGRIB      1
-#define HAVE_LIBCGRIBEX   1
-#define HAVE_LIBEXTRA     1
-#define HAVE_LIBSERVICE   1
-#define HAVE_LIBIEG       1
-
-#define HAVE_NETCDF       @HAVE_NETCDF@
-#define HAVE_NETCDF_NC4   @netCDF_HAS_NC4@
-#define NETCDF_FOUND      @NetCDF_FOUND@
-
-#endif /* cdi_config_h */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1f88fe09b84956160e7b52fb11ea0605f0b274a3..fca6176d99eb0e940133d841a51a05d6c281be2a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,3 +1,6 @@
+
+
+
 list( APPEND cdi_src_files
   async_worker.c
   async_worker.h
@@ -137,12 +140,64 @@ list( APPEND cdi_src_files
   zaxis.c
   zaxis.h
 )
+list( APPEND cdi_pio_files
+  cdipio.h
+  pio.c
+  pio.h
+  pio_cdf_int.c
+  pio_cdf_int.h
+  pio_client.c
+  pio_client.h
+  pio_comm.c
+  pio_comm.h
+  pio_conf.c
+  pio_conf.h
+  pio_dbuffer.c
+  pio_dbuffer.h
+  pio_dist_grid.c
+  pio_dist_grid.h
+  pio_id_set.h
+  pio_idxlist_cache.c
+  pio_idxlist_cache.h
+  pio_impl.h
+  pio_interface.c
+  pio_interface.h
+  pio_mpi_fw_at_all.c
+  pio_mpi_fw_at_reblock.c
+  pio_mpi_fw_ordered.c
+  pio_mpinonb.c
+  pio_posixasynch.c
+  pio_posixfpguardsendrecv.c
+  pio_posixnonb.c
+  pio_record_send.c
+  pio_roles.c
+  pio_rpc.c
+  pio_rpc.h
+  pio_serialize.c
+  pio_serialize.h
+  pio_server.c
+  pio_server.h
+  pio_util.c
+  pio_util.h
+  pio_xmap_cache.c
+  pio_xmap_cache.h
+)
+
+list( APPEND cdi_unknown
+  cfortran.h
+  getline.c
+  gribapi_utilities.c
+  make_fint.c
+  resource_unpack.c
+  resource_unpack.h
+  stream_gribapi.c
+)
 
 add_library(cdilib
-  ${cdi_src_files}
+  ${cdi_src_files} ${cdi_unknown}
 #  INSTALL_HEADERS_LIST  cdi.h
 )
-find_package(HDF5 REQUIRED COMPONENTS C REQUIRED)
-
-target_link_libraries(cdilib PUBLIC netCDF::netcdf ${HDF5_LIBS})
-target_compile_definitions(cdilib PUBLIC HAVE_CONFIG_H)
+target_link_libraries(cdilib eccodes ${netCDF_LIBRARIES})
+target_compile_definitions(cdilib PRIVATE CDI=1)
+target_compile_definitions(cdilib PRIVATE PACKAGE_NAME="cdilib")
+target_compile_definitions(cdilib PRIVATE VERSION="${CMAKE_PROJECT_VERSION}")
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cf18bbac6f3fe2a57236f2f68722ee26ea97c9a2
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,43 @@
+
+add_executable(calendar_test1.run calendar_test1.c)
+add_executable(cksum_read.run cksum_read.c )
+add_executable(cksum_verify.run cksum_verify.c)
+add_executable(cksum_write.run cksum_write.c)
+add_executable(cksum_write_chunk.run cksum_write_chunk.c)
+add_executable(deco2d_model.run deco2d_model.c)
+add_executable(ensure_array_size.run ensure_array_size.c)
+add_executable(pio_write.run pio_write.c)
+add_executable(pio_write_setup_grid.run pio_write_setup_grid.c)
+add_executable(simple_model.run simple_model.c)
+add_executable(simple_model_helper.run simple_model_helper.c)
+add_executable(stream_cksum.run stream_cksum.c)
+add_executable(test_byteswap.run test_byteswap.c)
+add_executable(test_cdf_read.run test_cdf_read.c)
+add_executable(test_cdf_write.run test_cdf_write.c)
+add_executable(test_grib.run test_grib.c)
+add_executable(test_month_adjust.run test_month_adjust.c)
+add_executable(test_resource_copy.run test_resource_copy.c)
+add_executable(test_table.run test_table.c)
+
+get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
+list(APPEND test_lib_src
+  var_cksum.c
+  ensure_array_size.c
+  stream_cksum.c
+  simple_model.c
+  simple_model_helper.c
+  pio_write_setup_grid.c
+)
+
+add_library(test_lib ${test_lib_src})
+target_include_directories(test_lib PRIVATE ../src/)
+target_link_libraries(test_lib PRIVATE cdilib eccodes)
+
+foreach(target ${current_targets})
+  target_include_directories(${target} PRIVATE ../src/)
+  target_link_libraries(${target} PRIVATE cdilib test_lib ${netCDF_LIBRARIES} )
+  add_test(NAME ${target} COMMAND ${target})
+  if(labels_${target})
+    set_property(TEST ${target} PROPERTY LABELS labels_${target})
+  endif()
+endforeach()