diff --git a/Makefile b/Makefile
index 88be8c84db53617da6e7551817c2a5556bb46b70..462a7675c6b55b1b49ee14d5e3a5a54ddd871aa6 100644
--- a/Makefile
+++ b/Makefile
@@ -115,6 +115,10 @@ src-link luci ../../packages_luci
 endef
 export FEEDS
 
+
+export GLUON_GENERATE := $(GLUONDIR)/scripts/generate.sh
+
+
 feeds: FORCE
 	rm -f feeds.conf
 	echo "$$FEEDS" > feeds.conf
diff --git a/scripts/configure.pl b/scripts/configure.pl
new file mode 100755
index 0000000000000000000000000000000000000000..2f98eaecd010a433cef3f9d958691c1315c80f14
--- /dev/null
+++ b/scripts/configure.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+
+my %config;
+
+sub add_config {
+    my ($prefix, $c) = @_;
+
+    foreach my $key (keys $c) {
+	my $val = $c->{$key};
+
+	if (ref($val)) {
+	    add_config($key . '.', $val);
+	}
+	else {
+	    $config{'@' . $prefix . $key . '@'} = $val;
+	}
+    }
+}
+
+sub read_config {
+    my $input = shift;
+    my $CONFIG = do $input;
+    add_config('', $CONFIG);
+}
+
+
+read_config 'site/site.pl';
+
+
+my $regex = join '|', map {quotemeta} keys %config;
+
+
+for (<>) {
+    s/($regex)/${config{$1}}/g;
+    print;
+}
diff --git a/scripts/generate.sh b/scripts/generate.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5aa9450165ac97545c29a9343edd0b4874bb0ecd
--- /dev/null
+++ b/scripts/generate.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+
+declare -a IN
+
+
+GLUONDIR="$(dirname "$0")/.."
+
+
+for ((i = 1; i < $#; i++)); do
+	IN[$i]="${!i}"
+done
+
+OUT="$(readlink -f "${!#}")"
+
+for S in "${IN[@]}"; do (
+	cd "$(dirname "$S")"
+	NAME="$(basename "$S")"
+	IFS='
+'
+
+	for FILE in $(find "$NAME" -type f); do
+		D="$(dirname "$FILE")"
+
+		mkdir -p "$OUT/$D"
+		(cd "$GLUONDIR"; scripts/configure.pl) < "$FILE" > "$OUT/$FILE"
+		chmod --reference="$FILE" "$OUT/$FILE"
+	done
+); done