diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 745980622c0d1f7be23193de92b546a315037776..b1428e24b512393d1f3988c9cd5eb52dc2cbd49d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,11 @@
 #This file is quite deprecated, but we keep it there in case someone has an internal GitLab CI pipeline and wants to reuse this
+
+default:
+  image: ubuntu:22.04
+
 variables:
-    DPDK_VERSION: "17.08"
     NETMAP_VERSION: "11.1"
-    CONFIG: "--enable-gtp --enable-json"
+    CONFIG: "--enable-all-elements --disable-verbose-batch --enable-simtime"
 
 batch:
     script:
@@ -10,20 +13,43 @@ batch:
 autobatch:
     script:
         - ./configure CXXFLAGS="-std=gnu++11" --enable-batch $CONFIG --disable-verbose-batch --enable-auto-batch=port && make && make check
-
 ip6:
     script:
         - ./configure CXXFLAGS="-std=gnu++11" --enable-ip6 --enable-json $CONFIG --disable-batch && make && make check
 mt:
     script:
         - ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread $CONFIG --disable-batch && make && make check
-dpdk-batch:
-    script:
-        - ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread --without-netmap --enable-dpdk $CONFIG --enable-batch --disable-verbose-batch RTE_SDK=$RTE_SDK RTE_TARGET=$RTE_TARGET && make
 
-dpdk-nobatch:
+noclone:
     script:
-        - ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread --without-netmap --enable-dpdk $CONFIG --disable--batch RTE_SDK=$RTE_SDK RTE_TARGET=$RTE_TARGET && make
+        - ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread $CONFIG --disable-clone && make && make check
+
+dpdk:
+  parallel:
+    matrix:
+      - DPDK_VERSION: ["20.11", "23.03"]
+        DPDK_CONFIG: ["--enable-dpdk-packet --enable-batch", "--enable-batch", "--disable-batch", "--enable-dpdk-pool"]
+  before_script:
+    - echo "Running global pre-install..."
+    - !reference [before_script]
+    - echo "Running local pre-install..."
+    - export RTE_SDK=`pwd`/dpdk-$DPDK_VERSION;
+      export RTE_TARGET=x86_64-native-linuxapp-gcc;
+      export PKG_CONFIG_PATH=${RTE_SDK}/install/lib/x86_64-linux-gnu/pkgconfig/;
+      export LD_LIBRARY_PATH=${RTE_SDK}/install/lib/x86_64-linux-gnu/:${RTE_SDK}/install/lib/:$LD_LIBRARY_PATH;
+      if [ ! -e "$RTE_SDK/$RTE_TARGET/include/rte_version.h" ]; then
+            wget http://dpdk.org/browse/dpdk/snapshot/dpdk-$DPDK_VERSION.tar.gz &&
+            tar -zxf dpdk-$DPDK_VERSION.tar.gz &&
+            cd dpdk-$DPDK_VERSION ;
+            pip3 install meson ninja &&
+            meson -Dprefix=$(pwd)/install/ -Dmachine=default build &&
+            cd build && ( ninja && ninja install ) ;  cd .. ; cd .. ;
+      fi;
+      ldconfig
+  script:
+        - ls $PKG_CONFIG_PATH
+        - echo $LD_LIBRARY_PATH
+        - ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread --without-netmap --enable-dpdk ${DPDK_CONFIG} $CONFIG RTE_SDK=$RTE_SDK RTE_TARGET=$RTE_TARGET && make && make check
 
 netmap_single:
     script:
@@ -46,24 +72,16 @@ fnetmap:
 
 cache:
     paths:
-        - dpdk-$DPDK_VERSION
+        - dpdk-*
         - netmap-$NETMAP_VERSION
 before_script:
-    - if ! ( gcc -v &> /dev/null ) ; then
-        apt-get install -yqq build-essential
-      fi
-    - gcc -v
-    - export RTE_SDK=`pwd`/dpdk-$DPDK_VERSION;
-      export RTE_TARGET=x86_64-native-linuxapp-gcc;
-      if [ ! -e "$RTE_SDK/$RTE_TARGET/include/rte_version.h" ]; then
-        wget http://dpdk.org/browse/dpdk/snapshot/dpdk-$DPDK_VERSION.tar.gz &&
-            tar -zxf dpdk-$DPDK_VERSION.tar.gz &&
-            cd dpdk-$DPDK_VERSION ;
-            make config T=$RTE_TARGET &&
-            make install T=$RTE_TARGET ;
-            cd ..;
+    - if ( command -v apt-get &> /dev/null ) ; then
+        echo "Installing dependencies..." ;
+        apt-get update -yqq && apt-get install -yqq build-essential sudo wget libelf-dev pkg-config zlib1g-dev libnuma-dev python3-pyelftools ninja-build meson linux-headers-$(uname -r) python3-pip ;
+
       fi;
