diff --git a/ppd/PPD.pm b/ppd/PPD.pm
index f0c850593ac1891c68eab08a481c98cc92ed19dd..569bdac2552211d3efe63c0080cd16d254d3065b 100644
--- a/ppd/PPD.pm
+++ b/ppd/PPD.pm
@@ -132,17 +132,23 @@ sub get($) {
 	my ($key) = @_;
 	my $kw = $keywords{$key};
 	if ($kw) {
-		return $kw->{'Value'};
+		return $kw->{Value} // (defined $kw->{Values} ? $kw->{Values}[0] : undef);
 	} else {
 		return;
 	}
 }
 
-# set("option", value) [must be already declared]
+# set("option", value) or set("option", [values]) [must be already declared]
 sub set($$) {
 	my ($key, $value) = @_;
 	my $k = $keywords{$key} or die "Unknown keyword $key (missing declaration)\n";
-	$k->{Value} = $value;
+	if (ref $value) {
+		delete $k->{Value};
+		$k->{Values} = $value;
+	} else {
+		$k->{Value} = $value;
+		delete $k->{Values};
+	}
 }
 
 # maybe_set("option", value) [must be already declared]
@@ -264,6 +270,7 @@ declare('d',
 # Group "c": CUPS options
 define_head_group({ Key => 'c', Name => 'CUPS options' });
 declare('c',
+	[ 'cupsFilter',			's',	undef ],
 	[ 'cupsProtocol',		's',	undef ],
 );
 
@@ -272,6 +279,7 @@ define_head_group({ Key => 'j', Name => 'JCL options' });
 declare('j',
 	[ 'JCLBegin',			'q',	undef ],
 	[ 'JCLToPSInterpreter',		'q',	undef ],
+	[ 'JCLToPDFInterpreter',	'q',	undef ],
 	[ 'JCLEnd',			'q',	undef ],
 );
 
@@ -303,9 +311,9 @@ sub format_value($$) {
 sub heading($) {
 	my ($h) = @_;
 	print "\n";
-	print "%* ", "=" x length $h, "\n";
-	print "%* ", $h, "\n";
-	print "%* ", "=" x length $h, "\n";
+	print "*% ", "=" x length $h, "\n";
+	print "*% ", $h, "\n";
+	print "*% ", "=" x length $h, "\n";
 	print "\n";
 }
 
@@ -321,7 +329,7 @@ sub get_default($) {
 sub emit_option($) {
 	my ($o) = @_;
 	my $key = $o->{Key};
-	print "%* === $key ===\n";
+	print "*% === $key ===\n";
 
 	my $jcl = ($o->{JCL} // ($key =~ /^JCL/)) ? "JCL" : "";
 	if (defined $o->{Choice}) {
@@ -331,7 +339,7 @@ sub emit_option($) {
 	if (defined($o->{Choice}) || defined($o->{Priority}) || defined($o->{Section})) {
 		my $pri = $o->{Priority} // 100;
 		my $sec = $o->{Section} // ($jcl ? "JCLSetup" : "AnySetup");
-		print '*', ((defined $o->{Choice}) ? "" : 'NonUI'), "OrderDependency $pri $sec *$key\n";
+		print '*', ((defined $o->{Choice}) ? "" : 'NonUI'), "OrderDependency: $pri $sec *$key\n";
 	}
 
 	# Normal option
@@ -352,7 +360,7 @@ sub emit_option($) {
 		print "\n";
 	}
 
-	if (defined $o->{Choice}) { print "*${jcl}CloseUI *$key\n"; }
+	if (defined $o->{Choice}) { print "*${jcl}CloseUI: *$key\n"; }
 
 	my $c = $o->{Custom};
 	if ($c) {
@@ -374,8 +382,11 @@ sub emit_keyword($) {
 	my ($k) = @_;
 	if ($k->{Type} eq 'o') {
 		emit_option($k);
-	} elsif (defined $k->{Value}) {
-		print "*", $k->{Key}, ": ", format_value($k->{'Type'}, $k->{'Value'}), "\n";
+	} elsif ($k->{Value} || $k->{Values}) {
+		my $vals = $k->{Values} // [ $k->{Value} ];
+		for my $t (@$vals) {
+			print "*", $k->{Key}, ": ", format_value($k->{Type}, $t), "\n";
+		}
 	}
 }
 
@@ -424,7 +435,7 @@ sub fill_defaults() {
 sub check_missing() {
 	for my $key (keys %keywords) {
 		my $k = $keywords{$key};
-		if ($k->{Mandatory} && !defined $k->{Value}) {
+		if ($k->{Mandatory} && !defined $k->{Value} && !defined $k->{Values}) {
 			die "Mandatory keyword $key not set\n";
 		}
 	}
diff --git a/ppd/PPD/PJL.pm b/ppd/PPD/PJL.pm
index 93e40798f00c65a9c93baba98aa00411ee2d63c4..ae0b66f28ed720d84034521447da2bbefa8aa9e3 100644
--- a/ppd/PPD/PJL.pm
+++ b/ppd/PPD/PJL.pm
@@ -2,9 +2,11 @@ package PPD::PJL;
 
 use PPD;
 
-sub add_jcl() {
+sub add_jcl($) {
+	my $opt = $_[0] // {};
 	set('JCLBegin', '<1B>%-12345X@PJL<0A>');
 	set('JCLToPSInterpreter', '@PJL ENTER LANGUAGE = POSTSCRIPT<0A>');
+	set('JCLToPDFInterpreter', '@PJL ENTER LANGUAGE = PDF<0A>') if $opt->{PDF};
 	set('JCLEnd', '<1B>%-12345X@PJL EOJ<0A><1B>%-12345X<0A>');
 }
 
diff --git a/ppd/PPD/Paper.pm b/ppd/PPD/Paper.pm
index adf19d5b1aeed760db3dc12a834f34f1cf51fef6..ee8e84fe74ac9bc0196eb3dd3f7e99863cce9b8b 100644
--- a/ppd/PPD/Paper.pm
+++ b/ppd/PPD/Paper.pm
@@ -19,22 +19,22 @@ my %media = (
 	'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) },
+	'ISOB0' => { Name => 'B0', W => mm(1000), H => mm(1414) },
+	'ISOB1' => { Name => 'B1', W => mm(707), H => mm(1000) },
+	'ISOB2' => { Name => 'B2', W => mm(500), H => mm(707) },
+	'ISOB3' => { Name => 'B3', W => mm(353), H => mm(500) },
+	'ISOB4' => { Name => 'B4', W => mm(250), H => mm(353) },
+	'ISOB5' => { Name => 'B5', W => mm(176), H => mm(250) },
+	'ISOB6' => { Name => 'B6', W => mm(125), H => mm(176) },
+	'EnvC0' => { Name => 'C0 Envelope', W => mm(917), H => mm(1297) },
+	'EnvC1' => { Name => 'C1 Envelope', W => mm(648), H => mm(917) },
+	'EnvC2' => { Name => 'C2 Envelope', W => mm(458), H => mm(648) },
+	'EnvC3' => { Name => 'C3 Envelope', W => mm(324), H => mm(458) },
+	'EnvC4' => { Name => 'C4 Envelope', W => mm(229), H => mm(324) },
+	'EnvC5' => { Name => 'C5 Envelope', W => mm(162), H => mm(229) },
+	'EnvC6' => { Name => 'C6 Envelope', W => mm(114), H => mm(162) },
+	'EnvC7' => { Name => 'C7 Envelope', W => mm(81), H => mm(114) },
+	'EnvC8' => { Name => 'C8 Envelope', W => mm(57), H => mm(81) },
 	'Letter' => { Name => 'US Letter', W => 612, H => 792 },
 	'Legal' => { Name => 'US Legal', W => 612, H => 1008 },
 );
@@ -47,6 +47,7 @@ my %media = (
 #	MarginH => pt,		# Horizontal margin (default: 0)
 #	MarginV => pt,		# Vertical margin (default: 0)
 #	DefPaper => paper,	# Default paper type (default: A4)
+#	JCL => 1,		# Paper should be handled via JCL (default: 0)
 #	PSPageSize => PS,	# PS code for setting PageSize (subroutine called with ref to media object)
 #	PSPageRegion => PS,	# The same for PageRegion (default: use PSPageSize)
 # })
@@ -59,6 +60,7 @@ sub add_papers($) {
 	my $maxh = $o->{MaxH} // 842;
 	my $margh = $o->{MarginH} // 0;
 	my $margv = $o->{MarginV} // 0;
+	my $jcl = $o->{JCL} // 0;
 	my %real_media = ();
 	for my $p (keys %media) {
 		my $m = $media{$p};
@@ -73,8 +75,9 @@ sub add_papers($) {
 	option({
 		Key => 'PageSize',
 		Name => 'Page Size',
-		Choice => 'PickAny',
+		Choice => 'PickOne',
 		Priority => 20,
+		JCL => $jcl,
 		Values => [ map {
 			my $k = $_;
 			my $m = $real_media{$_};
@@ -100,8 +103,9 @@ sub add_papers($) {
 	option({
 		Key => 'PageRegion',
 		Name => 'Page Region',
-		Choice => 'PickAny',
+		Choice => 'PickOne',
 		Priority => 21,
+		JCL => $jcl,
 		Values => [ map {
 			my $k = $_;
 			my $m = $real_media{$_};
diff --git a/ppd/gen-nessie-xcpt b/ppd/gen-nessie-xcpt
new file mode 100755
index 0000000000000000000000000000000000000000..f2cb9a8badbed7cd50b8357d8504595a7ae47bbf
--- /dev/null
+++ b/ppd/gen-nessie-xcpt
@@ -0,0 +1,482 @@
+#!/usr/bin/perl
+
+# FIXME: Custom paper sizes
+# FIXME: Precision of paper sizes
+# FIXME: Paper orientation
+
+use strict;
+use warnings;
+
+use lib ".";
+use PPD;
+use PPD::PJL;
+use PPD::Paper;
+use PPD::Common;
+
+set('FileVersion', '1.0');
+set('PCFileName', 'XRWC7845.PPD');
+
+set('Manufacturer', 'Xerox');
+set('Product', [ 'WorkCentre 7845', '(1.3.6.1.4.1.253.8.62.1.20.6.26.1.1)' ]);
+set('PSVersion', '(3010.106) 3000');
+
+set('Throughput', 45);
+set('TTRasterizer', 'Type42');
+set('Protocols', 'PJL BCP TBCP');
+
+set('cupsFilter', 'application/vnd.cups-pdf 0 /aux/root/xcpt');
+
+set('ColorDevice', 1);
+set('DefaultColorSpace', 'CMYK');
+
+# FIXME: Librarize
+sub jopt {
+	my $out = "";
+	while (@_) {
+		my $key = shift @_;
+		my $val = shift @_;
+		$out .= sprintf('@PJL SET %s=%s<0A>', $key, $val);
+	}
+	return $out;
+}
+
+define_ui_group({ Key => 'Basic', Name => 'Basic options' });
+
+option({
+	Key => 'Duplex',
+	Name => '2-Sided Printing',
+	Choice => 'PickOne',
+	Priority => 40,
+	JCL => 1,
+	Values => [
+		{ Key => 'None', Name => 'Off (1-Sided)', PS => jopt('SIDES', 'one-sided') },
+		{ Key => 'DuplexNoTumble', Name => 'Long-Edge Binding', PS => jopt('SIDES', 'two-sided-long-edge') },
+		{ Key => 'DuplexTumble', Name => 'Short-Edge Binding', PS => jopt('SIDES', 'two-sided-short-edge') },
+	]
+});
+
+option({
+	Key => 'Collate',
+	Choice => 'Boolean',
+	Priority => 41,
+	JCL => 1,
+	Values => [
+		{ Key => 'False', Name => 'Off', PS => jopt('COLLATE', 'uncollated') },
+		{ Key => 'True', Name => 'On', PS => jopt('COLLATE', 'collated'), Default => 1 },
+	]
+});
+
+option({
+	Key => 'XRPrivate',
+	Choice => 'Boolean',
+	Name => 'Private Job',
+	Priority => 59,
+	JCL => 1,
+	Values => [
+		{ Key => 'False', Name => 'Print normally', PS => jopt('PRIVATE', "") },
+		{ Key => 'True', Name => 'Private print-out (wait for the user to log in)', PS => jopt('PRIVATE', 'YES') },
+	],
+});
+
+PPD::PJL::add_jcl({ PDF => 1 });
+
+PPD::Paper::add_papers({
+	MinW => 252, MaxW => 864,
+	MinH => 278, MaxH => 1368,
+	MarginH => 11.34, MarginV => 11.34,	# FIXME: show as floats
+	JCL => 1,
+	PSPageSize => sub { my ($m) = @_; return jopt('MEDIAXSIZE', $m->{W}, 'MEDIAYSIZE', $m->{H}); },
+	# FIXME: LeadingEdge
+});
+switch_group('Media');
+
+option({
+	Key => 'MediaType',
+	Name => 'Media Type',
+	Choice => 'PickOne',
+	Priority => 20,
+	JCL => 1,
+	Values => [
+		map { { Key => $_->[0], Name => $_->[1], PS => jopt('MEDIATYPE', $_->[2]) } }
+		(
+		[ 'AutoSelect',				'Automatically Select',				'use-ready'			],
+		[ 'SystemDefault',			'Printer Default',				'system-default'		],
+		[ 'Plain',				'Plain',					'stationery'			],
+		[ 'PlainReload',			'Plain Reloaded',				'stationery-reloaded'		],
+		[ 'Recycled',				'Recycled',					'stationery-recycled'		],
+		[ 'Punched',				'Punched',					'stationery-pre-punched'	],
+		[ 'Lightweight',			'Lightweight',					'stationery-lightweight'	],
+		[ 'LightweightCardStock',		'Lightweight Cardstock',			'cardstock-lightweight'		],
+		[ 'LightweightCardStockReloaded',	'Lightweight Cardstock Reloaded',		'cardstock-lightweight-reloaded' ],
+		[ 'CardStock',				'Cardstock',					'cardstock'			],
+		[ 'CardStockReloaded',			'Cardstock Reloaded',				'cardstock-reloaded',		],
+		[ 'HeavyweightCardstock',		'Heavyweight Cardstock',			'cardstock-heavyweight'		],
+		[ 'HeavyweightCardstockReloaded',	'Heavyweight Cardstock Reloaded',		'cardstock-heavyweight-reloaded' ],
+		[ 'LightweightGlossyCardStock',		'Lightweight Glossy Cardstock',			'cardstock-lightweight-glossy'		],
+		[ 'LightweightGlossyCardStockReloaded',	'Lightweight Glossy Cardstock Reloaded',	'cardstock-lightweight-glossy-reloaded' ],
+		[ 'GlossyCardStock',			'Glossy Cardstock',				'cardstock-glossy',		],
+		[ 'GlossyCardStockReloaded',		'Glossy Cardstock Reloaded',			'cardstock-glossy-reloaded',	],
+		[ 'HeavyweightGlossyCardstock',		'Heavyweight Glossy Cardstock',			'cardstock-heavyweight'		],
+		[ 'HeavyweightGlossyCardstockReloaded',	'Heavyweight Glossy Cardstock Reloaded',	'cardstock-heavyweight-reloaded' ],
+		[ 'PrePrinted',				'Pre-Printed',					'stationery-pre-printed'	],
+		[ 'Letterhead',				'Letterhead',					'stationery-letterhead'		],
+		[ 'Transparency',			'Transparency',					'transparency'			],
+		[ 'Bond',				'Bond',						'bond'				],
+		[ 'Labels',				'Labels',					'labels',			],
+		[ 'Envelopes',				'Envelope',					'envelope',			],
+		[ 'Custom1',				'Custom Type 1',				'custom1'			],
+		[ 'Custom2',				'Custom Type 2',				'custom2'			],
+		[ 'Custom3',				'Custom Type 3',				'custom3'			],
+		[ 'Custom4',				'Custom Type 4',				'custom4'			],
+		[ 'Custom5',				'Custom Type 5',				'custom5'			],
+		[ 'Custom6',				'Custom Type 6',				'custom6'			],
+		[ 'Custom7',				'Custom Type 7',				'custom7'			],
+		[ 'Other',				'Other Type',					'other'				],
+		)
+	],
+	Default => 'SystemDefault',
+});
+
+option({
+	Key => 'MediaColor',
+	Name => 'Media Color',
+	Choice => 'PickOne',
+	Priority => 21,
+	JCL => 1,
+	Values => [
+		map { { Key => $_->[0], Name => $_->[1], PS => jopt('MEDIACOLOR', $_->[2]) } }
+		(
+		[ 'SystemDefault',	'Printer Default',	'system-default'	],
+		[ 'Blue',		'Blue',			'blue'			],
+		[ 'Buff',		'Buff',			'buff'			],
+		[ 'Clear',		'Clear',		'no-color'		],
+		[ 'Goldenrod',		'Goldenrod',		'goldenrod'		],
+		[ 'Gray',		'Gray',			'gray'			],
+		[ 'Green',		'Green',		'green'			],
+		[ 'Ivory',		'Ivory',		'ivory'			],
+		[ 'Orange',		'Orange',		'orange'		],
+		[ 'Pink',		'Pink',			'pink'			],
+		[ 'Red',		'Red',			'red'			],
+		[ 'White',		'White',		'white'			],
+		[ 'Yellow',		'Yellow',		'yellow'		],
+		[ 'Custom1',		'Custom Color 1',	'custom1'		],
+		[ 'Custom2',		'Custom Color 2',	'custom2'		],
+		[ 'Custom3',		'Custom Color 3',	'custom3'		],
+		[ 'Custom4',		'Custom Color 4',	'custom4'		],
+		[ 'Custom5',		'Custom Color 5',	'custom5'		],
+		[ 'Custom6',		'Custom Color 6',	'custom6'		],
+		[ 'Custom7',		'Custom Color 7',	'custom7'		],
+		[ 'Other',		'Other Color',		'other'			],
+		)
+	],
+	Default => 'SystemDefault',
+});
+
+option({
+	Key => 'InputSlot',
+	Name => 'Input Slot',
+	Choice => 'PickOne',
+	Priority => 30,
+	JCL => 1,
+	Values => [
+		{ Key => 'AutoSelect', Name => 'Automatically Select', PS => jopt('INPUTTRAY', 'automatic'), Default => 1 },
+		{ Key => 'Tray1', Name => 'Tray 1', PS => jopt('INPUTTRAY', 'tray-1') },
+		{ Key => 'Tray2', Name => 'Tray 2', PS => jopt('INPUTTRAY', 'tray-2') },
+		{ Key => 'Tray3', Name => 'Tray 3', PS => jopt('INPUTTRAY', 'tray-3') },
+		{ Key => 'Tray4', Name => 'Tray 4', PS => jopt('INPUTTRAY', 'tray-4') },
+		{ Key => 'Tray5', Name => 'Tray 5 (Bypass)', PS => jopt('INPUTTRAY', 'tray-5') },
+		{ Key => 'ManualFeed', Name => 'Tray 5 (Bypass with manual feed)', PS => jopt('INPUTTRAY', 'manualfeed', 'TRAYFEED', 'manual-check') },
+	],
+});
+
+option({
+	Key => 'RequiresPageRegion',
+	Values => [{ Key => 'All', String => 'True' }],
+	Default => undef,
+});
+
+define_ui_group({ Key => 'Finishing', Name => 'Finishing' });
+
+option({
+	Key => 'OutputBin',
+	Name => 'Paper Destination',
+	Choice => 'PickOne',
+	Priority => 50,
+	JCL => 1,
+	Values => [
+		{ Key => 'AutoSelect', Name => 'Automatically Select', PS => jopt('OUTPUT', 'automatic'), Default => 1 },
+		{ Key => 'Middle', Name => 'Center Tray', PS => jopt('OUTPUT', 'center') },
+		{ Key => 'Left', Name => 'Left Top Tray', PS => jopt('OUTPUT', 'left') },
+		{ Key => 'RightTop', Name => 'Right Top Tray', PS => jopt('OUTPUT', 'right-top') },
+		{ Key => 'RightMiddle', Name => 'Right Middle Tray', PS => jopt('OUTPUT', 'right-middle') },
+	],
+});
+
+option({
+	Key => 'Jog',
+	Name => 'Offset',
+	Choice => 'PickOne',
+	Priority => 51,
+	JCL => 1,
+	Values => [
+		{ Key => 'None', Name => 'No Offset', PS => jopt('OFFSET', 'none') },
+		{ Key => 'EndOfSet', Name => 'Each Set', PS => jopt('OFFSET', 'offset-set'), Default => 1 },
+		{ Key => 'EndOfJob', Name => 'Each Job', PS => jopt('OFFSET', 'offset-job') },
+	],
+});
+
+# FIXME
+#option({
+#	Key => 'StapleLocation',
+#	Name => 'Stapling',
+#	Choice => 'PickOne',
+#	Priority => 55,
+#	Values => [
+#		{ Key => 'None', Name => 'No Staple', PS => '<< /Staple 0 >> setpagedevice', Default => 1 },
+#		{ Key => 'SinglePortrait', Name => '1 Staple (Portrait)',
+#		  PS => '<< /Collate true /Staple 3 /StapleDetails << /Type 7 /Location 0 >> >> setpagedevice' },
+#		{ Key => 'SingleLandscape', Name => '1 Staple (Landscape)',
+#		  PS => '<< /Collate true /Staple 3 /StapleDetails << /Type 7 /Location 1 >> >> setpagedevice' },
+#		{ Key => 'DualPortrait', Name => '2 Staples (Portrait)',
+#		  PS => 'userdict /XRXShortEdgeFinishing known ' .
+#		        '{ << /Collate true /Staple 3 /LeadingEdge 0 /StapleDetails << /Type 7 /Location 4 >> >> setpagedevice } ' .
+#		        '{ << /Collate true /Staple 3 /LeadingEdge 1 /StapleDetails << /Type 7 /Location 6 >> >> setpagedevice } ifelse' },
+#		{ Key => 'DualLandscape', Name => '2 Staples (Landscape)',
+#		  PS => 'userdict /XRXShortEdgeFinishing known ' .
+#		        '{ << /Collate true /Staple 3 /LeadingEdge 0 /StapleDetails << /Type 7 /Location 5 >> >> setpagedevice } ' .
+#		        '{ << /Collate true /Staple 3 /LeadingEdge 1 /StapleDetails << /Type 7 /Location 6 >> >> setpagedevice } ifelse' },
+#		# FIXME: Set XRXShortEdgeFinishing
+#	],
+#});
+
+# FIXME
+#option({
+#	Key => 'XRFold',
+#	Name => 'Folding',
+#	Choice => 'PickOne',
+#	Priority => 56,
+#	Values => [
+#		{ Key => 'None', Name => 'No Folding', PS => '<< /Fold 0 >> setpagedevice >>', Default => 1 },
+#		{ Key => 'BiFold', Name => 'Booklet Fold',
+#		  PS => '<< /Booklet true /OutputType (BOOKLET TRAY) /LeadingEdge 0 ' .
+#		        '/BookletDetails << /Type 3 /StapleType 0 /PrintInside true /PageSet true >> ' .
+#			'>> setpagedevice' },
+#		{ Key => 'BiFoldStaple', Name => 'Booklet Fold and Staple',
+#		  PS => '<< /Booklet true /OutputType (BOOKLET TRAY) /LeadingEdge 0 ' .
+#		        '/BookletDetails << /StapleType 1 /PrintInside true >> ' .
+#			'>> setpagedevice' },
+#	],
+#});
+
+# FIXME: Update
+#constrain(undef, 'InputSlot', 'MediaType', sub {
+#	my ($is, $mt) = @_;
+#	return !(($is eq 'Tray2' || $is eq 'Tray3') &&
+#		 ($mt eq 'Labels' || $mt eq 'Envelope'));
+#});
+
+#constrain(undef, 'Duplex', 'MediaType', sub {
+#	my ($dp, $mt) = @_;
+#	return !($dp ne 'None' && $mt =~ /^(Labels|Transparency|Bond)$/);
+#});
+
+# FIXME: Replace by XRXMismatch
+#option({
+#	Key => 'HPPaperPolicy',
+#	Name => 'Fit to Page',
+#	Choice => 'PickOne',
+#	Priority => 10,
+#	Values => [
+#		{ Key => 'PromptUser', Name => 'PromptUser', PS => '', Default => 1 },
+#		{ Key => 'NearestSizeAdjust', Name => 'Nearest Size and Scale', PS => '<< /Policies << /DeferredMediaSelection true /PageSize 3 >> >> setpagedevice' },
+#		{ Key => 'NearestSizeNoAdjust', Name => 'Nearest Size and Crop', PS => '<< /Policies << /DeferredMediaSelection true /PageSize 5 >> >> setpagedevice' },
+#	],
+#});
+
+define_ui_group({ Key => 'Quality', Name => 'Print Quality' });
+
+option({
+	Key => 'XRColor',
+	Name => 'Color Printing',
+	Choice => 'PickOne',
+	Priority => 70,
+	JCL => 1,
+	Values => [
+		{ Key => 'Mono', Name => 'Monochromatic', PS => jopt('COLOR', 'mono'), Default => 1 },
+		{ Key => 'Color', Name => 'Color', PS => jopt('COLOR', 'color') },
+	],
+});
+
+# FIXME
+#option({
+#	Key => 'XRImageQuality',
+#	Name => 'Image Quality',
+#	Choice => 'PickOne',
+#	Priority => 71,
+#	Values => [ map {
+#			{ Key => ($_ > 0) ? "Lighten$_" : ($_ < 0) ? "Darken" . -$_ : "Normal",
+#			  Name => ($_ > 0) ? "Lighten (+$_)" : ($_ < 0) ? "Darken ($_)" : "Normal",
+#			  PS => "<< /DeviceRenderingInfo << /Brightness $_ >> >> setpagedevice",
+#			}
+#		  } (-5..5)
+#	],
+#});
+
+# FIXME
+#option({
+#	Key => 'Resolution',
+#	Name => 'Printer Resolution',
+#	Choice => 'PickOne',
+#	Priority => 72,
+#	Values => [
+#		{ Key => '600dpi', Name => '600 DPI (Fast)',
+#		  PS => '<< /HWResolution [600 600] /DeviceRenderingInfo << /Type 26 /ValuesPerColorComponent 2 >> >> setpagedevice',
+#		  Default => 1,
+#		},
+#		{ Key => '1200dpi', Name => '1200 DPI (High Quality)',
+#		  PS => '<< /HWResolution [1200 1200] /DeviceRenderingInfo << /Type 26 /ValuesPerColorComponent 2 >> >> setpagedevice'
+#		},
+#	],
+#});
+
+# As reported by the printer (FIXME)
+fonts( <<'AMEN' );
+AlbertusMT-Italic: Standard "(001.001)" Standard ROM
+AlbertusMT-Light: Standard "(001.001)" Standard ROM
+AlbertusMT: Standard "(001.001)" Standard ROM
+AntiqueOlive-Bold: Standard "(001.002)" Standard ROM
+AntiqueOlive-Compact: Standard "(001.002)" Standard ROM
+AntiqueOlive-Italic: Standard "(001.002)" Standard ROM
+AntiqueOlive-Roman: Standard "(001.002)" Standard ROM
+Apple-Chancery: Standard "(001.002)" ExtendedRoman ROM
+Arial-BoldItalicMT: Standard "(001.003)" Standard ROM
+Arial-BoldMT: Standard "(001.003)" Standard ROM
+Arial-ItalicMT: Standard "(001.003)" Standard ROM
+ArialMT: Standard "(001.003)" Standard ROM
+AvantGarde-Book: Standard "(003.000)" Standard ROM
+AvantGarde-BookOblique: Standard "(003.000)" Standard ROM
+AvantGarde-Demi: Standard "(003.000)" Standard ROM
+AvantGarde-DemiOblique: Standard "(003.000)" Standard ROM
+Bodoni-Bold: Standard "(001.003)" Standard ROM
+Bodoni-BoldItalic: Standard "(001.003)" Standard ROM
+Bodoni-Italic: Standard "(001.003)" Standard ROM
+Bodoni-Poster: Standard "(001.003)" Standard ROM
+Bodoni-PosterCompressed: Standard "(001.002)" Standard ROM
+Bodoni: Standard "(001.003)" Standard ROM
+Bookman-Demi: Standard "(003.000)" Standard ROM
+Bookman-DemiItalic: Standard "(003.000)" Standard ROM
+Bookman-Light: Standard "(003.000)" Standard ROM
+Bookman-LightItalic: Standard "(003.000)" Standard ROM
+Carta: Special "(001.001)" Special ROM
+Chicago: Standard "(001.000)" ExtendedRoman ROM
+Clarendon-Bold: Standard "(001.002)" Standard ROM
+Clarendon-Light: Standard "(001.002)" Standard ROM
+Clarendon: Standard "(001.002)" Standard ROM
+CooperBlack-Italic: Standard "(001.004)" Standard ROM
+CooperBlack: Standard "(001.004)" Standard ROM
+Copperplate-ThirtyThreeBC: Standard "(001.003)" Standard ROM
+Copperplate-ThirtyTwoBC: Standard "(001.003)" Standard ROM
+Coronet-Regular: Standard "(001.002)" Standard ROM
+Courier-Bold: Standard "(004.000)" Standard ROM
+Courier-BoldOblique: Standard "(004.000)" Standard ROM
+Courier-Oblique: Standard "(004.000)" Standard ROM
+Courier: Standard "(004.000)" Standard ROM
+Eurostile-Bold: Standard "(001.002)" Standard ROM
+Eurostile-BoldExtendedTwo: Standard "(001.003)" Standard ROM
+Eurostile-ExtendedTwo: Standard "(001.003)" Standard ROM
+Eurostile: Standard "(001.003)" Standard ROM
+Geneva: Standard "(001.000)" ExtendedRoman ROM
+GillSans-Bold: Standard "(001.002)" Standard ROM
+GillSans-BoldCondensed: Standard "(001.002)" Standard ROM
+GillSans-BoldItalic: Standard "(001.003)" Standard ROM
+GillSans-Condensed: Standard "(001.002)" Standard ROM
+GillSans-ExtraBold: Standard "(001.002)" Standard ROM
+GillSans-Italic: Standard "(001.003)" Standard ROM
+GillSans-Light: Standard "(001.002)" Standard ROM
+GillSans-LightItalic: Standard "(001.003)" Standard ROM
+GillSans: Standard "(001.003)" Standard ROM
+Goudy-Bold: Standard "(001.003)" Standard ROM
+Goudy-BoldItalic: Standard "(001.003)" Standard ROM
+Goudy-ExtraBold: Standard "(001.002)" Standard ROM
+Goudy-Italic: Standard "(001.003)" Standard ROM
+Goudy: Standard "(001.004)" Standard ROM
+Helvetica-Bold: Standard "(003.000)" Standard ROM
+Helvetica-BoldOblique: Standard "(003.000)" Standard ROM
+Helvetica-Condensed-Bold: Standard "(003.000)" Standard ROM
+Helvetica-Condensed-BoldObl: Standard "(003.000)" Standard ROM
+Helvetica-Condensed-Oblique: Standard "(003.000)" Standard ROM
+Helvetica-Condensed: Standard "(003.000)" Standard ROM
+Helvetica-Narrow-Bold: Standard "(003.000)" Standard ROM
+Helvetica-Narrow-BoldOblique: Standard "(003.000)" Standard ROM
+Helvetica-Narrow-Oblique: Standard "(003.000)" Standard ROM
+Helvetica-Narrow: Standard "(003.000)" Standard ROM
+Helvetica-Oblique: Standard "(003.000)" Standard ROM
+Helvetica: Standard "(003.000)" Standard ROM
+HoeflerText-Black: Standard "(001.000)" ExtendedRoman ROM
+HoeflerText-BlackItalic: Standard "(001.000)" ExtendedRoman ROM
+HoeflerText-Italic: Standard "(001.000)" ExtendedRoman ROM
+HoeflerText-Ornaments: Special "(001.001)" Standard ROM
+HoeflerText-Regular: Standard "(001.000)" ExtendedRoman ROM
+JoannaMT-Bold: Standard "(001.001)" Standard ROM
+JoannaMT-BoldItalic: Standard "(001.001)" Standard ROM
+JoannaMT-Italic: Standard "(001.001)" Standard ROM
+JoannaMT: Standard "(001.001)" Standard ROM
+LetterGothic-Bold: Standard "(001.007)" Standard ROM
+LetterGothic-BoldSlanted: Standard "(001.006)" Standard ROM
+LetterGothic-Slanted: Standard "(001.005)" Standard ROM
+LetterGothic: Standard "(001.005)" Standard ROM
+LubalinGraph-Book: Standard "(001.004)" Standard ROM
+LubalinGraph-BookOblique: Standard "(001.004)" Standard ROM
+LubalinGraph-Demi: Standard "(001.004)" Standard ROM
+LubalinGraph-DemiOblique: Standard "(001.004)" Standard ROM
+Marigold: Standard "(001.001)" Standard ROM
+MonaLisa-Recut: Standard "(001.001)" Standard ROM
+Monaco: Standard "(001.001)" ExtendedRoman ROM
+NewCenturySchlbk-Bold: Standard "(003.000)" Standard ROM
+NewCenturySchlbk-BoldItalic: Standard "(003.000)" Standard ROM
+NewCenturySchlbk-Italic: Standard "(003.000)" Standard ROM
+NewCenturySchlbk-Roman: Standard "(003.000)" Standard ROM
+NewYork: Standard "(001.000)" ExtendedRoman ROM
+Optima-Bold: Standard "(001.007)" Standard ROM
+Optima-BoldItalic: Standard "(001.001)" Standard ROM
+Optima-Italic: Standard "(001.001)" Standard ROM
+Optima: Standard "(001.006)" Standard ROM
+Oxford: Standard "(001.001)" Standard ROM
+Palatino-Bold: Standard "(003.000)" Standard ROM
+Palatino-BoldItalic: Standard "(003.000)" Standard ROM
+Palatino-Italic: Standard "(003.000)" Standard ROM
+Palatino-Roman: Standard "(003.000)" Standard ROM
+StempelGaramond-Bold: Standard "(001.003)" Standard ROM
+StempelGaramond-BoldItalic: Standard "(001.003)" Standard ROM
+StempelGaramond-Italic: Standard "(001.003)" Standard ROM
+StempelGaramond-Roman: Standard "(001.003)" Standard ROM
+Symbol: Special "(001.008)" Special ROM
+Tekton: Standard "(001.002)" Standard ROM
+Times-Bold: Standard "(003.000)" Standard ROM
+Times-BoldItalic: Standard "(003.000)" Standard ROM
+Times-Italic: Standard "(003.000)" Standard ROM
+Times-Roman: Standard "(003.000)" Standard ROM
+TimesNewRomanPS-BoldItalicMT: Standard "(001.003)" Standard ROM
+TimesNewRomanPS-BoldMT: Standard "(001.004)" Standard ROM
+TimesNewRomanPS-ItalicMT: Standard "(001.003)" Standard ROM
+TimesNewRomanPSMT: Standard "(001.003)" Standard ROM
+Univers-Bold: Standard "(001.004)" Standard ROM
+Univers-BoldExt: Standard "(001.001)" Standard ROM
+Univers-BoldExtObl: Standard "(001.001)" Standard ROM
+Univers-BoldOblique: Standard "(001.004)" Standard ROM
+Univers-Condensed: Standard "(001.003)" Standard ROM
+Univers-CondensedBold: Standard "(001.002)" Standard ROM
+Univers-CondensedBoldOblique: Standard "(001.002)" Standard ROM
+Univers-CondensedOblique: Standard "(001.003)" Standard ROM
+Univers-Extended: Standard "(001.001)" Standard ROM
+Univers-ExtendedObl: Standard "(001.001)" Standard ROM
+Univers-Light: Standard "(001.004)" Standard ROM
+Univers-LightOblique: Standard "(001.004)" Standard ROM
+Univers-Oblique: Standard "(001.004)" Standard ROM
+Univers: Standard "(001.004)" Standard ROM
+Wingdings-Regular: Special "(Version 2.00)" Special ROM
+ZapfChancery-MediumItalic: Standard "(003.000)" Standard ROM
+ZapfDingbats: Special "(002.000)" Special ROM
+AMEN
+
+generate();