diff --git a/Makefile b/Makefile
index ffce8d555778419bf2632009f3e5ae1cf33f214e..bf759bce9f09fdd11b4765e96a31187278f8aa7a 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,10 @@ TOPDIR:=$(GLUON_OPENWRTDIR)
 export TOPDIR
 
 
+GLUON_TARGET ?= ar71xx-generic
+export GLUON_TARGET
+
+
 update: FORCE
 	$(GLUONDIR)/scripts/update.sh $(GLUONDIR)
 	$(GLUONDIR)/scripts/patch.sh $(GLUONDIR)
@@ -55,7 +59,7 @@ endef
 define GluonModel
 endef
 
-include $(GLUONDIR)/include/profiles.mk
+include $(GLUONDIR)/targets/targets.mk
 
 CheckExternal := test -d $(GLUON_OPENWRTDIR) || (echo 'You don'"'"'t seem to have obtained the external repositories needed by Gluon; please call `make update` first!'; false)
 
@@ -103,15 +107,10 @@ include package/Makefile
 include tools/Makefile
 include toolchain/Makefile
 
-BOARD := ar71xx
-override SUBTARGET := generic
 
 PROFILES :=
 PROFILE_PACKAGES :=
 
-gluon_prepared_stamp := $(BOARD_BUILDDIR)/prepared
-
-
 define Profile
   $(eval $(call Profile/Default))
   $(eval $(call Profile/$(1)))
@@ -119,11 +118,6 @@ define Profile
 endef
 
 define GluonProfile
-image/$(1): $(gluon_prepared_stamp)
-	+$(GLUONMAKE) image PROFILE="$(1)" V=s$(OPENWRT_VERBOSE)
-
-CheckSite := (perl $(GLUON_SITEDIR)/site.conf 2>&1) > /dev/null || (echo 'Your site configuration did not pass validation; please verify yourself with `perl site.conf` and fix the problems.';false)
-
 PROFILES += $(1)
 PROFILE_PACKAGES += $(filter-out -%,$($(1)_PACKAGES) $(2) $(GLUON_$(1)_SITE_PACKAGES))
 GLUON_$(1)_DEFAULT_PACKAGES := $(2)
@@ -135,8 +129,16 @@ GLUON_$(1)_MODELS += $(2)
 GLUON_$(1)_MODEL_$(2) := $(3)
 endef
 
+
+include $(GLUONDIR)/targets/targets.mk
+
+BOARD := $(GLUON_TARGET_$(GLUON_TARGET)_BOARD)
+override SUBTARGET := $(GLUON_TARGET_$(GLUON_TARGET)_SUBTARGET)
+
+gluon_prepared_stamp := $(BOARD_BUILDDIR)/prepared
+
+
 include $(INCLUDE_DIR)/target.mk
-include $(GLUONDIR)/include/profiles.mk
 
 
 gluon-tools: $(STAGING_DIR_HOST)/bin/stat
@@ -173,7 +175,7 @@ feeds: FORCE
 
 config: FORCE
 	( \
-		cat $(GLUONDIR)/include/config $(GLUONDIR)/targets/$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))/config; \
+		cat $(GLUONDIR)/include/config $(GLUONDIR)/targets/$(GLUON_TARGET)/config; \
 		echo '$(patsubst %,CONFIG_PACKAGE_%=m,$(sort $(filter-out -%,$(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES) $(PROFILE_PACKAGES))))' \
 			| sed -e 's/ /\n/g'; \
 	) > $(BOARD_BUILDDIR)/config
@@ -208,6 +210,8 @@ prepare-image: FORCE
 	cp $(KERNEL_BUILD_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf $(BOARD_KDIR)/
 	+$(SUBMAKE) -C $(TOPDIR)/target/linux/$(BOARD)/image -f $(GLUONDIR)/include/Makefile.image prepare KDIR="$(BOARD_KDIR)"
 
+CheckSite := (perl $(GLUON_SITEDIR)/site.conf 2>&1) > /dev/null || (echo 'Your site configuration did not pass validation; please verify yourself with `perl site.conf` and fix the problems.';false)
+
 prepare: FORCE
 	@$(CheckSite)
 
@@ -300,6 +304,9 @@ image: FORCE
 		cp $(BIN_DIR)/gluon-$(model)-sysupgrade.bin $(GLUON_IMAGEDIR)/sysupgrade/$(IMAGE_PREFIX)-$(GLUON_$(PROFILE)_MODEL_$(model))-sysupgrade.bin && \
 	) :
 
