diff --git a/include/package-dumpinfo.mk b/include/package-dumpinfo.mk
index 6f1624aeb133837d83fb74e8d736fd01da4a9264..f5f1200ba2c1b1e4ad9f0d2ba977d71d2f93c41f 100644
--- a/include/package-dumpinfo.mk
+++ b/include/package-dumpinfo.mk
@@ -28,6 +28,7 @@ ifneq ($(DUMP),)
 		echo "Category: $(CATEGORY)"; \
 		echo "Title: $(TITLE)"; \
 		echo "Maintainer: $(MAINTAINER)"; \
+		echo "Source: $(PKG_SOURCE)"; \
 		echo "Type: $(if $(Package/$(1)/targets),$(Package/$(1)/targets),$(if $(PKG_TARGETS),$(PKG_TARGETS),ipkg))"; \
 		$(if $(KCONFIG),echo "Kernel-Config: $(KCONFIG)";) \
 		$(if $(BUILDONLY),echo "Build-Only: $(BUILDONLY)";) \
diff --git a/scripts/metadata.pl b/scripts/metadata.pl
index fa30556205d260034bd12f7570acf877e4d88b10..7496f33a7d6723e1ca3080a7ec7ec7c3fd426f1f 100755
--- a/scripts/metadata.pl
+++ b/scripts/metadata.pl
@@ -201,12 +201,20 @@ sub print_target($) {
 	}
 
 	my $v = kver($target->{version});
+	if (@{$target->{subtargets}} == 0) {
 	$confstr = <<EOF;
 config TARGET_$target->{conf}
 	bool "$target->{name}"
 	select LINUX_$kernel
 	select LINUX_$v
 EOF
+	}
+	else {
+		$confstr = <<EOF;
+config TARGET_$target->{conf}
+	bool "$target->{name}"
+EOF
+	}
 	if ($target->{subtarget}) {
 		$confstr .= "\tdepends TARGET_$target->{boardconf}\n";
 	}
@@ -293,7 +301,14 @@ EOF
 				print "\tselect DEFAULT_$pkg\n";
 				$defaults{$pkg} = 1;
 			}
-			print "\n";
+			my $help = $profile->{desc};
+			if ($help =~ /\w+/) {
+				$help =~ s/^\s*/\t  /mg;
+				$help = "\thelp\n$help";
+			} else {
+				undef $help;
+			}
+			print "$help\n";
 		}
 	}
 
@@ -651,6 +666,16 @@ EOF
 	}
 }
 
+sub gen_package_source() {
+	parse_package_metadata($ARGV[0]) or exit 1;
+	foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
+		my $pkg = $package{$name};
+		if ($pkg->{name} && $pkg->{source}) {
+			print "$pkg->{name}: ";
+			print "$pkg->{source}\n";
+		}
+	}
+}
 
 sub parse_command() {
 	my $cmd = shift @ARGV;
@@ -659,6 +684,7 @@ sub parse_command() {
 		/^package_mk$/ and return gen_package_mk();
 		/^package_config$/ and return gen_package_config();
 		/^kconfig/ and return gen_kconfig_overrides();
+		/^package_source$/ and return gen_package_source();
 	}
 	print <<EOF
 Available Commands:
@@ -666,6 +692,7 @@ Available Commands:
 	$0 package_mk [file]		Package metadata in makefile format
 	$0 package_config [file] 	Package metadata in Kconfig format
 	$0 kconfig [file] [config]	Kernel config overrides
+	$0 package_source [file] 	Package source file information
 
 EOF
 }
diff --git a/scripts/metadata.pm b/scripts/metadata.pm
index 9486c66cb315960ccaa9f46f6910ba4930106b64..97746809a4698b6e428c3a16fdb2a6516e1aa109 100644
--- a/scripts/metadata.pm
+++ b/scripts/metadata.pm
@@ -73,6 +73,7 @@ sub parse_package_metadata($) {
 		/^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;
 		/^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1;
 		/^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1;
+		/^Source: \s*(.+)\s*$/ and $pkg->{source} = $1;
 		/^Default: \s*(.+)\s*$/ and $pkg->{default} = $1;
 		/^Provides: \s*(.+)\s*$/ and do {
 			my @vpkg = split /\s+/, $1;