diff --git a/libsrc/Makefile b/libsrc/Makefile
index 6208d37b9..ea4864994 100644
--- a/libsrc/Makefile
+++ b/libsrc/Makefile
@@ -74,6 +74,9 @@ MKINC = $(GEOS) \
         atari   \
         nes
 
+TARGETUTIL = apple2 \
+             geos-apple
+
 GEOSDIRS = common      \
            conio       \
            disk        \
@@ -90,59 +93,65 @@ GEOSDIRS = common      \
 ifeq ($(TARGET),apple2enh)
   OBJPFX = a2
   DRVPFX = a2e
-  DIRS = apple2
+  SRCDIR = apple2
 else
-  DIRS = $(TARGET)
+  SRCDIR = $(TARGET)
 endif
 
+SRCDIRS = $(SRCDIR)
+
 ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
-  DIRS += cbm
+  SRCDIRS += cbm
 endif
 
 ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
-  DIRS += $(addprefix $(TARGET)/,  $(GEOSDIRS))
-  DIRS += $(addprefix geos-common/,$(GEOSDIRS))
+  SRCDIRS += $(addprefix $(TARGET)/,  $(GEOSDIRS))
+  SRCDIRS += $(addprefix geos-common/,$(GEOSDIRS))
 endif
 
-DIRS += common   \
-        conio    \
-        dbg      \
-        em       \
-        joystick \
-        mouse    \
-        runtime  \
-        serial   \
-        tgi      \
-        zlib
+SRCDIRS += common   \
+           conio    \
+           dbg      \
+           em       \
+           joystick \
+           mouse    \
+           runtime  \
+           serial   \
+           tgi      \
+           zlib
 
-vpath %.s $(DIRS)
-vpath %.c $(DIRS)
+vpath %.s $(SRCDIRS)
+vpath %.c $(SRCDIRS)
 
