diff --git a/Makefile b/Makefile
index 34a6f320c4ad059fc7926ba387136591df547445..6765abae73f083237ff35ea0773ba6bda1ea88f8 100644
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,8 @@ MAKE ?=		make
 
 # Select board in which we will work. Options are: ml605 or afcv3
 BOARD ?= ml605
+# Select which application we want to generate. Options are: ebpm
+APP ?= ebpm
 # Select if we want to have the AFCv3 DDR memory shrink to 2^28 or the full size 2^32. Options are: (y)es ot (n)o.
 # This is a TEMPORARY fix until the AFCv3 FPGA firmware is fixed. If unsure, select (y)es.
 SHRINK_AFCV3_DDR_SIZE ?= y
@@ -29,10 +31,10 @@ FMC130M_4CH_EEPROM_PROGRAM ?=
 WITH_DEV_MNGR ?= y
 # Selects the AFE RFFE version. Options are: 2
 AFE_RFFE_TYPE ?= 2
-# Selects if we want to compile DEVIO Config. Options are: y(es) or n(o).
+# Selects if we want to compile specfic APP Config. Options are: y(es) or n(o).
 # If selected, the FPGA firmware must have the AFC diagnostics module
 # synthesized.
-WITH_DEVIO_CFG ?= y
+WITH_APP_CFG ?= y
 # Selects the install location of the config file
 PREFIX ?= /usr/local
 export PREFIX
@@ -117,9 +119,9 @@ ifeq ($(AFE_RFFE_TYPE),2)
 CFLAGS_USR += -D__AFE_RFFE_V2__
 endif
 
-# Compile DEVIO Config or not
-ifeq ($(WITH_DEVIO_CFG),y)
-CFLAGS_USR += -D__WITH_DEVIO_CFG__
+# Compile APP Config or not
+ifeq ($(WITH_APP_CFG),y)
+CFLAGS_USR += -D__WITH_APP_CFG__
 endif
 
 ifneq ($(CFG_DIR),)
@@ -189,6 +191,7 @@ include $(SRC_DIR)/dev_io/dev_io.mk
 include $(SRC_DIR)/msg/msg.mk
 include $(SRC_DIR)/revision/revision.mk
 include $(SRC_DIR)/boards/$(BOARD)/board.mk
+include $(SRC_DIR)/apps/$(APP)/$(APP).mk
 
 # Project boards
 boards_INCLUDE_DIRS = -Iinclude/boards/$(BOARD)
@@ -205,32 +208,26 @@ override CFLAGS += $(CFLAGS_USR) $(CFLAGS_PLATFORM) $(CFLAGS_DEBUG) $(CPPFLAGS)
 override LDFLAGS += $(LDFLAGS_PLATFORM)
 
 # Output modules
-OUT = $(dev_mngr_OUT) $(dev_io_OUT)
+OUT = $(dev_mngr_OUT) $($(APP)_OUT)
 
 # All possible output modules
-ALL_OUT = $(dev_mngr_all_OUT) $(dev_io_all_OUT)
+ALL_OUT = $(dev_mngr_all_OUT) $($(APP)_all_OUT)
 
 # Out objects
 dev_mngr_OBJS += $(dev_mngr_core_OBJS) $(debug_OBJS) \
                  $(exp_ops_OBJS) $(thsafe_msg_zmq_OBJS) \
                  $(ll_io_utils_OBJS) $(dev_io_core_utils_OBJS)
 
-dev_io_OBJS += $(dev_io_core_OBJS) $(ll_io_OBJS) \
+$(APP)_OBJS += $(dev_io_core_OBJS) $(ll_io_OBJS) \
                $(sm_io_OBJS) $(msg_OBJS) $(board_OBJS)
 
-dev_io_cfg_OBJS += $(dev_io_core_OBJS) $(ll_io_OBJS) \
-                   $(sm_io_OBJS) $(msg_OBJS) $(board_OBJS)
+$(APP)_cfg_OBJS += $(dev_io_core_OBJS) $(ll_io_OBJS) \
+               $(sm_io_OBJS) $(msg_OBJS) $(board_OBJS)
 
 # Specific libraries for OUT targets
 dev_mngr_LIBS =
 dev_mngr_STATIC_LIBS =
 
