diff --git a/CMake/config.h.in b/CMake/config.h.in
index 7d385c4cb2ba9d9518e96d0850beba630e70a9cd..15827eda08ca08e9dfb3a9763dc07234aa945dfe 100644
--- a/CMake/config.h.in
+++ b/CMake/config.h.in
@@ -70,4 +70,4 @@
 #cmakedefine HAVE_HMAT
 #cmakedefine HAVE_CHAMELEON
 #cmakedefine HAVE_HLIBPRO
-#cmakedefine HAVE_MAPHYSPP
+#cmakedefine HAVE_COMPOSE
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5c2b2dfd646b035fa36898f6a33f789598ca4601..2ccdccabe015077cc81b414aa63c4b89cb66d464 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -140,12 +140,12 @@ if ( NOT TARGET MAPHYSPP::maphyspp )
   find_package(maphyspp)
   if(maphyspp_FOUND)
     message(STATUS "Found maphys++")
-    set(HAVE_MAPHYSPP TRUE)
+    set(HAVE_COMPOSE TRUE)
     set(CMAKE_CXX_STANDARD 20)
     set(CMAKE_CXX_STANDARD_REQUIRED ON)
   endif()
 else()
-  set(HAVE_MAPHYSPP TRUE)
+  set(HAVE_COMPOSE TRUE)
 endif()
 
 # ========================
@@ -201,7 +201,7 @@ if ( M_LIBRARIES )
 endif()
 
 if(maphyspp_FOUND)
-  target_link_libraries(test_FEMBEM PUBLIC PRIVATE MAPHYSPP::maphyspp)
+  target_link_libraries(test_FEMBEM PUBLIC MAPHYSPP::maphyspp)
 endif(maphyspp_FOUND)
 
 # ========================
diff --git a/include/main.h b/include/main.h
index ffa94c9416c02021bfea72e48cf5403eb34047c5..a91931209897010cc0201a0edb5ab32d8598547a 100644
--- a/include/main.h
+++ b/include/main.h
@@ -23,6 +23,11 @@
 #include "hmat/hmat_parallel.h" // from hmat (not oss)
 #endif
 #include "util.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif
+
 /* ================================================================================= */
 /*! \brief  List of numerical model (and matrix content) that we can test.
 
@@ -140,7 +145,8 @@ enum algo {
   _gemvHCHAMELEON,
   _gemmHCHAMELEON,
   _solveHCHAMELEON,
-  _helloCOMPOSE
+  _gemvCOMPOSE,
+  _solveCOMPOSE
 } ;
 
 /*! \brief  Algorithms that we want to test. */
@@ -280,15 +286,7 @@ int testCHAMELEON(double * relative_error);
 int testHLIBPRO(double * relative_error);
 int initHLIBPRO(int* argc, char*** argv) ;
 int testHCHAMELEON(double * relative_error);
-
-#if defined __cplusplus
-extern "C" {
-#endif
-
-void maphyspp_say_hello();
-#if defined __cplusplus
-}
-#endif
+int testCOMPOSE(double * relative_error);
 
 #ifdef HAVE_CHAMELEON
 extern cham_flttype_t chameleonType;
@@ -349,3 +347,7 @@ void         HMAT_destroy_matrix ( hmat_interface_t *hi,
                                    HMAT_desc_t      *hdesc );
 #endif
 
+#if defined __cplusplus
+} // extern "C"
+#endif
+
diff --git a/src/compose.cpp b/src/compose.cpp
index 1e51651af9d77d0f3714723cbefde92f47fd7f35..9856bef0fff4a36beafd2ddeb5fe0a07983e73f4 100644
--- a/src/compose.cpp
+++ b/src/compose.cpp
@@ -1,13 +1,5 @@
 #include "main.h"
 
-#if defined(HAVE_CHAMELEON)
-#include <maphys.hpp>
+#if defined(HAVE_COMPOSE)
 
