diff --git a/ppd/PPD.pm b/ppd/PPD.pm
index 14206f45364ece359c83ca0d5c18f3d5ef603f35..c1ec98f054ea4d3b876c5ca613bff888ee462a87 100644
--- a/ppd/PPD.pm
+++ b/ppd/PPD.pm
@@ -234,8 +234,8 @@ declare('f',
 define_head_group({ Key => 'p', Name => 'Product description' });
 declare('p',
 	[ 'Manufacturer',		'q!',	undef ],
-	[ 'ModelName',			'q!',	undef ],	# default: copy Product
-	[ 'NickName',			'q!',	undef ],	# default: copy Product
+	[ 'ModelName',			'q!',	undef ],	# default: concatenate Manufacturer and Product
+	[ 'NickName',			'q!',	undef ],	# default: copy ModelName
 	[ 'ShortNickName',		'q!',	undef ],	# default: copy NickName
 	[ 'Product',			'q!',	undef ],
 	[ 'PSVersion',			'q!',	undef ],
@@ -405,16 +405,14 @@ sub emit_constraints() {
 }
 
 sub fill_defaults() {
-	my $model = get('ModelName');
-	if (defined $model) {
-		maybe_set('Product', "($model)");
-		maybe_set('NickName', $model);
+	my $mfg = get('Manufacturer');
+	my $prod = get('Product');
+	if (defined($mfg) && defined($prod)) {
+		maybe_set('ModelName', $mfg . ' ' . $prod);
 	}
 
-	my $nick = get('NickName');
-	if ($nick) {
-		maybe_set('ShortNickName', $nick);
-	}
+	maybe_set('NickName', get('ModelName')) if defined get('ModelName');
+	maybe_set('ShortNickName', get('NickName')) if defined get('NickName');
 
 	my $psver = get('PSVersion');
 	if (defined($psver) && $psver =~ /\((\d)/) {
diff --git a/ppd/gen-hp b/ppd/gen-hp
index e509a3ca6511afec29885c30f7a96631004c8c42..351cf4a026693dd9d243ce6066c9b3e128d1ccd2 100755
--- a/ppd/gen-hp
+++ b/ppd/gen-hp
@@ -12,7 +12,7 @@ set('FileVersion', '1.0');
 set('PCFileName', 'HP4350.PPD');
 
 set('Manufacturer', 'HP');
-set('ModelName', 'HP LaserJet 4350');
+set('Product', 'LaserJet 4350');
 set('PSVersion', '(3010.107) 0');
 
 set('Throughput', 35);
diff --git a/ppd/gen-phaser b/ppd/gen-phaser
new file mode 100755
index 0000000000000000000000000000000000000000..a02dc56174c9b4548ad0824c1c3ae591a20303f7
--- /dev/null
+++ b/ppd/gen-phaser
@@ -0,0 +1,329 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use lib ".";
+use PPD;
+use PPD::PJL;
+use PPD::Paper;
+
+set('FileVersion', '1.0');
+set('PCFileName', 'XR7400.PPD');
+
+set('Manufacturer', 'Xerox');
+set('Product', 'Phaser 7400');
+set('PSVersion', '(3016.101) 3');
+
+# *DefaultOutputOrder: Normal
+# *AccurateScreensSupport: True
+# *DefaultGuaranteedMaxSeparations: 4
+
+set('Throughput', 35);
+set('TTRasterizer', 'Type42');
+set('Protocols', 'PJL BCP TBCP');
+set('FileSystem', 1);
+
+set('ColorDevice', 1);
+set('DefaultColorSpace', 'CMYK');
+
+set('cupsProtocol', 'None');
+
+# FIXME: JobPatchFile and magic there...
+
+define_ui_group({ Key => 'Basic', Name => 'Basic options' });
+
+option({
+	Key => 'Duplex',
+	Name => '2-Sided Printing',
+	Choice => 'PickOne',
+	Values => [
+		{ Key => 'None', Name => 'Off (1-Sided)', PS => "<< /Duplex false >> setpagedevice" },
+		{ Key => 'DuplexNoTumble', Name => 'Long-Edge Binding', PS => "<< /Duplex true /Tumble false >> setpagedevice", Default => 1 },
+		{ Key => 'DuplexTumble', Name => 'Short-Edge Binding', PS => "<< /Duplex true /Tumble true >> setpagedevice" },
+	]
+});
+
+option({
+	Key => 'Resolution',
+	Name => 'Printer Resolution',
+	Choice => 'PickOne',
+	Priority => 5,
+	Section  => 'DocumentSetup',
+	Values => [
+		{ Key => '1200x1200dpi', Name => 'ProRes 1200', PS => '<< /HWResolution [1200 1200] /PreRenderingEnhance false >> setpagedevice' },
+		{ Key => '600x600x2dpi', Name => 'FastRes 1200', PS => '<< /HWResolution [1200 1200] /PreRenderingEnhance true >> setpagedevice', Default => 1 },
+		{ Key => '600x600dpi', Name => '600 DPI', PS => '<< /HWResolution [600 600] /PreRenderingEnhance false >> setpagedevice' },
+	]
+});
+
+option({
+	Key => 'Collate',
+	Choice => 'Boolean',
+	Values => [
+		{ Key => 'False', Name => 'Off', PS => '<< /Collate false >> setpagedevice' },
+		{ Key => 'True', Name => 'On', PS => '<< /Collate true >> setpagedevice', Default => 1 },
+	]
+});
+
+# FIXME: Jog
+
+PPD::PJL::add_jcl();
+
+PPD::Paper::add_papers({
+	MinW => 254.6, MaxW => 930.3,
+	MinH => 254.6, MaxH => 3456.5,
+	MarginH => 14.456, MarginV => 14.456,
+	PSPageSize => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); },
+	# FIXME: LeadingEdge
+});
+switch_group('Media');
+
+option({
+	Key => 'MediaType',
+	Name => 'Media Type',
+	Choice => 'PickOne',
+	Priority => 20,
+	Values => gen_values("<< /MediaType (%s) >> setpagedevice",
+			{ Key => 'None', PS => '<< /MediaType null >> setpagedevice', Default => 1 },
+			"Paper",
+			"HeavyPaper",
+			"Transparency",
+			"ThinCardStock",
+			"ThickCardStock",
+			"ThickCardStock",
+			"ExtraThickCardStock",
+			"Envelope",
+			"Label",
+			"Letterhead",
+			"CoatedPaper",
+			"Preprinted",
+			"Prepunched",
+			"ColoredPaper",
+			"Special",
+		),
+});
+
+option({
+	Key => 'InputSlot',
+	Name => 'Input Slot',
+	Choice => 'PickOne',
+	Priority => 20,
+	Values => [
+		{ Key => 'ManualFeed', Name => 'Tray 1 with manual feed', PS => '<< /ManualFeed true /MediaPosition 0 /TraySwitch false >> setpagedevice' },
+		{ Key => 'Tray1', Name => 'Tray 1', PS => '<< /ManualFeed false /MediaPosition 0 /TraySwitch false >> setpagedevice' },
+		{ Key => 'Tray2', Name => 'Tray 2', PS => '<< /ManualFeed false /MediaPosition 1 /TraySwitch false >> setpagedevice' },
+		{ Key => 'Tray3', Name => 'Tray 3', PS => '<< /ManualFeed false /MediaPosition 2 /TraySwitch false >> setpagedevice' },
+	],
+	Default => 'Tray2',
+});
+
+option({
+	Key => 'OutputBin',
+	Name => 'Paper Destination',
+	Choice => 'PickOne',
+	Priority => 21,
+	Values => [
+		{ Key => 'TopBin', Name => 'Top Output Tray', PS => '<< /OutputType (Top Bin) >> setpagedevice' },
+		{ Key => 'LeftOutputTray', Name => 'Left Output Tray', PS => '<< /OutputType (Left Side Bin) >> setpagedevice' },
+	],
+	Default => 'TopBin',
+});
+
+option({
+	Key => 'RequiresPageRegion',
+	Values => [{ Key => 'All', String => 'True' }],
+	Default => undef,
+});
+
+# 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 / Color' });
+
+option({
+	Key => 'OutputMode',
+	Name => 'Print Quality',
+	Choice => 'PickOne',
+	Priority => 46,
+	Values => [
+		{ Key => 'Automatic', PS => 'true /RRCustomProcs /ProcSet findresource /setautopq get exec', Default => 1 },
+		# FIXME: ValuesPerColorComponent etc.
+		{ Key => 'Standard', PS => '<< /HWResolution [600 600] >> setpagedevice' },
+		{ Key => 'Enhanced', PS => '<< /HWResolution [600 1200] >> setpagedevice' },
+		{ Key => 'Photo', PS => '<< /HWResolution [600 600] >> setpagedevice' },
+	],
+});
+
+# FIXME: XRXColor, XRXGrayLine, XRXLightness, XRXSaturation, XRXContrast
+# FIXME: XRXCyanRed, XRXMagentaGreen, XRXYellowBlue, XRXApplyToCMYK
+# FIXME: XRXSmoothing, XRXPrintingOptimization
+
+# As reported by the printer
+fonts( <<'AMEN' );
+AlbertusMT: Standard "(001.001)" Standard ROM
+AlbertusMT-Italic: Standard "(001.001)" Standard ROM
+AlbertusMT-Light: 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)" Standard 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
+ArialNarrowCyrMT: Special "(001.004)" Special ROM
+ArialNarrowCyrMT-Bold: Special "(001.004)" Special 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: Standard "(001.003)" 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
+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)" Standard ROM
+Clarendon: Standard "(001.002)" Standard ROM
+Clarendon-Bold: Standard "(001.002)" Standard ROM
+Clarendon-Light: Standard "(001.002)" Standard ROM
+CooperBlack: Standard "(001.004)" Standard ROM
+CooperBlack-Italic: 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: Standard "(004.000)" Standard ROM
+Courier-Bold: Standard "(004.000)" Standard ROM
+Courier-BoldOblique: Standard "(004.000)" Standard ROM
+Courier-Oblique: Standard "(004.000)" Standard ROM
+Eurostile: Standard "(001.003)" Standard ROM
+Eurostile-Bold: Standard "(001.002)" Standard ROM
+Eurostile-BoldExtendedTwo: Standard "(001.003)" Standard ROM
+Eurostile-ExtendedTwo: Standard "(001.003)" Standard ROM
+Geneva: Standard "(001.000)" Standard ROM
+GillSans: Standard "(001.003)" Standard 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
+Goudy: Standard "(001.004)" 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
+Helvetica: Standard "(003.000)" Standard ROM
+Helvetica-Bold: Standard "(003.000)" Standard ROM
+Helvetica-BoldOblique: Standard "(003.000)" Standard ROM
+Helvetica-Condensed: 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-Narrow: 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-Oblique: Standard "(003.000)" Standard ROM
+HoeflerText-Black: Standard "(001.000)" Standard ROM
+HoeflerText-BlackItalic: Standard "(001.000)" Standard ROM
+HoeflerText-Italic: Standard "(001.000)" Standard ROM
+HoeflerText-Ornaments: Special "(001.001)" Special ROM
+HoeflerText-Regular: Standard "(001.000)" Standard ROM
+JoannaMT: Standard "(001.001)" Standard ROM
+JoannaMT-Bold: Standard "(001.001)" Standard ROM
+JoannaMT-BoldItalic: Standard "(001.001)" Standard ROM
+JoannaMT-Italic: Standard "(001.001)" Standard ROM
+LetterGothic: Standard "(001.005)" Standard ROM
+LetterGothic-Bold: Standard "(001.007)" Standard ROM
+LetterGothic-BoldSlanted: Standard "(001.006)" Standard ROM
+LetterGothic-Slanted: 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)" Standard 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)" Standard ROM
+Optima: Standard "(001.006)" Standard ROM
+Optima-Bold: Standard "(001.007)" Standard ROM
+Optima-BoldItalic: Standard "(001.001)" Standard ROM
+Optima-Italic: Standard "(001.001)" 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: Standard "(001.004)" 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
+Wingdings: Special "(001.001)" Special ROM
+Wingdings-Regular: Special "(001.001)" Special ROM
+ZapfChancery-MediumItalic: Standard "(003.000)" Standard ROM
+ZapfDingbats: Special "(002.000)" Special ROM
+AMEN
+
+# FIXME: Omitted configuration of halftoning
+
+generate();