-dev_io_LIBS = -lbsmp
-dev_io_STATIC_LIBS =
-
-dev_io_cfg_LIBS = -lbsmp
-dev_io_cfg_STATIC_LIBS =
-
 .SECONDEXPANSION:
 
 # Save a git repository description
@@ -242,8 +239,8 @@ OBJS_all = $(ll_io_OBJS) \
 	   $(sm_io_OBJS) \
 	   $(msg_OBJS) \
 	   $(dev_mngr_OBJS) \
-	   $(dev_io_OBJS) \
-	   $(dev_io_cfg_OBJS) \
+	   $($(APP)_OBJS) \
+	   $($(APP)_cfg_OBJS) \
 	   $(revision_OBJS)
 
 # Sources
diff --git a/compile.sh b/compile.sh
index 9e451637a139846c1dd1c0772cfb7b86cff92bce..982db0d1ad5e097ce8426727624ef4f053bb01e3 100755
--- a/compile.sh
+++ b/compile.sh
@@ -1,6 +1,7 @@
 #!/usr/bin/env bash
 
 VALID_BOARDS_STR="Valid values are: \"ml605\" and \"afcv3\"."
+VALID_APPS_STR="Valid values are: \"ebpm\"."
 VALID_WITH_EXAMPLES_STR="Valid values are: \"with_examples\" or \"without_examples\"."
 VALID_WITH_LIBS_LINK_STR="Valid values are: \"with_libs_link\" or \"without_libs_link\"."
 
@@ -21,14 +22,27 @@ if [ "$BOARD" != "afcv3" ] && [ "$BOARD" != "ml605" ]; then
     exit 1
 fi
 
-WITH_EXAMPLES=$2
+# Select board in which we will work. Options are: ml605 or afcv3
+APP=$2
+
+if [ -z "$APP" ]; then
+    echo "\"APP\" variable unset. "$VALID_APPS_STR
+    exit 1
+fi
+
+if [ "$APP" != "ebpm" ]; then
+    echo "Unsupported application. "$VALID_APPS_STR
+    exit 1
+fi
+
+WITH_EXAMPLES=$3
 
 if [ -n "$WITH_EXAMPLES" ] && [ "$WITH_EXAMPLES" != "with_examples" ] && [ "$WITH_EXAMPLES" != "without_examples" ]; then
     echo "Wrong variable value. "$VALID_WITH_EXAMPLES_STR
     exit 1
 fi
 
-WITH_LIBS_LINK=$3
+WITH_LIBS_LINK=$4
 
 if [ -n "$WITH_LIBS_LINK" ] && [ "$WITH_LIBS_LINK" != "with_libs_link" ] && [ "$WITH_LIBS_LINK" != "without_libs_link" ]; then
     echo "Wrong variable value. "$VALID_WITH_LIBS_LINK_STR
@@ -37,7 +51,7 @@ fi
 
 EXTRA_FLAGS=()
 # Get all other arguments
-for item in "${@:4}"
+for item in "${@:5}"
 do
     EXTRA_FLAGS+=("${item}")
 done
@@ -65,7 +79,7 @@ AFE_RFFE_TYPE=2
 # Selects if we want to compile DEVIO Config. Options are: y(es) or n(o).
 # If selected, the FPGA firmware must have the AFC diagnostics module
 # synthesized.
-WITH_DEVIO_CFG=y
+WITH_APP_CFG=y
 # Selects the install location of the config file
 CFG_FILENAME=/etc/bpm_sw/bpm_sw.cfg
 # Selects the install location of the config file
@@ -93,6 +107,7 @@ COMMAND_HAL="\
     make \
     ${EXTRA_FLAGS[@]} \
     BOARD=${BOARD} \
+    APP=${APP} \
     SHRINK_AFCV3_DDR_SIZE=${SHRINK_AFCV3_DDR_SIZE} \
     ERRHAND_DBG=${ERRHAND_DBG} \
     ERRHAND_MIN_LEVEL=${ERRHAND_MIN_LEVEL} \
@@ -102,7 +117,7 @@ COMMAND_HAL="\
     FMC130M_4CH_EEPROM_PROGRAM=${FMC130M_4CH_EEPROM_PROGRAM} \
     WITH_DEV_MNGR=${WITH_DEV_MNGR} \
     AFE_RFFE_TYPE=${AFE_RFFE_TYPE} \
