diff --git a/.gitignore b/.gitignore
index 1e60f8c731d9e8f54bb5615e3c2a4d86fb503bc0..dd07ddc67c632ebb7d054362ac9c3d32add83406 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ qosmngr
 *.xml
 .DS_Store
 include/version.h
+test/cmocka/unit_test_qos
+test/cmocka/functional_test_qos
diff --git a/Makefile b/Makefile
index ac07a382d29973585ee915df531e746c7994089f..46c8eaa8aaa361262b4689bc8e9164c29e262717 100644
--- a/Makefile
+++ b/Makefile
@@ -3,43 +3,61 @@ include common.mk
 
 QOSMNGR_LIB=libqosmngr.so
 
-QOSMNGR_LIB_DIR	?= $(shell dirname $(PWD))
-QOSMNGR_LDFLAGS	= -lqosmngr -L$(QOSMNGR_LIB_DIR)
-
 GCOV=gcov
-CODECOVERAGE_SRC = src/qosmngr.c
+CODECOVERAGE_SRC = qosmngr.c
+
+PROG = $(PROJECT_TOPLEVEL)/qosmngr
+SHARED_LIB = $(PROJECT_TOPLEVEL)/libqosmngr.so
+OBJS = main.o qosmngr.o
 
-subdirs ?= src
+PROG_CFLAGS = $(CFLAGS) -I$(INCLUDE_DIR) -Wall -fstrict-aliasing
+PROG_LDFLAGS = $(LDFLAGS)
+PROG_LIBS = $(COMMON_LDFLAGS) -lgcov
 
 .PHONY: all clean
 
-all clean:
-	@for i in $(subdirs) ; do [ -d $$i ] && $(MAKE) -C $$i $@; done
+all: version $(PROG)
 
-qosmngr:
-	$(MAKE) all -C src
+$(PROG): $(INCLUDE_DIR)/version.h $(OBJS)
+	$(CC) $(PROG_LDFLAGS) -o $@ $^ $(PROG_LIBS)
 
 ${QOSMNGR_LIB}:
-	$(MAKE) CFLAGS+=-fPIC lib -C src
+	$(CC) $(PROG_LDFLAGS) -shared -o $@ $^ $(PROG_LIBS)
 
-test: ${QOSMNGR_LIB}
+$(SHARED_LIB): $(INCLUDE_DIR)/version.h $(OBJS)
 
-unit-test: coverage
-	$(MAKE) -C test/cmocka unit-test QOSMNGR_LIB_DIR=$(PWD)
+version: $(INCLUDE_DIR)/version.h
 
-functional-test: coverage
-	$(MAKE) -C test/cmocka functional-test QOSMNGR_LIB_DIR=$(PWD)
+$(INCLUDE_DIR)/version.h: $(PROJECT_TOPLEVEL)/VERSION
+	@(dirty=$(shell (git status --porcelain | grep -q .) && echo -dirty); \
+	[ -f $(PROJECT_TOPLEVEL)/VERSION ] && basever=$(shell cat $(PROJECT_TOPLEVEL)/VERSION) || \
+		basever=Unknown; \
+	xver=$(shell date +'%y%V%u-%H%M'); \
+	echo "const char *qosmngr_base_version = \"$$basever\";" > $@; \
+	echo "const char *qosmngr_xtra_version = \"$$xver$$dirty\";" >> $@; \
+	)
+
+test: ${QOSMNGR_LIB}
 
-coverage: CFLAGS  += -g -O0 -fprofile-arcs -ftest-coverage -fPIC
+coverage: CFLAGS += -g -O0 -fprofile-arcs -ftest-coverage -fPIC
 coverage: LDFLAGS += --coverage
-coverage: test qosmngr
+coverage: test $(PROG)
 	$(foreach testprog, $(CODECOVERAGE_SRC), $(GCOV) $(testprog);)
 
+unit-test: test
+	$(MAKE) -C test/cmocka unit-test
+
+functional-test: test
+	$(MAKE) -C test/cmocka functional-test
+
+%.o: %.c
+	$(CC) $(PROG_CFLAGS) $(FPIC) -c -o $@ $<
+
 clean:
-	rm -f *.o libqosmngr.so $(PROG)
+	rm -f *.o $(SHARED_LIB) $(PROG) $(INCLUDE_DIR)/version.h
 	rm -f *.xml *.html
 	find -name '*.gcda' -exec rm {} -fv \;
 	find -name '*.gcno' -exec rm {} -fv \;
 	find -name '*.gcov' -exec rm {} -fv \;
 	make -C test/cmocka clean
-	make -C src clean
+
diff --git a/common.mk b/common.mk
index 99737477f4125b6eaf7c34161a027c3c7b7f2a19..2069d995aa3ca88ec33b63e567bc9a444a94935e 100644
--- a/common.mk
+++ b/common.mk
@@ -4,3 +4,7 @@ INCLUDE_DIR = $(PROJECT_TOPLEVEL)/include
 
 # Common compiler options
 CC=gcc # gcc || clang