-    - if [ ! -e "netmap-$NETMAP_VERSION/sys/net/netmap.h" ] ; then wget https://github.com/luigirizzo/netmap/archive/v$NETMAP_VERSION.tar.gz && tar -xvf v$NETMAP_VERSION.tar.gz && cd netmap-$NETMAP_VERSION && cd LINUX && ./configure --no-drivers && cd .. && cd .. ; fi
+    - gcc -v
+    - if [ ! -e "netmap-$NETMAP_VERSION/sys/net/netmap.h" ] ; then wget https://github.com/luigirizzo/netmap/archive/v$NETMAP_VERSION.tar.gz && tar -xvf v$NETMAP_VERSION.tar.gz && ( cd netmap-$NETMAP_VERSION && cd LINUX && ./configure --no-drivers ; cd .. && cd .. ) ; fi
     - ls -al
     - if [ `sudo -n whoami` = "root" ] ; then sudo insmod netmap-$NETMAP_VERSION/LINUX/netmap.ko && sudo chmod 666 /dev/netmap ; fi
     - export CONFIG_NETMAP="--with-netmap=`pwd`/netmap-$NETMAP_VERSION/sys/"
diff --git a/configure b/configure
index a6af550a511f6c5ff5f4ee3bbee7eb3322578cf9..3b322e5162c0ba917d9c1940b3399dd2e7f8e4e3 100755
--- a/configure
+++ b/configure
@@ -1671,6 +1671,7 @@ Optional Features:
   --enable-user-timestamp enable support for user-provided clock system
   --enable-bound-port-transfer
                           enable port transfer function ptr optimization
+  Optional features about flow and context:
     --disable-ctx-global-timeout
                           disable sloppy CTX timeouts. Enabled if CTX is
                           enabled by default.
@@ -4023,7 +4024,6 @@ test -n "$target_alias" &&
     NONENONEs,x,x, &&
   program_prefix=${target_alias}-
 
-
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
@@ -9883,10 +9883,10 @@ then :
 else $as_nop
   enable_flow=NO
 fi
-test "x$enable_all_elements" = xyes -a \( "x$enable_flow" = xNO -o "x$enable_flow" = x \) && enable_flow=yes
+test "x$enable_all_elements" = xyes -a \( "x$enable_flow" = xNO -o "x$enable_flow" = x \) -a "x$enable_batch" = xyes   && enable_flow=yes
 if test "x$enable_flow" = xyes; then
     :
-
+    enable_flow=yes
 fi
 # Check whether --enable-ctx was given.
 if test ${enable_ctx+y}
@@ -10102,7 +10102,7 @@ fi
 all_element_groups=
 for i in `(cd $srcdir/elements; ls | sed '/^CVS$/d;/^\.git/d;/^bsdmodule$/d;/^linuxmodule$/d;/^ns$/d;/^userlevel$/d;/^minios$/d')`; do
     enableval=`eval 'echo $'"enable_$i"`
-    test "x$enable_all_elements" = xyes -a "x$enableval" '!=' xno && enableval=yes
+    test "x$enable_all_elements" = xyes -a "x$enableval" '=' xyes && enableval=yes
     test -d "$srcdir/elements/$i" -a "$enableval" = "yes" && element_groups="$element_groups $i"
     test -d "$srcdir/elements/$i" && all_element_groups="$all_element_groups$i "
 done
@@ -14589,6 +14589,7 @@ if test "x$have_aligned_new" = xyes; then
     CXXFLAGS="$CXXFLAGS -faligned-new"
 fi
 
+
 if test "x$enable_flow" = xyes; then
     if test "x$enable_batch" != xyes; then
         as_fn_error $? "--enable-flow needs --enable-batch! Flow subsystem will be disabled." "$LINENO" 5
@@ -14609,6 +14610,8 @@ else
     enable_ctx="no"
 fi
 
+
+
 # Check whether --enable-ctx-global-timeout was given.
 if test ${enable_ctx_global_timeout+y}
 then :