-using namespace maphys;
-
-void maphyspp_say_hello(){
-  DenseMatrix<double> A({1, 2, 3, 4}, 2, 2);
-  A.display("Hello A");
-}
-
-#endif // defined(HAVE_CHAMELEON)
+#endif // defined(HAVE_COMPOSE)
diff --git a/src/help.c b/src/help.c
index 9ed0ba4ca2c7079b1dab03a1a55ca5ffff8dca97..6d273d1b77813d43a56ab60eb209654931a1185d 100644
--- a/src/help.c
+++ b/src/help.c
@@ -63,6 +63,12 @@ int printHelp() {
          "     -solvehlibpro: solve HLIBPRO.\n"
        #else
          "     HLIBPRO solver support not available.\n"
+       #endif
+       #ifdef HAVE_COMPOSE
+         "     -gemvcompose: gemv COMPOSE.\n"
+         "     -solvecompose: solve COMPOSE.\n"
+       #else
+         "     COMPOSE solver support not available.\n"
        #endif
          "\n"
        #ifdef HAVE_HMAT
diff --git a/src/main.c b/src/main.c
index 1006c41208d81c15cf6cc8d4401798bd0e054d45..6d8ad0853116e49058a00440858efb61f0d3ea8a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -100,9 +100,13 @@ int main(int argc, char **argv) {
     testedAlgo = _gemvHCHAMELEON ;
     printf("Testing : gemv H-CHAMELEON.\n") ;
   }
-  if (MpfArgHasName(&argc, argv, 1, "-hellocompose") > 0) {
-    testedAlgo = _helloCOMPOSE ;
-    printf("Testing : HELLO COMPOSE.\n") ;
+  if (MpfArgHasName(&argc, argv, 1, "-gemvcompose") > 0) {
+    testedAlgo = _gemvCOMPOSE ;
+    printf("Testing : gemv COMPOSE.\n") ;
+  }
+  if (MpfArgHasName(&argc, argv, 1, "-solvecompose") > 0) {
+    testedAlgo = _solveCOMPOSE ;
+    printf("Testing : solve COMPOSE.\n") ;
   }
   if (MpfArgHasName(&argc, argv, 1, "-solvehchameleon") > 0) {
     testedAlgo = _solveHCHAMELEON ;
@@ -127,7 +131,9 @@ int main(int argc, char **argv) {
     case _solveHCHAMELEON: // Add "--chameleon" in the command line if it is not yet there
       if (!MpfArgHasName(&argc, argv, 0, "--chameleon")) argv[argc++]="--chameleon";
       break;
-    case _helloCOMPOSE:
+    case _gemvCOMPOSE:
+    case _solveCOMPOSE:
+      // nothing
     break;
     case _undefined:
     default:
@@ -163,7 +169,8 @@ int main(int argc, char **argv) {
 #endif
       ierr = init_hmat_interface(); CHKERRQ(ierr);
       break;
-  case _helloCOMPOSE:
+    case _gemvCOMPOSE:
+    case _solveCOMPOSE:
     break;
   case _undefined:
     default:
@@ -378,10 +385,9 @@ int main(int argc, char **argv) {
     case _solveHCHAMELEON:
       ierr = testHCHAMELEON(&relative_error); CHKERRQ(ierr);
       break;
-    case _helloCOMPOSE:
-      maphyspp_say_hello();
-      relative_error = 1e-15;
-      ierr = 0;
+    case _gemvCOMPOSE:
+    case _solveCOMPOSE:
+      ierr = testCOMPOSE(&relative_error);  CHKERRQ(ierr);
     break;
     default:
       SETERRQ(1, "Unknown algorithm=%d", testedAlgo);
diff --git a/src/testCOMPOSE.cpp b/src/testCOMPOSE.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7eaab1cf9cf22d31385ed56a7e45bc4721ce4d01
--- /dev/null
+++ b/src/testCOMPOSE.cpp
@@ -0,0 +1,42 @@
+#include "main.h"
+
+/*! \brief Runs the test using COMPOSE solver
+ */
+#if defined(HAVE_COMPOSE)
+#include <maphys.hpp>
+#include <memory>
+#include <cstring>
+
+using namespace maphys;
+
+int testCOMPOSE(double * relative_error){
+
+  const int N = nbPts;
+
+  DenseMatrix<std::complex<double>> A(N, N);
+
+  auto myCtx = std::make_unique<contextTestFEMBEM>();
+  std::memset(myCtx.get(), 0, sizeof(contextTestFEMBEM));
+  myCtx->colDim = N;
+
+  int row_min = 1;
+  int row_max = N;
+  int col_min = 1;
+  int col_max = N;
+  int size_of_buffer = N * N;
+  int ld = A.get_leading_dim();
+
+  computeDenseBlockFEMBEM(&row_min, &row_max, &col_min, &col_max,
+                          &Mpf_i_zero, &Mpf_i_one, &Mpf_i_one, &Mpf_i_one,
+                          &size_of_buffer, &ld, (void *) get_ptr(A), (void *) myCtx.get());
+
+  auto A_first_block = A.get_block_view(0, 0, 6, 6);
+  A_first_block.display("A first block 6x6");
+
+  *relative_error = 1e-15;
+  return 0;
+}
+
+#else // HAVE_COMPOSE not defined
+  int testCOMPOSE(double *){ return 0; }
+#endif // defined(HAVE_COMPOSE)