+
+COMMON_LDFLAGS = -luci -lubus -lubox -ljson-c -lblobmsg_json -lnl-genl-3 -lnl-3 -lqos
+QOSMNGR_LIB_DIR	?= $(shell dirname $(PWD))
+QOSMNGR_LDFLAGS	= -lqosmngr -L$(QOSMNGR_LIB_DIR)
diff --git a/src/main.c b/main.c
similarity index 100%
rename from src/main.c
rename to main.c
diff --git a/src/qosmngr.c b/qosmngr.c
similarity index 100%
rename from src/qosmngr.c
rename to qosmngr.c
diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644
index 28859ee9cca469c7d53287fab59266a703427636..0000000000000000000000000000000000000000
--- a/src/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-include ../common.mk
-
-PROG = $(PROJECT_TOPLEVEL)/qosmngr
-SHARED_LIB = $(PROJECT_TOPLEVEL)/libqosmngr.so
-
-OBJS = main.o qosmngr.o
-
-PROG_CFLAGS = $(CFLAGS) -I$(INCLUDE_DIR) -Wall -fstrict-aliasing
-PROG_LDFLAGS = $(LDFLAGS)
-PROG_LIBS = -luci -lubus -lubox -ljson-c -lblobmsg_json -lnl-genl-3 -lnl-3 -lgcov -leasy -lqos
-
-%.o: %.c
-	$(CC) $(PROG_CFLAGS) $(FPIC) -c -o $@ $<
-
-.PHONY: clean
-
-all: $(PROG)
-
-lib: $(SHARED_LIB)
-
-$(SHARED_LIB): $(INCLUDE_DIR)/version.h $(OBJS)
-	$(CC) $(PROG_LDFLAGS) -shared -o $@ $^ $(PROG_LIBS)
-
-version: $(INCLUDE_DIR)/version.h
-
-$(INCLUDE_DIR)/version.h: $(PROJECT_TOPLEVEL)/VERSION
-	@(dirty=$(shell (git status --porcelain | grep -q .) && echo -dirty); \
-	[ -f $(PROJECT_TOPLEVEL)/VERSION ] && basever=$(shell cat $(PROJECT_TOPLEVEL)/VERSION) || \
-		basever=Unknown; \
-	xver=$(shell date +'%y%V%u-%H%M'); \
-	echo "const char *qosmngr_base_version = \"$$basever\";" > $@; \
-	echo "const char *qosmngr_xtra_version = \"$$xver$$dirty\";" >> $@; \
-	)
-
-$(PROG): $(INCLUDE_DIR)/version.h $(OBJS)
-	$(CC) $(PROG_LDFLAGS) -o $@ $^ $(PROG_LIBS)
-
-clean:
-	rm -f *.o $(SHARED_LIB) $(PROG) $(INCLUDE_DIR)/version.h
diff --git a/test/Makefile b/test/Makefile
deleted file mode 100644
index 9f654d8fb97e6ddde85683392bbaa4e7967d08b2..0000000000000000000000000000000000000000
--- a/test/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-include ../common.mk
-
-GCOV		= gcov
-CODECOVERAGE_SRC = qosmngr.c
-
-all:
-	
\ No newline at end of file
diff --git a/test/cmocka/Makefile b/test/cmocka/Makefile
index 1732db1243081d45c2706425d7120853b4a7dff9..5f5240e7f35e86cc3a5bd1b92913928bf917c8d2 100644
--- a/test/cmocka/Makefile
+++ b/test/cmocka/Makefile
@@ -1,12 +1,10 @@
 include ../../common.mk
 
-CC		= gcc
-QOSMNGR_LIB_DIR	?= $(shell dirname $(PWD))
-QOSMNGR_LIB	= -lqosmngr -L$(QOSMNGR_LIB_DIR)
-CMOCKA_LIB	= -l cmocka
-LIBS		= $(QOSMNGR_LIB) $(CMOCKA_LIB) -lqos -pthread -luci -lubus -lubox -ljson-c -lblobmsg_json -lnl-genl-3 -lnl-3 -ljson-validator -ljson-schema-validator -ljson-editor
-CFLAGS		= -g -Wall -I$(INCLUDE_DIR)
-LDFLAGS		= $(LIBS) -Wl,-rpath=$(QOSMNGR_LIB_DIR) -I$(QOSMNGR_LIB_DIR)
+QOSMNGR_LIB_DIR = $(PROJECT_TOPLEVEL)
+CMOCKA_LIB	= -lcmocka
+LIBS		= $(QOSMNGR_LDFLAGS) $(CMOCKA_LIB) -lpthread $(COMMON_LDFLAGS) -ljson-validator -ljson-schema-validator -ljson-editor
+CFLAGS		= -g -Wall -O0 -fprofile-arcs -ftest-coverage -fPIC -I$(INCLUDE_DIR)
+LDFLAGS		= $(LIBS) -Wl,-rpath=$(QOSMNGR_LIB_DIR) -I$(QOSMNGR_LIB_DIR) --coverage
 UNIT_TESTS	= unit_test_qos
 FUNCTIONAL_TESTS = functional_test_qos
 
@@ -21,7 +19,7 @@ unit_test_qos: unit_test_qos.o
 	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
 
 functional_test_qos: functional_test_qos.o
-	$(CC) -o $@ $^ $(LDFLAGS)
+	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
 
 unit-test: $(UNIT_TESTS)
 	$(foreach testprog, $(UNIT_TESTS), sudo $(VALGRIND) ./$(testprog);)
@@ -32,4 +30,4 @@ functional-test: $(FUNCTIONAL_TESTS)
 .PHONY: clean
 
 clean:
-	rm $(UNIT_TESTS) *.o -fv
+	rm $(UNIT_TESTS) $(FUNCTIONAL_TESTS) *.o *.gcno *.gcda -fv