diff --git a/.gitignore b/.gitignore
index e8df1add99cc25e5137741c66e654b1115d586fc..924cf8bcb5bda25d6501eafcbe54969c60bad69b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
 /drag.exe
 /build/
 /srcF/*.mod
-/parser/*.mod
+/config-parser/*.mod
 .idea
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 485c6b590f2c820ffbd8c12bcc42481ea7370f0d..23e174faa8ec5fad3aa38bfc85242909ba1a1334 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,7 +30,7 @@ endif ()
 set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)
 
 if(USE_CONFIG_PARSER)
-    add_subdirectory(parser/)
+    add_subdirectory(config-parser/)
     add_definitions(-DUSE_CONFIG_PARSER)
     # list(APPEND RUN_MACRO -DUSE_CONFIG_PARSER)
     set(USE_CXX ON)
@@ -75,7 +75,6 @@ set(SOURCES_F
     srcF/sfx_sheba.f90
     srcF/sfx_sheba_param.f90
     srcF/sfx_fc_wrapper.F90
-    srcF/parser_subfunctions.f90
 )
 
 set(HEADERS_F
@@ -153,7 +152,7 @@ set_property(TARGET sfx PROPERTY LINKER_LANGUAGE Fortran)
 target_include_directories(sfx PUBLIC ${CMAKE_BINARY_DIR}/modules/)
 
 if(USE_CONFIG_PARSER)
-    target_link_libraries(sfx parser_F parser_CXX)
+    target_link_libraries(sfx config_parser_F config_parser_CXX)
 endif(USE_CONFIG_PARSER)
 
 # copy data & configs on post build
diff --git a/parser/CMakeLists.txt b/config-parser/CMakeLists.txt
similarity index 67%
rename from parser/CMakeLists.txt
rename to config-parser/CMakeLists.txt
index c2aa35d9621979495542c170e9de3c7091720c98..f5db371ec88562084d8c670215cc86a0011a035a 100644
--- a/parser/CMakeLists.txt
+++ b/config-parser/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.19)
 
 # option(INCLUDE_CXX  "CXX build in mode"    OFF)
 
-project(Pars)
+project(config_parser)
 
 enable_language(Fortran)
 enable_language(C)
@@ -10,7 +10,7 @@ enable_language(CXX)
 set(CMAKE_CXX_STANDARD 11)
 
 set(SOURCES_CXX 
-    call_parser.cpp
+    c-config-parser.cpp
     cfg-cmd.cpp  
     cfg-value.cpp  
     cfg-vec.cpp   
@@ -21,7 +21,7 @@ set(SOURCES_CXX
     lexeme-parser.cpp
 )
 set(HEADERS_CXX 
-    call_parser.h
+    c-config-parser.h
     cfg-cmd.h
     cfg-value.h
     cfg-vec.h
@@ -36,11 +36,11 @@ set(HEADERS_CXX
 )
 
 set(SOURCES_C
-    call_parser.c
+    c-config-parser.c
 )
 
 set(SOURCES_F
-    call_parser.F90
+    config-parser.f90
 )
 
 set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)
@@ -48,7 +48,7 @@ set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)
 set(SOURCES_CXX ${SOURCES_CXX} ${SOURCES_C})
 set(HEADERS_CXX ${HEADERS_CXX})
 
-add_library(parser_CXX STATIC ${HEADERS_CXX} ${SOURCES_CXX})
-add_library(parser_F STATIC   ${SOURCES_F})
-set_property(TARGET parser_F PROPERTY LINKER_LANGUAGE Fortran)
-target_link_libraries(parser_F parser_CXX)
+add_library(config_parser_CXX STATIC ${HEADERS_CXX} ${SOURCES_CXX})
+add_library(config_parser_F STATIC   ${SOURCES_F})
+set_property(TARGET config_parser_F PROPERTY LINKER_LANGUAGE Fortran)
+target_link_libraries(config_parser_F config_parser_CXX)
diff --git a/config-parser/c-config-parser.c b/config-parser/c-config-parser.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f2b97c392c3f00729f9ea877e53a15b68e0e13f
--- /dev/null
+++ b/config-parser/c-config-parser.c
@@ -0,0 +1,30 @@
+#include "c-config-parser.h"
+#include <stdio.h>
+
+void c_config_run(const char* filename, int* status) {
+    (*status) = config_run(filename);
+}
+
+void c_config_is_varname(const char* name, int* status) {
+    (*status) = config_is_varname(name);
+}
+
+void c_config_get_int(const char* name, int* value, int* status) {
+    (*status) = config_get_int(name, value);
+}
+void c_config_get_float(const char* name, float* value, int* status) {
+    (*status) = config_get_float(name, value);
+}
+void c_config_get_double(const char* name, double* value, int* status) {
+    (*status) = config_get_double(name, value);
+}
+
+void c_config_get_string_len(const char* name, int *length) {
+    (*length) =  config_get_string_len(name);
+}
+
+void c_config_get_string_unsafe(const char* name, 
+    char* value, int* status) 
+{
+    (*status) = config_get_string_unsafe(name, value);
+}
diff --git a/config-parser/c-config-parser.cpp b/config-parser/c-config-parser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f580e0acf2280d32d4cb4e93913ec9a481e65eaf
--- /dev/null
+++ b/config-parser/c-config-parser.cpp
@@ -0,0 +1,53 @@
+#include "c-config-parser.h"
+
+#include "config-parser.h"
+#include <string>
+
+// *: static class
+static scm::ConfigParser config;
+
+
+#ifdef __cplusplus
+extern "C" {  
+#endif  
+
+    int config_run(const char* filename) {
+        return (int)config.run(filename);
+    }
+
+    int config_is_varname(const char* name) {
+        return (int)config.is_varname(name);
+    }
+
+    int config_get_int(const char* name, int* value) {
+        return (int)config.get_value(name, value);
+    }
+    int config_get_float(const char* name, float* value) {
+        return (int)config.get_value(name, value);
+    }
+    int config_get_double(const char* name, double* value) {
+        return (int)config.get_value(name, value);
+    }
+
+    int config_get_string_len(const char* name) 
+    {
+        std::string str;
+        bool status = config.get_value(name, str);
+
+        if (!status) return 0;
+        return (int)str.size();
+    }
+
+    int config_get_string_unsafe(const char* name, char* c_str) 
+    {
+        std::string str;
+        bool status = config.get_value(name, str);
+        if (!status) return 0;
+
+        memcpy(c_str, str.c_str(), (int)str.size() * sizeof(char));
+        return 1;
+    }
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/config-parser/c-config-parser.h b/config-parser/c-config-parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..cd518ec967af109588ec0ca6ea81eac101db1a93
--- /dev/null
+++ b/config-parser/c-config-parser.h
@@ -0,0 +1,26 @@
+#pragma once
+
+/* class [configParser] static C++ wrapper for C interface */
+
+#ifdef __cplusplus
+extern "C" {  
+#endif  
+
+    /* main run call */
+    int config_run(const char* filename);
+
+    /* check calls */
+    int config_is_varname(const char* name);
+
+    /* get calls */
+    int config_get_int(const char* name, int* value);
+    int config_get_float(const char* name, float* value);
+    int config_get_double(const char* name, double* value);
+
+    int config_get_string_len(const char* name);
+    /*    --- unsafe call: assumes 'c_str' is allocated to [len] elements */
+    int config_get_string_unsafe(const char* name, char* c_str);
+
+#ifdef __cplusplus
+}
+#endif 
diff --git a/parser/cfg-cmd.cpp b/config-parser/cfg-cmd.cpp
similarity index 100%
rename from parser/cfg-cmd.cpp
rename to config-parser/cfg-cmd.cpp
diff --git a/parser/cfg-cmd.h b/config-parser/cfg-cmd.h
similarity index 100%
rename from parser/cfg-cmd.h
rename to config-parser/cfg-cmd.h
diff --git a/parser/cfg-value.cpp b/config-parser/cfg-value.cpp
similarity index 100%
rename from parser/cfg-value.cpp
rename to config-parser/cfg-value.cpp
diff --git a/parser/cfg-value.h b/config-parser/cfg-value.h
similarity index 100%
rename from parser/cfg-value.h
rename to config-parser/cfg-value.h
diff --git a/parser/cfg-vec.cpp b/config-parser/cfg-vec.cpp
similarity index 100%
rename from parser/cfg-vec.cpp
rename to config-parser/cfg-vec.cpp
diff --git a/parser/cfg-vec.h b/config-parser/cfg-vec.h
similarity index 100%
rename from parser/cfg-vec.h
rename to config-parser/cfg-vec.h
diff --git a/parser/config-parser.cpp b/config-parser/config-parser.cpp
similarity index 100%
rename from parser/config-parser.cpp
rename to config-parser/config-parser.cpp
diff --git a/config-parser/config-parser.f90 b/config-parser/config-parser.f90
new file mode 100644
index 0000000000000000000000000000000000000000..1ee8abac9b5bbba849c11aae83b302706c19d8a5
--- /dev/null
+++ b/config-parser/config-parser.f90
@@ -0,0 +1,103 @@
+module config_parser
+
+    !< @brief C->Fortran interface 
+    interface
+        !< process configuration file [filename], status = [0 (ERROR), 1 (OK)]
+        subroutine c_config_run(filename, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: filename(*)
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_run
+
+        !< check if variable [name] is defined, status = [0 (FALSE), 1 (TRUE)]
+        subroutine c_config_is_varname(name, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_is_varname
+
+        !< get (int) [value] of variable [name], status = [0 (ERROR), 1 (OK)]
+        subroutine c_config_get_int(name, value, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            integer (kind=C_INT), intent(out) :: value
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_get_int
+
+        !< get (float) [value] of variable [name], status = [0 (ERROR), 1 (OK)]
+        subroutine c_config_get_float(name, value, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT, C_FLOAT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            real (kind=C_FLOAT), intent(out) :: value
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_get_float
+
+        !< get (double) [value] of variable [name], status = [0 (ERROR), 1 (OK)]
+        subroutine c_config_get_double(name, value, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT, C_DOUBLE
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            real (kind=C_DOUBLE), intent(out) :: value
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_get_double
+
+        !< get (int) [len] of string variable [name]
+        !<      [len] = 0 if variable is not defined or not a string
+        subroutine c_config_get_string_len(name, len) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            integer (kind=C_INT), intent(out) :: len
+        end subroutine c_config_get_string_len
+
+        !< get (char*) [c_str] of string variable [name], status = [0 (ERROR), 1 (OK)]
+        !<       *: [c_str] should be allocated up to hold at least [len] bytes
+        !<       *: [c_str] output doesn't contain the null terminated character
+        subroutine c_config_get_string_unsafe(name, c_str, status) BIND(C)
+            use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+            implicit none
+            character (kind=C_CHAR), intent(in) :: name(*)
+            character (kind=C_CHAR), intent(out) :: c_str(*)
+            integer (kind=C_INT), intent(out) :: status
+        end subroutine c_config_get_string_unsafe
+
+    end interface 
+
+    contains
+
+    !< @brief additional C->Fortran wrappers
+    ! --------------------------------------------------------------------------------
+    
+    !< get (char*) [c_str] of string variable [name], status = [0 (ERROR), 1 (OK)]
+    !       *: [c_str] allocation is performed in-place
+    !       *: [c_str] output doesn't contain the null terminated character
+    subroutine c_config_get_string(name, c_str, status)
+        use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT
+        implicit none
+        character (kind=C_CHAR), intent(in) :: name(*)
+        character (kind=C_CHAR), allocatable, intent(out) :: c_str(:)
+        integer (kind=C_INT), intent(out) :: status
+
+        ! local variables
+        ! --------------------------------------------------------------------------------
+        integer :: len
+        ! --------------------------------------------------------------------------------
+
+        call c_config_get_string_len(name, len)
+        
+        if (allocated(c_str)) deallocate(c_str)
+        if (len > 0) allocate(c_str(len))
+
+        call c_config_get_string_unsafe(name, c_str, status)
+    end subroutine c_config_get_string
+    ! --------------------------------------------------------------------------------
+    
+    !< @brief Fortran nice wrappers 
+    ! --------------------------------------------------------------------------------
+    ! --------------------------------------------------------------------------------
+
+end module config_parser
\ No newline at end of file
diff --git a/parser/config-parser.h b/config-parser/config-parser.h
similarity index 100%
rename from parser/config-parser.h
rename to config-parser/config-parser.h
diff --git a/parser/io-guts.cpp b/config-parser/io-guts.cpp
similarity index 100%
rename from parser/io-guts.cpp
rename to config-parser/io-guts.cpp
diff --git a/parser/io-guts.h b/config-parser/io-guts.h
similarity index 100%
rename from parser/io-guts.h
rename to config-parser/io-guts.h
diff --git a/parser/lexeme-list.cpp b/config-parser/lexeme-list.cpp
similarity index 100%
rename from parser/lexeme-list.cpp
rename to config-parser/lexeme-list.cpp
diff --git a/parser/lexeme-list.h b/config-parser/lexeme-list.h
similarity index 100%
rename from parser/lexeme-list.h
rename to config-parser/lexeme-list.h
diff --git a/parser/lexeme-parser.cpp b/config-parser/lexeme-parser.cpp
similarity index 100%
rename from parser/lexeme-parser.cpp
rename to config-parser/lexeme-parser.cpp
diff --git a/parser/lexeme-parser.h b/config-parser/lexeme-parser.h
similarity index 100%
rename from parser/lexeme-parser.h
rename to config-parser/lexeme-parser.h
diff --git a/parser/lexeme.cpp b/config-parser/lexeme.cpp
similarity index 100%
rename from parser/lexeme.cpp
rename to config-parser/lexeme.cpp
diff --git a/parser/lexeme.h b/config-parser/lexeme.h
similarity index 100%
rename from parser/lexeme.h
rename to config-parser/lexeme.h
diff --git a/parser/mem-buffer.h b/config-parser/mem-buffer.h
similarity index 100%
rename from parser/mem-buffer.h
rename to config-parser/mem-buffer.h
diff --git a/parser/scm-mem.h b/config-parser/scm-mem.h
similarity index 100%
rename from parser/scm-mem.h
rename to config-parser/scm-mem.h
diff --git a/parser/scm-sys.h b/config-parser/scm-sys.h
similarity index 100%
rename from parser/scm-sys.h
rename to config-parser/scm-sys.h
diff --git a/parser/call_parser.F90 b/parser/call_parser.F90
deleted file mode 100644
index 475dcda23d62bfab3449d1e0596fbee0a1e21771..0000000000000000000000000000000000000000
--- a/parser/call_parser.F90
+++ /dev/null
@@ -1,78 +0,0 @@
-module PARSER
-    INTERFACE
-        SUBROUTINE run(filename) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),  intent(in)  :: filename(*)
-        END SUBROUTINE run
-
-        SUBROUTINE get_int(name, value) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),  intent(in)    :: name(*)
-            INTEGER   (KIND=C_INT),   intent(out)   :: value
-        END SUBROUTINE get_int
-
-        SUBROUTINE get_float(name, value) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_FLOAT
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),    intent(in)    :: name(*)
-            REAL      (KIND=C_FLOAT),   intent(out)   :: value
-        END SUBROUTINE get_float
-
-        SUBROUTINE get_double(name, value) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_DOUBLE
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),    intent(in)    :: name(*)
-            REAL      (KIND=C_DOUBLE),  intent(out)   :: value
-        END SUBROUTINE get_double
-
-        ! TODO:
-        SUBROUTINE get_char_len(name, len) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),    intent(in)    :: name(*)
-            INTEGER   (KIND=C_INT),     intent(out)   :: len
-        END SUBROUTINE get_char_len
-
-        SUBROUTINE get_char_c(name, value) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),    intent(in)    :: name(*)
-            CHARACTER (KIND=C_CHAR),    intent(out)   :: value(*)
-        END SUBROUTINE get_char_c
-
-        SUBROUTINE is_varname(name, status) BIND(C)
-            USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT
-            IMPLICIT NONE
-            CHARACTER (KIND=C_CHAR),    intent(in)    :: name(*)
-            INTEGER   (KIND=C_INT),     intent(out)   :: status
-        END SUBROUTINE is_varname
-
-    END INTERFACE  
-
-    contains
-    
-    SUBROUTINE get_char_lenf(name, len) 
-        IMPLICIT NONE
-        CHARACTER, intent(in) :: name(*)
-        INTEGER, intent(out)  :: len
-
-        call get_char_len(name, len)
-    END SUBROUTINE get_char_lenf
-
-    SUBROUTINE get_charf(name, char_value) 
-        IMPLICIT NONE
-        CHARACTER, allocatable, intent(OUT) :: char_value(:)
-        CHARACTER, intent(in) :: name(*)
-        INTEGER :: len
-
-        call get_char_lenf(name, len)
-
-        IF(allocated(char_value)) deallocate(char_value)
-        allocate(char_value(len))
-
-        call get_char_c(name, char_value)
-    END SUBROUTINE get_charf 
-
-end module PARSER
\ No newline at end of file
diff --git a/parser/call_parser.c b/parser/call_parser.c
deleted file mode 100644
index f0d020ae110a2e6be13da7d081acf4429090bc06..0000000000000000000000000000000000000000
--- a/parser/call_parser.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "call_parser.h"
-#include <stdio.h>
-
-int run(const char* filename)
-{
-    return runCXX(filename);
-}
-
-int get_int(const char* name, int* value)
-{
-    return get_intCXX(name, value);
-}
-
-int get_float(const char* name, float* value)
-{
-    return get_floatCXX(name, value);
-}
-
-int get_double(const char* name, double* value)
-{
-    return get_doubleCXX(name, value);
-}
-
-int get_char_c(const char* name, char* value) 
-{
-    return get_charCXX(name, value);
-}
-
-void get_char_len(const char* name, int *len) 
-{
-    *len =  get_char_lenCXX(name);
-}
-
-void is_varname(const char* name, int* status)
-{
-    is_varnameCXX(name, status);
-}
-
-// int get_bool(const char* name, bool* value) 
-// {
-//     return get_valueCXX(name, value);
-// }
\ No newline at end of file
diff --git a/parser/call_parser.cpp b/parser/call_parser.cpp
deleted file mode 100644
index 259a532627b6eb3b406a8026060f5be95c015252..0000000000000000000000000000000000000000
--- a/parser/call_parser.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "call_parser.h"
-#include "config-parser.h"
-#include <string>
-
-static scm::ConfigParser Parser;
-
-#ifdef __cplusplus
-extern "C" {  
-#endif  
-
-    int runCXX(const char* filename)
-    {
-        bool res = Parser.run(filename);
-
-        if(res == false) return 0;
-        return 1;
-    }
-
-    int get_intCXX(const char* name, int* value)
-    {
-        bool res = Parser.get_value(name, value);
-
-        if(res == false) return 0;
-        return 1;
-    }
-
-    int get_floatCXX(const char* name, float* value)
-    {
-        bool res = Parser.get_value(name, value);
-
-        if(res == false) return 0;
-        return 1;
-    }
-
-    int get_doubleCXX(const char* name, double* value)
-    {
-        bool res = Parser.get_value(name, value);
-
-        if(res == false) return 0;
-        return 1;
-    }
-
-    int get_char_lenCXX(const char* name) 
-    {
-        std::string target_res;
-        bool res = Parser.get_value(name, target_res);
-
-        return target_res.size();
-    }
-
-    int get_charCXX(const char* name, char* value) 
-    {
-        std::string target_res;
-        bool res = Parser.get_value(name, target_res);
-
-        const int n = target_res.size();
-
-        for (int i = 0; i < n; i++)
-            value[i] = target_res[i];
-
-        if(res == false) return 0;
-        return 1;
-    }
-
-    void is_varnameCXX(const char* name, int* status)
-    {
-        bool flag = Parser.is_varname(name);
-        (*status) = (int)flag;
-    }
-
-    // bool get_valueCXX(const char* name, std::string& value) 
-    // {
-    //     return Parser.get_value(name, value);
-    // }
-
-    // bool get_valueCXX(const char* name, bool* value) 
-    // {
-    //     return Parser.get_value(name, value);
-    // }
-#ifdef __cplusplus
-}
-#endif 
\ No newline at end of file
diff --git a/parser/call_parser.h b/parser/call_parser.h
deleted file mode 100644
index cfc5a64b608937ae86dd7a8b7cb39ff29ae753e4..0000000000000000000000000000000000000000
--- a/parser/call_parser.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {  
-#endif  
-
-    int runCXX(const char* filename);
-    int get_intCXX(const char* name, int* value);
-    int get_floatCXX(const char* name, float* value);
-    int get_doubleCXX(const char* name, double* value);
-    // bool get_valueCXX(const char* name, long double* value);
-
-    int get_char_lenCXX(const char* name);
-    int get_charCXX(const char* name, char* value);
-
-    void is_varnameCXX(const char* name, int* status);
-
-    // bool get_valueCXX(const char* name, bool* value);
-
-#ifdef __cplusplus
-}
-#endif 
diff --git a/srcF/parser_subfunctions.f90 b/srcF/parser_subfunctions.f90
deleted file mode 100644
index 3bd2bb3f1db0f4d9f9edb41924a4935c6daf2a87..0000000000000000000000000000000000000000
--- a/srcF/parser_subfunctions.f90
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifdef USE_CONFIG_PARSER
-module PARSER_SUB_F
-    contains
-
-    FUNCTION compare_char_arrays(arr1, arr2) RESULT(isEqual)
-        IMPLICIT NONE
-        INTEGER :: size1, size2
-        CHARACTER, intent(in) :: arr1(:)
-        CHARACTER(len=*), intent(in) :: arr2
-        LOGICAL:: isEqual
-        INTEGER :: N, i
-        size1 = size(arr1)
-        size2 = len(arr2)
-
-        isEqual = .TRUE.
-
-        IF (size1.NE.size2) THEN
-            isEqual = .FALSE.
-            RETURN
-        END IF
-
-        N = size1
-
-        DO i = 1, N
-            IF (arr1(i) .NE. arr2(i:i)) THEN
-                isEqual = .FALSE.  
-                RETURN
-            END IF
-        END DO
-    END FUNCTION compare_char_arrays 
-
-    FUNCTION get_sfx_type(config_var_name) RESULT(type)
-        USE PARSER
-        USE sfx_surface
-        IMPLICIT NONE
-        CHARACTER, intent(in) :: config_var_name(*)
-        CHARACTER, allocatable :: sfx_type(:)
-        INTEGER :: type
-
-        call get_charf(config_var_name, sfx_type)
-
-        if ( compare_char_arrays(sfx_type, "ocean") ) then
-            type = surface_ocean
-        else if ( compare_char_arrays(sfx_type, "lake") ) then
-            type = surface_lake
-        else if ( compare_char_arrays(sfx_type, "land") ) then
-            type = surface_land
-        end if
-
-        deallocate(sfx_type)
-    END FUNCTION get_sfx_type 
-
-end module PARSER_SUB_F
-#endif
-
diff --git a/srcF/sfx_main.f90 b/srcF/sfx_main.f90
index dcabad5f2ab4f35008ea870ca7b0f08ce1bdd13b..c96cc2890879301a40c0ea162e94389b33a10dac 100644
--- a/srcF/sfx_main.f90
+++ b/srcF/sfx_main.f90
@@ -150,9 +150,7 @@ program sfx_main
     ! modules used
     ! --------------------------------------------------------------------------------
 #ifdef USE_CONFIG_PARSER