-    WITH_DEVIO_CFG=${WITH_DEVIO_CFG} \
+    WITH_APP_CFG=${WITH_APP_CFG} \
     CFG_DIR=${CFG_DIR} && \
     make CFG=${CFG} ${EXTRA_FLAGS[@]} install"
 
diff --git a/src/dev_io/dev_io.c b/src/apps/ebpm/dev_io.c
similarity index 99%
rename from src/dev_io/dev_io.c
rename to src/apps/ebpm/dev_io.c
index 60b05440b531fa03d13bd702d76bbff34196bae1..51d5638ae15a35d8b11193b290eaf9665acbe74e 100644
--- a/src/dev_io/dev_io.c
+++ b/src/apps/ebpm/dev_io.c
@@ -261,7 +261,7 @@ int main (int argc, char *argv[])
 
     /* Spawn the Configure DEVIO to get the uTCA slot number. This is only
      * available in AFCv3 */
-#if defined (__BOARD_AFCV3__) && (__WITH_DEVIO_CFG__)
+#if defined (__BOARD_AFCV3__) && (__WITH_APP_CFG__)
     int child_devio_cfg_pid = 0;
     if (llio_type == PCIE_DEV) {
         /* Argument options are "process name", "device type" and
@@ -455,7 +455,7 @@ err_devio_log_filename_alloc:
     hutils_wait_chld ();
     devio_destroy (&devio);
 err_card_slot:
-#if defined (__BOARD_AFCV3__) && (__WITH_DEVIO_CFG__)
+#if defined (__BOARD_AFCV3__) && (__WITH_APP_CFG__)
     if (client_cfg != NULL) {
         bpm_client_destroy (&client_cfg);
     }
diff --git a/src/dev_io/dev_io_cfg.c b/src/apps/ebpm/dev_io_cfg.c
similarity index 100%
rename from src/dev_io/dev_io_cfg.c
rename to src/apps/ebpm/dev_io_cfg.c
diff --git a/src/apps/ebpm/ebpm.mk b/src/apps/ebpm/ebpm.mk
new file mode 100644
index 0000000000000000000000000000000000000000..3a45a2250a6ed26e3db8714d5d063b6503052e84
--- /dev/null
+++ b/src/apps/ebpm/ebpm.mk
@@ -0,0 +1,23 @@
+ebpm_DIR = $(SRC_DIR)/apps/ebpm
+
+ebpm_OBJS = $(ebpm_DIR)/dev_io.o
+
+ebpm_OUT = ebpm
+
+ifeq ($(WITH_APP_CFG),y)
+ebpm_cfg_OBJS = $(ebpm_DIR)/dev_io_cfg.o
+ebpm_cfg_OUT = ebpm_cfg
+else
+ebpm_cfg_OBJS =
+ebpm_cfg_OUT =
+endif
+
+ebpm_OUT += $(ebpm_cfg_OUT)
+
+ebpm_all_OUT = ebpm ebpm_cfg
+
+ebpm_LIBS = -lbsmp
+ebpm_STATIC_LIBS =
+
+ebpm_cfg_LIBS = -lbsmp
+ebpm_cfg_STATIC_LIBS =
diff --git a/src/dev_io/dev_io.mk b/src/dev_io/dev_io.mk
index 7232d923257cfe568a3a5369e9d16f78354843f6..65e2e572cef911c3d7270b23c62e7385aba684e1 100644
--- a/src/dev_io/dev_io.mk
+++ b/src/dev_io/dev_io.mk
@@ -9,18 +9,3 @@ dev_io_core_OBJS = $(dev_io_DIR)/dev_io_core.o \
 		   $(dev_io_DIR)/dev_io_err.o \
 		   $(dev_io_core_utils_OBJS)
 
-dev_io_OBJS = $(dev_io_DIR)/dev_io.o
-
-dev_io_OUT = dev_io
-
-ifeq ($(WITH_DEVIO_CFG),y)
-dev_io_cfg_OBJS = $(dev_io_DIR)/dev_io_cfg.o
-dev_io_cfg_OUT = dev_io_cfg
-else
-dev_io_cfg_OBJS =
-dev_io_cfg_OUT =
-endif
-
-dev_io_OUT += $(dev_io_cfg_OUT)
-
-dev_io_all_OUT = dev_io dev_io_cfg