+image/%: $(gluon_prepared_stamp)
+	+$(GLUONMAKE) image PROFILE="$(patsubst image/%,%,$@)" V=s$(OPENWRT_VERBOSE)
+
 call_image/%: FORCE
 	+$(GLUONMAKE) $(patsubst call_image/%,image/%,$@)
 
diff --git a/include/Makefile.target b/include/Makefile.target
index d45db8135426571766e2cd48d0e6946c9ac0e8fb..be25cc8c663f8abb1ddf6a232e34e1481b444902 100644
--- a/include/Makefile.target
+++ b/include/Makefile.target
@@ -1,10 +1,10 @@
 override define Kernel/Configure
-	cp $(GLUONDIR)/kernel/config-$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) $(LINUX_DIR)/.config
+	cp $(GLUONDIR)/targets/$(GLUON_TARGET)/kernel-config $(LINUX_DIR)/.config
 	+$(MAKE) $(KERNEL_MAKEOPTS) oldnoconfig
 	$(call Kernel/SetInitramfs)
 	rm -rf $(KERNEL_BUILD_DIR)/modules
 	+[ -d $(LINUX_DIR)/user_headers ] || $(MAKE) $(KERNEL_MAKEOPTS) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install
-	cp $(GLUONDIR)/kernel/vermagic-$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) $(LINUX_DIR)/.vermagic
+	cp $(GLUONDIR)/targets/$(GLUON_TARGET)/kernel-vermagic $(LINUX_DIR)/.vermagic
 endef
 
 # The Makefile included here is $(TOPDIR)/target/linux/$(BOARD)/Makefile
diff --git a/include/gluon.mk b/include/gluon.mk
index 7ade8db0522ab2c91708bde4400150d2011b1289..306adb1f96825cc5bc80b614a10126c3baaf4712 100644
--- a/include/gluon.mk
+++ b/include/gluon.mk
@@ -47,6 +47,17 @@ $(foreach var,$(2),$(1) := $$(sort $$(filter-out -% $$(patsubst -%,%,$$(filter -
 )
 endef
 
+GLUON_TARGETS :=
+
+define GluonTarget
+gluon_target := $(1)$$(if $(2),-$(2))
+GLUON_TARGETS += $$(gluon_target)
+GLUON_TARGET_$$(gluon_target)_BOARD := $(1)
+GLUON_TARGET_$$(gluon_target)_SUBTARGET := $(2)
+
+include $$(GLUONDIR)/targets/$$(gluon_target)/profiles.mk
+endef
+
 regex-escape = $(shell echo '$(1)' | sed -e 's/[]\/()$*.^|[]/\\&/g')
 
 GLUON_DEFAULT_PACKAGES := gluon-core kmod-ipv6 firewall ip6tables -uboot-envtools
diff --git a/kernel/config-ar71xx-generic b/targets/ar71xx-generic/kernel-config
similarity index 100%
rename from kernel/config-ar71xx-generic
rename to targets/ar71xx-generic/kernel-config
diff --git a/kernel/vermagic-ar71xx-generic b/targets/ar71xx-generic/kernel-vermagic
similarity index 100%
rename from kernel/vermagic-ar71xx-generic
rename to targets/ar71xx-generic/kernel-vermagic
diff --git a/include/profiles.mk b/targets/ar71xx-generic/profiles.mk
similarity index 100%
rename from include/profiles.mk
rename to targets/ar71xx-generic/profiles.mk
diff --git a/targets/targets.mk b/targets/targets.mk
new file mode 100644
index 0000000000000000000000000000000000000000..dcfbc1e5c2cdc0925bb92afe872ab720a5928dc2
--- /dev/null
+++ b/targets/targets.mk
@@ -0,0 +1 @@
+$(eval $(call GluonTarget,ar71xx,generic))