diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ca5e55eeac1f235dde77a47f5c43ad4373444887
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,35 @@
+variables:
+  DOCKER_DRIVER: overlay2
+stages:
+  - software
+  - powheg
+  - proc
+  - release
+  - eos
+
+.lcg-alma9:
+  image: gitlab-registry.cern.ch/sft/docker/alma9-core:${IMAGE}
+  stage: software
+  tags:
+    - k8s-${K8TAG}
+  script:
+    - dnf -y install epel-release dnf*
+    - dnf -y config-manager --set-enabled crb
+    - dnf -y install wget tar make  make autoconf bzip2 mc file which cmake*
+    - cmake -S . -B BUILD -DCMAKE_INSTALL_PREFIX=$(pwd)/INSTALLDIR
+    - cmake --build BUILD
+    - cmake --install BUILD
+
+
+lcg-alma9-arm:
+  variables:
+    IMAGE: aarch64
+    K8TAG: arm
+  extends: .lcg-alma9
+
+lcg-alma9-x86_64:
+  variables:
+    IMAGE: latest
+    K8TAG: cvmfs
+  extends: .lcg-alma9
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..87c67a51c8ff20a8c9067b36f1bfde9abf5fb364
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,148 @@
+cmake_minimum_required(VERSION 3.10)
+project(NLOX VERSION 1.2.2 LANGUAGES CXX Fortran C)
+find_package(Python REQUIRED)
+include(ExternalProject)
+include(FetchContent)
+find_program(SED gsed sed REQUIRED)
+option(NLOX_ENABLE_ONELOOP      "Enables OneLoop" ON)
+option(NLOX_ENABLE_QCDLOOP      "Enables QCDLoop" ON)
+option(NLOX_COMPILE_TESTS       "Enables compilation of tests" OFF)
+option(NLOX_DOWNLOAD_PROCESSES  "Download NLOX processes" ON)
+if (NOT NLOX_PROCESSES)
+#  set(NLOX_PROCESSES pp_Wpttbar pp_Wmttbar pp_Zttbar_as3ae1 pp_ttbarepem_as3ae2 )
+  set(NLOX_PROCESSES pp_Wpttbar )
+endif()
+message(STATUS "NLOX:  NLOX_ENABLE_ONELOOP=${NLOX_ENABLE_ONELOOP}")
+message(STATUS "NLOX:  NLOX_ENABLE_QCDLOOP=${NLOX_ENABLE_QCDLOOP}")
+message(STATUS "NLOX: NLOX_COMPILE_TESTS=${NLOX_COMPILE_TESTS}")
+message(STATUS "NLOX:  NLOX_DOWNLOAD_PROCESSES=${NLOX_DOWNLOAD_PROCESSES}")
+message(STATUS "NLOX:  NLOX_PROCESSES=${NLOX_PROCESSES}")
+include("GNUInstallDirs")
+
+file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/NLOXutil)
+set (NLOXutil  ${PROJECT_BINARY_DIR}/NLOXutil)
+if (NLOX_ENABLE_ONELOOP)
+  ExternalProject_Add(downloadedOneLOop
+      URL http://helac-phegas.web.cern.ch/helac-phegas/tar-files/OneLOop-3.6.tgz
+      DOWNLOAD_EXTRACT_TIMESTAMP ON
+      UPDATE_COMMAND ""
+      BUILD_IN_SOURCE     1
+      PREFIX ${PROJECT_BINARY_DIR}/EXTERNALSRC
+      CONFIGURE_COMMAND  ${SED} -i "s@#QPKIND@QPKIND@g" Config
+      BUILD_COMMAND ${Python_EXECUTABLE} create.py
+      INSTALL_COMMAND  ${CMAKE_COMMAND} -E copy libavh_olo.a ${NLOXutil}/libavh_olo.a
+      BUILD_BYPRODUCTS  ${NLOXutil}/libavh_olo.a 
+  )
+  add_definitions(-DONELOOP=1)
+  add_library(NLOXutil::avh_olo STATIC IMPORTED) 
+  set_target_properties(NLOXutil::avh_olo PROPERTIES IMPORTED_LOCATION ${NLOXutil}/libavh_olo.a)
+  install(FILES ${NLOXutil}/libavh_olo.a DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif()
+if(NLOX_ENABLE_QCDLOOP)
+  ExternalProject_Add(downloadedQCDLoop
+      URL https://qcdloop.fnal.gov/QCDLoop-1.98.tar.gz
+      DOWNLOAD_EXTRACT_TIMESTAMP ON
+      UPDATE_COMMAND ""
+      BUILD_IN_SOURCE     1
+      PREFIX ${PROJECT_BINARY_DIR}/EXTERNALSRC
+      CONFIGURE_COMMAND ${SED} -i "s@= gfortran@= gfortran -std=legacy -fallow-argument-mismatch -Wno-maybe-uninitialized@g" makefile
+      BUILD_COMMAND make
+      INSTALL_COMMAND  ${CMAKE_COMMAND} -E copy ff/libff.a ql/libqcdloop.a ${NLOXutil}/
+      BUILD_BYPRODUCTS  ${NLOXutil}/libff.a ${NLOXutil}/libqcdloop.a
+  )
+  add_definitions(-DQCDLOOP=1)
+  add_library(NLOXutil::qcdloop STATIC IMPORTED) 
+  set_target_properties(NLOXutil::qcdloop PROPERTIES IMPORTED_LOCATION ${NLOXutil}/libqcdloop.a)
+  install(FILES ${NLOXutil}/libqcdloop.a DESTINATION ${CMAKE_INSTALL_LIBDIR})
+  add_library(NLOXutil::ff STATIC IMPORTED) 
+  set_target_properties(NLOXutil::ff PROPERTIES IMPORTED_LOCATION ${NLOXutil}/libff.a)
+  install(FILES ${NLOXutil}/libff.a DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif()
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations -Wno-maybe-uninitialized")
+
+set(NLOX_DIR ${PROJECT_SOURCE_DIR})
+
+set(SRC kinematics.cc coefficient.cc numerics.cc interfaces.cc
+ab_node.cc pv_node.cc dd_node.cc evaluation.cc common.cc ea_node.cc et_node.cc
+fa_node.cc ft_node.cc tred.cc)
+list(TRANSFORM SRC PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/src/tred/")
+
+add_library(tred STATIC ${SRC} ${CMAKE_CURRENT_SOURCE_DIR}/src/tred/qlwrapper.f)
+target_include_directories(tred PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/tred/) 
+#add_library(tred_shared SHARED ${SRC} ${CMAKE_CURRENT_SOURCE_DIR}/src/tred/qlwrapper.f)
+install(TARGETS tred DESTINATION ${CMAKE_INSTALL_LIBDIR})
+file(GLOB TRED_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/src/tred/*.h")
+install(FILES ${TRED_HEADERS}   DESTINATION  ${CMAKE_INSTALL_LIBDIR}/src/tred)
+
+IF(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
+   set(COMMON_LIBS quadmath)
+else()
+   set(COMMON_LIBS )
+endif()
+
+macro(compilenloxprocess NM)
+  set(PROCPATH ${PROJECT_SOURCE_DIR}/${NM})
+
+  file(GLOB BORN_OBJS "${PROCPATH}/*/*born*/C/*.cc")
+  file(GLOB VIRT_OBJS "${PROCPATH}/*/*virt*/C/*.cc")
+  file(GLOB CT_OBJS "${PROCPATH}/*/*CT*/C/*.cc")
+  file(GLOB SUBPROC_CODE_OBJS "${PROCPATH}/*/code/*.cc")
+  file(GLOB PROC_CODE_OBJS "${PROCPATH}/code/*.cc")
+  file(GLOB ALL_OBJECTS "*.cc")
+  list(APPEND ALL_OBJECTS ${BORN_OBJS} ${VIRT_OBJS} ${CT_OBJS} ${SUBPROC_CODE_OBJS} ${PROC_CODE_OBJS})
+  list(REMOVE_ITEM ALL_OBJECTS ${PROCPATH}/code/test_process.cc ${PROCPATH}/code/nlox_olp_fortran.cc ${PROCPATH}/code/nlox_olp.cc)
+
+  add_library(${NM}_obj OBJECT ${ALL_OBJECTS})
+  add_library(${NM}_process STATIC  $<TARGET_OBJECTS:${NM}_obj> ${PROCPATH}/code/nlox_olp.cc)
+  add_library(${NM}_fprocess STATIC $<TARGET_OBJECTS:${NM}_obj> ${PROCPATH}/code/nlox_olp_fortran.cc)
+  install(TARGETS ${NM}_fprocess DESTINATION ${CMAKE_INSTALL_LIBDIR}/${NM})
+  install(TARGETS ${NM}_process DESTINATION ${CMAKE_INSTALL_LIBDIR}/${NM})
+  file(GLOB PROC_HEADERS_H "${PROCPATH}/code/*.h")
+  file(GLOB PROC_HEADERS_F90 "${PROCPATH}/code/*.f90")
+  install(FILES ${PROC_HEADERS_H}   DESTINATION  ${CMAKE_INSTALL_LIBDIR}/${NM}/code)
+  install(FILES ${PROC_HEADERS_F90}   DESTINATION  ${CMAKE_INSTALL_LIBDIR}/${NM}/code)
+
+  set_target_properties(${NM}_process PROPERTIES ARCHIVE_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/${NM} OUTPUT_NAME process)
+  set_target_properties(${NM}_fprocess PROPERTIES ARCHIVE_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/${NM}  OUTPUT_NAME fprocess)
+  target_compile_definitions(${NM}_obj PRIVATE NLOXPROCPATH=\"${PROCPATH}\")
+  target_compile_definitions(${NM}_process PRIVATE NLOXPROCPATH=\"${PROCPATH}\")
+  target_compile_definitions(${NM}_fprocess PRIVATE NLOXPROCPATH=\"${PROCPATH}\")
+  target_include_directories(${NM}_obj PRIVATE ${PROJECT_SOURCE_DIR}/src/tred ${PROCPATH}/code)
+  target_include_directories(${NM}_process PRIVATE ${PROJECT_SOURCE_DIR}/src/tred ${PROCPATH}/code)
+  target_include_directories(${NM}_fprocess PRIVATE ${PROJECT_SOURCE_DIR}/src/tred ${PROCPATH}/code)
+  if (NLOX_COMPILE_TESTS)
+    add_executable(${NM}_test_process ${PROCPATH}/examples/test_process.cc)
+    target_link_libraries(${NM}_test_process ${NM}_process tred ${COMMON_LIBS} NLOXutil::ff NLOXutil::qcdloop NLOXutil::avh_olo)
+    set_target_properties(${NM}_test_process PROPERTIES LINKER_LANGUAGE Fortran OUTPUT_NAME test_process RUNTIME_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/${NM})
+    target_include_directories(${NM}_test_process PRIVATE ${PROJECT_SOURCE_DIR}/src/tred ${PROCPATH}/code)
+
+    add_executable(${NM}_ftest_process ${PROCPATH}/examples/ftest_process.f90)
+    target_link_libraries(${NM}_ftest_process ${NM}_fprocess tred  ${COMMON_LIBS} NLOXutil::ff NLOXutil::qcdloop NLOXutil::avh_olo)
+    set_target_properties(${NM}_ftest_process PROPERTIES LINKER_LANGUAGE Fortran OUTPUT_NAME ftest_process RUNTIME_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/${NM})
+    target_include_directories(${NM}_ftest_process PRIVATE ${PROJECT_SOURCE_DIR}/src/tred ${PROCPATH}/code)
+  endif()
+endmacro()
+
+macro(getnloxprocessource NM MD) 
+FetchContent_Declare(
+  ${NM}
+  SOURCE_DIR ${PROJECT_SOURCE_DIR}/${NM}
+  DOWNLOAD_EXTRACT_TIMESTAMP ON  
+  HTTP_USERNAME NLOX
+  HTTP_PASSWORD LoopsAreCool
+  URL http://www.hep.fsu.edu/~nlox/downloads/processes/v1.2.0/${NM}.tar.gz
+  URL_HASH MD5=${MD}
+)
+endmacro()
+
+if (NLOX_DOWNLOAD_PROCESSES)
+ getnloxprocessource(pp_Wpttbar 92cb8954c6329ab236e87f7a68c296bd)
+ getnloxprocessource(pp_Wmttbar deb811e6e333c81244440e55b77e2b1e)
+ getnloxprocessource(pp_Zttbar_as3ae1 20af1c90c808ee15b88c46b52982a7c7)
+ getnloxprocessource(pp_ttbarepem_as3ae2 2f4a5ff23616f676bac658de295701f1)
+ FetchContent_MakeAvailable(${NLOX_PROCESSES})
+endif()
+foreach( p ${NLOX_PROCESSES})
+  compilenloxprocess(${p})
+endforeach()
diff --git a/src/tred/cavh_olo.h b/src/tred/cavh_olo.h
index 5d6c43e423f8f3a3a86b76215784a7d434f40cd8..ee037d83a95f659f2972e0957d2387e6366fa4d8 100644
--- a/src/tred/cavh_olo.h
+++ b/src/tred/cavh_olo.h
@@ -16,7 +16,13 @@
 // which can be set with OLO_SCALE.
 //
 
+#if defined(__x86_64__)
 #include <quadmath.h>
+#endif
+#if defined(__aarch64__)
+typedef _Float128  __float128;
+typedef _Complex float __attribute__((mode(TC))) __complex128;
+#endif
 
 // D0-routines
 #define OLO_D0ccr   __avh_olo_dp_MOD_d0ccr
diff --git a/src/tred/interfaces.h b/src/tred/interfaces.h
index c17f9085da96ac183f2051122be07ee9c825cb69..d8e0904427b438b3b11c477e90e9002c88c8be74 100644
--- a/src/tred/interfaces.h
+++ b/src/tred/interfaces.h
@@ -1029,13 +1029,19 @@ template <typename fT> Poly3T<fT> OLInterface::B0(fT psq, std::complex<fT> m0,
   return Poly3T<fT>(res[2], res[1], res[0], -2);
 }
 
+#include <complex.h>
 template <typename fT> Poly3T<fT> OLInterface::evaluate_scalar(
     const typename Invariants<fT>::Ptr & inv) {
   typename Vector<fT>::type args;
   __complex128 resq[3];
   double invtr[6];
   __float128 invtrq[6];
-  Complex128 massesq[4];
+#if defined(__x86_64__)
+  Complex128  massesq[4];
+#endif
+#if defined(__aarch64__)
+  std::complex<__float128>  massesq[4];
+#endif
   __complex128 olmassesq[4];
   int points = inv->points();
   int numInv = (points*points - points)/2;
@@ -1066,7 +1072,12 @@ template <typename fT> Poly3T<fT> OLInterface::evaluate_scalar(
 
   for (int i = 0; i < points; ++i) {
     //olmassesq[i] = {real(massesq[i]), imag(massesq[i])};
+#if defined(__x86_64__)
     olmassesq[i] = massesq[i].z_;
+#endif
+#if defined(__aarch64__)
+    olmassesq[i] = massesq[i].real() + I*massesq[i].imag();
+#endif
   }
 
  switch (points) {
diff --git a/src/tred/precision.h b/src/tred/precision.h
index 1370828296e26102d411c66d1a881d48849db153..af8bfdbe7a9a9546cd075da42e1169879438b639 100644
--- a/src/tred/precision.h
+++ b/src/tred/precision.h
@@ -15,11 +15,17 @@
 /* MAX_PREC_LVL: how many levels of floating point to attempt. We may want to
    define this variable at the makefile level once configuration tools are
    available, as well as the specific precisions below. */
+#if defined(__x86_64__)
 #define MAX_PREC_LVL 3
+#endif
+#if defined(__aarch64__)
+#define MAX_PREC_LVL 2
+#endif
 
 typedef double fT1; // first attempted precision
 typedef long double fT2; // second attempted precision
 #if MAX_PREC_LVL >= 3
+#if defined(__x86_64__)
 #include <quadmath.h>
 typedef __float128 fT3; // third attempted precision
 
@@ -38,6 +44,12 @@ inline __float128 pow(__float128 base, int exp) {
   return powq(base, exp);
 }
 
+#endif
+#endif
+#if defined(__aarch64__)
+typedef _Float128 __float128;
+typedef _Complex float __attribute__((mode(TC))) __complex128;
+typedef __float128 fT3; // third attempted precision
 #endif
 
 #endif // PRECISION_H_
diff --git a/src/tred/tcomplex.h b/src/tred/tcomplex.h
index de0bcdd37f97e456efe8a6f0cf615e834284216d..a37da6bae32f5b5d516ed9bc9d0579ddb55b0a65 100644
--- a/src/tred/tcomplex.h
+++ b/src/tred/tcomplex.h
@@ -9,7 +9,19 @@
 // std::complex, so we need additional code for that.
 
 #if MAX_PREC_LVL >= 3
+#if defined(__x86_64__)
 #include <quadmath.h>
+#endif
+#if defined(__aarch64__)
+#include <complex.h>
+typedef _Complex float __attribute__((mode(TC)))  __complex128;
+#define cpowq cpowl
+#define csqrtq csqrtl
+#define cimagq cimagl
+#define crealq creall
+#define cabsq cabsl
+#define clogq clogl
+#endif
 
 class Complex128 {
   public: