diff --git a/Makefile b/Makefile
index 45e9b48f8a7b669af4e1f344250a923fa964a62c..ca4ccd6fc4d582c7fe4d624db5145c971f6dc4ec 100644
--- a/Makefile
+++ b/Makefile
@@ -3,12 +3,22 @@ override CPPFLAGS	+= --std=c++1z
 override CPPFLAGS	+= -MMD -MP
 override CPPFLAGS	+= -I./include
 override CPPFLAGS	+= $(shell cat .cxxflags 2> /dev/null | xargs)
+override LDLIBS		+= -lstdc++fs
+
+ifneq ($(shell cat COPYRIGHT 2> /dev/null),)
+COPYRIGHT ?= COPYRIGHT
+else
+COPYRIGHT ?= /dev/null
+endif
 
 PREFIX	:= $(DESTDIR)/usr/local
+INCDIR	:= $(PREFIX)/include
 BINDIR	:= $(PREFIX)/bin
 
-SOURCES	:= $(shell echo *.cpp)
+SOURCES	:= $(wildcard *.cpp)
 SCRIPTS	:= $(shell find -name *.sh)
+MAKETMP	:= $(wildcard make_templates/*)
+INCLUDE	:= $(MAKETMP:%=$(INCDIR)/%)
 TEMPDIR	:= temp
 DISTDIR := out
 OUT		:= $(SOURCES:%.cpp=$(DISTDIR)/%)
@@ -26,25 +36,30 @@ $(TEMPDIR)/%.o: %.cpp | $(TEMPDIR)
 	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
 
 $(TEMPDIR):
-	@mkdir $@
+	@mkdir -p $@
 
 $(DISTDIR):
-	@mkdir $@
+	@mkdir -p $@
 
 clean:
 	@rm $(DEPENDS) 2> /dev/null || true
 	@rm $(OBJECTS) 2> /dev/null || true
-	@rmdir $(TEMPDIR) 2> /dev/null || true
+	@rmdir -p $(TEMPDIR) 2> /dev/null || true
 	@echo Temporaries cleaned!
 
 distclean: clean
 	@rm $(OUT) 2> /dev/null || true
-	@rmdir $(DISTDIR) 2> /dev/null || true
+	@rmdir -p $(DISTDIR) 2> /dev/null || true
 	@echo All clean!
 
-install: $(TARGET)
+install: $(TARGET) $(INCLUDE)
 	@echo Install complete!
 
+$(INCDIR)/make_templates/%: ./make_templates/% $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
 $(BINDIR)/%: $(DISTDIR)/% | $(BINDIR)
 	install --strip $< $@
 
@@ -52,11 +67,11 @@ $(BINDIR)/%: ./%.sh | $(BINDIR)
 	install $< $@
 
 $(BINDIR):
-	@mkdir $@
+	@mkdir -p $@
 
 uninstall:
 	-rm $(TARGET)
-	@rmdir $(BINDIR) 2> /dev/null || true
+	@rmdir -p $(BINDIR) 2> /dev/null || true
 	@echo Uninstall complete!
 
 -include $(DEPENDS)
diff --git a/make_templates/header_only_lib b/make_templates/header_only_lib
new file mode 100644
index 0000000000000000000000000000000000000000..cebc88c2d77501409ed7fcc0f94c23d8aeb6d97c
--- /dev/null
+++ b/make_templates/header_only_lib
@@ -0,0 +1,49 @@
+TAREGT_INCLUDE := include
+COPYRIGHT	:= COPYRIGHT
+
+PREFIX	:= $(DESTDIR)/usr/local
+INCDIR	:= $(PREFIX)/$(TAREGT_INCLUDE)
+
+SRCDIR	:= ./source
+HEADERS	:= $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h")
+INCLUDE	:= $(HEADERS:$(SRCDIR)/%=$(INCDIR)/%)
+INCDIRS	:= $(shell dirname $(INCLUDE))
+
+default:
+	@echo This is a pure header library, so there is nothing to build. You can still install/uninstall or test.
+
+install: $(INCLUDE)
+	@echo Install complete!
+
+$(INCDIR)/%.h: $(SRCDIR)/%.h $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
+$(INCDIR)/%.hpp: $(SRCDIR)/%.hpp $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
+uninstall:
+	-rm $(INCLUDE)
+	@rmdir -p $(INCDIRS) 2> /dev/null || true
+	@echo Uninstall complete!
+
+TESTMAKE = +@$(MAKE) --no-print-directory -C unit_tests/
+
+test:
+	@$(TESTMAKE)
+
+test-clean:
+	@$(TESTMAKE) clean
+
+test-cleanrun:
+	@$(TESTMAKE) cleanrun
+	@$(TESTMAKE) run
+
+test-all: testclean test
+
+clean: test-clean
+
+.PHONY : clean uninstall test test-clean test-cleanrun test-all
diff --git a/make_templates/static_lib b/make_templates/static_lib
new file mode 100644
index 0000000000000000000000000000000000000000..98367316580482bf768c9fb15c34af0ea350d2e5
--- /dev/null
+++ b/make_templates/static_lib
@@ -0,0 +1,106 @@
+override	CPPFLAGS	+= --std=c++1z
+override	CPPFLAGS	+= -MMD -MP
+override	CPPFLAGS	+= -I./include
+override	CPPFLAGS	+= $(shell cat .cxxflags 2> /dev/null | xargs)
+
+ARFLAGS	:= $(ARFLAGS)c
+
+TAREGT_INCLUDE := include
+TAREGT_SOURCE := source
+TAREGT_LIB	:= lib
+LOCAL_TEMP	:= .
+LOCAL_DIST	:= .
+
+COPYRIGHT	:= COPYRIGHT
+
+PREFIX	:= $(DESTDIR)/usr/local
+INCDIR	:= $(PREFIX)/$(TAREGT_INCLUDE)
+LIBDIR	:= $(PREFIX)/$(TAREGT_LIB)
+TARGET_SRCDIR	:= $(PREFIX)/$(TAREGT_SOURCE)
+
+SRCDIR	:= ./source
+TEMPDIR	:= temp/$(LOCAL_TEMP)
+DISTDIR	:= out/$(LOCAL_DIST)
+ifeq ($(origin TARGET), undefined)
+TARGET	:= $(shell pwd | xargs basename).a
+endif
+OUT		:= $(DISTDIR)/$(TARGET)
+
+HEADERS	:= $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h")
+INCLUDE	:= $(HEADERS:$(SRCDIR)/%=$(INCDIR)/%)
+INCDIRS	:= $(shell dirname $(INCLUDE))
+
+SOURCES	:= $(shell find -wholename "$(SRCDIR)/*.cpp")
+TARGET_SOURCES	:= $(SOURCES:$(SRCDIR)/%=$(TARGET_SRCDIR)/%)
+TARGET_SOURCES	+= $(INCLUDE:$(INCDIR)/%=$(TARGET_SRCDIR)/%)
+TARGET_SRCDIRS	:= $(shell dirname $(TARGET_SOURCES))
+
+OBJECTS	:= $(SOURCES:$(SRCDIR)/%.cpp=$(TEMPDIR)/%.o)
+OBJDIRS	:= $(shell dirname $(OBJECTS))
+DEPENDS	:= $(OBJECTS:.o=.d)
+
+
+$(OUT): $(OBJECTS) | $(DISTDIR)
+	$(AR) $(ARFLAGS) $@ $^
+
+$(TEMPDIR)/%.o: $(SRCDIR)/%.cpp | $(TEMPDIR)
+	@mkdir -p $(@D)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
+
+$(TEMPDIR):
+	@mkdir -p $@
+
+$(DISTDIR):
+	@mkdir -p $@
+
+clean:
+	@rm $(DEPENDS) 2> /dev/null || true
+	@rm $(OBJECTS) 2> /dev/null || true
+	@rmdir -p -p $(OBJDIRS) 2> /dev/null || true
+	@echo Temporaries cleaned!
+
+distclean: clean
+	@rm $(OUT) 2> /dev/null || true
+	@rmdir -p $(DISTDIR) 2> /dev/null || true
+	@echo All clean!
+
+install_all: install install_source
+
+install: $(LIBDIR)/$(TARGET) $(INCLUDE)
+
+$(LIBDIR)/$(TARGET): $(OUT) | $(LIBDIR)
+	cp $< $@
+
+$(LIBDIR):
+	@mkdir -p $@
+
+$(INCDIR)/%.h: $(SRCDIR)/%.h $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
+$(INCDIR)/%.hpp: $(SRCDIR)/%.hpp $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
+install_source: $(TARGET_SOURCES)
+
+$(TARGET_SRCDIR)/%: $(SRCDIR)/% $(COPYRIGHT)
+	@mkdir -p $(@D)
+	cat $(COPYRIGHT) >> $@ 2> /dev/null || true
+	cat $< >> $@
+
+uninstall:
+	-rm $(INCLUDE)
+	@rmdir -p $(INCDIRS) 2> /dev/null || true
+	-rm $(LIBDIR)/$(TARGET)
+	@rmdir -p $(LIBDIR) 2> /dev/null || true
+	-rm $(TARGET_SOURCES)
+	@rmdir -p $(TARGET_SRCDIRS) 2> /dev/null || true
+	@echo Uninstall complete!
+
+-include $(DEPENDS)
+
+.PRECIOUS : $(OBJECTS)
+.PHONY : clean distclean uninstall