diff --git a/configure b/configure
index d82cfba3ac677dcb4806a0b2cb8fbbabe97205a1..66541b3418d10460e455be20bffc8bad60b10a99 100755
--- a/configure
+++ b/configure
@@ -16327,6 +16327,10 @@ pcap.h and/or -lpcap not found; user-level driver can't steal packets.
     HAVE_USERLEVEL_DRIVER=1
 fi
 
+if test "x$enable_dpdk_packet" = "xyes" -a "x$HAVE_NETMAP" = "xyes"; then
+        as_fn_error $? "--with-netmap is not compatible with --enable-dpdk-packet " "$LINENO" 5
+fi
+
 if test "x$enable_netmap_pool" = "xyes"; then
     if test "x$HAVE_NETMAP" != "xyes"; then
         as_fn_error $? "
diff --git a/configure.in b/configure.in
index e2d9ae8132d1c77d75af37a1cecf8e759fd4d786..dd5ca5c1c658b14845c5344a30ccd8c482dab041 100644
--- a/configure.in
+++ b/configure.in
@@ -1828,6 +1828,10 @@ pcap.h and/or -lpcap not found; user-level driver can't steal packets.
     HAVE_USERLEVEL_DRIVER=1
 fi
 
+if test "x$enable_dpdk_packet" = "xyes" -a "x$HAVE_NETMAP" = "xyes"; then
+        AC_MSG_ERROR([--with-netmap is not compatible with --enable-dpdk-packet ])
+fi
+
 if test "x$enable_netmap_pool" = "xyes"; then
     if test "x$HAVE_NETMAP" != "xyes"; then
         AC_MSG_ERROR([
diff --git a/deps.sh b/deps.sh
old mode 100644
new mode 100755
index 2968785163e9542a1f950025509ee71544d989e9..23ca32effa682bd0b796218d27c4c71075fbc2a0
--- a/deps.sh
+++ b/deps.sh
@@ -1,6 +1,11 @@
 #!/bin/sh
 # This installs dependencies for both DPDK and FastClick, support for apt-get(Debian, Ubuntu, ...) and apk (Alpine) for now. PRs are welcome.
 
+opt=0
+if [ $1 = "--optional" ] ; then
+    opt=1
+fi
+
 echo "Installing dependencies..." ;
 if ( command -v apt-get &> /dev/null ) ; then
     echo "Using apt-get"
@@ -10,6 +15,10 @@ if ( command -v apt-get &> /dev/null ) ; then
     if apt-cache search --names-only $header &> /dev/null ;  then
        apt-get install -yqq $header
     fi
+    if [ $opt -eq 1 ] ; then
+        echo "Installing optional dependencies"
+        apt-get install -yqq libmicrohttpd-dev libhyperscan-dev libpci-dev libbpf-dev libpapi-dev libre2-dev llvm-dev
+    fi
 elif ( command -v apk &> /dev/null ) ; then
     echo "Using apk"
     echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
diff --git a/elements/analysis/checknumberpacket.hh b/elements/analysis/checknumberpacket.hh
index 5bbbdf1c994e21ec1a50699bb0025b8f8fdf6590..2cfcf444246cefdc6f727a4a5d1a9b50bff6d245 100644
--- a/elements/analysis/checknumberpacket.hh
+++ b/elements/analysis/checknumberpacket.hh
@@ -11,7 +11,7 @@ CLICK_DECLS
 
 CheckNumberPacket() Check increasing number inside packet
 
-=s analysis
+=s timestamps
 
 =d
 
diff --git a/elements/analysis/numberpacket.hh b/elements/analysis/numberpacket.hh
index c6d956d5a34fd9facec8543183fc63955a673d80..6dcaf00746763f96d159bd2b7cc03ac743d432c2 100644
--- a/elements/analysis/numberpacket.hh
+++ b/elements/analysis/numberpacket.hh
@@ -11,7 +11,7 @@ CLICK_DECLS
 
 NumberPacket() Set an increasing number inside packet
 
-=s analysis
+=s timestamps
 
 =d
 
diff --git a/elements/analysis/replay.hh b/elements/analysis/replay.hh
index c83b3f179ce114e0df3d8d37b035708349df8881..4db4af2c30d6bf2b588e328edede0aa3eea167ce 100644
--- a/elements/analysis/replay.hh
+++ b/elements/analysis/replay.hh
@@ -167,7 +167,7 @@ replay an input of packets at a given speed, pull to push
 
 Technically equivalent to Replay->Unqueue-> it is more efficient.
 
-Keyword arguments are the same than @Replay, with the addition of:
+Keyword arguments are the same than Replay, with the addition of:
 
 =over 8
 
diff --git a/elements/ctx/midstat.hh b/elements/ctx/midstat.hh
index a87964bd2a644a6438e3d54c0e6f31759d8cd226..bb1f232dc000ade780090fa9716c1b347acd9784 100644
--- a/elements/ctx/midstat.hh
+++ b/elements/ctx/midstat.hh
@@ -33,7 +33,9 @@ MidStat([CLOSECONNECTION])
 
 Count the number of bytes and packets in sessions.
 
-This element is not context aware. So it would count dups etc. FlowCounter is.
+=d
+
+This element is not context aware. So it would count dups etc.
 
 =a FlowCounter
  */
diff --git a/elements/flow/flowcounter.cc b/elements/flow/flowcounter.cc
index dce40415f3e03122423436f47e111a27384bae3d..a0a87eb535c5339e0c80d3db323de0864523d31d 100644
--- a/elements/flow/flowcounter.cc
+++ b/elements/flow/flowcounter.cc
@@ -11,7 +11,7 @@
 
 CLICK_DECLS
 
-FlowCounter::FlowCounter()
+FlowCounter::FlowCounter() : StatVector(Vector<int>(32768,0))
 {
 
 }
@@ -32,7 +32,7 @@ void FlowCounter::push_flow(int, int* fcb, PacketBatch* flow)
 }
 
 
-enum { h_count };
+enum { h_count, h_open };
 
 String
 FlowCounter::read_handler(Element *e, void *thunk)
@@ -43,6 +43,10 @@ FlowCounter::read_handler(Element *e, void *thunk)
           PER_THREAD_MEMBER_SUM(uint64_t,count, fd->_state, count);
           return String(count);
                     }