-OBJS := $(patsubst %.s,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.s)))
-OBJS += $(patsubst %.c,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c)))
+OBJS := $(patsubst %.s,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.s)))
+OBJS += $(patsubst %.c,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)))
 
 OBJS := $(addprefix ../wrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
 
 DEPS = $(OBJS:.o=.d)
 
-EXTRA_SRCPAT = $(firstword $(DIRS))/extra/%.s
+EXTRA_SRCPAT = $(SRCDIR)/extra/%.s
 EXTRA_OBJPAT = ../lib/$(TARGET)-%.o
-EXTRA_OBJS := $(patsubst $(EXTRA_SRCPAT),$(EXTRA_OBJPAT),$(wildcard $(firstword $(DIRS))/extra/*.s))
+EXTRA_OBJS := $(patsubst $(EXTRA_SRCPAT),$(EXTRA_OBJPAT),$(wildcard $(SRCDIR)/extra/*.s))
 
 ZPOBJ = ../wrk/$(TARGET)/zeropage.o
 ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
   ZPOBJ += ../wrk/$(TARGET)/extzp.o
 endif
 
-ifeq ($(TARGET),$(filter $(TARGET),$(MKINC)))
-  include $(TARGET)/Makefile.inc
+ifeq ($(SRCDIR),$(filter $(SRCDIR),$(MKINC)))
+  include $(SRCDIR)/Makefile.inc
+endif
+
+ifeq ($(SRCDIR),$(filter $(SRCDIR),$(TARGETUTIL)))
+  include $(SRCDIR)/targetutil/Makefile.inc
 endif
 
 ##########
 
 define DRVTYPE_template
 
-$1_SRCDIR = $$(firstword $$(DIRS))/$1
+$1_SRCDIR = $$(SRCDIR)/$1
 $1_OBJDIR = ../wrk/$$(TARGET)/$1
 $1_DRVDIR = ../$1
 
@@ -158,14 +167,11 @@ $1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS))
 
 $$($1_OBJS): | $$($1_OBJDIR)
 
-$$($1_OBJDIR):
-	@$$(call MKDIR,$$@)
-
 $$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR)
 	@echo $$(TARGET) - $$(@F)
 	@$$(LD) -o $$@ -t module $$^
 
-$$($1_DRVDIR):
+$$($1_OBJDIR) $$($1_DRVDIR):
 	@$$(call MKDIR,$$@)
 
 $(TARGET): $$($1_DRVS)
@@ -191,17 +197,32 @@ CC = $(if $(wildcard ../bin/cc65*),../bin/cc65,cc65)
 CO = $(if $(wildcard ../bin/co65*),../bin/co65,co65)
 LD = $(if $(wildcard ../bin/ld65*),../bin/ld65,ld65)
 
+##########
+
+define ASSEMBLE_recipe
+
+@echo $(TARGET) - $<
+@$(CA) -t $(TARGET) $(AFLAGS) --create-dep $(@:.o=.d) -o $@ $<
+
+endef
+
+##########
+
+define COMPILE_recipe
+
+@echo $(TARGET) - $<
+@$(CC) -t $(TARGET) $(CFLAGS) --create-dep $(@:.o=.d) -o $(@:.o=.s) $<
+@$(CA) -t $(TARGET) -o $@ $(@:.o=.s)
+
+endef
+
+##########
+
 ../wrk/$(TARGET)/%.o: %.s | ../wrk/$(TARGET)
-	@echo $(TARGET) - $<
-	@$(CA) -t $(TARGET) $(AFLAGS) --create-dep $(@:.o=.d) -o $@ $<
+	$(ASSEMBLE_recipe)
 
 ../wrk/$(TARGET)/%.o: %.c | ../wrk/$(TARGET)
-	@echo $(TARGET) - $<
-	@$(CC) -t $(TARGET) $(CFLAGS) --create-dep $(@:.o=.d) -o $(@:.o=.s) $<
-	@$(CA) -t $(TARGET) -o $@ $(@:.o=.s)
-
-../wrk/$(TARGET):
-	@$(call MKDIR,$@)
+	$(COMPILE_recipe)
 
 $(EXTRA_OBJPAT): $(EXTRA_SRCPAT) | ../lib
 	@echo $(TARGET) - $<
@@ -210,7 +231,7 @@ $(EXTRA_OBJPAT): $(EXTRA_SRCPAT) | ../lib
 ../lib/$(TARGET).lib: $(OBJS) | ../lib
 	$(AR) a $@ $?
 
-../lib:
+../wrk/$(TARGET) ../lib ../targetutil:
 	@$(call MKDIR,$@)
 
 $(TARGET): $(EXTRA_OBJS) ../lib/$(TARGET).lib
diff --git a/libsrc/apple2/targetutil/Makefile.inc b/libsrc/apple2/targetutil/Makefile.inc
new file mode 100644
index 000000000..37fec5d39
--- /dev/null
+++ b/libsrc/apple2/targetutil/Makefile.inc
@@ -0,0 +1,7 @@
+../wrk/$(TARGET)/loader.o: $(SRCDIR)/targetutil/loader.s | ../wrk/$(TARGET)
+	$(ASSEMBLE_recipe)
+
+../targetutil/loader.system: ../wrk/$(TARGET)/loader.o $(SRCDIR)/targetutil/loader.cfg | ../targetutil
+	$(LD) -o $@ -C $(filter %.cfg,$^) $(filter-out %.cfg,$^)
+
+$(TARGET): ../targetutil/loader.system
diff --git a/targetutil/apple2/loader.cfg b/libsrc/apple2/targetutil/loader.cfg
similarity index 100%
rename from targetutil/apple2/loader.cfg
rename to libsrc/apple2/targetutil/loader.cfg
diff --git a/libsrc/apple2/targetutil/loader.o b/libsrc/apple2/targetutil/loader.o
new file mode 100644
index 000000000..5c18e0ea0
Binary files /dev/null and b/libsrc/apple2/targetutil/loader.o differ
diff --git a/targetutil/apple2/loader.s b/libsrc/apple2/targetutil/loader.s
similarity index 100%
rename from targetutil/apple2/loader.s
rename to libsrc/apple2/targetutil/loader.s
diff --git a/targetutil/apple2/loader.txt b/libsrc/apple2/targetutil/loader.txt
similarity index 100%
rename from targetutil/apple2/loader.txt
rename to libsrc/apple2/targetutil/loader.txt
diff --git a/libsrc/geos-apple/targetutil/Makefile.inc b/libsrc/geos-apple/targetutil/Makefile.inc
new file mode 100644
index 000000000..ff9429691
--- /dev/null
+++ b/libsrc/geos-apple/targetutil/Makefile.inc
@@ -0,0 +1,9 @@
+../wrk/$(TARGET)/convert.o: TARGET = apple2enh
+
+../wrk/$(TARGET)/convert.o: $(SRCDIR)/targetutil/convert.c | ../wrk/$(TARGET)
+	$(COMPILE_recipe)
+
+../targetutil/convert.system: ../wrk/$(TARGET)/convert.o | ../targetutil
+	$(LD) -o $@ -C apple2enh-system.cfg $^ apple2enh.lib
+
+$(TARGET): ../targetutil/convert.system
diff --git a/targetutil/geos-apple/convert.c b/libsrc/geos-apple/targetutil/convert.c
similarity index 100%
rename from targetutil/geos-apple/convert.c
rename to libsrc/geos-apple/targetutil/convert.c
diff --git a/targetutil/Makefile b/targetutil/Makefile
deleted file mode 100644
index ef20b64b0..000000000
--- a/targetutil/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Makefile
-#
-
-# --------------------------------------------------------------------------
-# Programs
-
-# Subdirectories
-SUBDIRS = apple2 geos-apple
-
-# --------------------------------------------------------------------------
-# List of executables. This list could be made target dependent by checking
-# $(SYS).
-
-.PHONY: all
-all:
-	@for DIR in $(SUBDIRS); do \
-	    $(MAKE) -C $${DIR} $(MAKEOPTS); \
-	done
-
-.PHONY:	clean
-clean:
-	@for DIR in $(SUBDIRS); do \
-	    $(MAKE) -C $${DIR} $(MAKEOPTS) clean; \
-	done
-
-.PHONY:	zap
-zap:
-	@for DIR in $(SUBDIRS); do \
-	    $(MAKE) -C $${DIR} $(MAKEOPTS) zap; \
-	done
-
diff --git a/targetutil/apple2/Makefile b/targetutil/apple2/Makefile
deleted file mode 100644
index 03596189e..000000000
--- a/targetutil/apple2/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Makefile
-#
-
-# --------------------------------------------------------------------------
-# Programs
-CC      = ../../src/cc65/cc65
-AS      = ../../src/ca65/ca65
-LD      = ../../src/ld65/ld65
-
-# Directories
-CFGDIR  = ../../src/ld65/cfg
-INCDIR  = ../../include
-LIBDIR  = ../../libsrc
-
-# --------------------------------------------------------------------------
-# List of executables.
-
-EXELIST	=      	loader.system
-
-
-# --------------------------------------------------------------------------
-# Targets
-
-
-.PHONY:	all
-all:	$(EXELIST)
-
-
-loader.system:	loader.s Makefile
-	$(AS) -t apple2 --forget-inc-paths loader.s
-	$(LD) -o $@ -C loader.cfg loader.o $(LIBDIR)/apple2.lib
-
-
-# --------------------------------------------------------------------------
-# Cleanup rules
-
-.PHONY:	clean
-clean:
-	$(RM) *~ *.map *.o *.lbl
-
-.PHONY:	zap
-zap:	clean
-	$(RM) $(EXELIST)
-
-
-
diff --git a/targetutil/geos-apple/Makefile b/targetutil/geos-apple/Makefile
deleted file mode 100644
index b2dcc967f..000000000
--- a/targetutil/geos-apple/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# Makefile
-#
-
-# --------------------------------------------------------------------------
-# Programs
-CC      = ../../src/cc65/cc65
-AS      = ../../src/ca65/ca65
-LD      = ../../src/ld65/ld65
-
-# Directories
-CFGDIR  = ../../src/ld65/cfg
-INCDIR  = ../../include
-LIBDIR  = ../../libsrc
-
-# --------------------------------------------------------------------------
-# List of executables.
-
-EXELIST	=      	convert.system
-
-
-
-# --------------------------------------------------------------------------
-# Targets
-
-
-.PHONY:	all
-all:	$(EXELIST)
-
-
-convert.system:	convert.c Makefile
-	$(CC) --forget-inc-paths -I $(INCDIR) -t apple2enh -O convert.c
-	$(AS) --forget-inc-paths convert.s
-	$(LD) -o $@ -C $(CFGDIR)/apple2enh-system.cfg convert.o $(LIBDIR)/apple2enh.lib
-
-
-# --------------------------------------------------------------------------
-# Cleanup rules
-
-.PHONY:	clean
-clean:
-	$(RM) *~ *.map *.o *.s *.lbl
-
-.PHONY:	zap
-zap:	clean
-	$(RM) $(EXELIST)
-
-
-