diff --git a/Pcie40Applications/Makefile b/Pcie40Applications/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7835050db61539ae78ffe20dc5d23bdf53a29979
--- /dev/null
+++ b/Pcie40Applications/Makefile
@@ -0,0 +1,18 @@
+HERE :=$(strip $(realpath $(dir $(lastword $(MAKEFILE_LIST)))))
+TOP :=$(realpath $(HERE))
+
+include $(TOP)/flags.mk
+
+PCIE40_ECS :=pcie40_ecs
+PCIE40_ECS_OBJS =main_pcie40_ecs.o
+PCIE40_ECS_CFLAGS =$(CFLAGS) -I$(TOP) -I$(TOP)/../Pcie40DriverLibraries
+PCIE40_ECS_INSTALL =$(PREFIX)/bin
+PCIE40_ECS_LDFLAGS = -L../Pcie40Libraries/lib -lpcie40 -L../Pcie40DriverLibraries/ -lpcie40driver_ecs 
+VPATH :=$(TOP)
+
+include $(TOP)/rules.mk
+
+ifeq ($(ENABLE_PCIE40), true)
+$(eval $(call ODIR_template,PCIE40_ECS))
+endif
+$(eval $(call DEFAULT_template))
diff --git a/Pcie40Applications/flags.mk b/Pcie40Applications/flags.mk
new file mode 100755
index 0000000000000000000000000000000000000000..63a89a230a66776bb90c055d2fffcd6bc653c025
--- /dev/null
+++ b/Pcie40Applications/flags.mk
@@ -0,0 +1,36 @@
+#dg`make.flags` Several variables can be set in order to control what to build and what dependencies to enable, these can be set either in the environment, for example: <?
+# ENABLE_XXX=false make   # Set flag for single command, or
+# export ENABLE_XXX=false # export flag in environment and
+# make                    # reuse exported flags.
+#?>Or by directly editing the file ``common/flags.mk``.
+
+export ENABLE_DIM ?=true
+export ENABLE_MON ?=true
+export ENABLE_HWLOC ?=true
+export ENABLE_DOCRA ?=true
+#dg`make.flags`1 _ The following dependency flags are available: _
+# ENABLE_DIM::
+# Whether to include support for http://cern.ch/dim[DIM]. Default: *true*.
+# ENABLE_MON::
+# Whether to include the interface for DQMP (Data Quality Monitor and Presenter). Default: *true*.
+# ENABLE_HWLOC::
+# Whether to include support for the https://www.open-mpi.org/projects/hwloc[hwloc library] (will try to schedule threads processing data from a PCIe40 board on a core closest to the corresponding PCIe root complex). Default: *true*.
+# ENABLE_DOCRA::
+# Whether to generate the documentation (HTML and man pages). Requires docra and asciidoctor installed. Default: *true*.
+
+export ENABLE_DAQ40 ?=true
+export ENABLE_AMC40 ?=true
+export ENABLE_CCPC40 ?=false
+export ENABLE_PCIE40 ?=true
+#dg`make.flags`2 _ The following flags can be used to build only a subset of the targets: _
+# ENABLE_DAQ40::
+# Build tools and libraries that are common to both AMC40 and PCIe40 setups. Default: *true*.
+# ENABLE_AMC40::
+# Build tools and libraries specific to the AMC40 board. Default: *true*.
+# ENABLE_CCPC40::
+# Build tools and libraries specific to the AMC40 CCPC module. Default: *false*.
+# ENABLE_PCIE40::
+# Build tools and libraries specific the the PCIe40 board. Default: *true*.
+
+export PREFIX ?=/usr
+export DAQ40_PREFIX ?=/opt/lhcb/daq40
diff --git a/Pcie40Applications/main_pcie40_ecs.c b/Pcie40Applications/main_pcie40_ecs.c
new file mode 100644
index 0000000000000000000000000000000000000000..d66478fee45a152cb578150528502f670421ff7c
--- /dev/null
+++ b/Pcie40Applications/main_pcie40_ecs.c
@@ -0,0 +1,118 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "ecs_driverlib.h"
+
+static int flag_devnum = 0;
+static int flag_barnum = -1;
+static int flag_address = 0;
+static uint32_t flag_addroff;
+static int flag_write = 0;
+static uint32_t flag_writeval;
+static int flag_read = 0;
+
+//ug`pcie40_ecs.synopsis`
+// *pcie40_ecs* [-i _interface_] -b _bar_ -a _address_ -w _value_ _
+// *pcie40_ecs* [-i _interface_] -b _bar_ -a _address_ -r
+static void usage()
+{
+  fprintf(stderr, "usage: pcie40_ecs [options]\n");
+  fprintf(stderr, "  -h    Print this message\n");
+  fprintf(stderr, "  -i {} Interface number (default: 0)\n");
+  fprintf(stderr, "  -b {} BAR number\n");
+  fprintf(stderr, "  -a {} Register address\n");
+  fprintf(stderr, "  -w {} Write value to register\n");
+  fprintf(stderr, "  -r    Read register\n");
+}
+
+//ug`pcie40_ecs.description`
+// Reads and writes PCIe40 BAR0 and BAR2 registers over PCI Express.
+
+int main(int argc, char *argv[])
+{
+  while (argc > 1 && argv[1][0] == '-') {
+    switch (argv[1][1]) {
+
+      //ug`pcie40_ecs.options`interface
+      // *-i* _interface_::
+      // Bind to PCIe40 interface number _interface_. This is optional and by default the tool will bind to the first interface available (typically 0).
+      case 'i':
+        ++argv;
+        --argc;
+        flag_devnum = atoi(argv[1]);
+        break;
+
+      //ug`pcie40_ecs.options`bar
+      // *-b* _bar_::
+      // Access BAR number _bar_. Two PCI BARs are available:
+      // * 0 for user code (includes registers for DAQ, TFC, SCA...)
+      // * 2 for the common low-level interface
+      case 'b':
+        ++argv;
+        --argc;
+        flag_barnum = atoi(argv[1]);
+        break;
+
+      //ug`pcie40_ecs.options`address
+      // *-a* _address_::
+      // Address to use for BAR access. Can be in decimal, hexadecimal or any other format supported by *strtol(3)*.
+      case 'a':
+        ++argv;
+        --argc;
+        flag_address = 1;
+        flag_addroff = strtol(argv[1], NULL, 0);
+        break;
+
+      //ug`pcie40_ecs.options`write
+      // *-w* _value_::
+      // Write 32-bit _value_ to register at the given address. Same input format considerations apply as for the *-a* option.
+      case 'w':
+        ++argv;
+        --argc;
+        flag_write = 1;
+        flag_writeval = strtoul(argv[1], NULL, 0);
+        break;
+
+      //ug`pcie40_ecs.options`read
+      // *-r*::
+      // Read value of register at given address. Value is printed to stdout in hexadecimal format.
+      case 'r':
+        flag_read = 1;
+        break;
+
+      //ug`pcie40_ecs.options`help
+      // *-h*::
+      // Output short program synopsis and exit.
+      default:
+      case 'h':
+        usage();
+        exit(1);
+        break;
+    }
+    --argc;
+    ++argv;
+  }
+  //ug`pcie40_ecs.exit`
+  // -1 is returned in case of access error or wrong command line options, 0 otherwise.
+  if (!flag_address || flag_barnum < 0) {
+    usage();
+    exit(-1);
+  }
+  if (!flag_read && !flag_write) {
+    printf("-r and -w are mutually exclusive\n");
+    exit(-1);
+  }
+
+  uint32_t *regs;
+  int ecs = p40_ecs_open(flag_devnum, flag_barnum, &regs);
+
+  if (flag_write) {
+    p40_ecs_w32(regs, flag_addroff, flag_writeval);
+  } else if (flag_read) {
+    uint32_t reg = p40_ecs_r32(regs, flag_addroff);
+    printf("0x%08x", reg);
+  }
+  p40_ecs_close(ecs, regs);
+
+  return 0;
+}
diff --git a/Pcie40Applications/rules.mk b/Pcie40Applications/rules.mk
new file mode 100644
index 0000000000000000000000000000000000000000..38479046d3cd79a07122c28c8f4eeee3fdf8d870
--- /dev/null
+++ b/Pcie40Applications/rules.mk
@@ -0,0 +1,318 @@
+BUILD_PREFIX ?=
+LIBDIR_SUFFIX ?=64
+FLEX ?=flex
+LFLAGS ?=
+CFLAGS +=-Wall -g -O3
+CXXFLAGS +=-Wall -g -O3
+DOCRA ?=docra
+ASCIIDOCTOR ?=asciidoctor
+
+define INST_template #file, dst, mode
+INSTALL +=$(BUILD_PREFIX)$(2)/$(notdir $(1))
+ifeq (,$(wildcard $(HERE)/$(1)))
+# Installing using absolute path
+$(BUILD_PREFIX)$(2)/$(notdir $(1)): $(1)
+	@install -m 755 -d $(BUILD_PREFIX)$(2)
+	install -m $(3) $$< $(BUILD_PREFIX)$(2)
+else
+# Installing using relative path
+$(BUILD_PREFIX)$(2)/$(notdir $(1)): $(HERE)/$(1)
+	@install -m 755 -d $(BUILD_PREFIX)$(2)
+	install -m $(3) $$< $(BUILD_PREFIX)$(2)
+endif
+endef
+
+%.out/_dir: $(HERE)/Makefile $(TOP)/rules.mk $(TOP)/flags.mk
+	mkdir -p $*.out && touch $@
+
+define ODIR_template #var, [nodefault]
+ifneq ($(2),nodefault)
+	DEFAULT +=$$($(1))
+endif
+$(1)_ODIR :=$$($(1)).out
+$(1)_ODOT :=$$($(1)_ODIR)/_dir
+
+-include $$(addprefix $$($(1)_ODIR)/,$$($(1)_OBJS:.o=.d))
+
+ODIRS +=$$($(1)_ODIR)
+
+ifeq (,$(wildcard $(shell pwd)/Makefile))
+# Out-of-tree build, external libraries are built locally
+ifdef $(1)_LIBS_S
+$$($(1)): $$(notdir $$($(1)_LIBS_S))
+endif
+else
+# In-tree build, external libraries are in their source dir
+$$($(1)): $$($(1)_LIBS_S)
+endif
+
+ifdef $(1)_DEPS
+$$($(1)): $$($(1)_DEPS)
+endif
+
+######################
+ifdef $(1)_CXXFLAGS
+$(1)_CXXFLAGS +=-I$$($(1)_ODIR)
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: $(HERE)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: %.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: $$($(1)_ODIR)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.o: %.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: %.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $(HERE)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $(HERE)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $$($(1)_ODIR)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $$($(1)_ODIR)/%.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: %.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: %.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $(HERE)/%.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $(HERE)/%.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $$($(1)_ODIR)/%.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $$($(1)_ODIR)/%.c $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.l.cpp $$($(1)_ODIR)/%.l.hpp: $(HERE)/%.lpp $$($(1)_ODOT)
+	$(FLEX) $(LFLAGS) --outfile=$$($(1)_ODIR)/$$*.l.cpp --header-file=$$($(1)_ODIR)/$$*.l.hpp $$<
+
+$$($(1)_ODIR)/%.l.o: $$($(1)_ODIR)/%.l.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -Wno-sign-compare -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.l.pic.o: $$($(1)_ODIR)/%.l.cpp $$($(1)_ODOT)
+	$$(CXX) $$($(1)_CXXFLAGS) -fPIC -Wno-sign-compare -c -o $$@ $$<
+
+ifeq (,$(wildcard $(shell pwd)/Makefile))
+# Out-of-tree build, external libraries are built locally
+ifdef $(1)_LIBS_S
+$$($(1)): $$(notdir $$($(1)_LIBS_S))
+endif
+else
+# In-tree build, external libraries are in their source dir
+$$($(1)): $$($(1)_LIBS_S)
+endif
+
+ifdef $(1)_DEPS
+$$($(1)): $$($(1)_DEPS)
+endif
+
+ifdef $(1)_ARFLAGS
+$$($(1)): $$(addprefix $$($(1)_ODIR)/,$$($(1)_OBJS))
+	$(AR) $$($(1)_ARFLAGS) $$@ $$(filter %.o %.a,$$^)
+else
+$$($(1)): $$(addprefix $$($(1)_ODIR)/,$$($(1)_OBJS))
+	$(CXX) $$($(1)_CXXFLAGS) $$(filter %.o %.a,$$^) -o $$@ $$($(1)_LDFLAGS)
+endif
+
+######################
+else ifdef $(1)_CFLAGS
+$(1)_CFLAGS +=-I$$($(1)_ODIR)
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: $(HERE)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: %.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.d $$($(1)_ODIR)/%.pic.d: $$($(1)_ODIR)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -MM -MT $$(@:.d=.o) $$< > $$@
+
+$$($(1)_ODIR)/%.o: %.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: %.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $(HERE)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $(HERE)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.o: $$($(1)_ODIR)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.pic.o: $$($(1)_ODIR)/%.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -fPIC -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.l.c $$($(1)_ODIR)/%.l.h: $(HERE)/%.lpp $$($(1)_ODOT)
+	$(FLEX) $(LFLAGS) --outfile=$$($(1)_ODIR)/$$*.l.c --header-file=$$($(1)_ODIR)/$$*.l.h $$<
+
+$$($(1)_ODIR)/%.l.o: $$($(1)_ODIR)/%.l.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -fPIC -Wno-sign-compare -c -o $$@ $$<
+
+$$($(1)_ODIR)/%.l.pic.o: $$($(1)_ODIR)/%.l.c $$($(1)_ODOT)
+	$$(CC) $$($(1)_CFLAGS) -Wno-sign-compare -c -o $$@ $$<
+
+ifdef $(1)_ARFLAGS
+$$($(1)): $$(addprefix $$($(1)_ODIR)/,$$($(1)_OBJS))
+	$(AR) $$($(1)_ARFLAGS) $$@ $$^
+else
+$$($(1)): $$(addprefix $$($(1)_ODIR)/,$$($(1)_OBJS))
+	$(CC) $$($(1)_CFLAGS) $$^ -o $$@ $$($(1)_LDFLAGS)
+endif
+
+######################
+else
+#$$(error no compilation flags defined for target $(1))
+endif
+
+ifdef $(1)_INSTALL
+ifdef $(1)_ARFLAGS
+$$(eval $$(call INST_template,$($(1)),$($(1)_INSTALL),644))
+else
+$$(eval $$(call INST_template,$($(1)),$($(1)_INSTALL),755))
+endif
+endif
+endef
+
+define HDRS_template #var
+	$(foreach hdr,$($(1)_HDRS),$(eval $(call INST_template,$(hdr),$($(1)_HDRS_INSTALL),644)))
+endef
+
+define COPY_template #var, chmod
+	$(foreach hdr,$($(1)),$(eval $(call INST_template,$(hdr),$($(1)_INSTALL),$(2))))
+endef
+
+define LINK_template #var
+INSTALL +=$(BUILD_PREFIX)$($(1)_INSTALL)/$($(1))
+$(BUILD_PREFIX)$($(1)_INSTALL)/$($(1)): $(BUILD_PREFIX)$($(1)_LINK)
+	@install -m 755 -d $(BUILD_PREFIX)$($(1)_INSTALL)
+	ln -s $($(1)_LINK) $$@
+endef
+
+define DEP_template #file
+DEP_DIRS +=$(dir $(1))
+
+ifeq (,$(wildcard $(shell pwd)/Makefile))
+# Out-of-tree build, all targets go to the local folder
+DEFAULT +=$(notdir $(1))
+$(notdir $(1)):
+	$(MAKE) $(notdir $(1)) -f $(dir $(1))Makefile
+.PHONY: $(notdir $(1))
+else
+# In-tree build, each target goes into its source folder
+DEFAULT +=$(1)
+$(1):
+	$(MAKE) $(notdir $(1)) -C $(dir $(1))
+.PHONY: $(1)
+endif
+endef
+
+define MAN_template #var, mansection
+$(1)_ODIR :=$$($(1)).out
+$(1)_ODOT :=$$($(1)_ODIR)/_dir
+$(1)_MAN.ADOC :=$$($(1)_ODIR)/$$(patsubst %.dcrt,%.adoc,$$(notdir $$($(1)_MAN_DCRT)))
+$(1)_MAN :=$$($(1)_ODIR)/$$($(1)).$(2)
+$(1)_MAN.GZ :=$$($(1)_ODIR)/$$($(1)).$(2).gz
+
+MAN +=$$($(1)_MAN.GZ)
+
+ifeq ($(ENABLE_DOCRA), true)
+$$($(1)_MAN.ADOC): $$($(1)_ODOT)
+	docra -l 0 -o $$($(1)_ODIR) $$($(1)_MAN_FLAGS) $$(dir $$($(1)_MAN_DCRT)) $$($(1)_MAN_DCRT)
+
+$$($(1)_MAN): $$($(1)_MAN.ADOC)
+	$(ASCIIDOCTOR) -b manpage $$<
+
+$$($(1)_MAN.GZ): $$($(1)_MAN)
+	gzip -f $$^
+
+ifdef $(1)_MAN_INSTALL
+MANINSTALL +=$(BUILD_PREFIX)$($(1)_MAN_INSTALL)/man$(2)/$$($(1)).$(2).gz
+$(BUILD_PREFIX)$$($(1)_MAN_INSTALL)/man$(2)/$$($(1)).$(2).gz: $$($(1)_MAN.GZ)
+	@install -m 755 -d $(BUILD_PREFIX)$$($(1)_MAN_INSTALL)/man$(2)
+	@cp -v $$< $$@
+endif
+
+endif
+
+.PHONY: $$($(1)_MAN.ADOC) $$($(1)_MAN) $$($(1)_MAN.GZ)
+endef
+
+define ALIAS_template #aliasvar, var, mansection
+
+ifdef $(2)_INSTALL
+INSTALL +=$(BUILD_PREFIX)$($(2)_INSTALL)/$($(1))
+$(BUILD_PREFIX)$$($(2)_INSTALL)/$($(1)):
+	@install -m 755 -d $(BUILD_PREFIX)$$($(2)_INSTALL)
+	ln -s $$($(2)_INSTALL)/$$($(2)) $$@
+endif
+
+ifdef $(2)_MAN_INSTALL
+MANINSTALL +=$(BUILD_PREFIX)$($(2)_MAN_INSTALL)/man$(3)/$($(1)).$(3).gz
+$(BUILD_PREFIX)$$($(2)_MAN_INSTALL)/man$(3)/$$($(1)).$(3).gz:
+	@install -m 755 -d $(BUILD_PREFIX)$$($(2)_MAN_INSTALL)/man$(3)
+	ln -s $$($(2)_MAN_INSTALL)/man$(3)/$$($(2)).$(3).gz $$@
+endif
+
+endef
+
+#dg`make.sub` Each subfolder containing a ``Makefile`` can be build individually by simply issuing ``make`` from there. Dependencies on targets built in other subfolders will be built automatically. This can be used during development to quickly iterate on a single subproject.
+# By default, a sub-project ``Makefile`` implements at least the following targets: _
+# *default*::
+# Builds all library and executable targets.
+# *install*::
+# Copies installable files to their destination.
+# *uninstall*::
+# Removes files copied by both *install* and *maninstall*.
+# *man*::
+# Builds man pages.
+# *maninstall*::
+# Installs man pages under ``$(PREFIX)/share/man``.
+# *clean*::
+# Cleans build directory and deletes final targets.
+# *depclean*::
+# Makes the *clean* target in every dependency of this subproject.
+
+define DEFAULT_template
+default: $$(DEFAULT)
+
+install: $$(INSTALL)
+
+uninstall:
+	$$(RM) $$(INSTALL) $$(MANINSTALL)
+
+man: $$(MAN)
+
+maninstall: $$(MANINSTALL)
+
+clean:
+	$(RM) -r *.out/ $(ODIRS)
+	$(RM) $(DEFAULT)
+
+depclean:
+	for dep_dir in ${DEP_DIRS}; do $(MAKE) -C $$$${dep_dir} clean; done
+
+.PHONY: install uninstall man maninstall clean depclean
+endef
+
+default:
+
+.PHONY: default
diff --git a/Pcie40Libraries/Makefile b/Pcie40Libraries/Makefile
index 333c2da9fdbb4e571ab0b9b63d14c56161aeb315..057816812ed132fb3829094b63ecabb6d3ee86be 100644
--- a/Pcie40Libraries/Makefile
+++ b/Pcie40Libraries/Makefile
@@ -23,10 +23,6 @@ ECS_OBJ=$(ECS_SRC:%.c=$(OBJ_DIR)%.o)
 MINIPODS_SRC= i2cDriver.c
 MINIPODS_OBJ=$(MINIPODS_SRC:%.c=$(OBJ_DIR)%.o)
 
