diff --git a/Makefile b/Makefile
index 5b5ecca..1c90a3e 100644
--- a/Makefile
+++ b/Makefile
@@ -61,8 +61,7 @@
 #          by "haproxy -vv" in CFLAGS.
 #   SILENT_DEFINE may be used to specify other defines which will not be
 #     reported by "haproxy -vv".
-#   EXTRA   is used to force building or not building some extra tools. By
-#           default on Linux 2.6+, it contains "haproxy-systemd-wrapper".
+#   EXTRA   is used to force building or not building some extra tools.
 #   DESTDIR is not set by default and is used for installation only.
 #           It might be useful to set DESTDIR if you want to install haproxy
 #           in a sandbox.
@@ -175,7 +174,7 @@
 DEFINE =
 SILENT_DEFINE =
 
-#### extra programs to build (eg: haproxy-systemd-wrapper)
+#### extra programs to build
 # Force this to enable building extra programs or to disable them.
 # It's automatically appended depending on the targets.
 EXTRA =
@@ -266,7 +265,6 @@
   USE_TPROXY      = implicit
   USE_LIBCRYPT    = implicit
   USE_FUTEX       = implicit
-  EXTRA          += haproxy-systemd-wrapper
   USE_DL          = implicit
 else
 ifeq ($(TARGET),linux2628)
@@ -282,7 +280,6 @@
   USE_FUTEX       = implicit
   USE_CPU_AFFINITY= implicit
   ASSUME_SPLICE_WORKS= implicit
-  EXTRA          += haproxy-systemd-wrapper
   USE_DL          = implicit
 else
 ifeq ($(TARGET),solaris)
@@ -835,7 +832,6 @@
 OBJS += src/trace.o
 endif
 
-WRAPPER_OBJS = src/haproxy-systemd-wrapper.o
 
 # Not used right now
 LIB_EBTREE = $(EBTREE_DIR)/libebtree.a
@@ -850,9 +846,6 @@
 haproxy: $(OPTIONS_OBJS) $(EBTREE_OBJS) $(OBJS)
 	$(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS)
 
-haproxy-systemd-wrapper: $(WRAPPER_OBJS)
-	$(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS)
-
 $(LIB_EBTREE): $(EBTREE_OBJS)
 	$(AR) rv $@ $^
 
@@ -875,11 +868,6 @@
 	      -DBUILD_OPTIONS='"$(strip $(BUILD_OPTIONS))"' \
 	       -c -o $@ $<
 
-src/haproxy-systemd-wrapper.o:	src/haproxy-systemd-wrapper.c $(DEP)
-	$(CC) $(COPTS) \
-	      -DSBINDIR='"$(strip $(SBINDIR))"' \
-	       -c -o $@ $<
-
 src/dlmalloc.o: $(DLMALLOC_SRC) $(DEP)
 	$(CC) $(COPTS) -DDEFAULT_MMAP_THRESHOLD=$(DLMALLOC_THRES) -c -o $@ $<
 
@@ -915,14 +903,12 @@
 	done
 	-rmdir "$(DESTDIR)$(DOCDIR)"
 	rm -f "$(DESTDIR)$(SBINDIR)"/haproxy