diff --git a/configure.in b/configure.in
index 1cede6239c6bd4fe61ab6bf1914c352cc692da2c..7fea8a0183817b36cf21d6822a1f2527aba81e3d 100644
--- a/configure.in
+++ b/configure.in
@@ -11,8 +11,8 @@ dnl The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
 dnl notice is a summary of the Click LICENSE file; the license in that file is
 dnl legally binding.
 
-AC_INIT([click], [2.1])
-AC_PREREQ(2.60)
+AC_INIT([click],[2.1])
+AC_PREREQ([2.71])
 AC_CONFIG_HEADERS([include/click/config.h:config.h.in], [echo > stamp-h])
 AC_CONFIG_HEADERS([include/click/pathvars.h:pathvars.h.in])
 AC_CONFIG_HEADERS([include/click/config-bsdmodule.h:config-bsdmodule.h.in include/click/config-linuxmodule.h:config-linuxmodule.h.in include/click/config-ns.h:config-ns.h.in include/click/config-userlevel.h:config-userlevel.h.in include/click/config-minios.h:config-minios.h.in])
@@ -39,7 +39,7 @@ AC_DEFINE_UNQUOTED([CLICK_VERSION_CODE], [CLICK_MAKE_VERSION_CODE($click_version
 CLICK_INIT('$(top_srcdir)')
 
 dnl support for cross compiling
-AC_CANONICAL_SYSTEM
+AC_CANONICAL_TARGET
 
 dnl This is wrong!!
 AC_CHECK_TOOL(CC, gcc)
@@ -66,14 +66,14 @@ esac
 
 
 
-AC_TRY_RUN([#include <new>
+AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <new>
 
 int main() {
     std::size_t sz = 8;
     std::align_val_t al{64};
     void* a = operator new(sz,al);
     return (a == nullptr?1:0);
-}],AC_DEFINE([HAVE_ALIGNED_NEW]))
+}]])],[AC_DEFINE(HAVE_ALIGNED_NEW)],[],[])
 
 CLICK_PROG_KERNEL_CC
 CLICK_PROG_KERNEL_CXX
@@ -693,7 +693,7 @@ ELEMENTS_ARG_ENABLE(app, [include application-level elements], yes)
 ELEMENTS_ARG_ENABLE(aqm, [include active queue management elements], yes)
 ELEMENTS_ARG_ENABLE(ethernet, [include Ethernet elements], yes)
 ELEMENTS_ARG_ENABLE(etherswitch, [include Ethernet switch elements], NO)
-ELEMENTS_ARG_ENABLE(flow, [include Enable flow system and elements], NO)
+ELEMENTS_ARG_ENABLE(flow, [include Enable flow system and elements], NO, enable_flow=yes, [ -a "x$enable_batch" = xyes ] )
 ELEMENTS_ARG_ENABLE(ctx, [include Context-based elements], NO, enable_ctx=yes , [ -a "x$enable_flow" = xyes ] )
 ELEMENTS_ARG_ENABLE(grid, [include Grid elements (see FAQ)], NO)
 ELEMENTS_ARG_ENABLE(icmp, [include ICMP elements], yes)