-#User
-USER_SRC= 
-USER_OBJ=$(USER_SRC:$(SRC_DIR)$(USER_DIR)%.c=$(OBJ_DIR)%.o)
-
 #LTC2990
 LTC2990_SRC= 
 LTC2990_OBJ=$(LTC2990_SRC:$(SRC_DIR)$(LTC2990_DIR)%.c=$(OBJ_DIR)%.o)
@@ -34,14 +30,11 @@ LTC2990_OBJ=$(LTC2990_SRC:$(SRC_DIR)$(LTC2990_DIR)%.c=$(OBJ_DIR)%.o)
 # static libraries
 ECS_LIB= libecs.a
 MINIPODS_LIB= libminipods.a
-USER_LIB= libuser.a
 LTC2990_LIB= libltc2990.a
 # dynamic libraries
-USER_DYNLIB= libuser-dyn.so
 LLI_DYNLIB= libpcie40.so
 
-
-all: $(ECS_OBJ) $(ECS_LIB) $(MINIPODS_OBJ) $(MINIPODS_LIB) $(LTC2990_OBJ) $(LTC2990_LIB) $(LLI_DYNLIB) $(USER_LIB) $(USER_DYNLIB)
+all: $(ECS_OBJ) $(ECS_LIB) $(MINIPODS_OBJ) $(MINIPODS_LIB) $(LTC2990_OBJ) $(LTC2990_LIB) $(LLI_DYNLIB)
 
 $(ECS_OBJ): $(OBJ_DIR)%.o : %.c
 	@echo "Construction of ecs objects $@ from $<"