-	rm -f "$(DESTDIR)$(SBINDIR)"/haproxy-systemd-wrapper
 
 clean:
 	rm -f *.[oas] src/*.[oas] ebtree/*.[oas] haproxy test .build_opts .build_opts.new
 	for dir in . src include/* doc ebtree; do rm -f $$dir/*~ $$dir/*.rej $$dir/core; done
 	rm -f haproxy-$(VERSION).tar.gz haproxy-$(VERSION)$(SUBVERS).tar.gz
 	rm -f haproxy-$(VERSION) haproxy-$(VERSION)$(SUBVERS) nohup.out gmon.out
-	rm -f haproxy-systemd-wrapper
 
 tags:
 	find src include \( -name '*.c' -o -name '*.h' \) -print0 | \
diff --git a/contrib/systemd/haproxy.service.in b/contrib/systemd/haproxy.service.in
index ca38d70..81b4951 100644
--- a/contrib/systemd/haproxy.service.in
+++ b/contrib/systemd/haproxy.service.in
@@ -7,7 +7,7 @@
 # socket if you want seamless reloads.
 Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
 ExecStartPre=@SBINDIR@/haproxy -f $CONFIG -c -q
-ExecStart=@SBINDIR@/haproxy-systemd-wrapper -f $CONFIG -p $PIDFILE
+ExecStart=@SBINDIR@/haproxy -W -f $CONFIG -p $PIDFILE
 ExecReload=@SBINDIR@/haproxy -f $CONFIG -c -q
 ExecReload=/bin/kill -USR2 $MAINPID
 KillMode=mixed
diff --git a/src/haproxy-systemd-wrapper.c b/src/haproxy-systemd-wrapper.c
deleted file mode 100644
index 457f5bd..0000000
--- a/src/haproxy-systemd-wrapper.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Wrapper to make haproxy systemd-compliant.
- *
- * Copyright 2013 Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/wait.h>
-
-#define REEXEC_FLAG "HAPROXY_SYSTEMD_REEXEC"
-#define SD_DEBUG "<7>"
-#define SD_NOTICE "<5>"
-
-static volatile sig_atomic_t caught_signal;
-
-static char *pid_file = "/run/haproxy.pid";
-static int wrapper_argc;
-static char **wrapper_argv;
-
-static void setup_signal_handler();
-static void pause_signal_handler();
-static void reset_signal_handler();
-
-
-/* returns the path to the haproxy binary into <buffer>, whose size indicated
- * in <buffer_size> must be at least 1 byte long.
- */
-static void locate_haproxy(char *buffer, size_t buffer_size)
-{
-	char *end = NULL;
-	int len;
-
-	len = readlink("/proc/self/exe", buffer, buffer_size - 1);
-	if (len == -1)
-		goto fail;
-
-	buffer[len] = 0;
-	end = strrchr(buffer, '/');
-	if (end == NULL)
-		goto fail;
-
-	if (strcmp(end + strlen(end) - 16, "-systemd-wrapper") == 0) {
-		end[strlen(end) - 16] = '\0';
-		return;
-	}
-
-	end[1] = '\0';
-	strncpy(end + 1, "haproxy", buffer + buffer_size - (end + 1));
-	buffer[buffer_size - 1] = '\0';
-	return;
- fail:
-	strncpy(buffer, "/usr/sbin/haproxy", buffer_size);
-	buffer[buffer_size - 1] = '\0';
-	return;
-}
-
-/* Note: this function must not exit in case of error (except in the child), as
- * it is only dedicated the starting a new haproxy process. By keeping the
- * process alive it will ensure that future signal delivery may get rid of
- * the issue. If the first startup fails, the wrapper will notice it and
- * return an error thanks to wait() returning ECHILD.
- */
-static void spawn_haproxy(char **pid_strv, int nb_pid)
-{
-	char haproxy_bin[512];
-	pid_t pid;
-	int main_argc;
-	char **main_argv;
-	int pipefd[2];
-	char fdstr[20];
-	int ret;
-
-	main_argc = wrapper_argc - 1;
-	main_argv = wrapper_argv + 1;
-
-	if (pipe(pipefd) != 0) {
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to create a pipe, please try again later.\n");
-		return;
-	}
-
-	pid = fork();
-	if (!pid) {
-		char **argv;
-		char *stats_socket = NULL;
-		int i;
-		int argno = 0;
-
-		/* 3 for "haproxy -Ds -sf" */
-		if (nb_pid > 0)
-			stats_socket = getenv("HAPROXY_STATS_SOCKET");
-		argv = calloc(4 + main_argc + nb_pid + 1 +
-		    (stats_socket != NULL ? 2 : 0), sizeof(char *));
-		if (!argv) {
-			fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to calloc(), please try again later.\n");
-			exit(1);
-		}
-
-		reset_signal_handler();
-
-		close(pipefd[0]); /* close the read side */
-
-		snprintf(fdstr, sizeof(fdstr), "%d", pipefd[1]);
-		if (setenv("HAPROXY_WRAPPER_FD", fdstr, 1) != 0) {
-			fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to setenv(), please try again later.\n");
-			exit(1);
-		}
-
-		locate_haproxy(haproxy_bin, 512);
-		argv[argno++] = haproxy_bin;
-		for (i = 0; i < main_argc; ++i)
-			argv[argno++] = main_argv[i];
-		argv[argno++] = "-Ds";
-		if (nb_pid > 0) {
-			argv[argno++] = "-sf";
-			for (i = 0; i < nb_pid; ++i)
-				argv[argno++] = pid_strv[i];
-			if (stats_socket != NULL) {
-				argv[argno++] = "-x";
-				argv[argno++] = stats_socket;
-			}
-		}
-		argv[argno] = NULL;
-
-		fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: executing ");
-		for (i = 0; argv[i]; ++i)
-			fprintf(stderr, "%s ", argv[i]);
-		fprintf(stderr, "\n");
-
-		execv(argv[0], argv);
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: execv(%s) failed, please try again later.\n", argv[0]);
-		exit(1);
-	}
-	else if (pid == -1) {
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to fork(), please try again later.\n");
-	}
-
-	/* The parent closes the write side and waits for the child to close it
-	 * as well. Also deal the case where the fd would unexpectedly be 1 or 2
-	 * by silently draining all data.
-	 */
-	close(pipefd[1]);
-
-	do {
-		char c;
-		ret = read(pipefd[0], &c, sizeof(c));
-	} while ((ret > 0) || (ret == -1 && errno == EINTR));
-	/* the child has finished starting up */
-	close(pipefd[0]);
-}
-
-static int read_pids(char ***pid_strv)
-{
-	FILE *f = fopen(pid_file, "r");
-	int read = 0, allocated = 8;
-	char pid_str[10];
-
-	if (!f)
-		return 0;
-
-	*pid_strv = malloc(allocated * sizeof(char *));
-	while (1 == fscanf(f, "%s\n", pid_str)) {
-		if (read == allocated) {
-			allocated *= 2;
-			*pid_strv = realloc(*pid_strv, allocated * sizeof(char *));
-		}
-		(*pid_strv)[read++] = strdup(pid_str);
-	}
-
-	fclose(f);
-
-	return read;
-}
-
-static void signal_handler(int signum)
-{
-	if (caught_signal != SIGINT && caught_signal != SIGTERM)
-		caught_signal = signum;
-}
-
-static void setup_signal_handler()
-{
-	struct sigaction sa;
-
-	memset(&sa, 0, sizeof(struct sigaction));
-	sa.sa_handler = &signal_handler;
-	sigaction(SIGUSR2, &sa, NULL);
-	sigaction(SIGHUP, &sa, NULL);
-	sigaction(SIGINT, &sa, NULL);
-	sigaction(SIGTERM, &sa, NULL);
-}
-
-static void pause_signal_handler()
-{
-	signal(SIGUSR2, SIG_IGN);
-	signal(SIGHUP,  SIG_IGN);
-	signal(SIGINT,  SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-}
-
-static void reset_signal_handler()
-{
-	signal(SIGUSR2, SIG_DFL);
-	signal(SIGHUP,  SIG_DFL);
-	signal(SIGINT,  SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-}
-
-/* handles SIGUSR2 and SIGHUP only */
-static void do_restart(int sig)
-{
-	setenv(REEXEC_FLAG, "1", 1);
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-executing on %s.\n",
-	        sig == SIGUSR2 ? "SIGUSR2" : "SIGHUP");
-
-	/* don't let the other process take one of those signals by accident */
-	pause_signal_handler();
-	execv(wrapper_argv[0], wrapper_argv);
-	/* failed, let's reinstall the signal handler and continue */
-	setup_signal_handler();
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-exec(%s) failed.\n", wrapper_argv[0]);
-}
-
-/* handles SIGTERM and SIGINT only */
-static void do_shutdown(int sig)
-{
-	int i, pid;
-	char **pid_strv = NULL;
-	int nb_pid = read_pids(&pid_strv);
-	for (i = 0; i < nb_pid; ++i) {
-		pid = atoi(pid_strv[i]);
-		if (pid > 0) {
-			fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: %s -> %d.\n",
-			        sig == SIGTERM ? "SIGTERM" : "SIGINT", pid);
-			kill(pid, sig);
-			free(pid_strv[i]);
-		}
-	}
-	free(pid_strv);
-}
-
-static void init(int argc, char **argv)
-{
-	while (argc > 1) {
-		if ((*argv)[0] == '-' && (*argv)[1] == 'p') {
-			pid_file = *(argv + 1);
-		}
-		--argc; ++argv;
-	}
-}
-
-int main(int argc, char **argv)
-{
-	int status;
-
-	setup_signal_handler();
-
-	wrapper_argc = argc;
-	wrapper_argv = argv;
-
-	--argc; ++argv;
-	init(argc, argv);
-
-	if (getenv(REEXEC_FLAG) != NULL) {
-		/* We are being re-executed: restart HAProxy gracefully */
-		int i;
-		char **pid_strv = NULL;
-		int nb_pid = read_pids(&pid_strv);
-
-		unsetenv(REEXEC_FLAG);
-		spawn_haproxy(pid_strv, nb_pid);
-
-		for (i = 0; i < nb_pid; ++i)
-			free(pid_strv[i]);
-		free(pid_strv);
-	}
-	else {
-		/* Start a fresh copy of HAProxy */
-		spawn_haproxy(NULL, 0);
-	}
-
-	status = -1;
-	while (caught_signal || wait(&status) != -1 || errno == EINTR) {
-		int sig = caught_signal;
-
-		if (caught_signal == SIGUSR2 || caught_signal == SIGHUP) {
-			caught_signal = 0;
-			do_restart(sig);
-		}
-		else if (caught_signal == SIGINT || caught_signal == SIGTERM) {
-			caught_signal = 0;
-			do_shutdown(sig);
-		}
-	}
-
-	/* return either exit code or signal+128 */
-	if (WIFEXITED(status))
-		status = WEXITSTATUS(status);
-	else if (WIFSIGNALED(status))
-		status = 128 + WTERMSIG(status);
-	else if (WIFSTOPPED(status))
-		status = 128 + WSTOPSIG(status);
-	else
-		status = 255;
-
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: exit, haproxy RC=%d\n",
-			status);
-	return status;
-}