+       case h_open: {
+          PER_THREAD_MEMBER_SUM(uint64_t,open, fd->_state, open);
+          return String(open);
+            }
       default:
           return "<error>";
     }
@@ -57,6 +61,8 @@ FlowCounter::write_handler(const String &s_in, Element *e, void *thunk, ErrorHan
 void
 FlowCounter::add_handlers() {
     add_read_handler("count", read_handler, h_count);
+    add_read_handler("open", read_handler, h_open);
+    add_stat_handler(this);
 }
 
 CLICK_ENDDECLS
diff --git a/elements/flow/flowcounter.hh b/elements/flow/flowcounter.hh
index 89cb9f35d576248c090d943fc41d3e23fdd8333a..71fc9b9ebe8f0e4d6fac5ee11af764313435b9f0 100644
--- a/elements/flow/flowcounter.hh
+++ b/elements/flow/flowcounter.hh
@@ -3,6 +3,7 @@
 #include <click/element.hh>
 #include <click/vector.hh>
 #include <click/multithread.hh>
+#include <click/statvector.hh>
 #include <click/flow/flowelement.hh>
 
 CLICK_DECLS
@@ -15,13 +16,42 @@ FlowCounter([CLOSECONNECTION])
 
 =s flow
 
-Counts all flows passing by, the number of active flows, and the number of 
-packets per flow.
+Counts the number of flows and packets per flow
+
+=d
+
+This element uses the flow subsystem to count the number of flows passing by,
+the one considered still active (using the upstream FlowManager's definition of
+active flow) and the number of packets per flow.
+
+
+=h count
+
+Returns the number of flows seen
+
+=h open
+
+Returns the number of flows currently active
+
+=h average
+
+Returns the average length of a flow
+
+=h median
+
+Returns the median length of flows
+
+=h dump
+
+Print the histogram of flow sizes
+
+
+=a MidStat
 
  */
 
 
-class FlowCounter : public FlowStateElement<FlowCounter,int>
+class FlowCounter : public FlowStateElement<FlowCounter,int>, StatVector<int>
 {
 public:
     /** @brief Construct an FlowCounter element
@@ -36,10 +66,10 @@ public:
 
     void release_flow(int* fcb) {
         _state->open--;
-        if (_state->lengths.size() < *fcb) {
-            _state->lengths.resize(*fcb, 0);
-        }
-        _state->lengths[*fcb - 1]++;
+        unsigned n = *fcb - 1;
+        if (n > 32767)
+            n = 32767;
+        (*stats)[n]++;
     }
 
     const static int timeout = 15000;
@@ -55,11 +85,9 @@ public:
     void add_handlers() override CLICK_COLD;
 protected:
 
-
     struct fcstate {
         long count;
         long open;
-        Vector<int> lengths;
     };
     per_thread<fcstate> _state;
 
diff --git a/elements/flow/tcpreorder.hh b/elements/flow/tcpreorder.hh
index 9b5fe660f3c00dae4ff7d2063ca1160975f284d1..5b8cacf2ffa37ec3b7ae070eef59d16d7c0b541e 100644
--- a/elements/flow/tcpreorder.hh
+++ b/elements/flow/tcpreorder.hh
@@ -72,12 +72,12 @@ is reused after a RST, the other side will see packets out of order.
 Proper implementation needs a "dual" state, something only accessible after
 TCPIn
 
-=d
-
 This element reorders TCP packets before sending them on its first output. It can be used outside
 of the stack of the middlebox. The second output is optional and is used to push retransmitted
 packets. If the second output is not used, retransmitted packets are dropped.
 
+=over 8
+
 =item FLOWDIRECTION
 
 ID of the path for the connection (0 or 1). The return path must have the other ID.
@@ -95,6 +95,8 @@ Where k is the number of packets in the batch and n is the number of packets in
 
 Default value: true.
 
+=back
+
 =a TCPIn, TCPOut, TCPRetransmitter */
 
 class TCPReorder : public FlowSpaceElement<fcb_tcpreorder>, public TCPHelper
diff --git a/elements/standard/averagecounter.hh b/elements/standard/averagecounter.hh
index 7dc803762536bd1ae09562577caa3c896c044aff..c1164505c1a08584a3475dca364a73ffcac7f858 100644
--- a/elements/standard/averagecounter.hh
+++ b/elements/standard/averagecounter.hh
@@ -38,6 +38,9 @@ CLICK_DECLS
  *
  * =h reset write-only
  * Resets the count and rate to zero.
+ *
+ * =a
+ * AverageCounterMP, AverageCounterIMP
  */
 
 template <typename Stats>
@@ -125,6 +128,20 @@ class AverageCounter : public AverageCounterBase<AverageCounterStats<uint64_t> >
     const char *class_name() const override		{ return "AverageCounter"; }
 };
 
+/*
+ * =c
+ * AverageCounterMP
+ *
+ * =s counters
+ * measures historical packet count and rate, atomic version
+ *
+ * =d
+ *
+ * Check AverageCounter for documentation*
+ * *
+ * =a
+ * AverageCounter, AverageCounterIMP
+ */
 class AverageCounterMP : public AverageCounterBase<AverageCounterStats<atomic_uint64_t> > { public:
     AverageCounterMP() CLICK_COLD;
 
@@ -181,6 +198,20 @@ struct AverageCounterStatsIMP {
     inline void set_last(uint64_t last){ _counts->last = last; }
 };
 
+/*
+ * =c
+ * AverageCounterIMP
+ *
+ * =s counters
+ * measures historical packet count and rate, per-thread version
+ *
+ * =d
+ *
+ * Check AverageCounter for documentation*
+ * *
+ * =a
+ * AverageCounter, AverageCounterMP
+ */
 class AverageCounterIMP : public AverageCounterBase<AverageCounterStatsIMP> { public:
     AverageCounterIMP() CLICK_COLD;
 
diff --git a/elements/userlevel/fromdump.hh b/elements/userlevel/fromdump.hh
index 99903bee872c80b263d872ecb9b9aa220acad3c5..9305d3063d0621a932fb8f8d8c8ad475e1493552 100644
--- a/elements/userlevel/fromdump.hh
+++ b/elements/userlevel/fromdump.hh
@@ -127,7 +127,7 @@ if TIMING is not true. Defaults to 100, the original time.
 String. A function that can be used to change the ACCELERATION according to 
 the current time. The parsing uses TinyFNT and therefore follows the format.
 The variable containing the time is x. E.g. "10 + min(90,10*x)" will have an
-acceleration from 10 to 100% in 9 seconds. See @ReplayUnqueue for more details.
+acceleration from 10 to 100% in 9 seconds. See ReplayUnqueue for more details.
 Ineffective if TIMING is not true. Defaults to an empty string (inactive).
 
 =item BURST
diff --git a/elements/userlevel/xdploader.hh b/elements/userlevel/xdploader.hh
index dd8c11b27599d00aa94f5fe628f884682b52794d..57126ab7c56dc75a28e66392428532077c0dbac3 100644
--- a/elements/userlevel/xdploader.hh
+++ b/elements/userlevel/xdploader.hh
@@ -16,9 +16,12 @@ CLICK_DECLS
 
 
 /*
+
+=title XDPLoader
+
 =c
 
-XDPLoader
+XDPLoader(PATH, DEV, [CLEAN])
 
 =s 
 
diff --git a/etc/build_wiki.sh b/etc/build_wiki.sh
index 92adea782b8721f40a4fa835f5d88be01e2868b0..a1eb9e67f2c94cfd00f99d862dd8af0a75891620 100755
--- a/etc/build_wiki.sh
+++ b/etc/build_wiki.sh
@@ -1,3 +1,4 @@
 #!/bin/bash
+sudo ./deps.sh --optional
 ./configure CXXFLAGS="-std=gnu++11" --enable-user-multithread --disable-verbose-batch --enable-simtime --disable-clone --enable-dpdk --enable-all-elements --enable-flow --enable-batch --enable-ctx --enable-cpu-load --enable-rsspp --enable-flow-api --with-netmap=../netmap/sys/ --enable-user-timestamp
 make -C doc install-man-markdown O=$(pwd)/../fastclick.wiki/elements
diff --git a/include/click/statvector.hh b/include/click/statvector.hh
index 7659b49fc069f08afeab991f41678bc39d26cc23..6cb1da648893b73d770ed8bc574fece73c4d8151 100644
--- a/include/click/statvector.hh
+++ b/include/click/statvector.hh
@@ -14,7 +14,7 @@ class StatVector {
 
 
 
-    enum{H_MEDIAN,H_AVERAGE,H_DUMP,H_MAX_OBS,H_N_OBS,H_NZ,H_MAX,H_MAX_OBS_VAL};
+    enum{H_MEDIAN=736,H_AVERAGE,H_DUMP,H_MAX_OBS,H_N_OBS,H_NZ,H_MAX,H_MAX_OBS_VAL};
 
     static String read_handler(Element *e, void *thunk)
     {