[Xfce4-commits] [www/bugzilla.xfce.org] 01/01: Initial push for the Xfce Bugzilla skin and related templates.

noreply at xfce.org noreply at xfce.org
Sun May 28 21:36:10 CEST 2017


This is an automated email from the git hooks/post-receive script.

knome pushed a commit to branch master
in repository www/bugzilla.xfce.org.

commit d16fbe2a4e04fad3d53955aa388ae470b8affb59
Author: Pasi Lallinaho <pasi at shimmerproject.org>
Date:   Sun May 28 22:35:11 2017 +0300

    Initial push for the Xfce Bugzilla skin and related templates.
---
 skins/contrib/Xfce/README                          |   18 +
 skins/contrib/Xfce/add-attachment.png              |  Bin 0 -> 469 bytes
 skins/contrib/Xfce/admin.css                       |    0
 skins/contrib/Xfce/bug.css                         |  303 +++++
 skins/contrib/Xfce/buglist.css                     |    4 +
 skins/contrib/Xfce/favicon.ico                     |  Bin 0 -> 1082 bytes
 skins/contrib/Xfce/global.css                      |  596 ++++++++++
 skins/contrib/Xfce/index/bugzilla-magnifier.png    |  Bin 0 -> 7491 bytes
 skins/contrib/Xfce/index/bugzilla-papericon.png    |  Bin 0 -> 3800 bytes
 .../Xfce/index/bugzilla-person-alternate.png       |  Bin 0 -> 8359 bytes
 .../contrib/Xfce/index/bugzilla-questionmark2.png  |  Bin 0 -> 11552 bytes
 skins/contrib/Xfce/rss.png                         |  Bin 0 -> 679 bytes
 skins/contrib/Xfce/scripts.js                      |    9 +
 template/en/custom/attachment/list.html.tmpl       |    5 +
 .../en/custom/attachment/list_DEFAULT.html.tmpl    |    1 +
 template/en/custom/attachment/list_XFCE.html.tmpl  |  157 +++
 template/en/custom/bug/comments.html.tmpl          |    5 +
 template/en/custom/bug/comments_DEFAULT.html.tmpl  |    1 +
 template/en/custom/bug/comments_XFCE.html.tmpl     |  224 ++++
 template/en/custom/bug/create/create.html.tmpl     |    5 +
 .../en/custom/bug/create/create_DEFAULT.html.tmpl  |    1 +
 .../en/custom/bug/create/create_XFCE.html.tmpl     |  619 ++++++++++
 template/en/custom/bug/edit.html.tmpl              |    5 +
 template/en/custom/bug/edit_DEFAULT.html.tmpl      |    1 +
 template/en/custom/bug/edit_XFCE.html.tmpl         | 1183 ++++++++++++++++++++
 template/en/custom/bug/field.html.tmpl             |    5 +
 template/en/custom/bug/field_DEFAULT.html.tmpl     |    1 +
 template/en/custom/bug/field_XFCE.html.tmpl        |  294 +++++
 template/en/custom/bug/knob.html.tmpl              |    5 +
 template/en/custom/bug/knob_DEFAULT.html.tmpl      |    1 +
 template/en/custom/bug/knob_XFCE.html.tmpl         |  103 ++
 template/en/custom/bug/navigate.html.tmpl          |    5 +
 template/en/custom/bug/navigate_DEFAULT.html.tmpl  |    1 +
 template/en/custom/bug/navigate_XFCE.html.tmpl     |   66 ++
 template/en/custom/bug/show.html.tmpl              |    5 +
 template/en/custom/bug/show_DEFAULT.html.tmpl      |    1 +
 template/en/custom/bug/show_XFCE.html.tmpl         |   30 +
 template/en/custom/global/banner.html.tmpl         |   29 +
 template/en/custom/global/choose-product.html.tmpl |    5 +
 .../custom/global/choose-product_DEFAULT.html.tmpl |    1 +
 .../en/custom/global/choose-product_XFCE.html.tmpl |   73 ++
 template/en/custom/global/common-links.html.tmpl   |    5 +
 .../custom/global/common-links_DEFAULT.html.tmpl   |    1 +
 .../en/custom/global/common-links_XFCE.html.tmpl   |  110 ++
 template/en/custom/global/footer.html.tmpl         |    5 +
 template/en/custom/global/footer_DEFAULT.html.tmpl |    1 +
 template/en/custom/global/footer_XFCE.html.tmpl    |   11 +
 template/en/custom/global/header.html.tmpl         |  285 +++++
 template/en/custom/global/useful-links.html.tmpl   |    5 +
 .../custom/global/useful-links_DEFAULT.html.tmpl   |    1 +
 .../en/custom/global/useful-links_XFCE.html.tmpl   |   57 +
 template/en/custom/index.html.tmpl                 |  163 +++
 template/en/custom/list/list.html.tmpl             |    5 +
 template/en/custom/list/list_DEFAULT.html.tmpl     |  349 ++++++
 template/en/custom/list/list_XFCE.html.tmpl        |  328 ++++++
 template/en/custom/list/table.html.tmpl            |  267 +++++
 56 files changed, 5355 insertions(+)