@@ -717,7 +717,7 @@ AC_ARG_ENABLE(skip-elements, [AS_HELP_STRING([--enable-skip-elements=ELTS], [dis
 all_element_groups=
 for i in `(cd $srcdir/elements; ls | sed '/^CVS$/d;/^\.git/d;/^bsdmodule$/d;/^linuxmodule$/d;/^ns$/d;/^userlevel$/d;/^minios$/d')`; do
     enableval=`eval 'echo $'"enable_$i"`
-    test "x$enable_all_elements" = xyes -a "x$enableval" '!=' xno && enableval=yes
+    test "x$enable_all_elements" = xyes -a "x$enableval" '=' xyes && enableval=yes
     test -d "$srcdir/elements/$i" -a "$enableval" = "yes" && element_groups="$element_groups $i"
     test -d "$srcdir/elements/$i" && all_element_groups="$all_element_groups$i "
 done
@@ -801,10 +801,10 @@ dnl
 dnl functions
 dnl
 
-AC_LANG_C
+AC_LANG([C])
 AC_REPLACE_FUNCS(strerror)
 AC_CHECK_FUNCS(random snprintf strnlen strtof strtold strtoul tcgetpgrp vsnprintf aligned_alloc)
-AC_LANG_CPLUSPLUS
+AC_LANG([C++])
 
 
 dnl
@@ -908,6 +908,7 @@ if test "x$have_aligned_new" = xyes; then
     CXXFLAGS="$CXXFLAGS -faligned-new"
 fi
 
+
 if test "x$enable_flow" = xyes; then
     if test "x$enable_batch" != xyes; then
         AC_MSG_ERROR([--enable-flow needs --enable-batch! Flow subsystem will be disabled.])
@@ -924,6 +925,8 @@ else
     enable_ctx="no"
 fi
 
+m4_divert_once([HELP_ENABLE], [[  Optional features about flow and context:]])
+
 AC_ARG_ENABLE([ctx-global-timeout],
     [AS_HELP_STRING([  --disable-ctx-global-timeout], [disable sloppy CTX timeouts. Enabled if CTX is enabled by default.])],
     [:], [enable_ctx_global_timeout=$enable_ctx])
@@ -971,7 +974,7 @@ else
 fi
 
 AC_ARG_ENABLE(tools,
-  [AC_HELP_STRING([--enable-tools=WHERE], [enable tools (host/build/mixed/no) [[mixed]]])],
+  [AS_HELP_STRING([--enable-tools=WHERE],[enable tools (host/build/mixed/no) [[mixed]]])],
   :, enable_tools=mixed)
 
 if test "$enable_tools" != mixed -a "$enable_tools" != host -a "$enable_tools" != build -a "$enable_tools" != no; then
@@ -1034,7 +1037,7 @@ dnl
 dnl sockets
 dnl
 
-AC_LANG_C
+AC_LANG([C])
 SOCKET_LIBS=
 if test "$enable_userlevel" = yes; then
     savelibs="$LIBS"; LIBS=
@@ -1052,7 +1055,7 @@ if test "$enable_userlevel" = yes; then
     fi
 fi
 AC_SUBST(SOCKET_LIBS)
-AC_LANG_CPLUSPLUS
+AC_LANG([C++])
 
 
 dnl
@@ -1066,10 +1069,10 @@ dnl
 dnl mmap
 dnl
 
-AC_LANG_C
+AC_LANG([C])
 AC_CHECK_HEADERS_ONCE([sys/mman.h])
 AC_FUNC_MMAP
-AC_LANG_CPLUSPLUS
+AC_LANG([C++])
 AC_CHECK_FUNCS(madvise)
 AC_CHECK_DECLS(madvise, [], [], [#if HAVE_SYS_MMAN_H
 #include <sys/types.h>
@@ -1870,11 +1873,11 @@ if test "$properprefix" != no; then
     AC_CHECK_HEADER(prop.h, have_prop_h=yes, have_prop_h=no)
     CPPFLAGS="$saveflags"
 
-    AC_LANG_C
+    AC_LANG([C])
     saveflags="$LDFLAGS"; test -n "$properprefix" && LDFLAGS="$LDFLAGS -L$properprefix/lib"
     AC_CHECK_LIB(proper, prop_open, have_libproper=yes, have_libproper=no)
     LDFLAGS="$saveflags"
-    AC_LANG_CPLUSPLUS
+    AC_LANG([C++])
 
     if test $have_prop_h = yes -a $have_libproper = yes; then
         AC_DEFINE(HAVE_PROPER)
@@ -1909,7 +1912,7 @@ if test "$expatprefix" != no; then
     AC_CHECK_HEADER(expat.h, have_expat_h=yes, have_expat_h=no)
     CPPFLAGS="$saveflags"
 
-    AC_LANG_C
+    AC_LANG([C])
     saveflags="$LDFLAGS"; test -n "$expatprefix" && LDFLAGS="$LDFLAGS -L$expatprefix/lib"
     AC_CHECK_LIB(expat, XML_ParserCreateNS, have_libexpat=yes, have_libexpat=no)
     LDFLAGS="$saveflags"
@@ -2055,7 +2058,7 @@ $linux_autoconf_include
 
 
     AC_CACHE_CHECK([for C++-includable kernel header files], [ac_cv_cxx_aware_system],
-        [AC_LANG_CPLUSPLUS
+        [AC_LANG([C++])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <linux/signal.h>
 #include <linux/skbuff.h>
@@ -2160,7 +2163,7 @@ void f1(int64_t) { // will fail if long long and int64_t are the same type
     fi
 
     AC_CACHE_CHECK([for <asm/alternative.h>], [ac_cv_linux_asm_alternative_h],
-        [AC_LANG_C
+        [AC_LANG([C])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <asm/alternative.h>]],
 [[]])],
@@ -2170,7 +2173,7 @@ void f1(int64_t) { // will fail if long long and int64_t are the same type
     fi
 
     AC_CACHE_CHECK([for <asm/scatterlist.h>], [ac_cv_linux_asm_scatterlist_h],
-        [AC_LANG_C
+        [AC_LANG([C])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <asm/scatterlist.h>]],
 [[]])],
@@ -2180,7 +2183,7 @@ void f1(int64_t) { // will fail if long long and int64_t are the same type
     fi
 
     AC_CACHE_CHECK([for <asm/system.h>], [ac_cv_linux_asm_system_h],
-        [AC_LANG_C
+        [AC_LANG([C])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <asm/system.h>]],
 [[]])],
@@ -2198,7 +2201,7 @@ void f1(int64_t) { // will fail if long long and int64_t are the same type
 
     dnl Linux kernel network configuration
 
-    AC_LANG_CPLUSPLUS
+    AC_LANG([C++])
     AC_CACHE_CHECK([whether struct sk_buff has a security member], [ac_cv_linuxmodule_skbuff_security],
         [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <linux/skbuff.h>]],
@@ -2408,7 +2411,7 @@ CFLAGS="$save_cflags"
     dnl Linux kernel file system configuration
 
     AC_CACHE_CHECK([whether struct super_block has an s_d_op member], [ac_cv_linuxmodule_super_block_s_d_op],
-        [AC_LANG_C
+        [AC_LANG([C])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <linux/fs.h>]],
 [[extern struct super_block *sb; sb->s_d_op = 0;]])],
@@ -2425,7 +2428,7 @@ CFLAGS="$save_cflags"
     fi
 
     AC_CACHE_CHECK([whether struct dentry has a d_child member], [ac_cv_linuxmodule_dentry_d_child],
-        [AC_LANG_C
+        [AC_LANG([C])
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([CLICK_LINUXMODULE_PROLOGUE()[
 #include <linux/fs.h>
 #include <linux/dcache.h>]],
diff --git a/elements/research/flowipmanager.cc b/elements/research/flowipmanager.cc
index 46883162badc9827ae5e8be068e59e6a5718b211..231e9372246f60cc4265f7c83e0c57bae472a0ac 100755
--- a/elements/research/flowipmanager.cc
+++ b/elements/research/flowipmanager.cc
@@ -314,6 +314,6 @@ void FlowIPManager::add_handlers()
 
 CLICK_ENDDECLS
 
-ELEMENT_REQUIRES(dpdk dpdk19)
+ELEMENT_REQUIRES(dpdk dpdk19 flow)
 EXPORT_ELEMENT(FlowIPManager)
 ELEMENT_MT_SAFE(FlowIPManager)
diff --git a/lib/dpdkdevice.cc b/lib/dpdkdevice.cc
index 1217a8b1c3a9fe471bec3e1d282e1d8f71a08092..773db76a8548a4619cbfbb277b4735715b70a6d2 100644
--- a/lib/dpdkdevice.cc
+++ b/lib/dpdkdevice.cc
@@ -68,7 +68,9 @@ extern "C" {
 #define DEV_TX_OFFLOAD_TCP_CKSUM RTE_ETH_TX_OFFLOAD_TCP_CKSUM
 #define DEV_TX_OFFLOAD_TCP_TSO RTE_ETH_TX_OFFLOAD_TCP_TSO
 #define DEV_TX_OFFLOAD_MULTI_SEGS RTE_ETH_TX_OFFLOAD_MULTI_SEGS
-#define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
+#ifndef RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
+# define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
+#endif
 
 //#define DEF_DEV_RXDESC DEF_RTE_ETH_RXDESC
 //#define DEF_DEV_TXDESC DEF_RTE_ETH_TXDESC
diff --git a/lib/fromfile.cc b/lib/fromfile.cc
index 1af5d8f37bdec9ebfb7084a321e41ea1b39c113a..6fa1e46ee47da818016dc0020aac0bedb442630c 100644
--- a/lib/fromfile.cc
+++ b/lib/fromfile.cc
@@ -577,12 +577,20 @@ FromFile::get_packet(size_t size, uint32_t sec, uint32_t subsec, ErrorHandler *e
 #else
     if (_pos + size <= _len) {
 
+#ifndef CLICK_NOINDIRECT
         if (Packet *p = _data_packet->clone()) {
             p->shrink_data(_buffer + _pos, size);
             p->timestamp_anno().assign(sec, subsec);
             _pos += size;
             return p;
         }
+#else
+        if (Packet *p = Packet::make(_buffer + _pos, size)) {
+            p->timestamp_anno().assign(sec, subsec);
+            _pos += size;
+            return p;
+        }
+#endif
     } else
 #endif
     {