diff --git a/App/tools/driver.makefile b/App/tools/driver.makefile
index e81088d5be06fd6c91c95fabbea221151ed120fb..d9a794b8fdb5dd2b502766c3cff95026851fbc6a 100644
--- a/App/tools/driver.makefile
+++ b/App/tools/driver.makefile
@@ -335,6 +335,10 @@ HDRS = ${HEADERS} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS}))
 HDRS += ${HEADERS_${EPICSVERSION}}
 export HDRS
 
+HDR_SUBDIRS = $(KEEP_HEADER_SUBDIRS)
+export HDR_SUBDIRS
+
+
 TEMPLS = $(if ${TEMPLATES},$(filter-out -none-,${TEMPLATES}),$(wildcard *.template *.db *.subs))
 TEMPLS += ${TEMPLATES_${EPICSVERSION}}
 TEMPLS += $(wildcard $(COMMON_DIR)/*.db)
@@ -648,7 +652,11 @@ ${MODULEDBD}: ${DBDFILES}
 INSTALL_LIBS = ${MODULELIB:%=${INSTALL_LIB}/%}
 INSTALL_DEPS = ${DEPFILE:%=${INSTALL_LIB}/%}
 INSTALL_DBDS = ${MODULEDBD:%=${INSTALL_DBD}/%}
-INSTALL_HDRS = $(addprefix ${INSTALL_INCLUDE}/,$(notdir ${HDRS}))
+ifneq ($(strip $(HDR_SUBDIRS)),)
+  INSTALL_HDRS = $(addprefix ${INSTALL_INCLUDE}/,$(notdir $(filter-out $(addsuffix /%,$(HDR_SUBDIRS)),${HDRS})))
+else
+  INSTALL_HDRS = $(addprefix ${INSTALL_INCLUDE}/,$(notdir ${HDRS}))
+endif
 INSTALL_DBS  = $(addprefix ${INSTALL_DB}/,$(notdir ${TEMPLS}))
 INSTALL_SCRS = $(addprefix ${INSTALL_SCR}/,$(notdir ${SCR}))
 INSTALL_BINS = $(addprefix ${INSTALL_BIN}/,$(notdir ${BINS}))
@@ -670,6 +678,19 @@ debug::
 	@echo "INSTALL_CFGS = $(INSTALL_CFGS)"
 	@echo "INSTALL_BIN = $(INSTALL_BIN)"
 	@echo "INSTALL_BINS = $(INSTALL_BINS)"
+	@echo "HDR_SUBDIRS = $(HDR_SUBDIRS)"
+
+define install_subdirs
+$1_HDRS = $$(filter $1/%,$$(HDRS))
+INSTALL_HDRS += $$(addprefix $$(INSTALL_INCLUDE)/,$$($1_HDRS:$1/%=%))
+vpath %.h ../$1
+vpath %.hpp ../$1
+vpath %.hh ../$1
+vpath %.hxx ../$1
+debug::
+	@echo "$1_HDRS = $$($1_HDRS)"
+endef
+$(foreach d,$(HDR_SUBDIRS),$(eval $(call install_subdirs,$d)))
 
 INSTALLS += ${INSTALL_CFGS} ${INSTALL_SCRS} ${INSTALL_HDRS} ${INSTALL_DBDS} ${INSTALL_DBS} ${INSTALL_LIBS} ${INSTALL_BINS} ${INSTALL_DEPS}