@@ -74,21 +67,6 @@ $(LTC2990_LIB) : $(LTC2990_OBJ)
 	ar -q $(LIB_DIR)$(LTC2990_LIB) $(LTC2990_OBJ)
 	@echo ""
 
-$(USER_OBJ): $(OBJ_DIR)%.o : $(SRC_DIR)$(USER_DIR)%.c
-	@echo "Construction of $@ from $<"
-	$(CC) $(CFLAGS) -I $(INC_DIR)$(USER_DIR) -I $(INC_DIR)$(SYSTEM_DIR) -I $(INC_DIR)$(ECS_DIR)  -I $(PCIE40_INC_DIR) $< -o $@
-	@echo ""
-
-$(USER_LIB) : $(USER_OBJ)
-	@echo "Construction of USER Library"
-	ar -q $(LIB_DIR)$(USER_LIB) $(USER_OBJ) $(ECS_OBJ)
-	@echo ""
-
-$(USER_DYNLIB) : $(USER_OBJ)
-	@echo "Construction of dynamic USER Library"
-	$(CC) -o $(LIB_DIR)$(USER_DYNLIB) -shared $(USER_OBJ) $(ECS_OBJ)
-	@echo 
-
 $(LLI_DYNLIB) : $(ECS_OBJ) $(MINIPODS_OBJ)
 	@echo "Construction of dynamic LLI technical Library for V2"
 	mkdir -p lib
@@ -112,9 +90,6 @@ clean: mrproper
 	-rm $(LIB_DIR)$(LTC2990_LIB)
 	@echo ""
 
-	@echo "removing $(USER_LIB)"
-	-rm $(LIB_DIR)$(USER_LIB)
-	-rm $(LIB_DIR)$(USER_DYNLIB)
 	-rm $(LIB_DIR)$(LLI_DYNLIB)
 	-rm -r $(LIB_DIR)
 
diff --git a/Scripts/setup.sh b/Scripts/setup.sh
index c4792f21903a0ad694345aaef30970238dace5cf..6fce6117a42ee2867590b6ed637fcfefa02805dd 100644
--- a/Scripts/setup.sh
+++ b/Scripts/setup.sh
@@ -1,5 +1,5 @@
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 export PYTHONPATH=${PYTHONPATH}:${DIR}/../Python
 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../Pcie40Libraries/lib:../Pcie40DriverLibraries
-export PATH=${PATH}:${DIR}/../Driver/pcie40_reload:${DIR}/../Driver/pcie40
+export PATH=${PATH}:${DIR}/../Pcie40Applications