diff --git a/skins/contrib/Xfce/README b/skins/contrib/Xfce/README
new file mode 100644
index 0000000..394f86c
--- /dev/null
+++ b/skins/contrib/Xfce/README
@@ -0,0 +1,18 @@
+This skin is not only a customization layer for CSS; it also includes some
+templates specific to it. These templates create three new files under
+template/en/custom:
+  - templatename.html.tmpl, which executes a simple IF
+  - templatename_DEFAULT.html.tmpl, which is a symlink back to the
+    appropriate default template
+  - templatename_XFCE.html.tmpl, which includes all of the Xfce skin changes
+
+Note: There are a few custom templates that are used to override templates
+for all themes in the Xfce Bugzilla. These are:
+  - index.html.tmpl
+  - global/banner.html.tmpl
+  - global/header.html.tmpl
+  - list/table.html.tmpl
+
+In addition to the CSS files and templates, this skin includes a JavaScript
+file, which is included in the global/header.html.tmpl file; please make
+sure this is kept included when you modify the header template.
diff --git a/skins/contrib/Xfce/add-attachment.png b/skins/contrib/Xfce/add-attachment.png
new file mode 100644
index 0000000..a493b21
Binary files /dev/null and b/skins/contrib/Xfce/add-attachment.png differ
diff --git a/skins/contrib/Xfce/admin.css b/skins/contrib/Xfce/admin.css
new file mode 100644
index 0000000..e69de29
diff --git a/skins/contrib/Xfce/bug.css b/skins/contrib/Xfce/bug.css
new file mode 100644
index 0000000..0792c32
--- /dev/null
+++ b/skins/contrib/Xfce/bug.css
@@ -0,0 +1,303 @@
+/*
+ *  BUG VIEW
+ *
+ */
+
+#bug-header {
+	display: flex;
+	padding: 1em 0 0.4em 0;
+	font-weight: normal;    
+
+	border-bottom: 1px solid rgba( 0, 0, 0, 0.4 );
+	border-bottom: 1px solid #06c;
+}
+	#bug-header #bug-primary-actions { flex: 2; text-align: right; min-width: 200px; }
+		#bug-header #bug-primary-actions .action-link {
+			font-size: 105%;
+			padding: 0.3em 1em;
+		}
+#bug-title { font-size: 180%; flex: 8; padding-bottom: 0.2em; line-height: 1.1em; }
+	#bug-title a { color: #000; }
+	#bug-title input { display: block; font-size: 80%; margin-top: -0.15em; font-weight: normal; }
+
+/* Main layout
+ */
+
+#bug-layout {
+	display: flex;
+}
+	#bug-main { flex: 70; }
+	#bug-sidebar { flex: 30; margin-left: 3em; min-width: 310px; }
+		#bug-sidebar .field,
+		#bug-sidebar .sidebar-item { margin-bottom: 1em; }
+		#bug-sidebar #sidebar-expand .field,
+		#bug-sidebar #sidebar-expand .sidebar-item { display: none; }
+		#bug-sidebar #sidebar-expand.expanded .field,
+		#bug-sidebar #sidebar-expand.expanded .sidebar-item { display: block; }
+
+	#bug-layout h3 { font-weight: normal; font-size: 130%; border-bottom: 1px solid rgba( 0, 0, 0, 0.3 ); padding-bottom: 0.3em; color: rgba( 0, 0, 0, 0.7 ); margin-top: 2em; }
+		#bug-layout h3:first-child { margin-top: 0.5em; }
+
+/*  Rows that need to be split
+ */
+
+#changeform .flex-split { display: flex; }
+#changeform .flex-split * { flex: 1; margin: 0 0.1em; }
+	#changeform .flex-split a.action-link { padding: 0.5em; text-align: center; }
+
+/*  Product and component box
+ */
+
+#changeform .flex-item { flex: 2; }
+#changeform .flex-product,
+#changeform .flex-status { flex: 3; }
+#changeform .flex-component { flex: 4; }
+
+#changeform .flex-split span.select,
+#changeform .flex-split select { flex: 2; }
+
+/*  Comments
+ */
+
+/* Collapse and Expand links */
+.bz_collapse_expand_comments {
+	float: right;
+	margin-top: -3.5em;
+}
+	.bz_collapse_expand_comments li {
+		display: inline;
+	}
+
+/* Comments itself */
+body #comments pre.bz_comment_text,
+body #comments pre.bz_comment_text * {
+	font-family: 'Noto Sans', sans-serif !important;
+}
+
+/*  SIDEBAR
+ */
+
+#bug-sidebar select {
+	width: 100%;
+	margin: 0.2em 0;
+}
+
+/* Duplicates
+ */
+
+.field-duplicates ul {
+	list-style-type: none;
+	margin: 0 0 1em 0;
+	padding-left: 0;
+}
+/* CC List
+ */
+
+#cc_edit_area {
+	margin-left: 2em;
+}
+
+/* Attachments
+ */
+
+#attachment_table {
+	width: 100%;
+	border: none;
+	margin-top: 1em;
+}
+
+#attachment_table tr:nth-child(even) {
+	background-color: rgba( 0, 0, 0, 0.08 );
+}
+#attachment_table tr:nth-child(odd) {
+	background-color: rgba( 0, 0, 0, 0.04 );
+}
+#attachment_table th,
+#attachment_table tr:last-child {
+	background-color: transparent;
+}
+
+#attachment_table td {
+	border: none;
+}
+
+#attachment_table .bz_attach_footer > td > a {
+	display: block;
+	clear: both;
+	background: transparent url(add-attachment.png) no-repeat 0 0;
+	padding-left: 20px;
+}
+
+/*
+ *
+ *
+ */
+
+/*  Bug comments  */
+.bz_comment_table {
+	width: 100% !important;
+}
+	.bz_comment {
+		background-color: #f3f3f3;
+		margin-bottom: 1em;
+	}
+		.bz_first_comment_head,
+		.bz_comment_head {
+			padding: 0.5em;
+		}
+		.bz_comment_user {
+			font-weight: bold;
+		}
+		.bz_comment_text {
+			width: auto !important;
+			padding: 0 1em 1em 1em;
+		}
+.comment_tab {
+	display: inline-block;
+	margin: 0.1em 0 0.4em 0;
+	font-size: 90%;
+}
+
+#add_comment,
+#add_comment table,
+#add_comment #comment {
+	width: 100%;
+}
+
+/*  Commit buttons  */
+#commit_top,
+#commit {
+	padding: 0.3em 1em;
+	background-color: #06c;
+	color: #fff;
+}
+	#commit_top:hover, #commit_top:active, #commit_top:focus,
+	#commit:hover, #commit:active, #commit:focus {
+		background-color: #00a8dd;
+	}
+
+/*
+ *  Filing and editing bugs
+ *
+ */
+.bug-row,
+.filebug-row {
+	margin-bottom: 1em;
+	width: auto !important;
+	vertical-align: top;
+}
+	/*  Bug row elements  */
+	.filebug-row b.required::before {
+		color: red;
+		content: "* ";
+	}
+	.flex-item.expert_fields b::before,
+	tbody.expert_fields th::before,
+	#expert_fields_controller::before {
+		color: rgba( 255, 180, 0, 1 );
+		content: "^ ";
+		font-weight: bold;
+	}
+	.bug-row textarea,
+	.filebug-row textarea {
+		width: 100%;
+	}
+	.bug-row input,
+	.bug-row span {
+		vertical-align: top;
+	}
+	/*  Specific element styles  */
+	.bug-row #short_desc,
+	.filebug-row #short_desc {
+		font-size: 130%;
+		font-weight: 500;
+		padding: 0.5em;
+	}
+	.bug-row #status {
+		margin-bottom: 0;
+	}
+	.bug-row .popup,
+	.filebug-row .popup {
+		padding: 1em;
+		margin-top: 0.3em;
+		background-color: #eee;
+	}
+		/* Possible duplicates table */
+		#possible_duplicates table,
+		#possible_duplicates table th,
+		#possible_duplicates table td {
+			border: none;
+			text-align: left;
+		}
+			#possible_duplicates table th#yui-dt0-th-id {
+				width: 100px;
+			}
+			#possible_duplicates table thead tr {
+				background-color: #ddd !important;
+			}
+			#possible_duplicates table tr:nth-child(odd) {
+				background-color: #f7f7f7;
+			}
+			#possible_duplicates table tr:nth-child(even) {
+				background-color: #eee;
+			}
+
+	/*  Flex rows  */
+	.bug-row.bug-flex,
+	.filebug-row.filebug-flex {
+		display: flex;
+		flex-wrap: wrap;
+		margin: 0 -0.1em;
+	}
+	.bug-row.bug-flex {
+		background-color: #f7f7f7;
+		padding: 0.5em 1em 1em 1em;
+		margin-bottom: 1em !important;
+	}
+		/* Flex items */
+		.bug-row.bug-flex .flex-item,
+		.filebug-row.filebug-flex .flex-item {
+			flex: 1;
+			min-width: 120px;
+			margin: 0 0.1em;
+			line-height: 1.8em;
+		}
+			/* Flex item elements and specific element styles */
+			.bug-row.bug-flex .flex-item select,
+			.filebug-row.filebug-flex .flex-item select {
+				width: 100%;
+			}
+			.bug-row.bug-flex .flex-item.status select#resolution,
+			.bug-row.bug-flex .flex-item.platform select {
+				width: 49%;
+			}
+
+/*  Notes... Move to global.css?  */
+
+.note {
+	background-color: #eee;
+	padding: 0.5em 0.8em;
+}
+.note-before {
+	border-left: 7px solid rgba( 220, 0, 0, 1 );
+}
+.note-guess-os {
+	border-left: 7px solid rgba( 0, 220, 0, 1 );
+}
+
+/* ... */
+
+.enter_bug_form hr {
+	margin: 1.5em 0;
+	border: none;
+	border-bottom: 3px solid rgba( 0, 0, 0, 0.2 );
+}
+
+
+.bug-row #newalias {
+	margin-top: -0.5em;
+}
+
+.bz_bug #bugzilla-body th {
+	vertical-align: middle;
+}
diff --git a/skins/contrib/Xfce/buglist.css b/skins/contrib/Xfce/buglist.css
new file mode 100644
index 0000000..872dfd5
--- /dev/null
+++ b/skins/contrib/Xfce/buglist.css
@@ -0,0 +1,4 @@
+.bz_blocker,
+.bz_critical {
+	color: rgba( 180, 0, 0, 1 );
+}
\ No newline at end of file
diff --git a/skins/contrib/Xfce/favicon.ico b/skins/contrib/Xfce/favicon.ico
new file mode 100644
index 0000000..dd0c9fc
Binary files /dev/null and b/skins/contrib/Xfce/favicon.ico differ
diff --git a/skins/contrib/Xfce/global.css b/skins/contrib/Xfce/global.css
new file mode 100644
index 0000000..50852ce
--- /dev/null
+++ b/skins/contrib/Xfce/global.css
@@ -0,0 +1,596 @@
+body * {
+	font-family: 'Noto Sans', sans-serif !important;
+	box-sizing: border-box;
+}
+
+.group:after {
+	content: ".";
+	display: block;
+	height: 0;
+	clear: both;
+	visibility: hidden;
+	font-size: 0;
+}
+
+a, a:link, a:visited,
+a:hover, a:active, a:focus {
+	color: #06c;
+	text-decoration: none;
+}
+
+body pre,
+body pre * {
+	font-family: 'Noto Mono', monospace !important;
+	font-size: 100%;
+}
+
+hr {
+	clear: both;
+	display: block;
+	border: none;
+	border-bottom: 1px solid rgba( 0, 0, 0, 0.3 );
+	margin: 2em 0;
+}
+	hr + * {
+		margin-top: 0;
+	}
+
+/*
+ *  Form stuff and links dressed as buttons
+ *
+ */
+
+/*.yui-skin-sam .yui-button a, */
+.action-link,
+.comment_tab,
+input[type="submit"],
+.bz_query_buttons #xml,
+button,
+select {
+	border-radius: 0.2em;
+	border: 1px solid rgba( 0, 0, 0, 0.2 );
+	background: #f7f7f7 linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ) repeat-x;
+	color: #000;
+	padding: 0.2em 0.5em;
+	outline: none !important;
+	transition: 150ms all;
+}
+	.yui-skin-sam .yui-button a:hover,
+	a.action-link:hover,
+	.comment_tab:hover,
+	input[type="submit"]:hover,
+	button:hover,
+	select:hover {
+		background-color: #fff;
+	}
+	.yui-skin-sam .yui-button a,
+	a.action-link {
+        	font-size: 85%;
+	        line-height: 1em;
+		color: #000;
+	}
+	        .yui-skin-sam .yui-button a:hover, .yui-skin-sam .yui-button a:active, .yui-skin-sam .yui-button a:focus,
+        	.action-link:hover, .action-link:active, .action-link:focus,
+		.comment_tab:hover, .comment_tab:active, .comment_tab:focus {
+        	        color: #06c;
+		}
+	select {
+        	-moz-appearance: none;
+	        -webkit-appearance: none;
+        	appearance: none;
+	}
+
+input,
+input[type="text"],
+textarea {
+	background-color: #f7f7f7;
+	color: #000;
+	border-radius: 0.2em;
+	border: 1px solid rgba( 0, 0, 0, 0.2 );
+	padding: 0.2em 0.5em;
+}
+	input[type="file"] { border: none; }
+	textarea {
+		font-size: 90%;
+	}
+
+input[type="checkbox"] {
+	float: left;
+	display: block;
+	opacity: 0.75;
+	margin-top: 0.15em;
+	margin-right: 0.5em;
+	transition: 150ms all;
+}
+	input[type="checkbox"]:checked {
+		opacity: 1;
+	}
+
+
+/*
+ *  Header
+ *
+ */
+
+#header {
+	margin: 0 !important;
+	width: 100% !important;
+}
+	#header.scrolled {
+		position: fixed;
+		top: 0;
+		z-index: 2000;
+	}
+	#header #titles {
+		/* Used in the default template... */
+		display: none;
+	}
+/*	#header a {
+		color: #fff;
+	} */
+	#header a:hover, #header a:active, #header a:focus {
+		border-bottom: 1px solid rgba( 255, 255, 255, 0.7 );
+	}
+
+#quicksearch_top,
+#find_top {
+	border: 1px solid rgba( 255, 255, 255, 0.1 );
+	background-color: rgba( 255, 255, 255, 0.25 );
+}
+#find_top {
+	background-color: rgba( 255, 255, 255, 0.5 );
+	transition: 150ms all;
+}
+	#find_top:hover {
+		background-color: rgba( 255, 255, 255, 0.75 );
+	}
+
+/*
+ *  Body
+ *
+ */
+
+#bugzilla-body {
+	position: relative;
+	margin: 0 !important;
+	padding: 3em 1em 1em 1em !important;
+}
+	#bugzilla-body > h1:first-child,
+	#bugzilla-body > h2:first-child,
+	#bugzilla-body > h3:first-child {
+		margin-top: 0;
+	}
+
+/*
+ *  Navigation
+ *
+ */
+
+#header ul {
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+}
+
+#header .links-dropdown {
+	position: relative;
+	float: right;
+}
+	#header .links-dropdown li.main {
+		position: relative;
+		z-index: 1000;
+		padding: 0.45em 1em;
+	}
+		#header .links-dropdown:hover li.main {
+			background-color: rgba( 255, 255, 255, 0.2 );
+		}
+	#header .links-dropdown ul {
+		position: absolute;
+		top: 0;
+		right: 0;
+		padding-top: 2.4em;
+		display: none;
+		box-shadow: 0 0 0.2em rgba( 0, 0, 0, 0.1 );
+	}
+		#header .links-dropdown:hover ul {
+			min-width: 200px;
+			display: block;
+		}
+	#header .links-dropdown li.main ul li {
+		background-color: #eee;
+	}
+		#header .links-dropdown:hover ul li:first-child {
+			padding-top: 0.5em;
+		}
+		#header .links-dropdown:hover ul li:last-child {
+			padding-bottom: 0.5em;
+		}
+	#header .links-dropdown a {
+		display: block;
+		border: none;
+		padding: 0.25em 1em;
+	}
+		#header .links-dropdown a:hover {
+			background-color: rgba( 255, 255, 255, 0.5 );
+			color: #000;
+		}
+
+ at media screen and (max-width:800px)�{
+}
+
+
+
+#header .links {
+	padding: 0.25em 1em;
+	border: none;
+	border-radius: 0;
+}
+	#header #common_links {
+		background-color: #00a8dd;
+		color: rgba( 255, 255, 255, 0.9 );
+	}
+	#header #common_links:after {
+		content: ".";
+		display: block;
+		height: 0;
+		clear: both;
+		visibility: hidden;
+		font-size: 0;
+	}
+		.links li {
+			margin-right: 0.5em;
+		}
+			.links li .separator {
+				display: none;
+			}
+			.links li a {
+				font-weight: bold;
+			}
+				#header .links li a {
+					color: #fff;
+				}
+			.links.links-primary {
+				float: left;
+			}
+
+/*
+ *  Bug navigation and messages
+ *
+ */
+
+#bugzilla-body  .navigation {
+	width: 100%;
+	position: absolute;
+	margin: 0;
+	top: 0;
+	left: 0;
+
+	padding: 0.25em 1em;
+	background-color: #eee;
+}
+	#bugzilla-body > dl:first-child {
+		background-color: #eee;
+		padding: 0.8em 1.3em;
+		border-left: 7px solid #00a8dd;
+	}
+		#bugzilla-body > dl:first-child code {
+			font-size: 100%;
+		}
+.navigation .nav_left { float: left; }
+.navigation .nav_right { float: right; font-size: 90%; }
+.navigation a,
+.navigation span {
+	margin: 0 0.3em;
+}
+
+/*
+ *  Front page
+ *
+ */
+
+#page-index {
+	max-width: 100%;
+}
+
+#page-index #enter_bug { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-papericon.png); }
+#page-index #query { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-magnifier.png); }
+#page-index #account { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-person-alternate.png); }
+#page-index #help { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-questionmark2.png); }
+
+#page-index .bz_common_actions a {
+	width: 170px;
+	padding: 1em;
+	background-color: #f7f7f7;
+	background-position: 50% 0;
+	background-repeat: repeat-x, no-repeat;
+	border-radius: 0.5em;
+}
+	#page-index .bz_common_actions a:hover {
+		background-color: #fff;
+	}
+
+
+.rss {
+	background-image: url(rss.png);
+}
+
+/*  Fix the related action links... */
+.related_actions {
+	font-size: 0.85em;
+	float: right;
+	white-space: nowrap;
+	margin: 0;
+	padding: 0;
+}
+	.related_actions li {
+		display: inline;
+	}
+
+	.related_actions.no-navigation {
+		display: block;
+		float: none;
+		text-align: right;
+		width: 100%;
+
+		box-sizing: border-box;
+		padding: 0.35em 1.25em;
+		margin-top: -0.1em !important;
+		background-color: #eee;
+	}
+		.related_actions:first-child + #useful-links {
+			clear: both;
+		}
+/*  Browse  */
+ul.product_categories {
+	list-style-type: none;
+	padding-left: 0;
+}
+	ul.product_categories li {
+		display: inline;
+	}
+		ul.product_categories li a {
+			font-size: 100%;
+		}
+
+
+h3.product_cat {
+	padding-top: 5em;
+	margin-top: -4em;
+	margin-bottom: 0;
+}
+	hr + h3.product_cat {
+		padding-top: 4em;
+	}
+	h3.product_cat + p {
+		margin-top: 0.25em;
+		margin-bottom: 1.25em;
+	}
+
+ul.products {
+	list-style-type: none;
+	padding-left: 0;
+	margin-left: 3em;
+	border-top: 1px solid rgba(0,0,0,0.2);
+}
+	ul.products li {
+		display: flex;
+		border-bottom: 1px solid rgba(0,0,0,0.2);
+	}
+		ul.products li:hover {
+			background-color: #f7f7f7;
+		}
+		ul.products li a {
+			display: block;
+		}
+			ul.products a.description {
+				color: #444;
+			}
+		ul.products strong {
+			flex: 20;
+			min-width: 220px;
+			padding: 0.2em 0;
+		}
+		ul.products div {
+			flex: 80;
+			font-size: 80%;
+			padding: 0.3em 0;
+			line-height: 1.5em;
+		}
+			ul.products span.product_components a {
+				font-size: 120%;
+				line-height: 1.6em;
+				display: inline;
+				white-space: nowrap;
+				margin-right: 0.5em;
+			}
+			ul.products span.product_components a:first-child:last-child,
+			ul.products span.product_components a.component-all {
+				font-style: oblique;
+				font-weight: bold;
+			}
+			ul.products span.product_components a.component-general,
+			ul.products span.product_components a.component-General {
+				font-weight: bold;
+			}
+
+
+/*  Search  */
+.bz_search_section {
+	background-color: #eee;
+	padding: 1em;
+}
+.field_help_link {
+	color: #000 !important;
+}
+
+tr.bz_row_odd {
+	/* Makes sure all odd rows have a background... */
+	background-color: #f7f7f7;
+}
+.bz_query_links .action-link {
+	font-size: 100%;
+}
+.bz_query_buttons #xml {
+	font-size: 100%;
+	margin-top: -0.25em;
+}
+.buglist_menu div {
+	line-height: 2.5em;
+}
+
+/*  Common styles  */
+a.bz_closed, a.bz_closed:link, a.bz_closed:visited,
+a.bz_closed:hover, a.bz_closed:active, a.bz_closed:focus  {
+	text-decoration: line-through;
+}
+
+/* Bug statuses */
+.bz_bugitem .bz_bug_status_column {
+	position: relative;
+}
+	.bz_bugitem .bz_bug_status_column span {
+		display: inline-block;
+		width: 100%;
+		text-align: center;
+
+		border-radius: 0.2em;
+		padding: 0.15em 0.4em;
+		background-color: rgba( 0, 0, 0, 0.1 );
+	}
+
+.bz_bugitem.bz_NEW .bz_bug_status_column span,
+.bz_bugitem.bz_REOPENED .bz_bug_status_column span,
+.bz_bugitem.bz_UNCONFIRMED .bz_bug_status_column span,
+#status_resolution.NEW,
+#status_resolution.REOPENED,
+#status_resolution.UNCONFIRMED {
+	background-color: rgba( 0, 150, 210, 1 );
+        color: #fff;
+}
+	#status_resolution.NEW:hover,
+	#status_resolution.REOPENED:hover,
+	#status_resolution.UNCONFIRMED:hover {
+		background-color: rgba( 20, 170, 230, 1 );
+	}
+
+.bz_bugitem.bz_ASSIGNED .bz_bug_status_column span,
+.bz_bugitem.bz_NEEDINFO .bz_bug_status_column span,
+#status_resolution.ASSIGNED,
+#status_resolution.NEEDINFO {
+        background-color: rgba( 210, 150, 30, 1 );
+        color: #fff;
+}
+	#status_resolution.ASSIGNED:hover,
+	#status_resolution.NEEDINFO:hover {
+		background-color: rgba( 230, 170, 50, 1 );
+	}
+
+.bz_bugitem.bz_CLOSED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_FIXED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_WORKSFORME .bz_bug_status_column span,
+.bz_bugitem.bz_VERIFIED .bz_bug_status_column span,
+#status_resolution.CLOSED,
+#status_resolution.RESOLVED-FIXED,
+#status_resolution.RESOLVED-WORKSFORME,
+#status_resolution.VERIFIED {
+        background-color: rgba( 90, 180, 90, 1 );
+        color: #fff;
+}
+	#status_resolution.CLOSED:hover,
+	#status_resolution.RESOLVED-FIXED:hover,
+	#status_resolution.RESOLVED-WORKSFORME:hover,
+	#status_resolution.VERIFIED:hover {
+		background-color: rgba( 110, 200, 110, 1 );
+	}
+
+.bz_bugitem.bz_RESOLVED.bz_DUPLICATE .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_INVALID .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_MOVED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_WONTFIX .bz_bug_status_column span,
+#status_resolution.RESOLVED-DUPLICATE,
+#status_resolution.RESOLVED-INVALID,
+#status_resolution.RESOLVED-MOVED,
+#status_resolution.RESOLVED-WONTFIX {
+	background-color: rgba( 90, 90, 90, 1 );
+	color: #fff;
+}
+	#status_resolution.RESOLVED-DUPLICATE:hover,
+	#status_resolution.RESOLVED-INVALID:hover,
+	#status_resolution.RESOLVED-MOVED:hover,
+	#status_resolution.RESOLVED-WONTFIX:hover {
+		background-color: rgba( 110, 110, 110, 1 );
+	}
+
+	#status_resolution option {
+                background-color: #fff;
+                color: #000;
+        }
+
+/* Bug severities */
+.severity-critical select#bug_severity,
+.severity-blocker select#bug_severity {
+	background-color: rgba( 210, 0, 0, 1 );
+	color: #fff;
+}
+	.severity-critical select#bug_severity:hover,
+	.severity-blocker select#bug_severity:hover {
+		background-color: rgba( 230, 20, 20, 1 );
+	}
+
+	.severity select#bug_severity option {
+		background-color: #fff;
+		color: #000;
+	}
+
+.bz_bugitem {
+	color: inherit;
+	font-weight: normal;
+}
+	.bz_critical .bz_bug_status_column:after,
+	.bz_blocker .bz_bug_status_column:after {
+		position: absolute;
+		content: "!";
+		right: -1.5em;
+		padding: 0.15em 0.4em;
+		border-radius: 0.2em;
+		background-color: rgba( 210, 0, 0, 1 );
+		color: #fff;
+		font-weight: bold;
+	}
+		.bz_critical .bz_resolution_column,
+		.bz_blocker .bz_resolution_column {
+			color: transparent;
+		}
+
+	.bz_CLOSED .bz_bug_status_column:after,
+	.bz_RESOLVED .bz_bug_status_column:after,
+	.bz_VERIFIED .bz_bug_status_column:after {
+		display: none;
+	}
+		.bz_CLOSED .bz_resolution_column,
+		.bz_RESOLVED .bz_resolution_column,
+		.bz_VERIFIED .bz_resolution_column {
+			color: inherit;
+		}
+
+
+ at media screen and (max-width: 1100px) {
+	.links.links-secondary {
+		clear: left;
+		float: left;
+		display: block;
+		width: 100%;
+		background-color: rgba( 0, 0, 0, 0.1 );
+		margin-top: 0;
+	}
+}
+ at media screen and (max-width: 800px) {
+	#bugzilla-body {
+		padding-top: 4.5em !important;
+	}
+	.navigation .nav_right {
+		clear: left;
+		float: left;
+		margin-top: 0.3em;
+	}
+}
diff --git a/skins/contrib/Xfce/index/bugzilla-magnifier.png b/skins/contrib/Xfce/index/bugzilla-magnifier.png
new file mode 100644
index 0000000..b859b16
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-magnifier.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-papericon.png b/skins/contrib/Xfce/index/bugzilla-papericon.png
new file mode 100644
index 0000000..6775679
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-papericon.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-person-alternate.png b/skins/contrib/Xfce/index/bugzilla-person-alternate.png
new file mode 100644
index 0000000..a9e9ff2
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-person-alternate.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-questionmark2.png b/skins/contrib/Xfce/index/bugzilla-questionmark2.png
new file mode 100644
index 0000000..441d07f
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-questionmark2.png differ
diff --git a/skins/contrib/Xfce/rss.png b/skins/contrib/Xfce/rss.png
new file mode 100644
index 0000000..ff17763
Binary files /dev/null and b/skins/contrib/Xfce/rss.png differ
diff --git a/skins/contrib/Xfce/scripts.js b/skins/contrib/Xfce/scripts.js
new file mode 100644
index 0000000..068c45c
--- /dev/null
+++ b/skins/contrib/Xfce/scripts.js
@@ -0,0 +1,9 @@
+window.onscroll = function( ) {
+	var nav = document.getElementById( 'header' );
+	var xfceheader = document.getElementById( 'xfce-header' );
+	if( window.pageYOffset > ( nav.scrollHeight + xfceheader.scrollHeight + 100 ) ) {
+		nav.classList.add( 'scrolled' );
+	} else {
+		nav.classList.remove( 'scrolled' );
+	}
+}
diff --git a/template/en/custom/attachment/list.html.tmpl b/template/en/custom/attachment/list.html.tmpl
new file mode 100644
index 0000000..d71b58a
--- /dev/null
+++ b/template/en/custom/attachment/list.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'attachment/list_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'attachment/list_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/attachment/list_DEFAULT.html.tmpl b/template/en/custom/attachment/list_DEFAULT.html.tmpl
new file mode 120000
index 0000000..b32bb46
--- /dev/null
+++ b/template/en/custom/attachment/list_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/attachment/list.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/attachment/list_XFCE.html.tmpl b/template/en/custom/attachment/list_XFCE.html.tmpl
new file mode 100644
index 0000000..e7d42f5
--- /dev/null
+++ b/template/en/custom/attachment/list_XFCE.html.tmpl
@@ -0,0 +1,157 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[% RETURN UNLESS attachments.size || Param("maxattachmentsize") || Param("maxlocalattachment") %]
+
+<script type="text/javascript">
+<!--
+function toggle_display(link) {
+    var table = document.getElementById("attachment_table");
+    var view_all = document.getElementById("view_all");
+    var hide_obsolete_url_parameter = "&hide_obsolete=1";
+    // Store current height for scrolling later
+    var originalHeight = table.offsetHeight;
+    var rows = YAHOO.util.Dom.getElementsByClassName(
+        'bz_tr_obsolete', 'tr', table);
+
+    for (var i = 0; i < rows.length; i++) {
+        bz_toggleClass(rows[i], 'bz_default_hidden');
+    }
+
+    if (YAHOO.util.Dom.hasClass(rows[0], 'bz_default_hidden')) {
+        link.innerHTML = "Show Obsolete";
+        view_all.href = view_all.href + hide_obsolete_url_parameter 
+    }
+    else {
+        link.innerHTML = "Hide Obsolete";
+        view_all.href = view_all.href.replace(hide_obsolete_url_parameter,"");
+    }
+
+    var newHeight = table.offsetHeight;
+    // This scrolling makes the window appear to not move at all.
+    window.scrollBy(0, newHeight - originalHeight);
+
+    return false;
+}
+//-->
+</script>
+
+<table id="attachment_table">
+  [% count = 0 %]
+  [% obsolete_attachments = 0 %]
+  [% user_cache = template_cache.users %]
+
+  [% FOREACH attachment = attachments %]
+    [% count = count + 1 %]
+    [% IF !attachment.isprivate || user.is_insider || attachment.attacher.id == user.id %]
+      [% IF attachment.isobsolete %]
+        [% obsolete_attachments = obsolete_attachments + 1 %]
+      [% END %]
+      <tr id="a[% count %]" class="[% "bz_contenttype_" _ attachment.contenttype
+                     FILTER css_class_quote %]
+                 [% " bz_patch" IF attachment.ispatch %]
+                 [% " bz_private" IF attachment.isprivate %]
+                 [% " bz_tr_obsolete bz_default_hidden" 
+                     IF attachment.isobsolete %]">
+        <td>
+          [% IF attachment.datasize %]
+            <a href="attachment.cgi?id=[% attachment.id %]"
+               title="View the content of the attachment">
+          [% END %]
+          <b>[% attachment.description FILTER html FILTER obsolete(attachment.isobsolete) %]</b>
+          [% "</a>" IF attachment.datasize %]
+
+          <span class="bz_attach_extra_info">
+            [% IF attachment.datasize %]
+              ([% attachment.datasize FILTER unitconvert %],
+              [% IF attachment.ispatch %]
+                patch)
+              [% ELSE %]
+                [%+ attachment.contenttype FILTER html %])
+              [% END %]
+            [% ELSE %]
+              (<em>deleted</em>)
+            [% END %]
+
+            <br>
+            <a href="#attach_[% attachment.id %]"
+               title="Go to the comment associated with the attachment">
+              [%- attachment.attached FILTER time("%Y-%m-%d %H:%M %Z") %]</a>,
+
+            [%# No need to recreate the exact same template if we already have it. %]
+            [% attacher_id = attachment.attacher.id %]
+            [% UNLESS user_cache.$attacher_id %]
+              [% user_cache.$attacher_id = BLOCK %]
+                [% INCLUDE global/user.html.tmpl who = attachment.attacher %]
+              [% END %]
+            [% END %]
+            [% user_cache.$attacher_id FILTER none %]
+          </span>
+        </td>
+
+        [% IF show_attachment_flags %]
+          <td class="bz_attach_flags">
+            [% IF attachment.flags.size == 0 %]
+              <i>no flags</i>
+            [% ELSE %]
+              [% FOREACH flag = attachment.flags %]
+                [% IF user.id %]
+                  <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
+                [% ELSIF flag.setter.name %]
+                  <span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
+                [% ELSE %]
+                  [% flag.setter.nick FILTER html %]:
+                [% END %]
+                [%+ flag.type.name FILTER html %][% flag.status %]
+                [%+ IF flag.status == "?" && flag.requestee %]
+                  [% IF user.id %]
+                    (<span title="[% flag.requestee.identity FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
+                  [% ELSIF flag.requestee.name %]
+                    (<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
+                  [% ELSE %]
+                    ([% flag.requestee.nick FILTER html %])
+                  [% END %]
+                [% END %]<br>
+              [% END %]
+            [% END %]
+          </td>
+        [% END %]
+
+        <td>
+          <a href="attachment.cgi?id=[% attachment.id %]&action=edit">Details</a>
+          [% IF attachment.ispatch && feature_enabled('patch_viewer') %]
+            | <a href="attachment.cgi?id=[% attachment.id %]&action=diff">Diff</a>
+          [% END %]
+          [% Hook.process("action") %]
+        </td>
+      </tr>
+    [% END %]
+  [% END %]
+
+  <tr class="bz_attach_footer">
+    <td colspan="[% show_attachment_flags ? 3 : 2 %]">
+      [% IF attachments.size %]
+        <span class="bz_attach_view_hide">
+          [% IF obsolete_attachments %]
+            <a href="#a0" onclick="return toggle_display(this);">Show
+              Obsolete</a> ([% obsolete_attachments %])
+          [% END %]
+          [% IF Param("allow_attachment_display") %]
+            <a class="action-link" id="view_all" href="attachment.cgi?bugid=
+                  [%- bugid %]&action=viewall
+                  [%- "&hide_obsolete=1" IF obsolete_attachments %]">View All</a>
+          [% END %]
+        </span>
+      [% END %]
+      [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
+        <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Add an attachment</a>
+        (proposed patch, testcase, etc.)
+      [% END %]
+    </td>
+  </tr>
+</table>
diff --git a/template/en/custom/bug/comments.html.tmpl b/template/en/custom/bug/comments.html.tmpl
new file mode 100644
index 0000000..108d797
--- /dev/null
+++ b/template/en/custom/bug/comments.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/comments_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/comments_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/comments_DEFAULT.html.tmpl b/template/en/custom/bug/comments_DEFAULT.html.tmpl
new file mode 120000
index 0000000..be5d57e
--- /dev/null
+++ b/template/en/custom/bug/comments_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/comments.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/comments_XFCE.html.tmpl b/template/en/custom/bug/comments_XFCE.html.tmpl
new file mode 100644
index 0000000..a87215f
--- /dev/null
+++ b/template/en/custom/bug/comments_XFCE.html.tmpl
@@ -0,0 +1,224 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+<script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript">
+</script>
+
+<script type="text/javascript">
+<!--
+  /* Adds the reply text to the 'comment' textarea */
+  function replyToComment(id, real_id, name) {
+      var prefix = "(In reply to " + name + " from comment #" + id + ")\n";
+      var replytext = "";
+      [% IF user.settings.quote_replies.value == 'quoted_reply' %]
+        /* pre id="comment_name_N" */
+        var text_elem = document.getElementById('comment_text_'+id);
+        var text = getText(text_elem);
+        replytext = prefix + wrapReplyText(text);
+      [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
+        replytext = prefix;
+      [% END %]
+
+      [% IF user.is_insider %]
+        if (document.getElementById('isprivate_' + real_id).checked) {
+            document.getElementById('newcommentprivacy').checked = 'checked';
+            updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); 
+        }
+      [% END %]
+
+      /* <textarea id="comment"> */
+      var textarea = document.getElementById('comment');
+      if (textarea.value != replytext) {
+          textarea.value += replytext;
+      }
+
+      textarea.focus();
+  } 
+//-->
+</script>
+
+[% DEFAULT mode = "show" %]
+[% user_cache = template_cache.users %]
+[% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %]
+[% can_tag_comments = feature_enabled('jsonrpc') AND user.can_tag_comments %]
+
+[% IF mode == "edit" %]
+  <ul class="bz_collapse_expand_comments">
+    <li><a href="#" class="action-link" onclick="toggle_all_comments('collapse');
+                             return false;">Collapse All Comments</a></li>
+    <li><a href="#" class="action-link" onclick="toggle_all_comments('expand');
+                             return false;">Expand All Comments</a></li>
+    [% IF Param('comment_taggers_group') %]
+      <li><div id="comment_tags_collapse_expand_container"></div></li>
+    [% END %]
+  </ul>
+[% END %]
+
+[% PROCESS display_comments %]
+
+[% Hook.process("aftercomments") %]
+
+[%############################################################################%]
+[%# Block for individual comments                                            #%]
+[%############################################################################%]
+
+[% BLOCK display_comments %]
+  [% FOREACH comment = comments %]
+    [% NEXT IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %]
+    [% comment_text = comment.body_full %]
+    [% NEXT IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
+
+    <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
+                [% " bz_default_collapsed" IF comment.collapsed %]
+                [% " bz_comment_hilite" IF marks.${comment.count} %]
+                [% " bz_first_comment" IF comment.count == 0 %]">
+      [% IF comment.count == 0 %]
+        [% class_name = "bz_first_comment_head" %]
+        [% comment_label = "Description" %]
+      [% ELSE %]
+        [% class_name = "bz_comment_head" %]
+        [% comment_label = "Comment " _ comment.count %]
+      [% END %]
+
+      <div class="[% class_name FILTER html %]">
+        [% IF mode == "edit" %]
+          <span class="bz_comment_actions">
+            [% IF comment.collapsed %]
+              <span class="bz_collapsed_actions">
+            [% END %]
+            [% IF can_edit_comments %]
+              [% IF can_tag_comments %]
+                <a href="#" onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false" class="action-link">tag</a>
+              [% END %]
+              <a class="bz_reply_link action-link" href="#add_comment"
+                [% IF user.settings.quote_replies.value != 'off' %]
+                  onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;"
+                [% END %]
+              >reply</a>
+            [% END %]
+            [% IF comment.collapsed %]
+              </span>
+            [% END %]
+            <script type="text/javascript">
+              function addCollapseLinkXfce(count, collapsed, title) {
+                document.write(' <a href="#" class="bz_collapse_comment action-link"' +
+                  ' id="comment_link_' + count +
+                  '" onclick="toggle_comment_display(this, ' +  count +
+                  '); return false;" title="' + title + '">[' +
+                  (collapsed ? '+' : '−') + ']<\/a> ');
+              }
+              addCollapseLinkXfce([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display');
+            </script>
+          </span>
+        [% ELSIF comment.collapsed %]
+          <span class="bz_comment_actions">
+            <script type="text/javascript">
+              function addCollapseLinkXfce(count, collapsed, title) {
+                document.write(' <a href="#" class="bz_collapse_comment action-link"' +
+                  ' id="comment_link_' + count +
+                  '" onclick="toggle_comment_display(this, ' +  count +
+                  '); return false;" title="' + title + '">[' +
+                  (collapsed ? '+' : '−') + ']<\/a> ');
+              }
+              addCollapseLinkXfce([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display');
+            </script>
+          </span>
+        [% END %]
+
+        [% IF mode == "edit" && can_edit_comments && user.is_insider %]
+          <div class="bz_private_checkbox">
+            <input type="hidden" value="1"
+                   name="defined_isprivate_[% comment.id %]">
+            <input type="checkbox"
+                   name="isprivate_[% comment.id %]" value="1"
+                   id="isprivate_[% comment.id %]"
+                   onClick="updateCommentPrivacy(this, [% comment.count %])"
+                   [% " checked=\"checked\"" IF comment.is_private %]>
+            <label for="isprivate_[% comment.id %]">Private</label>
+          </div>
+        [% END %]
+
+        <span class="bz_comment_number">
+          <a 
+             href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]">
+            [%- comment_label FILTER html %]</a>
+        </span>
+
+        <span class="bz_comment_user">
+          [%# No need to recreate the exact same template if we already have it. %]
+          [% commenter_id = comment.author.id %]
+          [% UNLESS user_cache.$commenter_id %]
+            [% user_cache.$commenter_id = BLOCK %]
+              [% INCLUDE global/user.html.tmpl who = comment.author %]
+            [% END %]
+          [% END %]
+          [% user_cache.$commenter_id FILTER none %]
+        </span>
+
+        <span class="bz_comment_user_images">
+          [% FOREACH group = comment.author.groups_with_icon %]
+            <img src="[% group.icon_url FILTER html %]"
+                 alt="[% group.name FILTER html %]"
+                 title="[% group.name FILTER html %] - [% group.description FILTER html %]">
+          [% END %]
+        </span>
+
+        <span class="bz_comment_time">
+          [%+ comment.creation_ts FILTER time %]
+        </span>
+
+        [% IF comment.collapsed %]
+          <span id="cr[% comment.count %]" class="bz_comment_collapse_reason"
+             title="[% comment.author.name || comment.author.login FILTER html %]
+                    [%~ %] [[% comment.creation_ts FILTER time %]]">
+            Comment hidden ([% comment.tags.join(', ') FILTER html %])
+          </span>
+        [% END %]
+      </div>
+
+      [% IF user.is_timetracker &&
+            (comment.work_time > 0 || comment.work_time < 0) %]
+         <br>
+         Additional hours worked: 
+         [% PROCESS formattimeunit time_unit=comment.work_time %]
+      [% END %]
+
+      [% IF user.id && Param('comment_taggers_group') %]
+        <div id="comment_tag_[% comment.count FILTER html %]"
+             class="bz_comment_tags">
+          <span id="ct_[% comment.count %]"
+                class="[% 'bz_default_hidden' UNLESS comment.tags.size %]">
+            [% IF comment.tags.size %]
+              <script>
+                YAHOO.bugzilla.commentTagging.showTags([% comment.id FILTER none %],
+                  [% comment.count FILTER none %], [
+                [% FOREACH tag = comment.tags %]
+                  [%~%]'[% tag FILTER js %]'[% "," UNLESS loop.last %]
+                [% END %]
+                [%~%]]);
+              </script>
+            [% END %]
+          </span>
+        </div>
+      [% END %]
+
+[%# Don't indent the <pre> block, since then the spaces are displayed in the
+  # generated HTML
+  #%]
+<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]"
+  [% IF mode == "edit" || comment.collapsed %]
+    id="comment_text_[% comment.count FILTER none %]"
+  [% END %]>
+  [%- comment_text FILTER quoteUrls(bug, comment) -%]
+</pre>
+    [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
+    </div>
+  [% END %]
+[% END %]
diff --git a/template/en/custom/bug/create/create.html.tmpl b/template/en/custom/bug/create/create.html.tmpl
new file mode 100644
index 0000000..fbc3fca
--- /dev/null
+++ b/template/en/custom/bug/create/create.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% INCLUDE bug/create/create_XFCE.html.tmpl %]
+[% ELSE %]
+  [% INCLUDE bug/create/create_DEFAULT.html.tmpl %]
+[% END %]
diff --git a/template/en/custom/bug/create/create_DEFAULT.html.tmpl b/template/en/custom/bug/create/create_DEFAULT.html.tmpl
new file mode 120000
index 0000000..97b771a
--- /dev/null
+++ b/template/en/custom/bug/create/create_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../../default/bug/create/create.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/create/create_XFCE.html.tmpl b/template/en/custom/bug/create/create_XFCE.html.tmpl
new file mode 100644
index 0000000..6d35832
--- /dev/null
+++ b/template/en/custom/bug/create/create_XFCE.html.tmpl
@@ -0,0 +1,619 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[% title = BLOCK %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %]
+[% use_qa_contact = Param("useqacontact") %]
+
+[% PROCESS global/header.html.tmpl
+  title = title
+  generate_api_token = 1
+  yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ]
+  style_urls = ['skins/standard/bug.css']
+  javascript_urls = [ "js/attachment.js", "js/util.js",
+                      "js/field.js", "js/TUI.js", "js/bug.js" ]
+  onload = "set_assign_to($use_qa_contact); hideElementById('attachment_true');
+            showElementById('attachment_false'); showElementById('btn_no_attachment');"
+%]
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array([% product.components.size %]);
+var last_initialowner;
+var initialccs = new Array([% product.components.size %]);
+var components = new Array([% product.components.size %]);
+var comp_desc = new Array([% product.components.size %]);
+var flags = new Array([% product.components.size %]);
+[% IF Param("useqacontact") %]
+    var initialqacontacts = new Array([% product.components.size %]);
+    var last_initialqacontact;
+[% END %]
+[% count = 0 %]
+[%- FOREACH c = product.components %]
+    [% NEXT IF NOT c.is_active %]
+    components[[% count %]] = "[% c.name FILTER js %]";
+    comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]";
+    initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]";
+    [% flag_list = [] %]
+    [% FOREACH f = c.flag_types.bug %]
+      [% NEXT UNLESS f.is_active %]
+      [% flag_list.push(f.id) %]
+    [% END %]
+    [% FOREACH f = c.flag_types.attachment %]
+      [% NEXT UNLESS f.is_active %]
+      [% flag_list.push(f.id) %]
+    [% END %]
+    flags[[% count %]] = [[% flag_list.join(",") FILTER js %]];
+    [% IF Param("useqacontact") %]
+        initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]";
+    [% END %]
+
+    [% SET initial_cc_list = [] %]
+    [% FOREACH cc_user = c.initial_cc %]
+      [% initial_cc_list.push(cc_user.login) %]
+    [% END %]
+    initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]";
+
+    [% count = count + 1 %]
+[%- END %]
+
+var status_comment_required = new Array();
+[% FOREACH status = bug_status %]
+  status_comment_required['[% status.name FILTER js %]'] = 
+    [% status.comment_required_on_change_from() ? 'true' : 'false' %]
+[% END %]
+
+TUI_alternates['expert_fields'] = 'Show Advanced Fields';
+// Hide the Advanced Fields by default, unless the user has a cookie
+// that specifies otherwise.
+TUI_hide_default('expert_fields');
+// Also hide the "Paste text as attachment" textarea by default.
+TUI_hide_default('attachment_text_field');
+-->
+</script>
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi"
+      class="enter_bug_form" enctype="multipart/form-data"
+      onsubmit="return validateEnterBug(this)">
+  <input type="hidden" name="product" value="[% product.name FILTER html %]">
+  <input type="hidden" name="token" value="[% token FILTER html %]">
+
+  <p class="note note-before">[%PROCESS 'bug/create/user-message.html.tmpl' %]</p>
+
+  <h1>File a bug for [% product.name %]</h1>
+  <p style="margin-top: -1em;">Reporting as [% user.login %]. Required fields are marked with an <span class="required_star">*</span>.</p>
+
+  <div class="filebug-row">
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = bug_fields.short_desc editable = 1, tag_name = 'b'
+    %]<br />
+    <input name="short_desc" size="70" value="[% short_desc FILTER html %]" maxlength="255" spellcheck="true"
+      aria-required="true" class="req text_input" id="short_desc">
+  </div>
+
+  [% IF feature_enabled('jsonrpc') AND !cloned_bug_id
+        AND user.settings.possible_duplicates.value == 'on' %]
+    <div id="possible_duplicates_container" class="filebug-row bz_default_hidden">
+      <b>Possible Duplicates:</b><br />
+
+      <div id="possible_duplicates"></div>
+
+      <script type="text/javascript">
+        var dt_columns = [ 
+          { key: "id", label: "[% field_descs.bug_id FILTER js %]",
+            formatter: YAHOO.bugzilla.dupTable.formatBugLink },
+          { key: "summary", 
+            label: "[% field_descs.short_desc FILTER js %]",
+            formatter: "text" },
+          { key: "status",
+            label: "[% field_descs.bug_status FILTER js %]",
+            formatter: YAHOO.bugzilla.dupTable.formatStatus },
+          { key: "update_token", label: '',
+            formatter: YAHOO.bugzilla.dupTable.formatCcButton }
+        ];
+        YAHOO.bugzilla.dupTable.addCcMessage = "Add Me to the CC List";
+        YAHOO.bugzilla.dupTable.init({
+          container: 'possible_duplicates',
+          columns: dt_columns,
+          product_name: '[% product.name FILTER js %]',
+          summary_field: 'short_desc',
+          options: {
+            MSG_LOADING: 'Searching for possible duplicates...',
+            MSG_EMPTY:   'No possible duplicates found.',
+            SUMMARY:     'Possible Duplicates'
+          }
+        });
+      </script>
+    </div>
+  [% END %]
+
+  <div class="filebug-row">
+    <b>Description:</b><br />
+      [%# defaultcontent = BLOCK %]
+      [% IF cloned_bug_id %]
+        <span class="note note-cloned">This [% terms.bug %] was initially created as a clone of [% terms.bug %] [% cloned_bug_id %].</span><br />
+      [% END %]
+      [% comment FILTER none %]
+      [% INCLUDE bug/comment.html.tmpl
+        minrows = 10
+        maxrows = 25
+        cols = constants.COMMENT_COLS
+        defaultcontent = defaultcontent
+      %]
+  </div>
+
+  <div class="filebug-row filebug-flex">
+    <div class="flex-item">
+      [% component_desc_url = BLOCK -%]
+        describecomponents.cgi?product=[% product.name FILTER uri %]
+      [% END %]
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.component editable = 1,
+        desc_url = component_desc_url, tag_name = 'b'
+      %]
+      <br />
+      <select name="component" id="component" onchange="set_assign_to([% Param("useqacontact") %]);"
+              aria-required="true" class="req">
+        [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %]
+        [% IF Param("usemenuforusers") %]
+          [% assignees_list = user.get_userlist.clone %]
+          [% qa_contacts_list = user.get_userlist.clone %]
+        [% END %]
+
+        [%- FOREACH c = product.components %]
+          [% NEXT IF NOT c.is_active %]
+          <option value="[% c.name FILTER html %]"
+                  id="v[% c.id FILTER html %]_component"
+            [% IF c.name.lower == default.component_.lower %]
+              [%# This is for bug/field.html.tmpl, for visibility-related
+                # controls. %]
+              [% default.component_id = c.id %]
+              selected="selected"
+            [% END %]>
+            [% c.name FILTER html -%]
+          </option>
+          [% IF Param("usemenuforusers") %]
+            [% INCLUDE build_userlist default_user = c.default_assignee,
+                                      userlist = assignees_list %]
+            [% INCLUDE build_userlist default_user = c.default_qa_contact,
+                                      userlist = qa_contacts_list %]
+          [% END %]
+        [%- END %]
+      </select>
+    </div>
+    <div class="flex-item">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.version editable = 1, tag_name = 'b'
+      %]
+      <br />
+      <select name="version" id="version" aria-required="true" class="req">
+        [%- FOREACH v = version %]
+          [% NEXT IF NOT v.is_active %]
+          <option value="[% v.name FILTER html %]"
+            [% ' selected="selected"' IF v.name == default.version %]>[% v.name FILTER html -%]
+          </option>
+        [%- END %]
+      </select>
+    </div>
+    <div class="flex-item">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.rep_platform editable = 1, tag_name = 'b'
+      %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl
+        bug = default, field = bug_fields.rep_platform, editable = 1,
+        value = default.rep_platform, no_label = 1, no_tds = 1
+      %]
+    </div>
+    <div class="flex-item">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.op_sys editable = 1, tag_name = 'b'
+      %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl 
+        bug = default, field = bug_fields.op_sys, editable = 1, 
+        value = default.op_sys, no_label = 1, no_tds = 1
+      %]
+    </div>
+  </div>
+  <div class="filebug-row filebug-flex">
+    <div class="flex-item expert_fields">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.bug_severity editable = 1, tag_name ='b'
+      %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl
+        bug = default, field = bug_fields.bug_severity, editable = 1, 
+        value = default.bug_severity, no_label = 1, no_tds = 1
+      %]
+    </div>
+    [% IF Param('letsubmitterchoosepriority') %]
+      <div class="flex-item expert_fields">
+        [% INCLUDE "bug/field-label.html.tmpl"
+          field = bug_fields.priority editable = 1, tag_name = 'b'
+        %]
+        <br />
+        [% INCLUDE bug/field.html.tmpl
+          bug = default, field = bug_fields.priority, editable = 1, 
+          value = default.priority, no_label = 1, no_tds = 1
+        %]
+      </div>
+    [% END %]
+    [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
+      <div class="flex-item expert_fields">
+        [% INCLUDE "bug/field-label.html.tmpl"
+           field = bug_fields.target_milestone, tag_name = 'b'
+        %]
+        <br />
+        [% INCLUDE select field = bug_fields.target_milestone,
+          no_label = 1, no_tds = 1 %]
+      </div>
+    [% END %]
+    <div class="flex-item expert_fields">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.bug_status editable = 1, tag_name = 'b'
+      %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl
+        bug = default, field = bug_fields.bug_status,
+        editable = (bug_status.size > 1), value = default.bug_status
+        override_legal_values = bug_status, no_label = 1, no_tds = 1
+      %]
+    </div>
+  </div>
+
+  [% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %]
+    <p class="note note-guess-os">
+      We've made a guess at your
+        [% IF Param('defaultplatform') %]
+          operating system. Please check it
+        [% ELSIF Param('defaultopsys') %]
+          platform. Please check it
+        [% ELSE %]
+          operating system and platform. Please check them
+        [% END %]
+          and make any corrections if necessary.
+    </p>
+  [% END %]
+
+
+  [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
+    <div class="filebug-row">
+      <b>Attachment:</b>
+      <span id="attachment_false" class="bz_default_hidden">
+        <input type="button" value="Add an attachment" onClick="handleWantsAttachment(true)">
+      </span>
+      <span id="attachment_true">
+        <input type="button" id="btn_no_attachment" value="Don't add an attachment"
+               class="bz_default_hidden"  onClick="handleWantsAttachment(false)">
+        <div class="popup">
+          <table class="attachment_entry">
+            [% PROCESS attachment/createformcontents.html.tmpl
+                       flag_types = product.flag_types.attachment
+                       any_flags_requesteeble = 1
+                       flag_table_id ="attachment_flags" %]
+          </table>
+        </div>
+      </span>
+    </div>
+  [% END %]
+
+  <hr />
+
+  [%# SUBMIT BUG %]
+  <div class="filebug-row">
+    <input type="submit" id="commit_top" value="Submit [% terms.Bug %]">
+    <span style="padding: 0 0.5em;">or</span>
+
+    <a id="expert_fields_controller" class="action-link bz_default_hidden" href="javascript:TUI_toggle_class('expert_fields')">Hide Advanced Fields</a>
+    <script type="text/javascript">YAHOO.util.Dom.removeClass('expert_fields_controller','bz_default_hidden');</script>
+  </div>
+
+  <hr class="expert_fields" />
+
+  [%# Note: template below this point is mostly unreviewed! %]
+
+  <table>
+  <tbody class="expert_fields">
+    <tr>
+      <th>Flags:</th>
+      <td>
+        [% IF product.flag_types.bug.size > 0 %]
+          [% display_flag_headers = 0 %]
+          [% any_flags_requesteeble = 0 %]
+
+          [% FOREACH flag_type = product.flag_types.bug %]
+            [% NEXT UNLESS flag_type.is_active %]
+            [% display_flag_headers = 1 %]
+            [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %]
+          [% END %]
+
+          [% IF display_flag_headers %]
+            [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug
+                                             any_flags_requesteeble = any_flags_requesteeble
+                                             flag_table_id = "bug_flags", flag_no_header = 1
+             %]
+          [% END %]
+        [% END %]
+      </td>
+    </tr>
+
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.assigned_to editable = 1
+      %]
+      <td>
+        [% INCLUDE global/userselect.html.tmpl
+           id => "assigned_to"
+           name => "assigned_to"
+           value => assigned_to
+           disabled => assigned_to_disabled
+           size => 30
+           emptyok => 1
+           custom_userlist => assignees_list
+         %]
+        <noscript>(Leave blank to assign to component's default assignee)</noscript>
+      </td>
+    </tr>
+  
+    [% IF Param("useqacontact") %]
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.qa_contact editable = 1
+      %]
+      <td>
+      [% INCLUDE global/userselect.html.tmpl
+         id => "qa_contact"
+         name => "qa_contact"
+         value => qa_contact
+         disabled => qa_contact_disabled
+         size => 30
+         emptyok => 1
+         custom_userlist => qa_contacts_list
+       %]
+        <noscript>(Leave blank to assign to default qa contact)</noscript>
+      </td>
+    </tr>
+    [% END %]
+
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.cc editable = 1 
+      %]
+      <td colspan="2">
+        [% INCLUDE global/userselect.html.tmpl
+           id => "cc"
+           name => "cc"
+           value => cc
+           disabled => cc_disabled
+           size => 30
+           multiple => 5
+         %]
+      </td>
+    </tr>
+
+<!--    <tr>
+      <th>Default [% field_descs.cc FILTER html %]:</th>
+      <td>
+        <div id="initial_cc">
+        </div>
+     </td>
+    </tr> -->
+  
+    [% IF user.is_timetracker %]
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.estimated_time editable = 1
+      %]
+      <td>
+        <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]">
+      </td>
+    </tr>
+    <tr>
+      [% INCLUDE bug/field.html.tmpl
+        bug = default, field = bug_fields.deadline, value = deadline,
+        editable = 1, value_span = 2 %] 
+    </tr>
+    [% END %]
+
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.alias editable = 1
+      %]
+      <td>
+        <input name="alias" size="20" value="[% alias FILTER html %]">
+      </td>
+    </tr>
+
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.bug_file_loc editable = 1
+      %]
+      <td class="field_value">
+        <input name="bug_file_loc" id="bug_file_loc" class="text_input"
+             size="40" value="[% bug_file_loc FILTER html %]">
+      </td>
+    </tr>
+  </tbody>
+
+  <tbody class="expert_fields">
+    [% USE Bugzilla %]
+    [% FOREACH field = Bugzilla.active_custom_fields %]
+      [% NEXT UNLESS field.enter_bug %]
+      [% SET value = ${field.name}.defined ? ${field.name} : "" %]
+      <tr [% 'class="expert_fields"' IF !field.is_mandatory %]>
+        [% INCLUDE bug/field.html.tmpl 
+          bug = default, field = field, value = value, editable = 1 %]
+      </tr>
+    [% END %]
+  </tbody>
+
+  <tbody class="expert_fields">
+  [% IF user.is_insider %]
+    <tr>
+      <th> </th>
+      <td>
+          
+        <input type="checkbox" id="comment_is_private" name="comment_is_private"
+          [% ' checked="checked"' IF comment_is_private %]
+               onClick="updateCommentTagControl(this, 'comment')">
+        <label for="comment_is_private">
+          Make description and any new attachment private (visible only to members 
+          of the <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+        </label>
+      </td>
+    </tr>
+    <script>
+      updateCommentTagControl(document.getElementById('comment_is_private'), 'comment');
+    </script>
+  [% END %]
+  </tbody>
+
+  <tbody class="expert_fields">
+  [% IF use_keywords %]
+    <tr>
+      [% INCLUDE bug/field.html.tmpl
+        bug = default, field = bug_fields.keywords, editable = 1,
+        value = keywords, possible_values = all_keywords,
+        desc_url = "describekeywords.cgi", value_span = 3
+      %]
+    </tr>
+  [% END %]
+  
+  [% IF user.in_group('editbugs', product.id) %]
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.dependson editable = 1
+      %]
+      <td>
+        <input name="dependson" accesskey="d" value="[% dependson FILTER html %]">
+      </td>
+    </tr>
+    <tr>
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.blocked editable = 1
+      %]
+      <td>
+        <input name="blocked" accesskey="b" value="[% blocked FILTER html %]">
+      </td>
+    </tr>
+  [% END %]
+
+  [% IF Param('use_see_also') %]
+    <tr>
+      [% INCLUDE bug/field.html.tmpl
+         bug            = default
+         field          = bug_fields.see_also
+         editable       = 1
+         value          = see_also
+      %]
+    </tr>
+  [% END %]
+  </tbody>
+
+  <tbody class="expert_fields">
+  [% IF product.groups_available.size %]
+  <tr>
+    <th> </th>
+    <td>
+      <br>
+        <strong>
+          Only users in [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %] of the selected groups can view this 
+          [%+ terms.bug %]:
+        </strong>
+      <br>
+      <span class="bz_info">
+        (Leave all boxes unchecked to make this a public [% terms.bug %].)
+      </span>
+      <br>
+      <br>
+
+      <!-- Checkboxes -->
+      <input type="hidden" name="defined_groups" value="1">
+      [% FOREACH group = product.groups_available %]
+        <input type="checkbox" id="group_[% group.id FILTER html %]"
+               name="groups" value="[% group.name FILTER html %]"
+               [% ' checked="checked"' IF default.groups.contains(group.name)
+                                          OR group.is_default %]>
+        <label for="group_[% group.id FILTER html %]">
+          [%- group.description FILTER html_light %]</label><br>
+      [% END %]
+    </td>
+  </tr>
+  [% END %]
+  </tbody>
+  </table>
+
+  <hr class="expert_fields" />
+
+  [%# SUBMIT BUG %]
+  <div class="filebug-row expert_fields">
+    <input type="submit" id="commit" value="Submit [% terms.Bug %]">
+    <span style="padding: 0 0.5em;">or</span>
+
+    <input type="submit" name="maketemplate" id="maketemplate"
+       value="Remember values as bookmarkable template"
+       onclick="bz_no_validate_enter_bug=true" class="action-link">
+  </div>
+
+  [% Hook.process("form") %]
+
+  <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+[%# Links or content with more information about the bug being created. %]
+[% Hook.process("end") %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields                                                  #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+
+  [% IF no_label != 1 %]
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = field editable = 1
+    %]
+  [% END %]
+  [% IF no_tds != 1 %]
+  <td>
+  [% END %]
+    <select name="[% field.name FILTER html %]" 
+            id="[% field.name FILTER html %]">
+    [%- FOREACH x = ${field.name} %]
+      [% NEXT IF NOT x.is_active %]
+      <option value="[% x.name FILTER html %]"
+        [% " selected=\"selected\"" IF x.name == default.${field.name} %]>
+        [% display_value(field.name, x.name) FILTER html %]
+      </option>
+    [% END %]
+    </select>
+  [% IF no_tds != 1 %]
+    </td>
+  [% END %]
+[% END %]
+
+[% BLOCK build_userlist %]
+  [% user_found = 0 %]
+  [% default_login = default_user.login %]
+  [% RETURN UNLESS default_login %]
+
+  [% FOREACH user = userlist %]
+    [% IF user.login == default_login %]
+      [% user_found = 1 %]
+      [% LAST %]
+    [% END %]
+  [% END %]
+
+  [% userlist.push({login    => default_login,
+                    identity => default_user.identity,
+                    visible  => 1})
+     UNLESS user_found %]
+[% END %]
diff --git a/template/en/custom/bug/edit.html.tmpl b/template/en/custom/bug/edit.html.tmpl
new file mode 100644
index 0000000..f6b9aae
--- /dev/null
+++ b/template/en/custom/bug/edit.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/edit_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/edit_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/edit_DEFAULT.html.tmpl b/template/en/custom/bug/edit_DEFAULT.html.tmpl
new file mode 120000
index 0000000..120cff3
--- /dev/null
+++ b/template/en/custom/bug/edit_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/edit.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/edit_XFCE.html.tmpl b/template/en/custom/bug/edit_XFCE.html.tmpl
new file mode 100644
index 0000000..35b9a0c
--- /dev/null
+++ b/template/en/custom/bug/edit_XFCE.html.tmpl
@@ -0,0 +1,1183 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% IF Param('comment_taggers_group') %]
+  [% IF user.can_tag_comments %]
+    <div id="bz_ctag_div" class="bz_default_hidden">
+      <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideInput()">x</a>
+      <div>
+        <input id="bz_ctag_add" size="10" placeholder="add tag"
+              maxlength="[% constants.MAX_COMMENT_TAG_LENGTH FILTER html %]">
+        <span id="bz_ctag_autocomp"></span>
+      </div>
+       
+    </div>
+    <div id="bz_ctag_error" class="bz_default_hidden">
+      <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideError()">x</a>
+      <span id="bz_ctag_error_msg"></span>
+    </div>
+  [% END %]
+  [% IF user.id %]
+    <script type="text/javascript">
+      YAHOO.bugzilla.commentTagging.init([% user.can_tag_comments ? 'true' : 'false' %]);
+      YAHOO.bugzilla.commentTagging.min_len = [% constants.MIN_COMMENT_TAG_LENGTH FILTER js %];
+      YAHOO.bugzilla.commentTagging.max_len = [% constants.MAX_COMMENT_TAG_LENGTH FILTER js %];
+      YAHOO.bugzilla.commentTagging.label = 'Comment Tags:';
+      YAHOO.bugzilla.commentTagging.min_len_error =
+        'Comment tags must be at least
+        [%~ " " _ constants.MIN_COMMENT_TAG_LENGTH FILTER js %] characters.';
+      YAHOO.bugzilla.commentTagging.max_len_error =
+        'Comment tags cannot be longer than
+        [%~ " " _ constants.MAX_COMMENT_TAG_LENGTH FILTER js %] characters.';
+    </script>
+  [% END %]
+[% END %]
+
+<script type="text/javascript">
+<!--
+[% IF user.is_timetracker %]
+  var bz_remaining_time = [% bug.remaining_time %];
+[% END %]
+
+[% IF user.id %]
+  /* Index all classifications so we can keep track of the classification
+   * for the selected product, which could control field visibility.
+   */
+  var all_classifications = new Array([% bug.choices.product.size %]);
+  [%- FOREACH product = bug.choices.product %]
+      all_classifications['[% product.name FILTER js %]'] = '
+          [%- product.classification.name FILTER js %]';
+  [%- END %]
+[% END %]
+//-->
+</script>
+
+<form name="changeform" id="changeform" method="post" action="process_bug.cgi">
+
+  <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
+  <input type="hidden" name="id" value="[% bug.bug_id %]">
+  <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
+
+  <div id="bug-header" class="group">
+    <div id="bug-title">
+      <div id="summary_container">
+        <a href="show_bug.cgi?id=[% bug.bug_id %]" class="bug_title">
+          <span id="short_desc_nonedit_display_custom">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
+        </a>
+      </div>
+      <div id="summary_input">
+        [% PROCESS input inputname => "short_desc" size => "80"
+                   maxlength => 255 spellcheck => "true" no_td => 1 %]
+      </div>
+      <script type="text/javascript">
+        hideEditableField('summary_container',
+                          'summary_input',
+                          'summary_edit_action',
+                          'short_desc',
+                          '[% bug.short_desc FILTER js %]' );
+      </script>
+    </div>
+
+    [% IF user.id %]
+      <div id="bug-primary-actions">
+        [% IF bug.check_can_change_field('short_desc', 0, 1) %]
+          <a href="#" id="summary_edit_action" class="action-link">Edit title</a>
+        [% END %]
+        <input type="submit" value="Save Changes" id="commit_top">
+      </div>
+    [% END %]
+  </div>
+
+  <div id="bug-layout">
+    <div id="bug-main">
+
+      [%#                        #%]
+      [%#    MAIN INFORMATION    #%]
+      [%#                        #%]
+
+      <div class="bug-row bug-flex" style="margin-top: 1em;">
+
+        [%#    Status    #%]
+
+        <div class="flex-item flex-status status status-[% bug.bug_status %]">
+          [% INCLUDE "bug/field-label.html.tmpl"
+              field = bug_fields.bug_status
+              tag_name = 'b' %]
+          <br />
+          [% PROCESS bug/knob.html.tmpl %]
+        </div>
+
+        [%#    Priority    #%]
+
+        [% can_edit_priority = bug.check_can_change_field('priority', 0, 1) %]
+        <div class="flex-item">
+          [% INCLUDE "bug/field-label.html.tmpl"
+              field = bug_fields.priority
+              tag_name = 'b' %]
+          <br />
+          <span class="select">
+            [% INCLUDE bug/field.html.tmpl
+              bug = bug, field = bug_fields.priority
+              no_tds = 1, value = bug.priority
+              override_legal_values = bug.choices.priority
+              editable = can_edit_priority %]
+          </span>
+        </div>
+
+        [%#    Severity    #%]
+
+        <div class="flex-item severity severity-[% bug.bug_severity %]">
+          [% INCLUDE "bug/field-label.html.tmpl"
+              field = bug_fields.bug_severity
+              tag_name = 'b' %]
+          <br />
+          <span class="select">
+            [% INCLUDE bug/field.html.tmpl
+              bug = bug, field = bug_fields.bug_severity
+              no_tds = 1, value = bug.bug_severity
+              override_legal_values = bug.choices.bug_severity
+              editable = can_edit_priority %]
+          </span>
+        </div>
+      </div>
+
+      [%#    PRODUCT INFORMATION    #%]
+
+      <div class="bug-row bug-flex">
+
+        [%#    Product    #%]
+
+        <div class="flex-item flex-product">
+          [% INCLUDE "bug/field-label.html.tmpl"
+              field = bug_fields.product
+              tag_name = 'b' %]
+          <br />
+          <span class="select">
+            [% INCLUDE bug/field.html.tmpl
+              bug = bug, field = bug_fields.product, value = bug.product
+              override_legal_values = bug.choices.product
+              desc_url = "describecomponents.cgi"
+              editable = bug.check_can_change_field('product', 0, 1)
+              no_tds = 1
+            %]
+          </span>
+        </div>
+
+        [%#    Component    #%]
+
+        <div class="flex-item flex-component">
+          [% INCLUDE "bug/field-label.html.tmpl"
+              field = bug_fields.component
+              tag_name = 'b' %]
+          <br />
+          <div class="flex-split">
+            [% INCLUDE bug/field.html.tmpl
+              bug = bug, field = bug_fields.component, value = bug.component
+              override_legal_values = bug.choices.component
+              desc_url = "describecomponents.cgi?product=$bug.product"
+              editable = bug.check_can_change_field('component', 0, 1)
+              no_tds = 1
+            %]
+          </div>
+        </div>
+      </div>
+
+      [%#                #%]
+      [%#    COMMENTS    #%]
+      [%#                #%]
+
+      <h3>Comments</h3>
+
+      [% IF user.settings.comment_box_position.value == 'before_comments' %]
+        [% PROCESS comment_box %]
+      [% END %]
+
+      <div id="comments">
+        [% PROCESS bug/comments.html.tmpl
+          comments = bug.comments
+          mode = user.id ? "edit" : "show"
+        %]
+      </div>
+
+      [% IF user.settings.comment_box_position.value == 'after_comments' %]
+        [% PROCESS comment_box %]
+      [% END %]
+    </div>
+
+    [%#    ----------  SIDEBAR  ----------    #%]
+
+    <div id="bug-sidebar">
+      <h3>[% terms.Bug %] #[% bug.bug_id FILTER html %]</h3>
+      [% PROCESS reporter %]
+      [% PROCESS report_dates %]
+      [% PROCESS duplicates %]
+
+      <h3>People</h3>
+      [% PROCESS assignee %]
+      [% PROCESS qa_contact %]
+      [% PROCESS cc_list %]
+      [% PROCESS ignore_bug_mail %]
+
+      <h3>Version</h3>
+      [% PROCESS version %]
+      [% PROCESS target_milestone %]
+
+      <h3>Attachments</h3>
+      [% PROCESS attachments %]
+
+      <h3>Additional information</h3>
+      <div id="sidebar-expand">
+        <a class="action-link expand" onclick="getElementById('sidebar-expand').className='expanded';this.style.display='none';">Show</a>
+        [% PROCESS platform %]
+        [% PROCESS deadline %]
+        [% PROCESS alias %]
+        [% PROCESS url %]
+        [% PROCESS keywords %]
+        [% PROCESS personal_tags %]
+        [% PROCESS dependson %]
+        [% PROCESS blockedby %]
+        [% PROCESS dependencytree %]
+        [% PROCESS see_also %]
+        [% PROCESS flags %]
+        [% PROCESS custom_fields %]
+        [% PROCESS restrict_visibility %]
+        [% PROCESS timetracking %]
+      </div>
+  </div>
+
+</div>
+</form>
+
+[%#              #%]
+[%#    BLOCKS    #%]
+[%#              #%]
+
+[%#    Reporter    #%]
+
+[% BLOCK reporter %]
+  <div class="field field-reporter">
+    <strong>Reported by:</strong><br />
+    [% INCLUDE global/user.html.tmpl who = bug.reporter %]<br />
+  </div>
+[% END %]
+
+[%#    Reporting and modification time and history    #%]
+
+[% BLOCK report_dates %]
+  <div class="field field-reportdates">
+    <strong>Reported on:</strong> [% bug.creation_ts FILTER time("%Y-%m-%d") %]<br />
+    <strong>Last modified on:</strong> [% bug.delta_ts FILTER time("%Y-%m-%d") %]
+    <a class="action-link" href="show_activity.cgi?id=[% bug.bug_id %]">Show history</a>
+  </div>
+[% END %]
+
+[%#    Duplicates    #%]
+
+[% BLOCK duplicates %]
+  [% IF bug.duplicates.size %]
+    <div class="field field-duplicates">
+      <b>Duplicates ([% bug.duplicates.size %]):</b>
+      <br />
+      <ul>
+        [% FOREACH dupe = bug.duplicates %]
+          <li>[% INCLUDE bug/link.html.tmpl bug = dupe, link_text = dupe.id, use_alias = 1 %] [% dupe.short_desc %]</li>
+        [% END %]
+      </ul>
+      <br />
+      <a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]" class="action-link">
+       [%-%]view as [% terms.bug %] list</a>
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Assignee    #%]
+
+[% BLOCK assignee %]
+  <div class="field field-assignee">
+    [% can_edit_assigned_to = bug.check_can_change_field("assigned_to", 0, 1) %]
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = bug_fields.assigned_to
+      tag_name = 'b'
+    %]
+    <br />
+    [% IF can_edit_assigned_to %]
+      <div id="bz_assignee_edit_container" class="bz_default_hidden">
+        <span>
+          [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+          <a href="#" id="bz_assignee_edit_action" class="action-link">edit</a>
+          [% IF bug.assigned_to.id != user.id %]
+            <a title="Reassign to yourself" href="#" id="bz_assignee_take_action" class="action-link">take</a>
+          [% END %]
+        </span>
+      </div>
+      <div id="bz_assignee_input">
+        [% INCLUDE global/userselect.html.tmpl
+             id => "assigned_to"
+             name => "assigned_to"
+             value => bug.assigned_to.login
+             classes => ["bz_userfield"]
+             size => 30
+        %]
+        <br />
+        <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
+        <label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
+      </div>
+      <script type="text/javascript">
+        hideEditableField('bz_assignee_edit_container',
+                          'bz_assignee_input',
+                          'bz_assignee_edit_action',
+                          'assigned_to',
+                          '[% bug.assigned_to.login FILTER js %]' );
+        hideEditableField('bz_assignee_edit_container',
+                          'bz_assignee_input',
+                          'bz_assignee_take_action',
+                          'assigned_to',
+                          '[% bug.assigned_to.login FILTER js %]',
+                          '[% user.login FILTER js %]' );
+        initDefaultCheckbox('assignee');
+      </script>
+    [% ELSE %]
+      [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+    [% END %]
+  </div>
+[% END %]
+
+[%#    QA Contact    #%]
+
+[% BLOCK qa_contact %]
+  [% IF Param('useqacontact') %]
+    <div class="field field-qacontact">
+      [% can_edit_qa_contact = bug.check_can_change_field("qa_contact", 0, 1) %]
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.qa_contact
+        accesskey = "q", tag_name = 'b'
+      %]
+      <br />
+      [% IF can_edit_qa_contact %]
+        <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
+          <span>
+            [% IF bug.qa_contact == null %]
+              Nobody
+            [% ELSE %]
+              [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+            [% END %]
+            <a href="#" id="bz_qa_contact_edit_action" class="action-link">edit</a>
+            [% IF bug.qa_contact.id != user.id %]
+              <a title="Change QA contact to yourself" href="#" id="bz_qa_contact_take_action" class="action-link">take</a>
+            [% END %]
+          </span>
+        </div>
+        <div id="bz_qa_contact_input">
+          [% INCLUDE global/userselect.html.tmpl
+             id      => "qa_contact"
+             name    => "qa_contact"
+             value   => bug.qa_contact.login
+             size    => 30
+             classes => ["bz_userfield"]
+             emptyok => 1
+          %]
+          <br />
+          <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
+          <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
+        </div>
+        <script type="text/javascript">
+          hideEditableField('bz_qa_contact_edit_container',
+                          'bz_qa_contact_input',
+                          'bz_qa_contact_edit_action',
+                          'qa_contact',
+                          '[% bug.qa_contact.login FILTER js %]');
+         hideEditableField('bz_qa_contact_edit_container',
+                          'bz_qa_contact_input',
+                          'bz_qa_contact_take_action',
+                          'qa_contact',
+                          '[% bug.qa_contact.login FILTER js %]',
+                          '[% user.login FILTER js %]');
+         initDefaultCheckbox('qa_contact');
+       </script>
+      [% ELSE %]
+        [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+      [% END %]
+    </div>
+  [% END %]
+  <script type="text/javascript">
+    assignToDefaultOnChange(['product', 'component'],
+      '[% bug.component_obj.default_assignee.login FILTER js %]',
+      '[% bug.component_obj.default_qa_contact.login FILTER js %]');
+  </script>
+[% END %]
+
+[%#    CC List    #%]
+
+[% BLOCK cc_list %]
+  <div class="field field-cclist">
+    <b>CC List:</b>
+    <br />
+    [% IF user.id %]
+      [% IF NOT bug.cc.contains(user.login) %]
+        <input type="checkbox" id="addselfcc" name="addselfcc"
+          [% " checked=\"checked\""
+               IF user.settings.state_addselfcc.value == 'always'
+                  || (!bug.user.has_any_role
+                      && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
+        <label for="addselfcc">Add me to CC list</label>
+        <br />
+      [% END %]
+    [% END %]
+    [% bug.cc.size FILTER html %]
+    [% IF bug.cc.size == 1 %]
+      user
+    [% ELSE %]
+      users
+    [% END %]
+    [% IF user.id %]
+      [% IF bug.cc.contains( user.email ) %]
+        including you
+      [% END %]
+    [% END %]
+    [% IF user.id || bug.cc.size %]
+      <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
+        <a href="#" id="cc_edit_area_showhide" class="action-link">[% IF user.id %]edit[% ELSE %]show[% END %]</a>
+      </span>
+    [% END %]
+    <div id="cc_edit_area">
+      [% IF user.id %]
+        <div>
+          <div><label for="cc"><b>Add</b></label></div>
+          [% INCLUDE global/userselect.html.tmpl
+              id => "newcc"
+              name => "newcc"
+              value => ""
+              size => 30
+              classes => ["bz_userfield"]
+              multiple => 5
+            %]
+        </div>
+      [% END %]
+      [% IF bug.cc.size %]
+        <select id="cc" multiple="multiple" size="5" [% 'name="cc"' IF bug.user.canedit %]>
+          [% FOREACH c = bug.cc %]
+            <option value="[% c FILTER email FILTER html %]">
+              [% c FILTER email FILTER html %]</option>
+          [% END %]
+        </select>
+        [% IF user.id && !bug.user.canedit %]
+          <input type="hidden" name="cc" value="[% user.login FILTER email FILTER html %]">
+        [% END %]
+        [% IF user.id AND (bug.user.canedit OR bug.cc.contains(user.login)) %]
+          <br />
+          <input type="checkbox" id="removecc" name="removecc">
+          <label for="removecc">
+            [% IF bug.user.canedit %]
+              Remove selected CCs
+            [% ELSE %]
+              Remove me from the CC list
+            [% END %]
+          </label>
+          <br />
+        [% END %]
+      [% END %]
+    </div>
+    [% IF user.id || bug.cc.size %]
+      <script type="text/javascript">
+        hideEditableField( 'cc_edit_area_showhide_container',
+                           'cc_edit_area',
+                           'cc_edit_area_showhide',
+                           '',
+                           '');
+      </script>
+    [% END %]
+  </div>
+[% END %]
+
+[%#    Ignore Bug Mail    #%]
+
+[% BLOCK ignore_bug_mail %]
+  [% IF user.id %]
+    <div class="field field-ignorebugmail">
+      <input type="hidden" name="defined_bug_ignored" value="1">
+      <input type="checkbox" name="bug_ignored" id="bug_ignored" value="1"
+        [% ' checked="checked"' IF user.is_bug_ignored(bug.id) %]>
+      <label for="bug_ignored" title="Ignore all email for this [% terms.bug %]">
+        <b>Ignore [% terms.Bug %] Mail</b> (never email me about this [% terms.bug %])
+      </label>
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Version    #%]
+
+[% BLOCK version %]
+  <div class="field field-version">
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = bug_fields.version
+      tag_name = 'b' %]
+    <br />
+    [% PROCESS select selname => "version" %]
+  </div>
+[% END %]
+
+[%#    Target Milestone    #%]
+
+[% BLOCK target_milestone %]
+  [% IF Param("usetargetmilestone") && bug.target_milestone %]
+    <div class="field field-targetmilestone">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.target_milestone
+        tag_name = 'b'
+      %]
+      <br />
+      [% PROCESS select selname = "target_milestone" %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Attachments    �#%]
+
+[% BLOCK attachments %]
+  <div class="field field-attachments">
+    [% PROCESS attachment/list.html.tmpl
+       attachments = bug.attachments
+       bugid       = bug.bug_id
+       num_attachment_flag_types = bug.num_attachment_flag_types
+       show_attachment_flags = bug.show_attachment_flags
+    %]
+  </div>
+[% END %]
+
+[%#    Platform    #%]
+
+[% BLOCK platform %]
+  [% can_edit_rep_platform = bug.check_can_change_field('rep_platform', 0, 1) %]
+  <div class="field field-platform">
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = bug_fields.rep_platform,
+      accesskey = "h", tag_name = 'b' %]
+    <br />
+    [% INCLUDE bug/field.html.tmpl
+        bug = bug, field = bug_fields.rep_platform
+        no_tds = 1, value = bug.rep_platform
+        override_legal_values = bug.choices.rep_platform
+        editable = can_edit_rep_platform %]
+    [% INCLUDE bug/field.html.tmpl
+        bug = bug, field = bug_fields.op_sys,
+        no_tds = 1, value = bug.op_sys
+        override_legal_values = bug.choices.op_sys
+        editable = bug.check_can_change_field('op_sys', 0, 1) %]
+   </div>
+[% END %]
+
+[%#    Deadline    #%]
+
+[% BLOCK deadline %]
+  [% IF Param("timetrackinggroup") && bug.deadline %]
+    <div class="field field-deadline">
+      <a href="page.cgi?id=fields.html#deadline">Deadline</a>:
+    </div>
+    <br />
+    [% bug.deadline FILTER html %]
+  [% END %]
+[% END %]
+
+[%#    Alias    #%]
+
+[% BLOCK alias %]
+  <div class="field field-alias">
+    [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.alias, tag_name = 'b' %]
+    <br />
+    [% IF bug.alias.size %]
+      [% bug.alias.join(', ') FILTER html %]
+    [% ELSE %]
+      None
+    [% END %]
+    [% IF bug.check_can_change_field('alias', 0, 1) %]
+      <span id="alias_edit_area_showhide_container" class="bz_default_hidden">
+        <a href="#" class="action-link" id="alias_edit_area_showhide">edit</a>
+      </span>
+      <br />
+      <div id="alias_edit_area">
+        <div>
+          <label for="newalias" class="field_label">Add</label>
+          <br />
+          <input name="newalias" id="newalias" size="20">
+        </div>
+        [% IF bug.alias.size %]
+          <select id="alias" name="alias" multiple="multiple" size="5">
+            [% FOREACH a = bug.alias %]
+              <option value="[% a FILTER html %]">[% a FILTER html %]</option>
+            [% END %]
+          </select>
+          <br />
+
+          <input type="checkbox" id="removealias" name="removealias">
+          <label for="removealias">Remove selected aliases</label>
+        [% END %]
+      </div>
+      <script type="text/javascript">
+        hideEditableField( 'alias_edit_area_showhide_container',
+                           'alias_edit_area',
+                           'alias_edit_area_showhide',
+                           '',
+                           '');
+      </script>
+    [% END %]
+  </div>
+[% END %]
+
+[%#    Status Whiteboard    #%]
+
+[% BLOCK status_whiteboard #%]
+  [% IF Param('usestatuswhiteboard') %]
+    <div class="field field-statuswhiteboard">
+      [% INCLUDE "bug/field-label.html.tmpl"
+        field = bug_fields.status_whiteboard
+        accesskey = "w", tag_name = 'b'
+      %]
+      <br />
+      [% INCLUDE input inputname = "status_whiteboard" size = 40 %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    URL    #%]
+
+[% BLOCK url #%]
+  <div class="field field-url">
+    [% can_edit_bug_file_loc = bug.check_can_change_field("bug_file_loc", 0, 1) %]
+    [% INCLUDE "bug/field-label.html.tmpl"
+      field = bug_fields.bug_file_loc
+      accesskey = "u", tag_name = 'b'
+    %]
+    <br />
+
+    [% IF can_edit_bug_file_loc %]
+      <span id="bz_url_edit_container" class="bz_default_hidden"> 
+      [% IF is_safe_url(bug.bug_file_loc) %]
+        <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+           rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
+           [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
+      [% ELSE %]
+        [% bug.bug_file_loc FILTER html %]
+      [% END %]
+      <a href="#" class="action-link" id="bz_url_edit_action">edit</a></span>
+    [% END %]
+    <span id="bz_url_input_area">
+      [% url_output = INCLUDE input no_td = 1 inputname = "bug_file_loc" size = 40 %]
+      [% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1)
+            AND is_safe_url(bug.bug_file_loc) %]
+        <a href="[% bug.bug_file_loc FILTER html %]"
+           rel="noreferrer">[% url_output FILTER none %]</a>
+      [% ELSE %]
+        [% url_output FILTER none %]
+      [% END %]
+    </span>
+    [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+      <script type="text/javascript">
+        hideEditableField('bz_url_edit_container', 
+                          'bz_url_input_area', 
+                          'bz_url_edit_action', 
+                          'bug_file_loc', 
+                          "[% bug.bug_file_loc FILTER js %]");
+      </script>
+    [% END %]
+  </div>
+[% END %]
+
+[%#    Keywords    #%]
+
+[% BLOCK keywords %]
+  [% IF use_keywords %]
+    <div class="field field-keywords">
+      [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.keywords, tag_name = 'b' %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl
+        bug = bug, field = bug_fields.keywords, value = bug.keywords
+        editable = bug.check_can_change_field("keywords", 0, 1),
+        desc_url = "describekeywords.cgi", possible_values = all_keywords,
+        no_label = 1
+      %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Personal Tags    #%]
+
+[% BLOCK personal_tags %]
+  [% IF user.id %]
+    <div class="field field-personaltags">
+      [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.tag, tag_name = 'b' %]
+      <br />
+      [% INCLUDE bug/field.html.tmpl
+        bug = bug, field = bug_fields.tag, value = bug.tags.join(", "),
+        editable = 1, possible_values = user.tags.keys, no_label = 1
+      %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Depends On    #%]
+
+[% BLOCK dependson %]
+  <div class="field field-dependson">
+    [% INCLUDE dependencies 
+       field = bug_fields.dependson deps = bug.depends_on_obj, tag_name = 'b' %]
+  </div>
+[% END %]
+
+[%#    Blocked By    #%]
+
+[% BLOCK blockedby %]
+  <div class="field field-blockedby">
+    [% INCLUDE dependencies 
+      field = bug_fields.blocked deps = bug.blocks_obj, tag_name = 'b' %]
+  </div>
+[% END %]
+
+[%#    Dependency tree/chart    #%]
+
+[% BLOCK dependencytree %]
+  [% IF bug.dependson.size || bug.blocked.size %]
+    <div class="field field-dependencytree" id="show_dependency_tree_or_graph">
+      Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">tree</a>
+      [% IF Param('webdotbase') %]
+        / <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
+      [% END %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    See Also    #%]
+[% BLOCK see_also %]
+  [% IF Param('use_see_also') || bug.see_also.size %]
+    <div class="field field-seealso">
+      [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.see_also, tag_name = 'b' %]<br />
+      [% INCLUDE bug/field.html.tmpl 
+           field    = bug_fields.see_also
+           value    = bug.see_also
+           editable = bug.check_can_change_field('see_also', 0, 1)
+      %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Flags    #%]
+
+[% BLOCK flags %]
+  [% show_bug_flags = 0 %]
+  [% bug_flags_set = 0 %]
+  [% show_more_flags = 0 %]
+  [% FOREACH type = bug.flag_types %]
+    [% IF type.flags.size || (user.id && type.is_active && user.can_request_flag(type)) %]
+      [% show_bug_flags = 1 %]
+    [% END %]
+    [% IF user.id && type.is_active && (!type.flags.size || type.is_multiplicable) %]
+      [% show_more_flags = 1 %]
+    [% END %]
+    [% IF type.flags.size %]
+      [% bug_flags_set = 1 %]
+    [% END %]
+    [% LAST IF show_bug_flags && show_more_flags && bug_flags_set %]
+  [% END %]
+  [% IF show_bug_flags %]
+    <div class="field field-flags">
+      [% IF bug.flag_types.size %]
+        [% PROCESS "flag/list.html.tmpl" flag_no_header = 1
+                                         flag_types = bug.flag_types
+                                         any_flags_requesteeble = bug.any_flags_requesteeble %]
+      [% END %]
+      [% IF show_more_flags %]
+        <span id="bz_flags_more_container" class="bz_default_hidden">
+          [% IF !bug_flags_set %]<em>None yet set</em>[% END %]
+          <a class="action-link" href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]set[% ELSE %]more[% END %] flags</a>
+        </span>
+        <script type="text/javascript">
+          YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden');
+          var table = YAHOO.util.Dom.get("flags");
+          var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table);
+          for (var i = 0; i < rows.length; i++) {
+              YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden');
+          }
+          YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) {
+              YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden');
+              for (var i = 0; i < rows.length; i++) {
+                  YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
+              }
+              YAHOO.util.Event.preventDefault(e);
+          }); 
+        </script>
+      [% END %]
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Restrict visibility    %]
+
+[% BLOCK restrict_visibility %]
+  [% RETURN UNLESS bug.groups.size %]
+
+  <div class="field field-restrictvisibility">
+    <div class="bz_group_visibility_section">
+      [% inallgroups = 1 %]
+      [% inagroup = 0 %]
+      [% emitted_description = 0 %]
+
+      [% FOREACH group = bug.groups %]
+        [% SET inallgroups = 0 IF NOT group.ingroup %]
+        [% SET inagroup = 1 IF group.ison %]
+
+        [% NEXT IF group.mandatory %]
+
+        [% IF NOT emitted_description %]
+          [% emitted_description = 1 %]
+            <div id="bz_restrict_group_visibility_help">
+              <b>Only users in
+                [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %]
+                of the selected groups can view this [% terms.bug %]:</b>
+               <p class="instructions">
+                 Unchecking all boxes makes this a more public [% terms.bug %].
+               </p>
+            </div>
+        [% END %]
+
+        [% IF group.ingroup %]
+          <input type="hidden" name="defined_groups" 
+                 value="[% group.name FILTER html %]">
+        [% END %]
+
+        <input type="checkbox" value="[% group.name FILTER html %]"
+               name="groups" id="group_[% group.bit %]"
+               [% ' checked="checked"' IF group.ison %]
+               [% ' disabled="disabled"' IF NOT group.ingroup %]>
+        <label for="group_[% group.bit %]">
+        [%- group.description FILTER html_light %]</label>
+        <br />
+      [% END %]
+
+      [% IF emitted_description %]
+        [% IF NOT inallgroups %]
+          <p class="instructions">Only members of a group can change the 
+            visibility of [% terms.abug %] for that group.</p>
+        [% END %]
+      [% END %]
+
+      [% IF inagroup %]
+        <div id="bz_enable_role_visibility_help">
+          <b>Users in the roles selected below can always view 
+            this [% terms.bug %]:</b>
+        </div>
+        <div id="bz_enable_role_visibility">
+          <div>
+            [% user_can_edit_accessible = 
+              bug.check_can_change_field("reporter_accessible", 0, 1) 
+            %]
+            [% IF user_can_edit_accessible %]
+              <input type="hidden" name="defined_reporter_accessible" value="1">
+            [% END %]
+            <input type="checkbox" value="1"
+                   name="reporter_accessible" id="reporter_accessible"
+                   [% " checked" IF bug.reporter_accessible %]
+                   [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+            <label for="reporter_accessible">Reporter</label>
+          </div>
+          <div>
+            [% user_can_edit_accessible = 
+              bug.check_can_change_field("cclist_accessible", 0, 1) 
+            %]
+            [% IF user_can_edit_accessible %]
+              <input type="hidden" name="defined_cclist_accessible" value="1">
+            [% END %]
+            <input type="checkbox" value="1"
+                   name="cclist_accessible" id="cclist_accessible"
+                   [% " checked" IF bug.cclist_accessible %]
+                   [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+            <label for="cclist_accessible">CC List</label>
+          </div>
+          <p class="instructions">
+            The assignee
+            [% IF (Param('useqacontact')) %]
+               and QA contact
+            [% END %]
+            can always see [% terms.abug %], and this section does not
+            take effect unless the [% terms.bug %] is restricted to at
+            least one group.
+          </p>
+        </div>
+      [% END %]
+    </div> [%# bz_group_visibility_section %]
+  </div>
+[% END %]
+
+[%#    Time Tracking    #%]
+
+[% BLOCK timetracking %]
+  [% IF user.is_timetracker %]
+    <div class="field field-timetracking"
+      <table class="bz_time_tracking_table">
+        <tr>
+          [% INCLUDE "bug/field-label.html.tmpl"
+            field = bug_fields.estimated_time
+          %]
+          <th>
+            Current Est.:
+          </th>
+          [% INCLUDE "bug/field-label.html.tmpl"
+             field = bug_fields.work_time
+          %]
+          [% INCLUDE "bug/field-label.html.tmpl"
+             field = bug_fields.remaining_time
+          %]
+          [% INCLUDE "bug/field-label.html.tmpl"
+             field = bug_fields.percentage_complete
+          %]
+          <th>
+            Gain:
+          </th>
+          [% INCLUDE "bug/field-label.html.tmpl"
+             field = bug_fields.deadline
+          %]
+        </tr>
+        <tr>
+          <td>
+            <input name="estimated_time" id="estimated_time"
+                   value="[% PROCESS formattimeunit
+                                     time_unit=bug.estimated_time %]"
+                   size="6" maxlength="6">
+          </td>
+          <td>
+            [% PROCESS formattimeunit
+                       time_unit=(bug.actual_time + bug.remaining_time) %]
+          </td>
+          <td>
+            [% PROCESS formattimeunit time_unit=bug.actual_time %] +
+            <input name="work_time" id="work_time"
+                   value="0" size="3" maxlength="6"
+                   onchange="adjustRemainingTime();">
+          </td>
+          <td>
+            <input name="remaining_time" id="remaining_time"
+                   value="[% PROCESS formattimeunit
+                                     time_unit=bug.remaining_time %]"
+                   size="6" maxlength="6" onchange="updateRemainingTime();">
+          </td>
+          <td>
+            [% PROCESS calculatepercentage act=bug.actual_time
+                                           rem=bug.remaining_time %]
+          </td>
+          <td>
+            [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
+          </td>
+          <td>
+            [% INCLUDE bug/field.html.tmpl
+              field = bug_fields.deadline, value = bug.deadline, no_tds = 1
+              editable = bug.check_can_change_field('deadline', 0, 1) %]
+          </td>        
+        </tr>
+        <tr>
+          <td colspan="7" class="bz_summarize_time">
+            <a href="summarize_time.cgi?id=[% bug.bug_id %]&do_depends=1">
+            Summarize time (including time for [% terms.bugs %]
+            blocking this [% terms.bug %])</a>
+          </td>
+        </tr>
+      </table> 
+    </div>
+  [% END %]
+[% END %]
+
+[%#    Custom fields    #%]
+
+[% BLOCK custom_fields %]
+  [% USE Bugzilla %]
+  [% FOREACH field = Bugzilla.active_custom_fields %]
+    <div class="field field.[% field.name FILTER html %]">
+      [%# Use PROCESS instead of INCLUDE, because extra_field_item is defined
+        # in the template and must be returned back. INCLUDE cannot do that. %]
+      [% PROCESS bug/field.html.tmpl value = bug.${field.name}
+                                     editable = bug.check_can_change_field(field.name, 0, 1) %]
+      [% IF extra_field_item %]
+        <br />
+        <strong>[% extra_field_item.header FILTER none %]</strong>
+        <br />
+        [% extra_field_item.data FILTER none %]
+      [% END %]
+    </div>
+  [% END %]
+  [% Hook.process("after_custom_fields") %]
+[% END %]
+
+
+[%# TBD #%]
+
+[%############################################################################%]
+[%# Block for the Additional Comments box                                    #%]
+[%############################################################################%]
+
+[% BLOCK comment_box %]
+  <div id="add_comment" class="bz_section_additional_comments">
+    [% IF user.id %]
+<!--      <label for="comment" accesskey="c"><b>Additional 
+        <u>C</u>omments</b></label>: -->
+
+      [% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
+        <input type="checkbox" name="comment_is_private" value="1"
+               id="newcommentprivacy"
+               onClick="updateCommentTagControl(this, 'comment')">
+        <label for="newcommentprivacy">
+          Make comment private (visible only to members of the
+          <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+        </label>
+      [% END %]
+
+      <!-- This table keeps the submit button aligned with the box. -->
+      <table><tr><td>
+        [% IF bug.check_can_change_field('longdesc', 0, 1) %]
+          [% INCLUDE bug/comment.html.tmpl
+                     minrows   = 10
+                     maxrows   = 25
+                     cols      = constants.COMMENT_COLS
+          %]
+          [% IF user.is_insider %]
+            <script>
+               updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
+            </script>
+          [% END %]
+          [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
+        [% ELSE %]
+          You are not allowed to make an additional comment on this [% terms.bug %].
+        [% END %]
+        [% PROCESS commit_button id=""%]
+
+        [% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %]
+
+      </td></tr></table>
+
+    [%# For logged-out users %]
+    [% ELSE %]
+      <table>
+        <tr>
+          <td>
+            <fieldset>
+              <legend>Note</legend>
+              You need to
+              <a href="show_bug.cgi?id=
+                      [%- bug.bug_id %]&GoAheadAndLogIn=1">log in</a>
+              before you can comment on or make changes to this [% terms.bug %].
+            </fieldset>
+          </td>
+        </tr> 
+      </table>
+    [% END %]
+  </div>
+[% END %]
+
+[%############################################################################%]
+[%# Block for SELECT fields                                                  #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+  [% IF bug.check_can_change_field(selname, 0, 1) 
+        AND bug.choices.${selname}.size > 1 %]
+    <input type="hidden" id="[% selname %]_dirty">
+    <select id="[% selname %]" name="[% selname %]">
+      [% FOREACH x = bug.choices.${selname} %]
+        <option value="[% x.name FILTER html %]"
+          [% " selected" IF x.name == bug.${selname} %]>
+          [%- x.name FILTER html %]
+        </option>
+      [% END %]
+    </select>
+  [% ELSE %]
+    [% bug.${selname} FILTER html %]
+  [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for INPUT fields                                                   #%]
+[%############################################################################%]
+
+[% BLOCK input %]
+  [% IF no_td != 1 %]
+  <td[% " colspan=\"$colspan\"" IF colspan %]>
+  [% END %]
+    [% val = value ? value : bug.$inputname %]
+    [% IF bug.check_can_change_field(inputname, 0, 1) %]
+       <input id="[% inputname %]" name="[% inputname %]" class="text_input"
+              value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
+              [% " maxlength=\"$maxlength\"" IF maxlength %]
+              [% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
+    [% ELSE %]
+      [% IF size && val.length > size %]
+        <span title="[% val FILTER html %]">
+          [% val FILTER truncate(size) FILTER html %]
+        </span>
+      [% ELSE %]
+        [% val FILTER html %]
+      [% END %]
+    [% END %]
+  [% IF no_td != 1 %]  
+  </td>
+  [% END %]
+  [% no_td = 0 %]
+  [% maxlength = 0 %]
+  [% colspan = 0 %]
+  [% size = 0 %]
+  [% value = undef %]
+  [% spellcheck = undef %]
+[% END %]
+
+[%# Commit button... %]
+[% BLOCK commit_button %]
+  [% IF user.id %]
+    <div class="knob-buttons">
+      [% IF id == '_top' && bug.check_can_change_field('short_desc', 0, 1) %]
+        <a href="#" id="summary_edit_action" class="action-link">Edit title</a>
+      [% END %]
+      <input type="submit" value="Save Changes" 
+             id="commit[% id FILTER css_class_quote %]">
+    </div>
+  [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for dependencies                                                   #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+
+  [% INCLUDE "bug/field-label.html.tmpl" %]
+
+  <td>
+    <span id="[% field.name FILTER html %]_input_area">
+      [% IF bug.check_can_change_field(field.name, 0, 1) %]
+        <input name="[% field.name FILTER html %]" 
+               id="[% field.name FILTER html %]" class="text_input"
+               value="[% bug.${field.name}.join(', ') FILTER html %]">
+      [% END %]
+    </span>
+
+    [% FOREACH dep_bug = deps %]
+      [% INCLUDE bug/link.html.tmpl bug = dep_bug, link_text = dep_bug.id, use_alias = 1 %][% " " %]
+    [% END %]
+    [% IF bug.check_can_change_field(field.name, 0, 1) %]
+      <span id="[% field.name FILTER html %]_edit_container" 
+            class="edit_me bz_default_hidden">
+        (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
+      </span>
+      <script type="text/javascript">
+        hideEditableField('[% field.name FILTER js %]_edit_container', 
+                          '[% field.name FILTER js %]_input_area', 
+                          '[% field.name FILTER js %]_edit_action', 
+                          '[% field.name FILTER js %]', 
+                          '[% bug.${field.name}.join(', ') FILTER js %]');
+      </script>
+    [% END %]
+  </td>
+  
+[% END %]
+
diff --git a/template/en/custom/bug/field.html.tmpl b/template/en/custom/bug/field.html.tmpl
new file mode 100644
index 0000000..02806cd
--- /dev/null
+++ b/template/en/custom/bug/field.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/field_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/field_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/field_DEFAULT.html.tmpl b/template/en/custom/bug/field_DEFAULT.html.tmpl
new file mode 120000
index 0000000..1587a55
--- /dev/null
+++ b/template/en/custom/bug/field_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/field.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/field_XFCE.html.tmpl b/template/en/custom/bug/field_XFCE.html.tmpl
new file mode 100644
index 0000000..edf0818
--- /dev/null
+++ b/template/en/custom/bug/field_XFCE.html.tmpl
@@ -0,0 +1,294 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# INTERFACE:
+  #   field: a Bugzilla::Field object
+  #   value: The value of the field for this bug.
+  #   field_hidden (optional): boolean; if true, the field is hidden by default.
+  #   override_legal_values (optional): The list of legal values, for select fields.
+  #   editable: Whether the field should be displayed as an editable
+  #             <input> or as just the plain text of its value.
+  #   allow_dont_change: display the --do_not_change-- option for select fields.
+  #   value_span: A colspan for the table cell containing
+  #               the field value.
+  #   no_tds: boolean; if true, don't display the label <th> or the 
+  #           wrapping <td> for the field.
+  #   bug (optional): The current Bugzilla::Bug being displayed, or a hash 
+  #                   with default field values being displayed on a page.
+  #   no_label: boolean; if true, don't display the label
+  #%]
+
+[% IF NOT no_tds %]
+  [% field_hidden = 0 %]
+  [% IF bug AND !field.is_visible_on_bug(bug) %]
+    [% field_hidden = 1 %]
+  [% END %]
+
+  [% IF no_label != 1 %]
+    [% INCLUDE "bug/field-label.html.tmpl" hidden = field_hidden %]
+  [% END %]
+  <td class="field_value [% ' bz_hidden_field' IF field_hidden %]"
+      id="field_container_[% field.name FILTER html %]" 
+      [% " colspan=\"$value_span\"" FILTER none IF value_span %]>
+[% END %]
+[% Hook.process('start_field_column') %]
+[% IF editable %]
+  [% SWITCH field.type %]
+    [% CASE [ constants.FIELD_TYPE_FREETEXT
+              constants.FIELD_TYPE_INTEGER ] %]
+        <input id="[% field.name FILTER html %]" class="text_input"
+               name="[% field.name FILTER html %]"
+               value="[% value FILTER html %]" size="40"
+               maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
+               [% IF field.type == constants.FIELD_TYPE_INTEGER %]
+                 pattern="-?\d+[% IF dontchange %]|[% dontchange FILTER html %][% END %]"
+                 title="The value must be a valid positive or negative integer"
+               [% END %]
+               [% IF field.is_mandatory %]
+                 data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+               [% END %]>
+    [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
+      [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %]
+      <input name="[% field.name FILTER html %]" size="[% size FILTER none %]"
+             id="[% field.name FILTER html %]"
+             value="[% value FILTER html %]"
+             [% IF field.is_mandatory %]
+               data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+             [% END %]
+             onchange="updateCalendarFromField(this)">
+      <button type="button" class="calendar_button"
+              id="button_calendar_[% field.name FILTER html %]"
+              onclick="showCalendar('[% field.name FILTER js %]')">
+        <span>Calendar</span>
+      </button>
+
+      <div id="con_calendar_[% field.name FILTER html %]"></div>
+
+      <script type="text/javascript">
+        <!--
+          [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
+        //--></script>
+    [% CASE constants.FIELD_TYPE_BUG_ID %]
+        <span id="[% field.name FILTER html %]_input_area">
+          <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
+                 value="[% value FILTER html %]" size="7"
+                 [% IF field.is_mandatory %]
+                   data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+                 [% END %]>
+        </span>
+
+        [% IF value %]  
+          [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
+        [% END %]
+        <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
+          <a href="#" id="[% field.name FILTER html %]_edit_action" class="action-link">edit</a>
+        </span>
+        <script type="text/javascript">
+        hideEditableField('[% field.name FILTER js %]_edit_container',
+                          '[% field.name FILTER js %]_input_area',
+                          '[% field.name FILTER js %]_edit_action',
+                          '[% field.name FILTER js %]',
+                          "[% value FILTER js %]");
+        </script>
+    [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT 
+              constants.FIELD_TYPE_MULTI_SELECT ] %]
+      [%# The 'product' field needs its own template if classifications are enabled. %]
+      [% IF field.name == "product" AND Param('useclassification') %]
+        [% INCLUDE "global/product-select.html.tmpl"
+                   id = "product", name = "product", value = value
+                   products = override_legal_values %]
+      [% ELSE %]
+        <input type="hidden" id="[% field.name FILTER html %]_dirty">
+        <select id="[% field.name FILTER html %]" 
+                name="[% field.name FILTER html %]" 
+                [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+                  [% SET field_size = 5 %]
+                  [% IF field.legal_values.size < 5 %]
+                    [% SET field_size = field.legal_values.size %]
+                  [% END %]
+                  size="[% field_size FILTER html %]" multiple="multiple"
+                  [% IF field.is_mandatory %]
+                    data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+                  [% END %]
+                [% END %]>
+          [% IF allow_dont_change %]
+            <option value="[% dontchange FILTER html %]"
+                   [% ' selected="selected"' IF value == dontchange %]>
+              [% dontchange FILTER html %]
+            </option>
+          [% END %]
+          [% IF override_legal_values %]
+            [% legal_values = override_legal_values %]
+          [% ELSE %]
+            [% legal_values = field.legal_values %]
+          [% END %]
+          [% FOREACH legal_value = legal_values %]
+            [% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %]
+            <option value="[% legal_value.name FILTER html %]"
+                    id="v[% legal_value.id FILTER html %]_
+                        [%- field.name FILTER html %]"
+              [%# We always show selected values, even if they should be
+                # hidden %]
+              [% IF value.contains(legal_value.name).size %]
+                selected="selected"
+              [% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %]
+                class="bz_hidden_option" disabled="disabled"
+              [% END %]>
+              [%- display_value(field.name, legal_value.name) FILTER html ~%]
+            </option>
+          [% END %]
+        </select>
+        [%# When you pass an empty multi-select in the web interface,
+          # it doesn't appear at all in the CGI object. Instead of
+          # forcing all users of process_bug to always specify every
+          # multi-select, we have this field defined if the multi-select
+          # field is defined, and then if this is passed but the multi-select
+          # isn't, we know that the multi-select was emptied.
+        %]
+        [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+          <input type="hidden" name="defined_[% field.name FILTER html %]">
+        [% END %]
+      [% END %]
+
+      <script type="text/javascript">
+        <!--
+          initHidingOptionsForIE('[% field.name FILTER js %]');
+          [%+ INCLUDE "bug/field-events.js.tmpl"
+                      field = field, product = bug.product_obj %]
+        //-->
+      </script>
+
+    [% CASE constants.FIELD_TYPE_TEXTAREA %]
+       <div id="[% field.name FILTER html %]_edit_container" class="bz_default_hidden">
+         <div>
+             <a href="#" id="[% field.name FILTER html %]_edit_action" class="action-link">edit</a>
+         </div>
+         [% IF value %]
+           <pre id="[% field.name FILTER html %]_readonly"
+                class="field_textarea_readonly">[% value FILTER html %]</pre>
+         [% END %]
+       </div>
+       <div id="[% field.name FILTER html %]_input">
+         [% INCLUDE global/textarea.html.tmpl
+            id = field.name name = field.name minrows = 4 maxrows = 8
+            cols = 60 defaultcontent = value mandatory = field.is_mandatory %]
+       </div>
+       <script type="text/javascript">
+         hideEditableField('[% field.name FILTER js %]_edit_container',
+                           '[% field.name FILTER js %]_input',
+                           '[% field.name FILTER js %]_edit_action',
+                           '[% field.name FILTER js %]',
+                           '[% value FILTER js %]',
+                           '',
+                           true);
+       </script>
+    [% CASE constants.FIELD_TYPE_BUG_URLS %]
+       [% IF bug.id && value.size %]
+         <ul class="bug_urls">
+         [% FOREACH bug_url = value %]
+           <li>
+             [% PROCESS bug_url_link bug_url = bug_url %]
+             <label><input type="checkbox" value="[% bug_url.name FILTER html %]"
+                           name="remove_[% field.name FILTER html %]">
+               Remove</label>
+           </li>
+         [% END %]
+         </ul>
+       [% END %]
+       [% IF Param('use_see_also') %]
+         <span id="container_showhide_[% field.name FILTER html %]"
+               class="bz_default_hidden">
+           <a href="#" id="showhide_[% field.name FILTER html %]" class="action-link">add</a>
+         </span>
+         <div id="container_[% field.name FILTER html %]">
+           <input type="text" id="[% field.name FILTER html %]" size="40"
+                  class="text_input" name="[% field.name FILTER html %]"
+                  [% IF !bug.id %]value="[% value FILTER html %]"[% END %]>
+         </div>
+         [% IF bug.id %]
+           <script type="text/javascript">
+             setupEditLink('[% field.name FILTER js %]');
+           </script>
+         [% END %]
+       [% END %]
+     [% CASE constants.FIELD_TYPE_KEYWORDS %]
+       <div id="[% field.name FILTER html %]_container">
+         <input type="text" id="[% field.name FILTER html %]" size="40"
+                class="text_input" name="[% field.name FILTER html %]"
+                value="[% value FILTER html %]">
+         <div id="[% field.name FILTER html %]_autocomplete"></div>
+       </div>
+       <script type="text/javascript">
+         if (typeof YAHOO.bugzilla.field_array === "undefined")
+           YAHOO.bugzilla.field_array = [];
+         YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [
+           [%- FOREACH val = possible_values %]
+             [%-# %]"[% val FILTER js %]"
+             [%- "," IF NOT loop.last %][% END %]];
+         YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
+                                               '[% field.name FILTER js %]_autocomplete');
+       </script>
+  [% END %]
+[% ELSE %]
+  [% SWITCH field.type %]
+    [% CASE constants.FIELD_TYPE_TEXTAREA %]
+      <div class="uneditable_textarea">[% value FILTER html %]</div>
+    [% CASE constants.FIELD_TYPE_BUG_ID %]
+      [% IF value %]  
+          [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
+      [% END %]
+    [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT 
+              constants.FIELD_TYPE_MULTI_SELECT ] %]
+      <span class="select">
+      [% FOREACH val = value %]
+        [% display_value(field.name, val) FILTER html %]
+        [% ', ' UNLESS loop.last() %]
+      [% END %]
+      </span>
+    [% CASE constants.FIELD_TYPE_BUG_URLS %]
+      [% '<ul class="bug_urls">' IF value.size %]
+        [% FOREACH bug_url = value %]
+          <li>
+            [% PROCESS bug_url_link bug_url = bug_url %]
+          </li>
+        [% END %]
+      [% '</ul>' IF value.size %]
+    [% CASE %]
+      [% value.join(', ') FILTER html %]
+  [% END %]
+[% END %]
+
+[% IF bug && field.name == 'component' %]
+  <a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__"
+    target="_blank" class="action-link">Show other [% terms.bugs %]</a>
+[% END %]
+
+[% Hook.process('end_field_column') %]
+[% '</td>' IF NOT no_tds %]
+
+[%# for reverse relationships, we show this pseudo-field after the main field %]
+[% IF bug.id && field.is_relationship %]
+    [% extra_field_item = {} %]
+    [% extra_field_item.header = field.reverse_desc _ ":" FILTER html %]
+    [% extra_field_item.data = BLOCK %]
+        [% FOREACH depbug = bug.related_bugs(field) %]
+            [% depbug.id FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
+        [% END %]
+    [% END %]
+[% ELSE %]
+    [% extra_field_item = '' %]
+[% END %]
+
+[% BLOCK bug_url_link %]
+  [% IF bug_url.isa('Bugzilla::BugUrl::Bugzilla::Local') %]
+    [% bug_url.target_bug_id FILTER bug_link(bug_url.target_bug_id, use_alias => 1) FILTER none %]
+  [% ELSE %]
+    <a href="[% bug_url.name FILTER html %]">
+      [% bug_url.name FILTER html %]</a>
+  [% END %]
+[% END %]
diff --git a/template/en/custom/bug/knob.html.tmpl b/template/en/custom/bug/knob.html.tmpl
new file mode 100644
index 0000000..08e43df
--- /dev/null
+++ b/template/en/custom/bug/knob.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/knob_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/knob_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/knob_DEFAULT.html.tmpl b/template/en/custom/bug/knob_DEFAULT.html.tmpl
new file mode 120000
index 0000000..dd89fea
--- /dev/null
+++ b/template/en/custom/bug/knob_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/knob.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/knob_XFCE.html.tmpl b/template/en/custom/bug/knob_XFCE.html.tmpl
new file mode 100644
index 0000000..7976fb3
--- /dev/null
+++ b/template/en/custom/bug/knob_XFCE.html.tmpl
@@ -0,0 +1,103 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+<div class="flex-split">
+  [% IF bug.choices.bug_status.size > 1 && bug.check_can_change_field('resolution', bug.resolution, 1) %]
+    <select id="status_resolution" name="status_resolution">
+      [% FOREACH status = bug.choices.bug_status %]
+        [% IF status.name == 'RESOLVED' %]
+          [% FOREACH resolution = bug.choices.resolution %]
+            <option value="RESOLVED-[% resolution.name FILTER html %]"
+              [% IF bug.resolution.contains(resolution.name).size %]
+                selected="selected"
+              [% ELSIF bug AND !resolution.is_visible_on_bug(bug) %]
+                class="bz_hidden_option" disabled="disabled"
+              [% END %]>
+              [% status.name FILTER html %]: [% resolution.name FILTER html %] [% IF resolution.name == 'DUPLICATE' %]...[% END %]</option>
+          [% END %]
+        [% ELSE %]
+          <option value="[% status.name FILTER html %]"
+            [% IF bug.bug_status.contains(status.name).size %]
+              selected="selected"
+            [% ELSIF bug AND !status.is_visible_on_bug(bug) %]
+              class="bz_hidden_option" disabled="disabled"
+            [% END %]>
+            [% status.name FILTER html %]
+          </option>
+        [% END %]
+      [% END %]
+    </select>
+  [% ELSE %]
+    <span class="select">
+      [% bug.bug_status FILTER html %][% IF bug.resolution %]: [% bug.resolution FILTER html %][% END %]
+    </span>
+  [% END %]
+
+  <input id="dup_id" name="dup_id" size="6" value="[% bug.dup_id FILTER html %]" placeholder="[% terms.bug %] #" style="display: none;"
+    [% IF !bug.check_can_change_field('dup_id', 0, 1) %]
+      disabled="disabled"
+    [% END %]
+  />
+
+  <input type="hidden" name="bug_status" id="bug_status" value="[% bug.bug_status %]" />
+  <input type="hidden" name="resolution" id="resolution" value="[% bug.bug_resolution %]" />
+</div>
+
+<script type="text/javascript">
+  var strs = document.getElementById('status_resolution');
+  var strs_opt = strs.options[strs.selectedIndex];
+  strs.className = strs_opt.value;
+
+  [% IF bug.dup_id && bug.resolution == 'DUPLICATE' %]
+    document.getElementById('dup_id').style.display = 'inline';
+  [% END %]
+
+  strs.addEventListener('change', function() {
+    var strs_opt = strs.options[strs.selectedIndex];
+    var strs_value = strs_opt.value.split('-');
+    if( strs_value.length == 1 ) {
+      if( strs_value[0] == 'VERIFIED' || strs_value[0] == 'CLOSED' ) {
+        strs_value[1] = 'FIXED';
+      } else {
+        strs_value[1] = '';
+      }
+    }
+
+    document.getElementById('bug_status').value = strs_value[0];
+    document.getElementById('resolution').value = strs_value[1];
+    strs.className = strs_opt.value;
+
+    if( strs_value[1] == 'DUPLICATE' ) {
+      document.getElementById('dup_id').style.display = 'block';
+    } else {
+      document.getElementById('dup_id').style.display = 'none';
+    }
+  });
+</script>
+<noscript>
+  [% PROCESS bug/field.html.tmpl
+      no_tds = 1
+      field  = bug_fields.bug_status
+      value  = bug.bug_status
+      override_legal_values = bug.choices.bug_status
+      editable = bug.choices.bug_status.size > 1
+  %]
+  [% PROCESS bug/field.html.tmpl
+      no_tds = 1
+      field  = bug_fields.resolution
+      value  = bug.resolution
+      override_legal_values = bug.choices.resolution
+      editable = bug.check_can_change_field('resolution', bug.resolution, 1)
+  %]
+
+  <input id="dup_id" name="dup_id" size="6" value="[% bug.dup_id FILTER html %]" placeholder="[% terms.bug %] #"
+    [% IF !bug.check_can_change_field('dup_id', 0, 1) %]
+      disabled="disabled"
+    [% END %]
+  />
+</noscript>
diff --git a/template/en/custom/bug/navigate.html.tmpl b/template/en/custom/bug/navigate.html.tmpl
new file mode 100644
index 0000000..f1f5def
--- /dev/null
+++ b/template/en/custom/bug/navigate.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/navigate_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/navigate_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/navigate_DEFAULT.html.tmpl b/template/en/custom/bug/navigate_DEFAULT.html.tmpl
new file mode 120000
index 0000000..244ac19
--- /dev/null
+++ b/template/en/custom/bug/navigate_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/navigate.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/navigate_XFCE.html.tmpl b/template/en/custom/bug/navigate_XFCE.html.tmpl
new file mode 100644
index 0000000..dbf2145
--- /dev/null
+++ b/template/en/custom/bug/navigate_XFCE.html.tmpl
@@ -0,0 +1,66 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[% RETURN IF !bug %]
+
+[% SET my_search = user.recent_search_for(bug) %]
+
+<div class="navigation">
+  [% IF my_search %]
+    <div class="nav_left">
+      [% SET last_bug_list = my_search.bug_list %]
+      [% SET this_bug_idx = lsearch(last_bug_list, bug.id) %]
+      <b>[% terms.Bug %] List:</b>
+
+      ([% this_bug_idx + 1 %] of [% last_bug_list.size %])
+
+      [% IF this_bug_idx > 0 %]
+        <a href="show_bug.cgi?id=
+          [%- last_bug_list.first FILTER uri %]&list_id=
+          [%- my_search.id FILTER uri %]">First</a>
+      [% ELSE %]
+        <span class="navigation_link">First</span>
+      [% END %]
+
+      [% IF this_bug_idx + 1 < last_bug_list.size %]
+        <a href="show_bug.cgi?id=
+          [%- last_bug_list.last FILTER uri %]&list_id=
+          [%- my_search.id FILTER uri %]">Last</a>
+      [% ELSE %]
+        <span class="navigation_link">Last</span>
+      [% END %]
+
+      [% IF this_bug_idx > 0 %]
+        [% prev_bug = this_bug_idx - 1 %]
+        <a href="show_bug.cgi?id=
+          [%- last_bug_list.$prev_bug FILTER uri %]&list_id=
+          [%- my_search.id FILTER uri %]">Prev</a>
+      [% ELSE %]
+        <span class="navigation_link">Prev</span>
+      [% END %]
+
+      [% IF this_bug_idx + 1 < last_bug_list.size %]
+        [% next_bug = this_bug_idx + 1 %]
+        <a href="show_bug.cgi?id=
+          [%- last_bug_list.$next_bug FILTER uri %]&list_id=
+          [%- my_search.id FILTER uri %]">Next</a>
+      [% ELSE %]
+        <span class="navigation_link">Next</span>
+      [% END %]
+
+        <a href="buglist.cgi?regetlastlist=
+        [%- my_search.id FILTER uri %]">Show last search results</a>
+    </div>
+  [% END %]
+
+  <div class="nav_right">
+    <b>All [% terms.Bugs %]:</b>
+    <a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__">This component</a>
+    <a href="buglist.cgi?product=[% bug.product FILTER uri %]&bug_status=__open__">This product</a>
+  </div>
+</div>
diff --git a/template/en/custom/bug/show.html.tmpl b/template/en/custom/bug/show.html.tmpl
new file mode 100644
index 0000000..3f668ee
--- /dev/null
+++ b/template/en/custom/bug/show.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'bug/show_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'bug/show_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/show_DEFAULT.html.tmpl b/template/en/custom/bug/show_DEFAULT.html.tmpl
new file mode 120000
index 0000000..aea9f73
--- /dev/null
+++ b/template/en/custom/bug/show_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/show.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/show_XFCE.html.tmpl b/template/en/custom/bug/show_XFCE.html.tmpl
new file mode 100644
index 0000000..be30805
--- /dev/null
+++ b/template/en/custom/bug/show_XFCE.html.tmpl
@@ -0,0 +1,30 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# This script/template only handles one bug #%]
+[% bug = bugs.0 %]
+
+[% IF !header_done %]
+  [% PROCESS "bug/show-header.html.tmpl" %]
+  [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% IF nextbug %]
+  <hr>
+  <p>
+    The next [% terms.bug %] in your list is [% terms.bug %]
+    <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>:
+  </p>
+  <hr>
+[% END %]
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+[% PROCESS bug/edit.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/global/banner.html.tmpl b/template/en/custom/global/banner.html.tmpl
new file mode 100644
index 0000000..f78c106
--- /dev/null
+++ b/template/en/custom/global/banner.html.tmpl
@@ -0,0 +1,29 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# Migration note: this file corresponds to the old Param 'bannerhtml' %]
+
+<div id="xfce-header">
+  <div>
+    <h1 id="xfce-header-title">Xfce Bug Tracker</h1>
+    <h5 id="xfce-header-subtitle">Sub domains</h5>
+     
+    <ul>
+      <li><a href="http://www.xfce.org" title="Go to the homepage">Home</a></li>
+      <li><a href="http://docs.xfce.org" title="Official documentation">Docs</a></li>
+      <li><a href="http://archive.xfce.org" title="Download location of tarballs">Archive</a></li>
+      <li><a href="http://wiki.xfce.org" title="Community documentation">Wiki</a></li>
+      <li><a href="http://forum.xfce.org" title="Community forums">Forum</a></li>
+      <li><a href="https://bugzilla.xfce.org" title="Report and track bugs" class="active">Bugs</a></li>
+      <li><a href="http://blog.xfce.org" title="Visit the blog">Blog</a></li>
+      <li><a href="http://www.xfce.org/getinvolved/translation" title="Help translating the Xfce project">Translate</a></li>
+      <li><a href="http://git.xfce.org" title="Project repositories">GIT</a></li>
+    </ul>
+  </div>
+  <div  id="xfce-header-clear"></div>
+</div>
diff --git a/template/en/custom/global/choose-product.html.tmpl b/template/en/custom/global/choose-product.html.tmpl
new file mode 100644
index 0000000..2a24f8a
--- /dev/null
+++ b/template/en/custom/global/choose-product.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'global/choose-product_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'global/choose-product_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/choose-product_DEFAULT.html.tmpl b/template/en/custom/global/choose-product_DEFAULT.html.tmpl
new file mode 120000
index 0000000..ed5d9ea
--- /dev/null
+++ b/template/en/custom/global/choose-product_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/choose-product.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/choose-product_XFCE.html.tmpl b/template/en/custom/global/choose-product_XFCE.html.tmpl
new file mode 100644
index 0000000..007a672
--- /dev/null
+++ b/template/en/custom/global/choose-product_XFCE.html.tmpl
@@ -0,0 +1,73 @@
+[%# INTERFACE:
+  # classifications: array of hashes, with an 'object' key representing a
+  #                  classification object and 'products' the list of
+  #                  product objects the user can enter bugs into.
+  # target:   the script that displays this template.
+  #%]
+
+[% IF target == "enter_bug.cgi" %]
+  [% title = "Enter $terms.Bug" %]
+  [% subheader = "Select Product" %]
+  [% h2 = BLOCK %]
+    [% IF Param('useclassification') %]Next[% ELSE %]First[% END %],
+    you must pick a product (and component) on which to enter [% terms.abug %]:
+  [% END %]
+[% ELSIF target == "describecomponents.cgi" %]
+  [% title = "Browse" %]
+  [% h2 = "Select a product category to browse:" %]
+[% END %]
+
+[% DEFAULT title = "Choose a Product" %]
+[% PROCESS global/header.html.tmpl %]
+
+[% USE Bugzilla %]
+[% previous_params = Bugzilla.cgi.canonicalise_query('classification', 'product') %]
+
+<h2>[% h2 FILTER html %]</h2>
+
+[% IF target == 'describecomponents.cgi' %]
+  <ul class="product_categories">
+  [% FOREACH c = classifications %]
+    [% IF c.object %]
+      <li><a class="action-link" href="#cat-[% c.object.id %]">[% c.object.name FILTER html %]</a></li>
+    [% END %]
+  [% END %]
+  </ul>
+  <hr />
+[% END %]
+
+[% IF target == "describecomponents.cgi" %][% url_base = "buglist.cgi" %][% ELSE %][% url_base = target %][% END %]
+
+[% FOREACH c = classifications %]
+  [% IF c.object %]
+    <h3 class="product_cat" id="cat-[% c.object.id %]">[% c.object.name FILTER html %]</h3>
+    <p>[% c.object.description FILTER html %]</p>
+  [% END %]
+
+  <ul class="products">
+    [% FOREACH p = c.products %]
+      <li>
+        <strong>
+          [% p.name FILTER html %]
+        </strong>
+        <div>
+          [% p.description FILTER html %]<br />
+          <span class="product_components">
+            [% IF target == 'describecomponents.cgi' && p.components.size > 1 %]
+              <a class="component-all" href="[% url_base %]?product=[% p.name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">All components</a>  
+            [% END %]
+            [% IF p.components.size == 1 %]
+              <a href="[% url_base %]?product=[% p.name FILTER uri %]&component=[% p.components.item(0).name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">[% p.name %]</a>
+            [% ELSE %]
+              [% FOREACH comp = p.components %]
+                <a class="component-[% comp.name FILTER uri %]" href="[% url_base %]?product=[% p.name FILTER uri %]&component=[% comp.name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">[% comp.name %]</a>   
+              [% END %]
+            [% END %]
+          </span>
+        </div>
+      </li>
+    [% END %]
+  </ul>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/global/common-links.html.tmpl b/template/en/custom/global/common-links.html.tmpl
new file mode 100644
index 0000000..bc933b5
--- /dev/null
+++ b/template/en/custom/global/common-links.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'global/common-links_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'global/common-links_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/common-links_DEFAULT.html.tmpl b/template/en/custom/global/common-links_DEFAULT.html.tmpl
new file mode 120000
index 0000000..38dff31
--- /dev/null
+++ b/template/en/custom/global/common-links_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/common-links.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/common-links_XFCE.html.tmpl b/template/en/custom/global/common-links_XFCE.html.tmpl
new file mode 100644
index 0000000..4025baa
--- /dev/null
+++ b/template/en/custom/global/common-links_XFCE.html.tmpl
@@ -0,0 +1,110 @@
+[% DEFAULT qs_suffix = "" %]
+[% USE Bugzilla %]
+
+<ul class="links links-primary">
+  <li><a href="./">Home</a></li>
+  <li><a href="enter_bug.cgi">New</a></li>
+  <li><a href="describecomponents.cgi">Browse</a></li>
+  <li><a href="query.cgi">Search</a></li>
+
+  <li class="form">
+    <form action="buglist.cgi" method="get"
+        onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input type="hidden" id="no_redirect[% qs_suffix FILTER html %]" name="no_redirect" value="0">
+    <script type="text/javascript">
+      if (history && history.replaceState) {
+        var no_redirect = document.getElementById("no_redirect[% qs_suffix FILTER js %]");
+        no_redirect.value = 1;
+      }
+    </script>
+    <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch" 
+           title="Quick Search" value="[% quicksearch FILTER html %]">
+    <input class="btn" type="submit" value="Search" 
+           id="find[% qs_suffix FILTER html %]">
+    [%-# Work around FF bug: keep this on one line %]</form>
+  <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li>
+</ul>
+
+[% IF user.login %]
+  <ul class="links-dropdown">
+    <li class="main">
+      [% IF sudoer %]
+        [%+ sudoer.login FILTER html %]
+      [% ELSE %]
+        [%+ user.login FILTER html %]
+      [% END %]
+      <ul>
+        <li><a href="report.cgi">Reports</a></li>
+        <li>
+          [% IF Param('shutdownhtml') || Bugzilla.has_flags %]
+            [% IF user.id %]
+              <a href="request.cgi?requester=[% user.login FILTER uri %]&requestee=
+                [% user.login FILTER uri %]&do_union=1&group=type&action=queue">My Requests</a>
+            [% ELSE %]
+              <a href="request.cgi">Requests</a>
+            [% END %]
+          [% END %]
+        [%-# Work around FF bug: keep this on one line %]</li>
+
+        [% Hook.process('action-links') %]
+
+        <li><a href="userprefs.cgi">Preferences</a></li>
+        [% IF user.can_administer %]
+          <li><a href="admin.cgi">Administration</a></li>
+        [% END %]
+ 
+        [% PROCESS link_to_documentation %]
+  
+        [% IF sudoer %]
+          <li>
+            <a href="relogin.cgi?action=end-sudo">Stop impersonating [%+ user.login FILTER html %]</a>
+          </li>
+        [% END %]
+
+        <li>
+          [% IF user.authorizer.can_logout %]
+            <a href="index.cgi?logout=1">Log out</a>
+          [% END %]
+        [%-# Work around FF bug: keep this on one line %]</li>
+      </ul>
+    </li>
+  </ul>
+[% ELSE %]
+  <ul class="links-right">
+    [% PROCESS link_to_documentation %]
+    
+    [% IF Param('createemailregexp')
+          && user.authorizer.user_can_create_account %]
+      <li id="new_account_container[% qs_suffix FILTER html %]">
+        <a href="createaccount.cgi">New Account</a>
+      </li>
+    [% END %]
+
+    [%# Only display one login form when we're on a LOGIN_REQUIRED page. That
+      # way, we're guaranteed that the user will use the form that has 
+      # hidden_fields in it (the center form) instead of this one. Also, it's
+      # less confusing to have one form (as opposed to  three) when you're 
+      # required to log in.
+      #%]
+    [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %]
+      [% PROCESS "account/auth/login-small.html.tmpl" %]
+    [% END %]
+  </ul>
+[% END %]
+
+[% PROCESS "global/useful-links.html.tmpl" %]
+
+[% Hook.process("link-row") %]
+[% BLOCK link_to_documentation %]
+    [% IF doc_section %]
+      <li>
+        
+        <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a>
+      </li>
+    [% END %]
+[% END %]
+
+[% BLOCK relevant_user %]
+[% END %]
diff --git a/template/en/custom/global/footer.html.tmpl b/template/en/custom/global/footer.html.tmpl
new file mode 100644
index 0000000..d47d254
--- /dev/null
+++ b/template/en/custom/global/footer.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'global/footer_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'global/footer_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/footer_DEFAULT.html.tmpl b/template/en/custom/global/footer_DEFAULT.html.tmpl
new file mode 120000
index 0000000..f2e5690
--- /dev/null
+++ b/template/en/custom/global/footer_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/footer.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/footer_XFCE.html.tmpl b/template/en/custom/global/footer_XFCE.html.tmpl
new file mode 100644
index 0000000..3d05a21
--- /dev/null
+++ b/template/en/custom/global/footer_XFCE.html.tmpl
@@ -0,0 +1,11 @@
+[%# INTERFACE:
+  # This template has no interface. However, you must fulfill the interface to
+  # global/useful-links.html.tmpl.
+  #%]
+
+    [% Hook.process('main-end') %]
+    </div>
+
+    [% Hook.process("end") %]
+  </body>
+</html>
diff --git a/template/en/custom/global/header.html.tmpl b/template/en/custom/global/header.html.tmpl
new file mode 100644
index 0000000..6dd036f
--- /dev/null
+++ b/template/en/custom/global/header.html.tmpl
@@ -0,0 +1,285 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# INTERFACE:
+  # (All the below interface elements are optional.)
+  # title: string. Page title.
+  # header: string. Main page header.
+  # subheader: string. Page subheader.
+  # header_addl_info: string. Additional header information.
+  # bodyclasses: array of extra CSS classes for the <body>
+  # onload: string. JavaScript code to run when the page finishes loading.
+  # javascript: string. Javascript to go in the header.
+  # javascript_urls: list. List of URLs to Javascript.
+  # style: string. CSS style.
+  # style_urls: list. List of URLs to CSS style sheets.
+  # message: string. A message to display to the user. May contain HTML.
+  # atomlink: Atom link URL, May contain HTML
+  # generate_api_token: generate a token which can be used to make authenticated webservice calls
+  #%]
+
+[% IF message %]
+  [% PROCESS global/messages.html.tmpl %]
+[% END %]
+
+[% DEFAULT
+  subheader = ""
+  header_addl_info = ""
+  onload = ""
+  style_urls = []
+  javascript_urls = []
+  yui = []
+  generate_api_token = 0
+  favicon_url = "skins/contrib/Xfce/favicon.ico"
+%]
+
+[% SET yui_css = {
+  autocomplete => 1,
+  calendar     => 1,
+  datatable    => 1,
+  button       => 1,
+} %]
+
+[%# Note: This is simple dependency resolution--you can't have dependencies
+  # that depend on each other. You have to specify all of a module's deps,
+  # if that module is going to be specified in "yui".
+  #%]
+[% SET yui_deps = {
+  autocomplete => ['json', 'connection', 'datasource'],
+  datatable    => ['json', 'connection', 'datasource', 'element'],
+} %]
+
+[%# When using certain YUI modules, we need to process certain
+  # extra JS templates.
+  #%]
+[% SET yui_templates = {
+  datatable => ['global/value-descs.js.tmpl'],
+} %]
+
+[%# These are JS URLs that are *always* on the page and come before
+  # every other JS URL.
+  #%]
+[% SET starting_js_urls = [
+    "js/yui/yahoo-dom-event/yahoo-dom-event.js",
+    "js/yui/cookie/cookie-min.js",
+] %]
+
+
+[%# We should be able to set the default value of the header variable
+  # to the value of the title variable using the DEFAULT directive,
+  # but that doesn't work if a caller sets header to the empty string
+  # to avoid header inheriting the value of title, since DEFAULT
+  # mistakenly treats empty strings as undefined and gives header the
+  # value of title anyway.  To get around that problem we explicitly
+  # set header's default value here only if it is undefined. %]
+[% IF !header.defined %][% header = title %][% END %]
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    [% Hook.process("start") %]
+    <title>[% title %]</title>
+
+    <meta name="viewport" content="width=device-width, maximum-scale=1.0, minimum-scale=1.0, initial-scale=1" />
+
+    [% IF Param('utf8') %]
+      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    [% END %]
+
+    [% SET yui = yui_resolve_deps(yui, yui_deps) %]
+
+    [% SET css_sets = css_files(style_urls, yui, yui_css) %]
+    [% IF constants.CONCATENATE_ASSETS %]
+      [% PROCESS format_css_link asset_url = css_sets.unified_standard_skin %]
+    [% ELSE %]
+      [% FOREACH asset_url = css_sets.standard %]
+        [% PROCESS format_css_link %]
+      [% END %]
+      [% FOREACH asset_url = css_sets.skin %]
+        [% PROCESS format_css_link %]
+      [% END %]
+    [% END %]
+
+    [% IF style %]
+      <style type="text/css">
+        [% style %]
+      </style>
+    [% END %]
+
+    [% IF css_sets.unified_custom %]
+      [% IF constants.CONCATENATE_ASSETS %]
+        [% PROCESS format_css_link asset_url = css_sets.unified_custom %]
+      [% ELSE %]
+        [% FOREACH asset_url = css_sets.custom %]
+          [% PROCESS format_css_link %]
+        [% END %]
+      [% END %]
+    [% END %]
+
+    [%# YUI Scripts %]
+    [% FOREACH yui_name = yui %]
+      [% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %]
+    [% END %]
+    [% starting_js_urls.push('js/global.js') %]
+
+    [% FOREACH asset_url = concatenate_js(starting_js_urls) %]
+      [% PROCESS format_js_link %]
+    [% END %]
+
+    <link rel="stylesheet" media="screen" type="text/css" href="/skins/header.css" />
+    <link rel="stylesheet" media="screen" type="text/css" href="/skins/xfce.css" />
+    [% IF user.settings.skin.value == 'Xfce' %]
+      <script type="text/javascript" src="/skins/contrib/Xfce/scripts.js"></script>
+    [% END %]
+
+    <script type="text/javascript">
+    <!--
+        YAHOO.namespace('bugzilla');
+        YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) {
+               if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; };
+               var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false;
+               return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
+         };
+        if ( "onpagehide" in window || YAHOO.env.ua.gecko) {
+            YAHOO.util.Event._simpleRemove(window, "unload", 
+                                           YAHOO.util.Event._unload);
+        }
+        [%# The language selector needs javascript to set its cookie,
+          # so it is hidden in HTML/CSS by the "bz_default_hidden" class.
+          # If the browser can run javascript, it will then "unhide"
+          # the language selector using the following code.
+          #%]
+        function unhide_language_selector() { 
+            YAHOO.util.Dom.removeClass(
+                'lang_links_container', 'bz_default_hidden'
+            ); 
+        } 
+        YAHOO.util.Event.onDOMReady(unhide_language_selector);
+
+        [%# Make some Bugzilla information available to all scripts. 
+          # We don't import every parameter and constant because we
+          # don't want to add a lot of uncached JS to every page. 
+          #%]
+        var BUGZILLA = {
+            param: {
+                cookiepath: '[% Param('cookiepath') FILTER js %]',
+                maxusermatches: [% Param('maxusermatches') FILTER js %]
+            },
+            constant: {
+                COMMENT_COLS: [% constants.COMMENT_COLS FILTER js %]
+            },
+            string: {
+                [%# Please keep these in alphabetical order. %]
+
+                attach_desc_required:
+                    "You must enter a Description for this attachment.",
+                component_required:
+                    "You must select a Component for this [% terms.bug %].",
+                description_required:
+                    "You must enter a Description for this [% terms.bug %].",
+                short_desc_required:
+                    "You must enter a Summary for this [% terms.bug %].",
+                version_required:
+                    "You must select a Version for this [% terms.bug %]."
+            }
+            [% IF generate_api_token %]
+              , api_token: '[% get_api_token FILTER js FILTER html %]'
+            [% END %]
+        };
+
+        [% FOREACH yui_name = yui %]
+          [% FOREACH yui_template = yui_templates.$yui_name %]
+            [% INCLUDE $yui_template %]
+          [% END %]
+        [% END %]
+        [% IF javascript %]
+          [% javascript %]
+        [% END %]
+    // -->
+    </script>
+
+    [% FOREACH asset_url = concatenate_js(javascript_urls) %]
+      [% PROCESS format_js_link %]
+    [% END %]
+
+    [%# this puts the live bookmark up on firefox for the Atom feed %]
+    [% IF atomlink %]
+       <link rel="alternate" 
+             type="application/atom+xml" title="Atom feed" 
+             href="[% atomlink FILTER html %]">
+    [% END %]
+
+    [%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %]
+    <link rel="search" type="application/opensearchdescription+xml"
+                       title="[% terms.Bugzilla %]" href="./search_plugin.cgi">
+    <link rel="shortcut icon" href="[% favicon_url FILTER html %]">
+    [% Hook.process("additional_header") %]
+  </head>
+
+  <body [% IF onload %] onload="[% onload %]"[% END %]
+        class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %]
+               [% FOREACH class = bodyclasses %]
+                 [%+ class FILTER css_class_quote %]
+               [% END %] yui-skin-sam">
+
+    [% INCLUDE global/banner.html.tmpl %]
+
+  <div id="header">
+
+    <div id="titles">
+      <span id="title">Xfce [% terms.Bugzilla %][% " – $header" IF header %]</span>
+
+      [% IF subheader %]
+        <span id="subtitle" class="subheader">[% subheader %]</span>
+      [% END %]
+
+      [% IF header_addl_info %]
+        <span id="information" class="header_addl_info">[% header_addl_info %]</span>
+      [% END %]
+    </div>
+
+    [% USE Bugzilla %]
+    [% IF Bugzilla.languages.size > 1 %]
+      <div id="lang_links_container" class="bz_default_hidden">
+        <ul class="links">
+          [% FOREACH lang = Bugzilla.languages.sort %]
+            <li>
+              [% IF NOT loop.first %]<span class="separator"> | </span>[% END %]
+              [% IF lang == current_language %]
+                <span class="lang_current">[% lang FILTER html FILTER upper %]</span>
+              [% ELSE %]
+                <a href="#" onclick="set_language('[% lang FILTER none %]');">
+                  [%- lang FILTER html FILTER upper %]</a>
+              [% END %]
+            </li>
+          [% END %]
+        </ul>
+      </div>
+    [% END %]
+
+    <div id="common_links">
+      [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %]
+    </div>
+  </div>
+
+  <div id="bugzilla-body">
+    [% IF Param('announcehtml') %]
+      [% Param('announcehtml') FILTER none %]
+    [% END %]
+
+    [% IF message %]
+      <div id="message">[% message %]</div>
+    [% END %]
+
+[% BLOCK format_css_link %]
+  <link href="[% asset_url FILTER html %]" rel="stylesheet" type="text/css">
+[% END %]
+
+[% BLOCK format_js_link %]
+  <script type="text/javascript" src="[% asset_url FILTER mtime FILTER html %]"></script>
+[% END %]
diff --git a/template/en/custom/global/useful-links.html.tmpl b/template/en/custom/global/useful-links.html.tmpl
new file mode 100644
index 0000000..aa11668
--- /dev/null
+++ b/template/en/custom/global/useful-links.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'global/useful-links_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'global/useful-links_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/useful-links_DEFAULT.html.tmpl b/template/en/custom/global/useful-links_DEFAULT.html.tmpl
new file mode 120000
index 0000000..3b2ca14
--- /dev/null
+++ b/template/en/custom/global/useful-links_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/useful-links.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/useful-links_XFCE.html.tmpl b/template/en/custom/global/useful-links_XFCE.html.tmpl
new file mode 100644
index 0000000..efda535
--- /dev/null
+++ b/template/en/custom/global/useful-links_XFCE.html.tmpl
@@ -0,0 +1,57 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# Saved searches %]
+
+[% IF user.showmybugslink OR user.queries.size OR user.queries_subscribed.size OR user.reports.size %]
+  <ul class="links-dropdown">
+    <li class="main">
+      My Links
+      <ul>
+        [% IF user.showmybugslink %]
+          [% filtered_username = user.login FILTER uri %]
+          <li>
+            <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a>
+          </li>
+        [% END %]
+
+        [% IF user.queries.size %]
+          [% FOREACH q = user.queries %]
+            [% NEXT UNLESS q.link_in_footer %]
+            <li>
+              <a href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER uri %]">[% q.name FILTER html %]</a>
+            </li>
+          [% END %]
+        [% END %]
+
+        [% IF user.queries_subscribed.size %]
+          [% FOREACH q = user.queries_subscribed %]
+            <li>
+              <a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=
+                       [%- q.name FILTER uri %]&sharer_id=[% q.user.id FILTER uri %]"
+                 class="shared" title="Shared by [% q.user.identity FILTER html %]">
+                [%- q.name FILTER html %]</a>
+            </li>
+          [% END %]
+        [% END %]
+        [% IF user.reports.size %]
+          [% FOREACH r = user.reports %]
+            <li>
+              <a href="report.cgi?[% r.query FILTER html %]&saved_report_id=
+                       [%~ r.id FILTER uri %]">[% r.name FILTER html %]</a>
+            </li>
+          [% END %]
+        [% END %]
+
+        [%# Sections of links to more things users can do on this installation. %]
+        [% Hook.process("end") %]
+
+      </ul>
+    </li>
+  </ul>
+[% END %]
diff --git a/template/en/custom/index.html.tmpl b/template/en/custom/index.html.tmpl
new file mode 100644
index 0000000..24cd332
--- /dev/null
+++ b/template/en/custom/index.html.tmpl
@@ -0,0 +1,163 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# INTERFACE:
+  # release: a hash containing data about new releases, if any.
+  #%]
+
+[% PROCESS global/header.html.tmpl
+   title = "Xfce Bugzilla"
+   header = "Main Page" 
+   header_addl_info = "version $constants.BUGZILLA_VERSION"
+%]
+
+[% IF release %]
+  <div id="new_release">
+    [% IF release.data %]
+      [% IF release.deprecated %]
+        <p>Bugzilla [%+ release.deprecated FILTER html %] is no longer
+        supported. You are highly encouraged to upgrade in order to keep your
+        system secure.</p>
+      [% END %]
+
+      <p>A new Bugzilla version ([% release.data.latest_ver FILTER html %])
+      is available at
+      <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br>
+      Release date: [% release.data.date FILTER html %]</p>
+
+      <p class="notice">This message is only shown to logged in users with admin privs.
+      You can configure this notification from the
+      <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p>
+    [% ELSIF release.error == "cannot_download" %]
+      <p>The remote file <a href="[% constants.REMOTE_FILE FILTER html %]">
+      [%~ constants.REMOTE_FILE FILTER html %]</a> cannot be downloaded
+      (reason: [% release.reason FILTER html %]).<br>
+      Either the remote server is temporarily unavailable, or your web server cannot access
+      the web. If you are behind a proxy, set the
+      <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a> parameter correctly.</p>
+    [% ELSIF release.error == "no_write" %]
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be created
+      (reason: [% release.reason FILTER html %]).<br>
+      Please make sure the web server can write into this directory.
+    [% ELSIF release.error == "no_update" %]
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be updated.
+      Please make sure the web server can edit this file.</p>
+    [% ELSIF release.error == "no_access" %]
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be read.
+      Please make sure this file has the correct rights set on it.</p>
+    [% ELSIF release.error == "corrupted" %]
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' has an invalid XML format.
+      Please delete it and try accessing this page again.</p>
+    [% ELSIF release.error == "unknown_parameter" %]
+      <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification
+      parameter. Please check this parameter in the
+      <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p>
+    [% END %]
+  </div>
+[% END %]
+
+<div id="page-index">
+  <h1 id="welcome">Welcome to the Xfce bug tracker!</h1>
+  <div class="intro">[% Hook.process('intro') %]</div>
+
+  <div class="bz_common_actions">
+    <ul>
+      <li>
+        <a class="action-link" id="enter_bug" href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a>
+      </li>
+      <li>
+        <a class="action-link" id="query" href="query.cgi"><span>Search</span></a>
+      </li>
+      <li>
+        <a class="action-link" id="account"
+          [% IF user.id %]
+            href="userprefs.cgi"><span>User Preferences</span></a>
+          [% ELSIF Param('createemailregexp') && user.authorizer.user_can_create_account %]
+            href="createaccount.cgi"><span>Open a New Account</span></a>
+          [% ELSE %]
+            href="?GoAheadAndLogIn=1"><span>Log In</span></a>
+          [% END %]
+      </li>
+      <li>
+        <a class="action-link" id="help" href="[% docs_urlbase FILTER html %]using/index.html"><span>Documentation</span></a>
+      </li>
+    </ul>
+  </div>
+
+  <div>
+    <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi">
+      <input id="quicksearch_main" name="quicksearch" title="Quick Search"
+             placeholder="Enter [% terms.abug %] # or some search terms"
+             autofocus required>
+      <input id="find" type="submit" value="Quick Search">
+      <a href="page.cgi?id=quicksearch.html" title="Quick Search help">[?]</a>
+    </form>
+
+    <ul class="additional_links">
+      [% Hook.process('additional_links') %]
+    </ul>
+  </div>
+
+  <div id="common_queries">
+    <h4>Common Queries:</h4>
+    <ul>
+      [% IF user.id %]
+        <li>
+          [% title = BLOCK %]Open [% terms.bugs %] assigned to me[% END %]
+          <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---">
+            [% title FILTER html %]</a> ([% assignee_count FILTER html %])
+          <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]"
+             class="rss"> </a>
+        </li>
+        <li>
+          [% title = BLOCK %]Open [% terms.bugs %] reported by me[% END %]
+          <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---">
+            [% title FILTER html %]</a> ([% reporter_count FILTER html %])
+          <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]"
+             class="rss"> </a>
+        </li>
+        [% IF Bugzilla.has_flags %]
+          <li>
+            [% title = BLOCK %]Requests addressed to me[% END %]
+            <a href="request.cgi?action=queue&requestee=[% user.login FILTER uri %]&group=type&do_union=0">
+              [% title FILTER html %]</a> ([% requestee_count FILTER html %])
+            <a href="buglist.cgi?f1=requestees.login_name&o1=equals&v1=%25user%25&ctype=atom&title=[% title FILTER uri %]"
+               class="rss"> </a>
+          </li>
+        [% END %]
+      [% END %]
+
+      <li>
+        [% terms.Bugs %] reported in the
+        <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h">last 24 hours</a>
+        [% title = BLOCK %][% terms.Bugs %] reported in the last 24 hours[% END %]
+        <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]"
+           class="rss"> </a>
+        | <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d">last 7 days</a>
+        [% title = BLOCK %][% terms.Bugs %] reported in the last 7 days[% END %]
+        <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]"
+           class="rss"> </a>
+      </li>
+      <li>
+        [% terms.Bugs %] changed in the
+        <a href="buglist.cgi?chfieldfrom=24h">last 24 hours</a>
+        [% title = BLOCK %][% terms.Bugs %] changed in the last 24 hours[% END %]
+        <a href="buglist.cgi?chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]"
+           class="rss"> </a>
+        | <a href="buglist.cgi?chfieldfrom=7d">last 7 days</a>
+        [% title = BLOCK %][% terms.Bugs %] changed in the last 7 days[% END %]
+        <a href="buglist.cgi?chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]"
+           class="rss"> </a>
+      </li>
+    </ul>
+  </div>
+
+  <div class="outro">[% Hook.process('outro') %]</div>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/list/list.html.tmpl b/template/en/custom/list/list.html.tmpl
new file mode 100644
index 0000000..c617c62
--- /dev/null
+++ b/template/en/custom/list/list.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+  [% PROCESS 'list/list_XFCE.html.tmpl' %]
+[% ELSE %]
+  [% PROCESS 'list/list_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/list/list_DEFAULT.html.tmpl b/template/en/custom/list/list_DEFAULT.html.tmpl
new file mode 100644
index 0000000..c2631a4
--- /dev/null
+++ b/template/en/custom/list/list_DEFAULT.html.tmpl
@@ -0,0 +1,349 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# INTERFACE:
+  # searchtype: string. Type of search - either "series", "saved" or undef.
+  # ...
+  # defaultsavename: string. The default name for saving the query.
+  #%]
+
+[%############################################################################%]
+[%# Template Initialization                                                  #%]
+[%############################################################################%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% unfiltered_title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename %]
+  [% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %]
+[% END %]
+[% title = unfiltered_title FILTER html %]
+
+[% qorder = order FILTER uri IF order %]
+
+[% javascript =  BLOCK %]
+  [% IF quicksearch %]
+    [% new_param = BLOCK ~%]
+      quicksearch=[% quicksearch FILTER uri %]
+      [%~ IF cgi.param('list_id') ~%]
+        &list_id=[% cgi.param('list_id') FILTER uri %]
+      [%~ END %]
+    [% END %]
+  [% ELSIF cgi.param('token') != '' %]
+    [% new_param = cgi.canonicalise_query('token', 'cmdtype', 'remtype') %]
+  [% ELSE %]
+    [% new_param = cgi.canonicalise_query %]
+  [% END %]
+
+  [% IF new_param.length + 12 < constants.CGI_URI_LIMIT %]
+    if (history && history.replaceState) {
+      history.replaceState(null, "[% unfiltered_title FILTER js %]",
+                           "buglist.cgi?[% new_param FILTER js %]");
+      document.title = "[% unfiltered_title FILTER js %]";
+    }
+  [% END %]
+  [% javascript FILTER none %]
+[% END %]
+
+[%############################################################################%]
+[%# Page Header                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+  title = title
+  generate_api_token = dotweak
+  atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" 
+  yui = [ 'autocomplete', 'calendar' ]
+  javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
+  style_urls = [ "skins/standard/buglist.css" ]
+  doc_section = "using/finding.html"
+%]
+
+<div class="bz_query_head">
+  <span class="bz_query_timestamp">
+    [% currenttime FILTER time('%a %b %e %Y %T %Z') FILTER html %]<br>
+  </span>
+
+  [% IF debug %]
+    <div class="bz_query_debug">
+      <p>Total execution time: [% query_time FILTER html %] seconds</p>
+      [% FOREACH query = queries %]
+        <pre>[% query.sql FILTER html %]</pre>
+        <p>Execution time: [% query.time FILTER html %] seconds</p>
+        [% IF query.explain %]
+          <pre>[% query.explain FILTER html %]</pre>
+        [% END %]
+      [% END %]
+    </div>
+  [% END %]
+
+  [% IF user.settings.display_quips.value == 'on' %]
+    [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %]
+    <span class="bz_quip">
+      <a href="quips.cgi"><em>[% quip FILTER html %]</em></a>
+    </span>
+  [% END %]
+</div>
+
+[% IF toolong %]
+  <h2 class="bz_smallminded">
+    This list is too long for Bugzilla's little mind; the
+    Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %].
+  </h2>
+[% END %]
+
+[% SET shown_types = [
+  'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', 
+  'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', 
+  'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
+  'nowordssubstr', 'notmatches', 'isempty', 'isnotempty'
+] %]
+
+<a id="search_description_controller" class="bz_default_hidden"
+   href="javascript:TUI_toggle_class('search_description')">Hide Search Description</a>
+[%# Show the link if the browser supports JS %]
+<script type="text/javascript">
+  TUI_alternates['search_description'] = 'Show Search Description';
+  YAHOO.util.Dom.removeClass('search_description_controller', 
+                             'bz_default_hidden');
+</script>
+
+<ul class="search_description">
+[% FOREACH desc_item = search_description %]
+  <li>
+    <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
+    [% IF shown_types.contains(desc_item.type) || debug %]
+      ([% search_descs.${desc_item.type} FILTER html %])
+    [% END %]
+    [% FOREACH val IN desc_item.value.split(',') %]
+      [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
+    [% END %]
+    [% IF debug %]
+      (<code>[% desc_item.term FILTER html %]</code>)
+   [% END %]
+  </li>
+[% END %]
+</ul>
+
+<hr />
+
+[%############################################################################%]
+[%# Preceding Status Line                                                    #%]
+[%############################################################################%]
+
+[% IF bugs.size > 9 %]
+  [% PROCESS num_results %]
+[% END %]
+
+[%############################################################################%]
+[%# Start of Change Form                                                     #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+  <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line                                                   #%]
+[%############################################################################%]
+
+[% PROCESS num_results %]
+
+[% IF bugs.size == 0 %]
+  <ul class="zero_result_links">
+    <li>[% PROCESS enter_bug_link %]</li>
+    [% IF one_product.defined %]
+      <li><a href="enter_bug.cgi">File a new [% terms.bug %] in a
+        different product</a></li>
+    [% END %]
+    <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li>
+    <li><a href="query.cgi">Start a new search</a></li>
+  </ul>
+[% END %]
+
+[%############################################################################%]
+[%# Rest of Change Form                                                      #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+  [% PROCESS "list/edit-multiple.html.tmpl" %]
+  </form>
+  <hr>
+[% END %]
+
+[%############################################################################%]
+[%# Navigation Bar                                                           #%]
+[%############################################################################%]
+
+  <div class="buglist_menu">
+    [% IF bugs.size > 0 %]
+      <div class="bz_query_buttons">
+        <form method="post" action="show_bug.cgi">
+          [% buglist_joined = buglist.join(",") %]
+          <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+          <input type="hidden" name="format" value="multiple">
+          <input type="submit" id="long_format" value="Long Format">
+        </form>
+
+        [% IF user.is_timetracker %]
+          <form method="post" action="summarize_time.cgi">
+            <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+            <input type="submit" id="timesummary" value="Time Summary">
+          </form>
+          [% IF time_summary_limited %]
+            <span class="bz_info">
+              Time Summary will only include the [% terms.bugs %] shown above.
+              In order to see a time summary for all [% terms.bugs %] found
+              by the search, you can
+              <a href="buglist.cgi?[% urlquerypart FILTER html %]
+                       [%- "&order=$qorder" FILTER html IF order %]&limit=0">
+                show all search results</a>.
+            </span>
+          [% END %]
+        [% END %]
+
+        <form method="post" action="show_bug.cgi">
+          <input type="hidden" name="ctype" value="xml">
+          [% FOREACH id = buglist %]
+            <input type="hidden" name="id" value="[% id FILTER html %]">
+          [% END %]
+          <input type="hidden" name="excludefield" value="attachmentdata">
+          <button type="submit" id="xml">
+            <img src="images/xml.png" width="24" height="24" alt="XML" title="XML Format">
+          </button>
+        </form>
+      </div>
+      <div class="bz_query_links">
+        <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=csv&human=1"
+        ><img title="CSV Format" alt="CSV" src="images/csv.png" height="24" width="24"></a>
+        <a href="buglist.cgi?[% urlquerypart FILTER html %]&title=
+           [%- title FILTER uri %]&ctype=atom"
+        ><img title="Feed Format" alt="Feed" src="images/rss.png" height="24" width="24"></a>
+        <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=ics"
+        ><img title="iCal Format" alt="iCal" src="images/ical.png" height="24" width="24"></a>
+        <button type="button" id="change_columns"
+                onclick="document.location='colchange.cgi?[% urlquerypart FILTER html %]&query_based_on=
+                         [%~ defaultsavename OR searchname FILTER uri FILTER js %]'">
+            Change Columns</button>
+
+
+        [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+          <button type="button" id="mass_change"
+                  onclick="document.location='buglist.cgi?[% urlquerypart FILTER html %]
+                           [%- "&order=$qorder" FILTER html IF order %]&tweak=1'">
+            Change Several [% terms.Bugs %] at Once</button>
+        [% END %]
+
+        [% IF bugowners && user.id %]
+          <button type="button" id="email_assignees"
+                  onclick="document.location='mailto:[% bugowners FILTER html %]'">
+            Send Mail to [% terms.Bug %] Assignees</button>
+        [% END %]
+
+        [%# Links to more things users can do with this bug list. %]
+        [% Hook.process("links") %]
+      </div>
+      <br>
+    [% END %]
+    <div class="bz_query_edit">
+      <button type="button" id="edit_search"
+              onclick="document.location='[% PROCESS edit_search_url FILTER js %]'">
+          Edit Search</button>
+    </div>
+
+    [% IF searchtype == "saved" %]
+      <div class="bz_query_forget">
+        <button type="button" id="forget_search"
+                onclick="document.location='buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=
+                         [%- searchname FILTER uri FILTER js %]&token=
+                         [%- issue_hash_token([search_id, searchname]) FILTER uri %]'">
+          Forget Search '[% searchname FILTER html %]'</button>
+      </div>
+    [% ELSE %]
+      <div class="bz_query_remember">
+        <form method="get" action="buglist.cgi">
+          <input type="submit" id="remember" value="Remember search"> as
+          <input type="hidden" name="newquery"
+                 value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
+          <input type="hidden" name="cmdtype" value="doit">
+          <input type="hidden" name="remtype" value="asnamed">
+          <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
+          <input type="text" id="save_newqueryname" name="newqueryname" size="20"
+                 title="New query name" value="[% defaultsavename FILTER html %]">
+        </form>
+      </div>
+    [% END %]
+  </div>
+
+[% IF one_product.defined && bugs.size %]
+  <p class="bz_query_single_product">
+    [% PROCESS enter_bug_link %]
+  </p>
+[% END %]
+
+[%############################################################################%]
+[%# Page Footer                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%##########%]
+[%# Blocks #%]
+[%##########%]
+
+[% BLOCK edit_search_url %]
+  [% editqueryname = searchname OR defaultsavename OR '' %]
+  query.cgi?[% urlquerypart FILTER html %]
+    [%- IF editqueryname != '' %]&known_name=
+      [%- editqueryname FILTER uri %]
+    [% END %]
+[% END %]
+
+[% BLOCK enter_bug_link %]
+  <a href="enter_bug.cgi
+           [%- IF one_product.defined %]?product=
+             [%- one_product.name FILTER uri %]
+             [%- IF one_component.defined %]&component=
+               [%- one_component FILTER uri %][% END %][% END %]">File
+    a new [% terms.bug %]
+   [% IF one_product.defined %]
+     in the
+     [% IF one_component.defined %]
+       "[% one_component FILTER html %]" component of the
+     [% END %]
+     "[% one_product.name FILTER html %]" product
+   [% END %]</a>
+[% END %]
+
+[% BLOCK num_results %]
+  <span class="bz_result_count">
+    [% IF bugs.size == 0 %]
+      <span class="zero_results">[% terms.zeroSearchResults %].</span>
+    [% ELSIF default_limited AND bugs.size >= Param('default_search_limit') %]
+      This result was limited to [% Param('default_search_limit') FILTER html %]
+      [%+ terms.bugs %].
+      <a href="buglist.cgi?[% urlquerypart FILTER html %]
+              [%- "&order=$qorder" FILTER html IF order %]&limit=0">See
+        all search results for this query</a>.
+      [% time_summary_limited = 1 %]
+    [% ELSIF bugs.size == 1 %]
+      One [% terms.bug %] found.
+    [% ELSE %]
+      [% bugs.size %] [%+ terms.bugs %] found.
+    [% END %]
+  </span>
+[% END %]
diff --git a/template/en/custom/list/list_XFCE.html.tmpl b/template/en/custom/list/list_XFCE.html.tmpl
new file mode 100644
index 0000000..f3a45f1
--- /dev/null
+++ b/template/en/custom/list/list_XFCE.html.tmpl
@@ -0,0 +1,328 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%# INTERFACE:
+  # searchtype: string. Type of search - either "series", "saved" or undef.
+  # ...
+  # defaultsavename: string. The default name for saving the query.
+  #%]
+
+[%############################################################################%]
+[%# Template Initialization                                                  #%]
+[%############################################################################%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% unfiltered_title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename %]
+  [% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %]
+[% END %]
+[% title = unfiltered_title FILTER html %]
+
+[% qorder = order FILTER uri IF order %]
+
+[% javascript =  BLOCK %]
+  [% IF quicksearch %]
+    [% new_param = BLOCK ~%]
+      quicksearch=[% quicksearch FILTER uri %]
+      [%~ IF cgi.param('list_id') ~%]
+        &list_id=[% cgi.param('list_id') FILTER uri %]
+      [%~ END %]
+    [% END %]
+  [% ELSIF cgi.param('token') != '' %]
+    [% new_param = cgi.canonicalise_query('token', 'cmdtype', 'remtype') %]
+  [% ELSE %]
+    [% new_param = cgi.canonicalise_query %]
+  [% END %]
+
+  [% IF new_param.length + 12 < constants.CGI_URI_LIMIT %]
+    if (history && history.replaceState) {
+      history.replaceState(null, "[% unfiltered_title FILTER js %]",
+                           "buglist.cgi?[% new_param FILTER js %]");
+      document.title = "[% unfiltered_title FILTER js %]";
+    }
+  [% END %]
+  [% javascript FILTER none %]
+[% END %]
+
+[%############################################################################%]
+[%# Page Header                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+  title = title
+  generate_api_token = dotweak
+  atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" 
+  yui = [ 'autocomplete', 'calendar' ]
+  javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
+  style_urls = [ "skins/standard/buglist.css" ]
+  doc_section = "using/finding.html"
+%]
+
+[% SET shown_types = [
+  'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', 
+  'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', 
+  'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
+  'nowordssubstr', 'notmatches', 'isempty', 'isnotempty'
+] %]
+
+<h2>Search results ([% bugs.size %] bugs)</h2>
+[% IF default_limited AND bugs.size >= Param('default_search_limit') %]
+  <p>This result was limited to [% Param('default_search_limit') FILTER html %] [%+ terms.bugs %].
+    <a href="buglist.cgi?[% urlquerypart FILTER html %]
+            [%- "&order=$qorder" FILTER html IF order %]&limit=0">See
+      all search results for this query</a>.
+  </p>
+  [% time_summary_limited = 1 %]
+[% END %]
+
+<ul class="search_description">
+[% FOREACH desc_item = search_description %]
+  <li>
+    <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
+    [% IF shown_types.contains(desc_item.type) || debug %]
+      ([% search_descs.${desc_item.type} FILTER html %])
+    [% END %]
+    [% FOREACH val IN desc_item.value.split(',') %]
+      [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
+    [% END %]
+    [% IF debug %]
+      (<code>[% desc_item.term FILTER html %]</code>)
+   [% END %]
+  </li>
+[% END %]
+</ul>
+
+<hr />
+
+[% IF dotweak %]
+  <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line                                                   #%]
+[%############################################################################%]
+
+[% IF bugs.size == 0 %]
+  <ul class="zero_result_links">
+    <li>[% PROCESS enter_bug_link %]</li>
+    [% IF one_product.defined %]
+      <li><a href="enter_bug.cgi">File a new [% terms.bug %] in a
+        different product</a></li>
+    [% END %]
+    <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li>
+    <li><a href="query.cgi">Start a new search</a></li>
+  </ul>
+[% END %]
+
+[%############################################################################%]
+[%# Rest of Change Form                                                      #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+  [% PROCESS "list/edit-multiple.html.tmpl" %]
+  </form>
+  <hr>
+[% END %]
+
+[%############################################################################%]
+[%# Navigation Bar                                                           #%]
+[%############################################################################%]
+
+<hr />
+
+<form action="buglist.cgi" method="get"
+      onsubmit="if (this.quicksearch.value == '')
+                { alert('Please enter one or more search terms first.');
+                  return false; } return true;">
+  <script type="text/javascript">
+    if (history && history.replaceState) {
+      var no_redirect = document.getElementById("no_redirect_buglist");
+      no_redirect.value = 1;
+    }
+  </script>
+  <b>Search again:</b>
+  <input class="txt" type="text" id="quicksearch_buglist" name="quicksearch" 
+         title="Quick Search" value="[% quicksearch FILTER html %]">
+  <input class="btn" type="submit" value="Search" 
+         id="find_buglist">
+  <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a>
+[%-# Work around FF bug: keep this on one line %]</form>
+
+  <div class="buglist_menu">
+    [% IF bugs.size > 0 %]
+      <div class="bz_query_buttons">
+        <form method="post" action="show_bug.cgi">
+          [% buglist_joined = buglist.join(",") %]
+          <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+          <input type="hidden" name="format" value="multiple">
+          <input type="submit" id="long_format" value="Long Format">
+        </form>
+
+        [% IF user.is_timetracker %]
+          <form method="post" action="summarize_time.cgi">
+            <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+            <input type="submit" id="timesummary" value="Time Summary">
+          </form>
+          [% IF time_summary_limited %]
+            <span class="bz_info">
+              Time Summary will only include the [% terms.bugs %] shown above.
+              In order to see a time summary for all [% terms.bugs %] found
+              by the search, you can
+              <a href="buglist.cgi?[% urlquerypart FILTER html %]
+                       [%- "&order=$qorder" FILTER html IF order %]&limit=0">
+                show all search results</a>.
+            </span>
+          [% END %]
+        [% END %]
+
+        <form method="post" action="show_bug.cgi">
+          <input type="hidden" name="ctype" value="xml">
+          [% FOREACH id = buglist %]
+            <input type="hidden" name="id" value="[% id FILTER html %]">
+          [% END %]
+          <input type="hidden" name="excludefield" value="attachmentdata">
+          <button type="submit" id="xml">XML</button>
+        </form>
+      </div>
+      <div class="bz_query_links">
+        <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=csv&human=1">CSV</a>
+        <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&title=[%- title FILTER uri %]&ctype=atom">RSS</a>
+        <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=ics">iCal</a>
+      </div>
+      <br />
+      <div class="bz_query_links">
+        <button type="button" id="change_columns"
+                onclick="document.location='colchange.cgi?[% urlquerypart FILTER html %]&query_based_on=
+                         [%~ defaultsavename OR searchname FILTER uri FILTER js %]'">
+            Change Columns</button>
+
+
+        [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+          <button type="button" id="mass_change"
+                  onclick="document.location='buglist.cgi?[% urlquerypart FILTER html %]
+                           [%- "&order=$qorder" FILTER html IF order %]&tweak=1'">
+            Change Several [% terms.Bugs %] at Once</button>
+        [% END %]
+
+        [% IF bugowners && user.id %]
+          <button type="button" id="email_assignees"
+                  onclick="document.location='mailto:[% bugowners FILTER html %]'">
+            Send Mail to [% terms.Bug %] Assignees</button>
+        [% END %]
+
+        [%# Links to more things users can do with this bug list. %]
+        [% Hook.process("links") %]
+      </div>
+      <br>
+    [% END %]
+    <div class="bz_query_edit">
+      <button type="button" id="edit_search"
+              onclick="document.location='[% PROCESS edit_search_url FILTER js %]'">
+          Edit Search</button>
+    </div>
+
+    [% IF searchtype == "saved" %]
+      <div class="bz_query_forget">
+        <button type="button" id="forget_search"
+                onclick="document.location='buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=
+                         [%- searchname FILTER uri FILTER js %]&token=
+                         [%- issue_hash_token([search_id, searchname]) FILTER uri %]'">
+          Forget Search '[% searchname FILTER html %]'</button>
+      </div>
+    [% ELSE %]
+      <div class="bz_query_remember">
+        <form method="get" action="buglist.cgi">
+          <input type="submit" id="remember" value="Remember search"> as
+          <input type="hidden" name="newquery"
+                 value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
+          <input type="hidden" name="cmdtype" value="doit">
+          <input type="hidden" name="remtype" value="asnamed">
+          <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
+          <input type="text" id="save_newqueryname" name="newqueryname" size="20"
+                 title="New query name" value="[% defaultsavename FILTER html %]">
+        </form>
+      </div>
+    [% END %]
+  </div>
+
+[% IF one_product.defined && bugs.size %]
+  <p class="bz_query_single_product">
+    [% PROCESS enter_bug_link %]
+  </p>
+[% END %]
+
+[% IF debug %]
+  <div class="bz_query_debug">
+    <p>Total execution time: [% query_time FILTER html %] seconds</p>
+    [% FOREACH query = queries %]
+      <pre>[% query.sql FILTER html %]</pre>
+      <p>Execution time: [% query.time FILTER html %] seconds</p>
+      [% IF query.explain %]
+        <pre>[% query.explain FILTER html %]</pre>
+      [% END %]
+    [% END %]
+  </div>
+[% END %]
+
+[% IF user.settings.display_quips.value == 'on' %]
+  [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %]
+  <span class="bz_quip">
+    <a href="quips.cgi"><em>[% quip FILTER html %]</em></a>
+  </span>
+[% END %]
+
+[% IF toolong %]
+  <h2 class="bz_smallminded">
+    This list is too long for Bugzilla's little mind; the
+    Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %].
+  </h2>
+[% END %]
+
+[%############################################################################%]
+[%# Page Footer                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%##########%]
+[%# Blocks #%]
+[%##########%]
+
+[% BLOCK edit_search_url %]
+  [% editqueryname = searchname OR defaultsavename OR '' %]
+  query.cgi?[% urlquerypart FILTER html %]
+    [%- IF editqueryname != '' %]&known_name=
+      [%- editqueryname FILTER uri %]
+    [% END %]
+[% END %]
+
+[% BLOCK enter_bug_link %]
+  <a href="enter_bug.cgi
+           [%- IF one_product.defined %]?product=
+             [%- one_product.name FILTER uri %]
+             [%- IF one_component.defined %]&component=
+               [%- one_component FILTER uri %][% END %][% END %]">File
+    a new [% terms.bug %]
+   [% IF one_product.defined %]
+     in the
+     [% IF one_component.defined %]
+       "[% one_component FILTER html %]" component of the
+     [% END %]
+     "[% one_product.name FILTER html %]" product
+   [% END %]</a>
+[% END %]
diff --git a/template/en/custom/list/table.html.tmpl b/template/en/custom/list/table.html.tmpl
new file mode 100644
index 0000000..7f3ad21
--- /dev/null
+++ b/template/en/custom/list/table.html.tmpl
@@ -0,0 +1,267 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+  # License, v. 2.0. If a copy of the MPL was not distributed with this
+  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+  #
+  # This Source Code Form is "Incompatible With Secondary Licenses", as
+  # defined by the Mozilla Public License, v. 2.0.
+  #%]
+
+[%############################################################################%]
+[%# Initialization                                                           #%]
+[%############################################################################%]
+
+[%# Don't display the table or do any processing if there are no bugs 
+  # to display %]
+[% RETURN IF !bugs.size %]
+
+[%# Columns whose titles or values should be abbreviated to make the list
+  # more compact.  For columns whose titles should be abbreviated,
+  # the shortened title is included.  For columns whose values should be
+  # abbreviated, a maximum length is provided along with the ellipsis that
+  # should be added to an abbreviated value, if any.
+  # wrap is set if a column's contents should be allowed to be word-wrapped
+  # by the browser.
+  #%]
+
+[% field_descs.short_short_desc     = field_descs.short_desc  %]
+[% field_descs.assigned_to_realname = field_descs.assigned_to %]
+[% field_descs.reporter_realname    = field_descs.reporter    %]
+[% field_descs.qa_contact_realname  = field_descs.qa_contact  %]
+
+[%# Setting maxlength => 0 means no limit. We set it for performance reasons. %]
+[% abbrev = 
+  {
+    "bug_severity"         => { maxlength => 3 , title => "Sev" } , 
+    "priority"             => { maxlength => 7 , title => "Pri" } , 
+    "rep_platform"         => { maxlength => 3 , title => "HW" } , 
+    "bug_status"           => { maxlength => 4 } , 
+    "assigned_to"          => { maxlength => 30 , ellipsis => "..." } , 
+    "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } , 
+    "reporter"             => { maxlength => 30 , ellipsis => "..." } , 
+    "reporter_realname"    => { maxlength => 20 , ellipsis => "..." } , 
+    "qa_contact"           => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } , 
+    "qa_contact_realname"  => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } , 
+    "resolution"        => { maxlength => 4 } , 
+    "short_desc"        => { maxlength => 0, wrap => 1 } ,
+    "short_short_desc"  => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
+    "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } , 
+    "keywords"          => { maxlength => 0, wrap => 1 } ,
+    "tags"              => { maxlength => 0, title => "Tags", wrap => 1},
+    "dependson"         => { maxlength => 0, wrap => 1 } ,
+    "blocked"           => { maxlength => 0, wrap => 1 } ,
+    "flagtypes.name"    => { maxlength => 0, wrap => 1 } ,
+    "component"         => { maxlength => 8 , title => "Comp" } , 
+    "product"           => { maxlength => 12 } , 
+    "version"           => { maxlength => 7 , title => "Vers" } ,
+    "op_sys"            => { maxlength => 12 } ,
+    "bug_file_loc"      => { maxlength => 30 } , 
+    "target_milestone"  => { maxlength => 0, title => "TargetM" } , 
+    "longdescs.count"   => { maxlength => 0, title => "# Comments" },
+    "percentage_complete" => { maxlength => 0, format_value => "%d %%" } , 
+  }
+%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% Hook.process("before_table") %]
+
+[%############################################################################%]
+[%# Table Header                                                             #%]
+[%############################################################################%]
+
+[% tableheader = BLOCK %]
+  <table class="bz_buglist">
+    <tr class="bz_buglist_header bz_first_buglist_header">
+      [% IF dotweak %]
+      <th> </th>
+      [% END %]
+      <th colspan="[% splitheader ? 2 : 1 %]" class="first-child">
+        <a href="buglist.cgi?
+                  [% urlquerypart FILTER html %]&order=
+                  [% PROCESS new_order id='bug_id' %]
+                  [%-#%]&query_based_on=
+                  [% defaultsavename OR searchname FILTER uri %]">ID
+          [% PROCESS order_arrow id='bug_id' ~%]
+        </a>
+      </th>
+
+      [% IF splitheader %]
+
+        [% FOREACH id = displaycolumns %]
+          [% NEXT UNLESS loop.count() % 2 == 0 %]
+          [% column = columns.$id %]
+          [% PROCESS columnheader %]
+        [% END %]
+
+        </tr><tr class="bz_buglist_header">
+        [% IF dotweak %]
+          <th> </th>
+        [% END %]
+        <th> </th>
+
+        [% FOREACH id = displaycolumns %]
+          [% NEXT IF loop.count() % 2 == 0 %]
+          [% column = columns.$id %]
+          [% PROCESS columnheader %]
+        [% END %]
+
+      [% ELSE %]
+
+        [% FOREACH id = displaycolumns %]
+          [% column = columns.$id %]
+          [% PROCESS columnheader %]
+        [% END %]
+
+      [% END %]
+
+    </tr>
+[% END %]
+
+[% BLOCK columnheader %]
+  <th colspan="[% splitheader ? 2 : 1 %]">
+    <a href="buglist.cgi?[% urlquerypart FILTER html %]&order=
+      [% PROCESS new_order %]
+      [%-#%]&query_based_on=
+      [% defaultsavename OR searchname FILTER uri %]">
+        [%- abbrev.$id.title || field_descs.$id || column.title FILTER html -%]
+        [% PROCESS order_arrow ~%]
+    </a>
+  </th>
+[% END %]
+
+[% BLOCK new_order %]
+  [% desc = '' %]
+  [% IF (om = order.match("\\b$id( DESC)?")) %]
+    [% desc = ' DESC' IF NOT om.0 %]
+  [% END %]
+  [% id _ desc FILTER uri %]
+  [% IF id != 'bug_id' AND order %]
+    [% ',' _ order.remove("\\b$id( DESC)?(,\\s*|\$)") FILTER uri %]
+  [% END %]
+[% END %]
+
+[% BLOCK order_arrow %]
+  [% IF order.search("^$id DESC") %]
+    <span class="bz_sort_order_primary">&#x25BC;</span>
+  [% ELSIF order.search("^$id(,\\s*|\$)") %]
+    <span class="bz_sort_order_primary">&#x25B2;</span>
+  [% ELSIF order.search("\\b$id DESC") %]
+    <span class="bz_sort_order_secondary">&#x25BC;</span>
+  [% ELSIF order.search("\\b$id(,\\s*|\$)") %]
+    <span class="bz_sort_order_secondary">&#x25B2;</span>
+  [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+[% tableheader %]
+
+[% FOREACH bug = bugs %]
+  [% count = loop.count() %]
+
+  <tr id="b[% bug.bug_id %]" class="bz_bugitem
+             bz_[% bug.bug_severity FILTER css_class_quote -%]
+             bz_[% bug.priority FILTER css_class_quote -%]
+             bz_[% bug.bug_status FILTER css_class_quote -%]
+             [%+ "bz_$bug.resolution" FILTER css_class_quote IF bug.resolution -%]
+             [%+ "bz_secure" IF bug.secure_mode -%]
+             [%+ "bz_secure_mode_$bug.secure_mode" FILTER css_class_quote IF bug.secure_mode -%]
+             [%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]
+             ">
+
+    [% IF dotweak %]
+    <td class="bz_checkbox_column">
+      <input type="checkbox" name="id_[% bug.bug_id %]">
+    </td>
+    [% END %]
+    <td class="first-child bz_id_column">
+      <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>
+      <span class="bz_default_hidden">[%+ '[SEC]' IF bug.secure_mode %]</span>
+    </td>
+
+    [% FOREACH column = displaycolumns %]
+    [% col_abbrev = abbrev.$column %]
+    <td class="bz_[% column FILTER css_class_quote %]_column
+      [%~ ' nowrap' UNLESS col_abbrev.wrap
+        OR bug_fields.$column.type == constants.FIELD_TYPE_FREETEXT
+        OR  bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]">
+      [% IF col_abbrev.maxlength %]
+        <span title="[%- display_value(column, bug.$column) FILTER html %]">
+      [% END %]
+      [% IF col_abbrev.format_value %]
+        [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%]
+      [% ELSIF column == 'actual_time' ||
+               column == 'remaining_time' ||
+               column == 'estimated_time' %]
+        [% PROCESS formattimeunit time_unit=bug.$column %] 
+      [%# Display the login name of the user if their real name is empty. %]
+      [% ELSIF column.search('_realname$') && bug.$column == '' %]
+        [% SET login_column = column.remove('_realname$') %]
+        [% bug.${login_column}.truncate(col_abbrev.maxlength,
+                                        col_abbrev.ellipsis) FILTER html %]
+      [% ELSIF column == 'short_desc' || column == "short_short_desc" %]
+        <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">
+          [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+        </a>
+      [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_BUG_ID %]
+        <a href="show_bug.cgi?id=[% bug.$column FILTER html %]">
+          [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+        </a>
+      [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]
+        [%- bug.$column.truncate(256, '...') FILTER html -%]
+      [% ELSIF column == 'bug_file_loc' && is_safe_url(bug.bug_file_loc) %]
+        <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+           rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
+          [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+        </a>
+      [% ELSE %]
+        [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+      [% END %]
+      [% IF col_abbrev.maxlength %]
+        </span>
+      [% END %]
+    </td>
+    [% END %]
+
+  </tr>
+[% END %]
+
+[% IF time_info.time_present %]
+  [% PROCESS time_summary_line %]
+[% END %]
+
+</table>
+
+[% BLOCK time_summary_line %]
+  <tr class="bz_time_summary_line">
+    [% columns_to_span = 1 %]  [%# bugID %]
+    [% IF dotweak %]
+      [% columns_to_span = columns_to_span + 1 %]
+    [% END %]
+    [% FOREACH column = displaycolumns %]
+      [% IF column == 'actual_time' ||
+            column == 'remaining_time' ||
+            column == 'estimated_time' ||
+            column == 'percentage_complete' %]
+        [% IF columns_to_span > 0 %]
+          <td class="bz_total bz_total_label" colspan="
+              [%- columns_to_span FILTER html %]"><b>Totals</b></td>
+          [% columns_to_span = 0 %]
+        [% END %]
+        [% IF column == 'percentage_complete' %]
+          <td class="bz_total">[% time_info.percentage_complete
+              FILTER format(abbrev.$column.format_value) FILTER html %]</td>
+        [% ELSE %]
+          <td class="bz_total">
+            [%- PROCESS formattimeunit time_unit=time_info.$column %]</td>
+        [% END %]
+      [% ELSIF columns_to_span == 0 %] [%# A column following the first total %]
+        <td class="bz_total"> </td>
+      [% ELSE %] [%# We haven't gotten to a time column yet, keep computing span %]
+        [% columns_to_span = columns_to_span + 1 %]
+      [% END %]
+    [% END %]
+  </tr>
+[% END %]

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list