diff -Nur httpd/compile_and_install.sh httpd.new/compile_and_install.sh
--- httpd/compile_and_install.sh	1970-01-01 01:00:00.000000000 +0100
+++ httpd.new/compile_and_install.sh	2017-11-02 23:48:05.049844778 +0100
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+set -ex
+
+# Directory with honggfuzz installation
+HFUZZ_DIR="/home/jagger/src/honggfuzz"
+# Change this to a directory where apache should be installed into
+INSTALL_PREFIX="$(realpath "$PWD/../dist")"
+NGHTTP2_VER=1.29.0
+APR_VER=1.6.3
+APR_UTIL_VER=1.6.1
+CFLAGS_SAN="-fsanitize=address"
+# Another viable option: few
+APACHE_MODULES=most
+
+NGHTTP2_PATH="$(realpath "$PWD/../nghttp2-$NGHTTP2_VER")/"
+APR_PATH="$(realpath "$PWD/../apr-$APR_VER")"
+APR_UTIL_PATH="$(realpath "$PWD/../apr-util-$APR_UTIL_VER")/"
+
+export CC="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang"
+export CXX="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang++"
+
+echo "Compiling APR"
+cd "$APR_PATH"
+CFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Compiling APR-UTIL"
+cd "$APR_UTIL_PATH"
+CFLAGS="$CFLAGS_SAN" ./configure --with-apr="$APR_PATH" --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Compiling NGHTTP2"
+cd "$NGHTTP2_PATH"
+CFLAGS="$CFLAGS_SAN" CXXFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Install PATH: $INSTALL_PREFIX"
+./buildconf --with-apr="$APR_PATH" --with-apr-util="$APR_UTIL_PATH"
+
+echo "Compiling HTTPD"
+CC="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang" CXX="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang++" CFLAGS="-I$NGHTTP2_PATH/lib/includes $CFLAGS_SAN -ggdb -O3" LDFLAGS="-L$NGHTTP2_PATH/lib -lpthread" \
+./configure \
+		--prefix="$INSTALL_PREFIX" \
+		--with-nghttp2="$NGHTTP2_PATH/" \
+		--enable-http2 \
+		--enable-nghttp2-staticlib-deps \
+		--with-mpm=event \
+		--enable-unixd \
+		--disable-pie \
+		--enable-mods-static=$APACHE_MODULES \
+		--with-apr="$APR_PATH" \
+		--with-apr-util="$APR_UTIL_PATH"
+make clean
+make -j$(nproc)
+make install
diff -Nur httpd/configure.in httpd.new/configure.in
--- httpd/configure.in	2017-11-02 23:48:27.717470876 +0100
+++ httpd.new/configure.in	2017-11-02 23:48:05.053844712 +0100
@@ -721,7 +721,7 @@
 if test "x$PKGCONFIG" != "x" && `$PKGCONFIG --atleast-version='0.9.12' check`; then
   UNITTEST_CFLAGS=`$PKGCONFIG --cflags check`
   UNITTEST_LIBS=`$PKGCONFIG --libs check`
-  other_targets="$other_targets test/httpdunit"
+  other_targets="$other_targets"
 
   AC_MSG_RESULT([yes])
 else
diff -Nur httpd/server/main.c httpd.new/server/main.c
--- httpd/server/main.c	2017-11-02 23:48:27.913467639 +0100
+++ httpd.new/server/main.c	2017-11-02 23:48:05.053844712 +0100
@@ -484,8 +484,84 @@
     destroy_and_exit_process(process, 1);
 }
 
-int main(int argc, const char * const argv[])
-{
+#include <libhfuzz/libhfuzz.h>
+
+static void GETDATA(void *unused) {
+  usleep(100000);
+
+  for (;;) {
+    size_t len;
+    const uint8_t *buf;
+
+    HF_ITER(&buf, &len);
+
+    int myfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
+    if (myfd == -1) {
+      perror("socket");
+      _exit(1);
+    }
+
+    int sz = (1024 * 1024);
+    if (setsockopt(myfd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)) == -1) {
+      perror("setsockopt");
+      exit(1);
+    }
+
+    struct sockaddr_in saddr;
+    saddr.sin_family = AF_INET;
+    saddr.sin_port = htons(8080);
+    saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    if (connect(myfd, &saddr, sizeof(saddr)) == -1) {
+      perror("connect");
+      close(myfd);
+      continue;
+    }
+
+    if (send(myfd, buf, len, MSG_NOSIGNAL) != len) {
+      perror("send() failed 1");
+      exit(1);
+    }
+
+    if (shutdown(myfd, SHUT_WR) == -1) {
+      perror("shutdown");
+      exit(1);
+    }
+
+    char b[1024 * 1024];
+    while (recv(myfd, b, sizeof(b), MSG_WAITALL) > 0) {} ;
+
+    close(myfd);
+  }
+}
+
+static void LAUNCHTHR() {
+  if (linuxEnterNs(CLONE_NEWUSER|CLONE_NEWNET|CLONE_NEWNS|CLONE_NEWIPC|CLONE_NEWUTS) == false) {
+    exit(1);
+  }
+  if (linuxIfaceUp("lo") == false) {
+    exit(1);
+  }
+  if (linuxMountTmpfs("/tmp") == false) {
+    exit(1);
+  }
+
+  pthread_t t;
+  pthread_attr_t attr;
+
+  pthread_attr_init(&attr);
+  pthread_attr_setstacksize(&attr, 1024 * 1024 * 8);
+  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+  pthread_create(&t, &attr, GETDATA,  NULL);
+}
+
+ int main(int argc, const char * const argv[])
+ {
+
+  if (getenv("NO_FUZZ") == NULL) {
+        LAUNCHTHR();
+  }
+
     char c;
     int showcompile = 0, showdirectives = 0;
     const char *confname = SERVER_CONFIG_FILE;
