diff --git a/scripts/feeds b/scripts/feeds
index 31481edcb1..b531fbac62 100755
--- a/scripts/feeds
+++ b/scripts/feeds
@@ -494,7 +494,7 @@ sub install_package {
 		warn "WARNING: Package '$name' is not available in feed $feed->[1].\n";
 		return 0;
 	};
-	my $src = $pkg->{src};
+	my $src = $pkg->{src}->{name};
 	my $type = $feed->[0];
 	$src or $src = $name;
 
@@ -663,7 +663,7 @@ sub uninstall {
 				warn "WARNING: $name not installed\n";
 				next;
 			};
-			$pkg->{src} and $name = $pkg->{src};
+			$pkg->{src} and $name = $pkg->{src}->{name};
 			warn "Uninstalling package '$name'\n";
 			system("rm -f ./package/feeds/*/$name");
 			$uninstall = 1;
diff --git a/scripts/metadata.pm b/scripts/metadata.pm
index 404309dc4e..0577390eda 100644
--- a/scripts/metadata.pm
+++ b/scripts/metadata.pm
@@ -193,9 +193,7 @@ sub parse_package_metadata($) {
 	my $file = shift;
 	my $pkg;
 	my $feature;
-	my $makefile;
 	my $preconfig;
-	my $subdir;
 	my $src;
 	my $override;
 	my %ignore = map { $_ => 1 } @ignore;
@@ -206,41 +204,42 @@ sub parse_package_metadata($) {
 	};
 	while (<FILE>) {
 		chomp;
-		/^Source-Makefile: \s*((.+\/)([^\/]+)\/Makefile)\s*$/ and do {
-			$makefile = $1;
-			$subdir = $2;
-			$src = $3;
-			$subdir =~ s/^package\///;
-			$subdir{$src} = $subdir;
-			$srcpackage{$src} = {
-				makefile => $makefile,
+		/^Source-Makefile: \s*(package\/((?:.+\/)?)([^\/]+)\/Makefile)\s*$/ and do {
+			$subdir{$3} = $2;
+
+			$src = {
+				makefile => $1,
+				subdir => $2,
+				name => $3,
+				ignore => $ignore{$3},
 				packages => [],
 				buildtypes => [],
 				builddepends => [],
 			};
+			$srcpackage{$3} = $src;
 			$override = "";
 			undef $pkg;
 		};
 		/^Override: \s*(.+?)\s*$/ and do {
 			$override = $1;
-			$overrides{$src} = 1;
+			$overrides{$src->{name}} = 1;
 		};
 		next unless $src;
 		/^Package:\s*(.+?)\s*$/ and do {
 			undef $feature;
 			$pkg = {};
-			$pkg->{ignore} = $ignore{$src};
+			$pkg->{ignore} = $src->{ignore};
 			$pkg->{src} = $src;
-			$pkg->{makefile} = $makefile;
+			$pkg->{makefile} = $src->{makefile};
 			$pkg->{name} = $1;
 			$pkg->{title} = "";
 			$pkg->{depends} = [];
 			$pkg->{mdepends} = [];
-			$pkg->{subdir} = $subdir;
+			$pkg->{subdir} = $src->{subdir};
 			$pkg->{tristate} = 1;
 			$pkg->{override} = $override;
 			$package{$1} = $pkg;
-			push @{$srcpackage{$src}->{packages}}, $pkg;
+			push @{$src->{packages}}, $pkg;
 		};
 		/^Feature:\s*(.+?)\s*$/ and do {
 			undef $pkg;
@@ -251,7 +250,7 @@ sub parse_package_metadata($) {
 		$feature and do {
 			/^Target-Name:\s*(.+?)\s*$/ and do {
 				$features{$1} or $features{$1} = [];
-				push @{$features{$1}}, $feature unless $ignore{$src};
+				push @{$features{$1}}, $feature unless $src->{ignore};
 			};
 			/^Target-Title:\s*(.+?)\s*$/ and $feature->{target_title} = $1;
 			/^Feature-Priority:\s*(\d+)\s*$/ and $feature->{priority} = $1;
@@ -259,9 +258,9 @@ sub parse_package_metadata($) {
 			/^Feature-Description:/ and $feature->{description} = get_multiline(\*FILE, "\t\t\t");
 			next;
 		};
-		/^Build-Depends: \s*(.+)\s*$/ and $srcpackage{$src}->{builddepends} = [ split /\s+/, $1 ];
-		/^Build-Depends\/(\w+): \s*(.+)\s*$/ and $srcpackage{$src}->{"builddepends/$1"} = [ split /\s+/, $2 ];
-		/^Build-Types:\s*(.+)\s*$/ and $srcpackage{$src}->{buildtypes} = [ split /\s+/, $1 ];
+		/^Build-Depends: \s*(.+)\s*$/ and $src->{builddepends} = [ split /\s+/, $1 ];
+		/^Build-Depends\/(\w+): \s*(.+)\s*$/ and $src->{"builddepends/$1"} = [ split /\s+/, $2 ];
+		/^Build-Types:\s*(.+)\s*$/ and $src->{buildtypes} = [ split /\s+/, $1 ];
 		next unless $pkg;
 		/^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
 		/^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
@@ -279,8 +278,8 @@ sub parse_package_metadata($) {
 					name => $vpkg,
 					vdepends => [],
 					src => $src,
-					subdir => $subdir,
-					makefile => $makefile
+					subdir => $src->{subdir},
+					makefile => $src->{makefile},
 				};
 				push @{$package{$vpkg}->{vdepends}}, $pkg->{name};
 			}
@@ -296,8 +295,8 @@ sub parse_package_metadata($) {
 		/^Category: \s*(.+)\s*$/ and do {
 			$pkg->{category} = $1;
 			defined $category{$1} or $category{$1} = {};
-			defined $category{$1}->{$src} or $category{$1}->{$src} = [];
-			push @{$category{$1}->{$src}}, $pkg;
+			defined $category{$1}->{$src->{name}} or $category{$1}->{$src->{name}} = [];
+			push @{$category{$1}->{$src->{name}}}, $pkg;
 		};
 		/^Description: \s*(.*)\s*$/ and $pkg->{description} = "\t\t $1\n". get_multiline(*FILE, "\t\t ");
 		/^Type: \s*(.+)\s*$/ and do {
@@ -318,7 +317,7 @@ sub parse_package_metadata($) {
 				$preconfig = {
 					id => $1
 				};
-				$preconfig{$pkgname}->{$1} = $preconfig unless $ignore{$src};
+				$preconfig{$pkgname}->{$1} = $preconfig unless $src->{ignore};
 			}
 		};
 		/^Preconfig-Type:\s*(.*?)\s*$/ and $preconfig->{type} = $1;
@@ -329,9 +328,9 @@ sub parse_package_metadata($) {
 
 			for my $ugspec (@ugspecs) {
 				my @ugspec = split /:/, $ugspec, 2;
-				parse_package_metadata_usergroup($makefile, "user", \%usernames, \%userids, $ugspec[0]) or return 0;
+				parse_package_metadata_usergroup($src->{makefile}, "user", \%usernames, \%userids, $ugspec[0]) or return 0;
 				if (@ugspec > 1) {
-					parse_package_metadata_usergroup($makefile, "group", \%groupnames, \%groupids, $ugspec[1]) or return 0;
+					parse_package_metadata_usergroup($src->{makefile}, "group", \%groupnames, \%groupids, $ugspec[1]) or return 0;
 				}
 			}
 		};
diff --git a/scripts/package-metadata.pl b/scripts/package-metadata.pl
index 077956e6a1..2369c37e2b 100755
--- a/scripts/package-metadata.pl
+++ b/scripts/package-metadata.pl
@@ -484,12 +484,12 @@ sub gen_package_mk() {
 				my $idx = "";
 				my $pkg_dep = $package{$dep};
 				if (defined($pkg_dep) && defined($pkg_dep->{src})) {
-					unless (!$deptype || grep { $_ eq $deptype } @{$srcpackage{$pkg_dep->{src}}->{buildtypes}}) {
+					unless (!$deptype || grep { $_ eq $deptype } @{$pkg_dep->{src}->{buildtypes}}) {
 						warn sprintf "WARNING: Makefile '%s' has a %s build dependency on '%s/%s' but '%s' does not implement a '%s' build type\n",
-							$src->{makefile}, $type, $pkg_dep->{src}, $deptype, $pkg_dep->{makefile}, $deptype;
+							$src->{makefile}, $type, $pkg_dep->{src}->{name}, $deptype, $pkg_dep->{makefile}, $deptype;
 						next;
 					}
-					$idx = $pkg_dep->{subdir}.$pkg_dep->{src};
+					$idx = $pkg_dep->{subdir}.$pkg_dep->{src}->{name};
 				} elsif (defined($srcpackage{$dep})) {
 					$idx = $subdir{$dep}.$dep;
 				} else {
@@ -538,12 +538,12 @@ sub gen_package_mk() {
 			foreach my $dep (@deps) {
 				$pkg_dep = $package{$deps};
 				if (defined $pkg_dep->{src}) {
-					unless (!$deptype || grep { $_ eq $deptype } @{$srcpackage{$pkg_dep->{src}}->{buildtypes}}) {
+					unless (!$deptype || grep { $_ eq $deptype } @{$pkg_dep->{src}->{buildtypes}}) {
 						warn sprintf "WARNING: Makefile '%s' has a build dependency on '%s/%s' but '%s' does not implement a '%s' build type\n",
-							$src->{makefile}, $pkg_dep->{src}, $deptype, $pkg_dep->{makefile}, $deptype;
+							$src->{makefile}, $pkg_dep->{src}->{name}, $deptype, $pkg_dep->{makefile}, $deptype;
 						next;
 					}
-					$idx = $pkg_dep->{subdir}.$pkg_dep->{src};
+					$idx = $pkg_dep->{subdir}.$pkg_dep->{src}->{name};
 				} elsif (defined($srcpackage{$dep})) {
 					$idx = $subdir{$dep}.$dep;
 				}
@@ -552,7 +552,7 @@ sub gen_package_mk() {
 					$idx .= $suffix;
 
 					my $depline;
-					next if $srcname eq $pkg_dep->{src}.$suffix;
+					next if $srcname eq $pkg_dep->{src}->{name}.$suffix;
 					next if $dep{$condition.":".$srcname."->".$idx};
 					next if $dep{$srcname."->($dep)".$idx} and $pkg_dep->{vdepends};
 					my $depstr;
