diff --git a/ppd/PPD.pm b/ppd/PPD.pm
index 36e179f9ea37473ad253e21bff5c0da45d677ded..f48aba1625391c61ebe6386126f2b9e00a8d8aaa 100644
--- a/ppd/PPD.pm
+++ b/ppd/PPD.pm
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 
 use Exporter 'import';
-our @EXPORT = qw(define_group define_ui_group declare get set maybe_set option generate);
+our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe_set option gen_values generate);
 
 ### PPD data model ###
 
@@ -45,6 +45,7 @@ my %groups = ();
 my @head_groups = ();
 my @ui_groups = ();
 my @nonui_groups = ();
+my $current_group_key;
 
 sub define_group($$) {
 	my ($key, $g) = @_;
@@ -54,6 +55,7 @@ sub define_group($$) {
 	if ($g->{UI}) { push @ui_groups, $key; }
 	elsif ($g->{Head}) { push @head_groups, $key; }
 	else { push @nonui_groups, $key; }
+	$current_group_key = $key;
 }
 
 sub define_head_group($$) {
@@ -68,6 +70,14 @@ sub define_ui_group($$) {
 	define_group($key, $g);
 }
 
+sub switch_group($) {
+	my ($key) = @_;
+	$groups{$key} or die "Group $key does not exist\n";
+	my $prev = $current_group_key;
+	$current_group_key = $key;
+	return $prev;
+}
+
 # declare("group", ["keyword", "type[!]", "value"], ...)
 sub declare($@) {
 	my $gn = shift @_;
@@ -119,12 +129,31 @@ sub option($) {
 	my ($o) = @_;
 	my $key = $o->{Key};
 	!defined $keywords{$key} or die "Keyword $key already known\n";
-	my $g = $groups{$o->{Group}} or die "Keyword $key specified with an unknown group\n";
-	$o->{Type} = 'o';
 	$keywords{$key} = $o;
+	my $g = $groups{$current_group_key};
+	$o->{Group} = $current_group_key;
+	$o->{Type} = 'o';
 	push @{$g->{Keywords}}, $o;
 }
 
+### Auxiliary functions ###
+
+sub gen_values($@) {
+	my $template = shift @_;
+	my @values = ();
+	while (@_) {
+		my $v = shift @_;
+		if (!ref $v) {
+			$v = { Key => $v };
+		}
+		if (!defined $v->{PS}) {
+			$v->{PS} = sprintf($template, $v->{Key});
+		}
+		push @values, $v;
+	}
+	return \@values;
+}
+
 ### Known main keywords ###
 
 # Group "f": file description
@@ -229,7 +258,7 @@ sub emit_option($) {
 		print "*${jcl}OpenUI *$key/", ($o->{Name} // $o->{Key}), ": ", $o->{Choice}, "\n";
 		my $pri = $o->{Priority} // 100;
 		my $sec = $o->{Section} // ($jcl ? "JCLSetup" : "AnySetup");
-		print '*', ((defined $o->{UI}) ? "" : 'NonUI'), "OrderDependency $pri $sec *$key\n";
+		print '*', ((defined $o->{Choice}) ? "" : 'NonUI'), "OrderDependency $pri $sec *$key\n";
 	}
 	print "*Default$key: ", get_default($o), "\n";
 	for my $v (@{$o->{Values}}) {
diff --git a/ppd/PPD/Paper.pm b/ppd/PPD/Paper.pm
index 2112b7bcdd8b9a74662a9c9f97f52f9b16209857..29e11a2265ddb9e2433cbfdd0ee3c17deea2face 100644
--- a/ppd/PPD/Paper.pm
+++ b/ppd/PPD/Paper.pm
@@ -12,10 +12,29 @@ sub mm($) {
 # 	W		width in PS points
 # 	H		height in PS points
 my %media = (
+	'A0' => { Name => 'A0', W => mm(841), H => mm(1189) },
+	'A1' => { Name => 'A1', W => mm(594), H => mm(841) },
+	'A2' => { Name => 'A2', W => mm(420), H => mm(594) },
 	'A3' => { Name => 'A3', W => mm(297), H => mm(420) },
 	'A4' => { Name => 'A4', W => mm(210), H => mm(297) },
 	'A5' => { Name => 'A5', W => mm(148), H => mm(210) },
 	'A6' => { Name => 'A6', W => mm(105), H => mm(148) },
+	'B0' => { Name => 'B0', W => mm(1000), H => mm(1414) },
+	'B1' => { Name => 'B1', W => mm(707), H => mm(1000) },
+	'B2' => { Name => 'B2', W => mm(500), H => mm(707) },
+	'B3' => { Name => 'B3', W => mm(353), H => mm(500) },
+	'B4' => { Name => 'B4', W => mm(250), H => mm(353) },
+	'B5' => { Name => 'B5', W => mm(176), H => mm(250) },
+	'B6' => { Name => 'B6', W => mm(125), H => mm(176) },
+	'C0' => { Name => 'C0', W => mm(917), H => mm(1297) },
+	'C1' => { Name => 'C1', W => mm(648), H => mm(917) },
+	'C2' => { Name => 'C2', W => mm(458), H => mm(648) },
+	'C3' => { Name => 'C3', W => mm(324), H => mm(458) },
+	'C4' => { Name => 'C4', W => mm(229), H => mm(354) },
+	'C5' => { Name => 'C5', W => mm(162), H => mm(229) },
+	'C6' => { Name => 'C6', W => mm(114), H => mm(162) },
+	'C7' => { Name => 'C7', W => mm(81), H => mm(114) },
+	'C8' => { Name => 'C8', W => mm(57), H => mm(81) },
 	'Letter' => { Name => 'US Letter', W => 612, H => 792 },
 	'Legal' => { Name => 'US Legal', W => 612, H => 1008 },
 );
@@ -52,7 +71,6 @@ sub add_papers($) {
 	define_ui_group('Media', { Name => 'Media settings' });
 
 	option({
-		Group => 'Media',
 		Key => 'PageSize',
 		Name => 'Page Size',
 		Choice => 'PickAny',
@@ -70,7 +88,6 @@ sub add_papers($) {
 	});
 
 	option({
-		Group => 'Media',
 		Key => 'PageRegion',
 		Name => 'Page Region',
 		Choice => 'PickAny',
@@ -88,7 +105,6 @@ sub add_papers($) {
 	});
 
 	option({
-		Group => 'Media',
 		Key => 'ImageableArea',
 		Values => [ map {
 			my $k = $_;
@@ -103,7 +119,6 @@ sub add_papers($) {
 	});
 
 	option({
-		Group => 'Media',
 		Key => 'PaperDimension',
 		Values => [ map {
 			my $k = $_;
diff --git a/ppd/gen-hp b/ppd/gen-hp
index 7bf8f6897780a257611dcd19858bfd8c6f0a9550..9dd670d4ae453cb63200460a5b9c8450203a6295 100755
--- a/ppd/gen-hp
+++ b/ppd/gen-hp
@@ -24,7 +24,6 @@ set('cupsProtocol', 'None');
 define_ui_group('Basic', { Name => 'Basic options' });
 
 option({
-	Group => 'Basic',
 	Key => 'Duplex',
 	Name => '2-Sided Printing',
 	Choice => 'PickOne',
@@ -36,7 +35,6 @@ option({
 });
 
 option({
-	Group => 'Basic',
 	Key => 'Resolution',
 	Name => 'Printer Resolution',
 	Choice => 'PickOne',
@@ -50,7 +48,6 @@ option({
 });
 
 option({
-	Group => 'Basic',
 	Key => 'HPEconoMode',
 	Name => 'EconoMode',
 	Choice => 'Boolean',
@@ -61,7 +58,6 @@ option({
 });
 
 option({
-	Group => 'Basic',
 	Key => 'Smoothing',
 	Name => 'Resolution Enhancement',
 	Choice => 'Boolean',
@@ -74,7 +70,6 @@ option({
 });
 
 option({
-	Group => 'Basic',
 	Key => 'Collate',
 	Choice => 'Boolean',
 	Values => [
@@ -84,6 +79,7 @@ option({
 });
 
 PPD::PJL::add_jcl();
+
 PPD::Paper::add_papers({
 	MinW => 216, MaxW => 612,
 	MinH => 360, MaxH => 1008,
@@ -91,4 +87,39 @@ PPD::Paper::add_papers({
 	PSPageSize => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); },
 });
 
+option({
+	Key => 'MediaType',
+	Name => 'Media Type',
+	Choice => 'PickOne',
+	Priority => 20,
+	Values => gen_values("<< /MediaType (%s) >> setpagedevice",
+			{ Key => 'None', PS => '<< /MediaType null >> setpagedevice', Default => 1 },
+			"Plain",
+			"Preprinted",
+			"Letterhead",
+			"Transparency",
+			"Prepunched",
+			"Labels",
+			"Bond",
+			"Recycled",
+			"Color",
+			"Rough",
+			"Card Stock",
+			"Envelope"
+		),
+});
+
+option({
+	Key => 'InputSlot',
+	Name => 'Input Slot',
+	Choice => 'PickOne',
+	Priority => 20,
+	Values => [
+		{ Key => 'ManualFeed', Name => 'Tray 1 with manual feed', PS => '<< /ManualFeed true /MediaPosition 3 >> setpagedevice' },
+		{ Key => 'Tray1', Name => 'Tray 1', PS => '<< /ManualFeed false /MediaPosition 3 >> setpagedevice' },
+		{ Key => 'Tray2', Name => 'Tray 2', PS => '<< /ManualFeed false /MediaPosition 0 >> setpagedevice' },
+		{ Key => 'Tray3', Name => 'Tray 3', PS => '<< /ManualFeed false /MediaPosition 1 >> setpagedevice' },
+	],
+});
+
 generate();