-    use parser_sub_f
-    use parser
-    use sfx_surface
+    use config_parser
     use iso_c_binding, only: C_NULL_CHAR
 #endif
 
@@ -323,11 +321,16 @@ program sfx_main
             
             call get_command_argument(i + 1, arg)
 #ifdef USE_CONFIG_PARSER
-            call run(trim(arg)//C_NULL_CHAR)
+            call c_config_run(trim(arg)//C_NULL_CHAR, status)
+            if (status == 0) then
+                write(*, *) ' FAILURE! > unable to parse configuration file: ', trim(arg)
+                stop
+            end if 
 
-            call is_varname("model.id"//C_NULL_CHAR, status)
+            call c_config_is_varname("model.id"//C_NULL_CHAR, status)
             if (status /= 0) then
-                call get_charf("model.id"//C_NULL_CHAR, config_field)
+                call c_config_get_string("model.id"//C_NULL_CHAR, config_field, status)
+                ! *: check status
                 model = get_model_id(char_array2str(config_field))
                 if (model == -1) then
                     write(*, *) ' FAILURE! > unknown model [key]: ', trim(char_array2str(config_field))
@@ -335,9 +338,10 @@ program sfx_main
                 end if
             end if
 
-            call is_varname("dataset.id"//C_NULL_CHAR, status)            
+            call c_config_is_varname("dataset.id"//C_NULL_CHAR, status)            
             if (status /= 0) then
-                call get_charf("dataset.id"//C_NULL_CHAR, config_field)
+                call c_config_get_string("dataset.id"//C_NULL_CHAR, config_field, status)
+                ! *: check status
                 id = get_dataset_id(char_array2str(config_field))
                 if (id == -1) then
                     write(*, *) ' FAILURE! > unknown dataset [key]: ', trim(char_array2str(config_field))
@@ -348,40 +352,42 @@ program sfx_main
                 call set_dataset(dataset, id)
                 dataset%nmax = nmax
 
-                call is_varname("dataset.filename"//C_NULL_CHAR, status)
+                call c_config_is_varname("dataset.filename"//C_NULL_CHAR, status)
                 if ((status /= 0).or.(dataset%id == dataset_user)) then
                     !< mandatory in user dataset
-                    call get_charf("dataset.filename"//C_NULL_CHAR, config_field)
+                    call c_config_get_string("dataset.filename"//C_NULL_CHAR, config_field, status)
+                    ! *: check status
                     dataset%filename = char_array2str(config_field)
                 end if
 
-                call is_varname("dataset.h"//C_NULL_CHAR, status)
+                call c_config_is_varname("dataset.h"//C_NULL_CHAR, status)
                 if ((status /= 0).or.(dataset%id == dataset_user)) then
                     !< mandatory in user dataset
-                    call get_float("dataset.h"//C_NULL_CHAR, dataset%h)
+                    call c_config_get_float("dataset.h"//C_NULL_CHAR, dataset%h, status)
                 end if
 
-                call is_varname("dataset.z0_m"//C_NULL_CHAR, status)
+                call c_config_is_varname("dataset.z0_m"//C_NULL_CHAR, status)
                 if ((status /= 0).or.(dataset%id == dataset_user)) then
                     !< mandatory in user dataset
-                    call get_float("dataset.z0_m"//C_NULL_CHAR, dataset%z0_m)
+                    call c_config_get_float("dataset.z0_m"//C_NULL_CHAR, dataset%z0_m, status)
                 end if
 
-                call is_varname("dataset.z0_h"//C_NULL_CHAR, status)
+                call c_config_is_varname("dataset.z0_h"//C_NULL_CHAR, status)
                 if ((status /= 0).or.(dataset%id == dataset_user)) then
                     !< mandatory in user dataset
-                    call get_float("dataset.z0_h"//C_NULL_CHAR, dataset%z0_h)
+                    call c_config_get_float("dataset.z0_h"//C_NULL_CHAR, dataset%z0_h, status)
                 end if
             end if
 
-            call is_varname("dataset.nmax"//C_NULL_CHAR, status)
+            call c_config_is_varname("dataset.nmax"//C_NULL_CHAR, status)
             if (status /= 0) then
-                call get_int("dataset.nmax"//C_NULL_CHAR, dataset%nmax)
+                call c_config_get_int("dataset.nmax"//C_NULL_CHAR, dataset%nmax, status)
             end if 
         
-            call is_varname("output.filename"//C_NULL_CHAR, status)
+            call c_config_is_varname("output.filename"//C_NULL_CHAR, status)
             if (status /= 0) then
-                call get_charf("output.filename"//C_NULL_CHAR, config_field)
+                call c_config_get_string("output.filename"//C_NULL_CHAR, config_field, status)
+                ! *: check status
                 filename_out = char_array2str(config_field)
             
                 is_output_set = 1